feat: add todo functionnality
This commit is contained in:
parent
59bcb7fbbb
commit
ec0f77a45c
12
app/Http/Controllers/TodoController.php
Normal file
12
app/Http/Controllers/TodoController.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class TodoController extends Controller
|
||||
{
|
||||
public function index() {
|
||||
return view('todo');
|
||||
}
|
||||
}
|
65
public/css/todo.css
Normal file
65
public/css/todo.css
Normal file
@ -0,0 +1,65 @@
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #f4f4f4;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.container {
|
||||
width: 80%;
|
||||
margin: 50px auto;
|
||||
background-color: #fff;
|
||||
padding: 20px;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
h1 {
|
||||
text-align: center;
|
||||
color: #333;
|
||||
}
|
||||
input[type="text"] {
|
||||
width: 70%;
|
||||
padding: 10px;
|
||||
font-size: 16px;
|
||||
}
|
||||
button {
|
||||
padding: 10px;
|
||||
font-size: 16px;
|
||||
background-color: #28a745;
|
||||
color: #fff;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
button:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
.task {
|
||||
padding: 15px;
|
||||
background-color: #f9f9f9;
|
||||
margin-bottom: 10px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.completed span {
|
||||
text-decoration: line-through;
|
||||
color: #888;
|
||||
}
|
||||
.supp,
|
||||
.modif {
|
||||
background-color: #dc3545;
|
||||
color: #fff;
|
||||
padding: 5px 10px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
margin-left: 5px;
|
||||
}
|
||||
.modif {
|
||||
background-color: #ffc107;
|
||||
}
|
||||
.supp:hover {
|
||||
background-color: #c82333;
|
||||
}
|
||||
.modif:hover {
|
||||
background-color: #e0a800;
|
||||
}
|
117
public/js/todo.js
Normal file
117
public/js/todo.js
Normal file
@ -0,0 +1,117 @@
|
||||
// Fonction pour ajouter une tâche
|
||||
function ajoutTache() {
|
||||
// Récupérer la valeur de la tâche entrée
|
||||
var tache = document.getElementById("tacheInput").value;
|
||||
|
||||
// Vérifier si la tâche n'est pas vide
|
||||
if (tache === "") {
|
||||
alert("Veuillez saisir une tâche.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Créer un élément <div> pour la nouvelle tâche
|
||||
var tacheDiv = document.createElement("div");
|
||||
tacheDiv.className = "task"; //mise en forme css
|
||||
|
||||
// Créer un élément <span> pour afficher la tâche
|
||||
var tacheSpan = document.createElement("span");
|
||||
tacheSpan.textContent = tache; //récupère texte saisi dans la zone de texte tacheInput
|
||||
tacheDiv.appendChild(tacheSpan); //pour afficher à la suite
|
||||
|
||||
// Créer une checkbox pour marquer la tâche comme terminée
|
||||
var checkbox = document.createElement("input");
|
||||
checkbox.type = "checkbox";
|
||||
checkbox.onchange = function () {
|
||||
toggleTaskCompletion(tacheDiv, checkbox);
|
||||
};
|
||||
tacheDiv.appendChild(checkbox);
|
||||
|
||||
// Ajouter un bouton "Supprimer"
|
||||
var suppButton = document.createElement("button");
|
||||
suppButton.textContent = "Supprimer";
|
||||
suppButton.className = "supp";
|
||||
suppButton.onclick = suppTache; // Associer la fonction de suppression
|
||||
tacheDiv.appendChild(suppButton);
|
||||
|
||||
// Ajouter un bouton "Modifier"
|
||||
var modifButton = document.createElement("button");
|
||||
modifButton.textContent = "Modifier";
|
||||
modifButton.className = "modif";
|
||||
modifButton.onclick = function () {
|
||||
modifTache(tacheDiv, tacheSpan);
|
||||
};
|
||||
tacheDiv.appendChild(modifButton);
|
||||
|
||||
// Ajouter la tâche au conteneur
|
||||
document.getElementById("listeTache").appendChild(tacheDiv);
|
||||
|
||||
// Réinitialiser le champ de saisie
|
||||
document.getElementById("tacheInput").value = "";
|
||||
}
|
||||
|
||||
// Fonction pour supprimer une tâche
|
||||
function suppTache() {
|
||||
var tacheDiv = this.parentElement;
|
||||
tacheDiv.remove();
|
||||
}
|
||||
|
||||
// Fonction pour marquer une tâche comme terminée (avec la checkbox)
|
||||
function toggleTaskCompletion(tacheDiv, checkbox) {
|
||||
if (checkbox.checked) {
|
||||
tacheDiv.classList.add("completed");
|
||||
} else {
|
||||
tacheDiv.classList.remove("completed");
|
||||
}
|
||||
}
|
||||
|
||||
// Fonction pour modifier une tâche
|
||||
function modifTache(tacheDiv, tacheSpan) {
|
||||
// Créer un champ de texte pour modifier la tâche
|
||||
var modifInput = document.createElement("input");
|
||||
modifInput.type = "text";
|
||||
modifInput.value = tacheSpan.textContent;
|
||||
|
||||
// Créer un bouton "Enregistrer"
|
||||
var saveButton = document.createElement("button");
|
||||
saveButton.textContent = "Enregistrer";
|
||||
saveButton.className = "save";
|
||||
|
||||
// Remplacer le texte et les boutons actuels par le champ de texte et le bouton "Enregistrer"
|
||||
tacheDiv.innerHTML = ""; // Supprime tout le contenu de la tâche
|
||||
tacheDiv.appendChild(modifInput);
|
||||
tacheDiv.appendChild(saveButton);
|
||||
|
||||
// Fonction pour enregistrer la modification
|
||||
saveButton.onclick = function () {
|
||||
if (modifInput.value === "") {
|
||||
alert("Veuillez saisir une tâche valide.");
|
||||
return;
|
||||
}
|
||||
tacheSpan.textContent = modifInput.value; // Mettre à jour le texte de la tâche
|
||||
tacheDiv.innerHTML = ""; // Vider l'élément <div> à nouveau
|
||||
tacheDiv.appendChild(checkbox); // Restaurer la checkbox
|
||||
tacheDiv.appendChild(tacheSpan); // Restaurer la tâche modifiée
|
||||
tacheDiv.appendChild(suppButton); // Restaurer le bouton "Supprimer"
|
||||
tacheDiv.appendChild(modifButton); // Restaurer le bouton "Modifier"
|
||||
};
|
||||
|
||||
// Re-créer les boutons de suppression et de modification après la sauvegarde
|
||||
var suppButton = document.createElement("button");
|
||||
suppButton.textContent = "Supprimer";
|
||||
suppButton.className = "supp";
|
||||
suppButton.onclick = suppTache;
|
||||
|
||||
var modifButton = document.createElement("button");
|
||||
modifButton.textContent = "Modifier";
|
||||
modifButton.className = "modif";
|
||||
modifButton.onclick = function () {
|
||||
modifTache(tacheDiv, tacheSpan);
|
||||
};
|
||||
|
||||
// Restaurer la checkbox après modification
|
||||
var checkbox = document.createElement("input");
|
||||
checkbox.type = "checkbox";
|
||||
checkbox.onchange = function () {
|
||||
toggleTaskCompletion(tacheDiv, checkbox);
|
||||
};
|
||||
}
|
65
resources/css/todo.css
Normal file
65
resources/css/todo.css
Normal file
@ -0,0 +1,65 @@
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #f4f4f4;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.container {
|
||||
width: 80%;
|
||||
margin: 50px auto;
|
||||
background-color: #fff;
|
||||
padding: 20px;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
h1 {
|
||||
text-align: center;
|
||||
color: #333;
|
||||
}
|
||||
input[type="text"] {
|
||||
width: 70%;
|
||||
padding: 10px;
|
||||
font-size: 16px;
|
||||
}
|
||||
button {
|
||||
padding: 10px;
|
||||
font-size: 16px;
|
||||
background-color: #28a745;
|
||||
color: #fff;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
button:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
.task {
|
||||
padding: 15px;
|
||||
background-color: #f9f9f9;
|
||||
margin-bottom: 10px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.completed span {
|
||||
text-decoration: line-through;
|
||||
color: #888;
|
||||
}
|
||||
.supp,
|
||||
.modif {
|
||||
background-color: #dc3545;
|
||||
color: #fff;
|
||||
padding: 5px 10px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
margin-left: 5px;
|
||||
}
|
||||
.modif {
|
||||
background-color: #ffc107;
|
||||
}
|
||||
.supp:hover {
|
||||
background-color: #c82333;
|
||||
}
|
||||
.modif:hover {
|
||||
background-color: #e0a800;
|
||||
}
|
117
resources/js/todo.js
Normal file
117
resources/js/todo.js
Normal file
@ -0,0 +1,117 @@
|
||||
// Fonction pour ajouter une tâche
|
||||
function ajoutTache() {
|
||||
// Récupérer la valeur de la tâche entrée
|
||||
var tache = document.getElementById("tacheInput").value;
|
||||
|
||||
// Vérifier si la tâche n'est pas vide
|
||||
if (tache === "") {
|
||||
alert("Veuillez saisir une tâche.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Créer un élément <div> pour la nouvelle tâche
|
||||
var tacheDiv = document.createElement("div");
|
||||
tacheDiv.className = "task"; //mise en forme css
|
||||
|
||||
// Créer un élément <span> pour afficher la tâche
|
||||
var tacheSpan = document.createElement("span");
|
||||
tacheSpan.textContent = tache; //récupère texte saisi dans la zone de texte tacheInput
|
||||
tacheDiv.appendChild(tacheSpan); //pour afficher à la suite
|
||||
|
||||
// Créer une checkbox pour marquer la tâche comme terminée
|
||||
var checkbox = document.createElement("input");
|
||||
checkbox.type = "checkbox";
|
||||
checkbox.onchange = function () {
|
||||
toggleTaskCompletion(tacheDiv, checkbox);
|
||||
};
|
||||
tacheDiv.appendChild(checkbox);
|
||||
|
||||
// Ajouter un bouton "Supprimer"
|
||||
var suppButton = document.createElement("button");
|
||||
suppButton.textContent = "Supprimer";
|
||||
suppButton.className = "supp";
|
||||
suppButton.onclick = suppTache; // Associer la fonction de suppression
|
||||
tacheDiv.appendChild(suppButton);
|
||||
|
||||
// Ajouter un bouton "Modifier"
|
||||
var modifButton = document.createElement("button");
|
||||
modifButton.textContent = "Modifier";
|
||||
modifButton.className = "modif";
|
||||
modifButton.onclick = function () {
|
||||
modifTache(tacheDiv, tacheSpan);
|
||||
};
|
||||
tacheDiv.appendChild(modifButton);
|
||||
|
||||
// Ajouter la tâche au conteneur
|
||||
document.getElementById("listeTache").appendChild(tacheDiv);
|
||||
|
||||
// Réinitialiser le champ de saisie
|
||||
document.getElementById("tacheInput").value = "";
|
||||
}
|
||||
|
||||
// Fonction pour supprimer une tâche
|
||||
function suppTache() {
|
||||
var tacheDiv = this.parentElement;
|
||||
tacheDiv.remove();
|
||||
}
|
||||
|
||||
// Fonction pour marquer une tâche comme terminée (avec la checkbox)
|
||||
function toggleTaskCompletion(tacheDiv, checkbox) {
|
||||
if (checkbox.checked) {
|
||||
tacheDiv.classList.add("completed");
|
||||
} else {
|
||||
tacheDiv.classList.remove("completed");
|
||||
}
|
||||
}
|
||||
|
||||
// Fonction pour modifier une tâche
|
||||
function modifTache(tacheDiv, tacheSpan) {
|
||||
// Créer un champ de texte pour modifier la tâche
|
||||
var modifInput = document.createElement("input");
|
||||
modifInput.type = "text";
|
||||
modifInput.value = tacheSpan.textContent;
|
||||
|
||||
// Créer un bouton "Enregistrer"
|
||||
var saveButton = document.createElement("button");
|
||||
saveButton.textContent = "Enregistrer";
|
||||
saveButton.className = "save";
|
||||
|
||||
// Remplacer le texte et les boutons actuels par le champ de texte et le bouton "Enregistrer"
|
||||
tacheDiv.innerHTML = ""; // Supprime tout le contenu de la tâche
|
||||
tacheDiv.appendChild(modifInput);
|
||||
tacheDiv.appendChild(saveButton);
|
||||
|
||||
// Fonction pour enregistrer la modification
|
||||
saveButton.onclick = function () {
|
||||
if (modifInput.value === "") {
|
||||
alert("Veuillez saisir une tâche valide.");
|
||||
return;
|
||||
}
|
||||
tacheSpan.textContent = modifInput.value; // Mettre à jour le texte de la tâche
|
||||
tacheDiv.innerHTML = ""; // Vider l'élément <div> à nouveau
|
||||
tacheDiv.appendChild(checkbox); // Restaurer la checkbox
|
||||
tacheDiv.appendChild(tacheSpan); // Restaurer la tâche modifiée
|
||||
tacheDiv.appendChild(suppButton); // Restaurer le bouton "Supprimer"
|
||||
tacheDiv.appendChild(modifButton); // Restaurer le bouton "Modifier"
|
||||
};
|
||||
|
||||
// Re-créer les boutons de suppression et de modification après la sauvegarde
|
||||
var suppButton = document.createElement("button");
|
||||
suppButton.textContent = "Supprimer";
|
||||
suppButton.className = "supp";
|
||||
suppButton.onclick = suppTache;
|
||||
|
||||
var modifButton = document.createElement("button");
|
||||
modifButton.textContent = "Modifier";
|
||||
modifButton.className = "modif";
|
||||
modifButton.onclick = function () {
|
||||
modifTache(tacheDiv, tacheSpan);
|
||||
};
|
||||
|
||||
// Restaurer la checkbox après modification
|
||||
var checkbox = document.createElement("input");
|
||||
checkbox.type = "checkbox";
|
||||
checkbox.onchange = function () {
|
||||
toggleTaskCompletion(tacheDiv, checkbox);
|
||||
};
|
||||
}
|
20
resources/views/todo.blade.php
Normal file
20
resources/views/todo.blade.php
Normal file
@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
@vite('resources/css/app.css')
|
||||
@vite('resources/css/todo.css')
|
||||
<link href="{{ asset('css/todo.css') }}" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>Ma Liste</h1>
|
||||
<input type="text" id="tacheInput" placeholder="Ajouter une tâche...">
|
||||
<button onclick="ajoutTache()">Ajouter</button>
|
||||
<div id="listeTache"></div>
|
||||
</div>
|
||||
<script src="{{ asset('js/todo.js')}}"></script>
|
||||
</body>
|
||||
</html>
|
@ -4,7 +4,10 @@ use Illuminate\Support\Facades\Route;
|
||||
|
||||
use App\Http\Controllers\AboutController;
|
||||
use App\Http\Controllers\HomeController;
|
||||
use App\Http\Controllers\TodoController;
|
||||
|
||||
Route::get('/', [HomeController::class, 'index'])->name('route0');
|
||||
|
||||
Route::get('/about', [AboutController::class, 'index'])->name('route1');
|
||||
|
||||
Route::get('/todo', [TodoController::class, 'index'])->name('route2');
|
@ -4,7 +4,7 @@ import laravel from 'laravel-vite-plugin';
|
||||
export default defineConfig({
|
||||
plugins: [
|
||||
laravel({
|
||||
input: ['resources/css/app.css', 'resources/js/app.js'],
|
||||
input: ['resources/css/app.css', 'resources/css/todo.css', 'resources/js/app.js', 'resources/js/todo.js'],
|
||||
refresh: true,
|
||||
}),
|
||||
],
|
||||
|
Loading…
x
Reference in New Issue
Block a user