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\AboutController;
|
||||||
use App\Http\Controllers\HomeController;
|
use App\Http\Controllers\HomeController;
|
||||||
|
use App\Http\Controllers\TodoController;
|
||||||
|
|
||||||
Route::get('/', [HomeController::class, 'index'])->name('route0');
|
Route::get('/', [HomeController::class, 'index'])->name('route0');
|
||||||
|
|
||||||
Route::get('/about', [AboutController::class, 'index'])->name('route1');
|
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({
|
export default defineConfig({
|
||||||
plugins: [
|
plugins: [
|
||||||
laravel({
|
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,
|
refresh: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user