From f0c68b9db1e05f8ac56976254f46c1142b19f906 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 12 Nov 2025 08:17:40 +0000 Subject: [PATCH] =?UTF-8?q?Feature:=20Am=C3=A9lioration=20de=20l'interface?= =?UTF-8?q?=20Todos=20et=20RSS=20avec=20onglets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cette mise à jour améliore l'interface utilisateur des tâches et des flux RSS avec une meilleure organisation et de nouvelles fonctionnalités. Changements principaux: 1. **Layout Todos et RSS côte à côte** - Les deux boxes sont maintenant affichées côte à côte - Meilleure utilisation de l'espace disponible - Layout en grid responsive 2. **Système d'onglets pour les Todos** - Onglet "Actives" : affiche uniquement les tâches non complétées - Onglet "Complétées" : affiche les tâches terminées avec style barré - Séparation claire entre tâches en cours et terminées - Possibilité de re-activer une tâche complétée en cliquant dessus 3. **Endpoint PATCH /api/todos/:id/toggle ajouté** - Nouvelle route backend pour basculer l'état d'une tâche - Résout l'erreur 404 précédente - Logging des actions pour suivi 4. **Optimisations visuelles** - Tailles de texte réduites (text-xs) pour plus de contenu visible - Hauteurs de boutons optimisées - Espacements améliorés - Animations et transitions fluides Fichiers modifiés: - routes/todos.routes.js : ajout de la route toggle - src/pages/Index.tsx : refonte de la sidebar droite avec onglets Cette version améliore significativement l'expérience utilisateur pour la gestion des tâches avec une séparation claire entre tâches actives et complétées. --- routes/todos.routes.js | 24 +++++ src/pages/Index.tsx | 230 ++++++++++++++++++++++++----------------- 2 files changed, 159 insertions(+), 95 deletions(-) diff --git a/routes/todos.routes.js b/routes/todos.routes.js index 3f920de..20a93a5 100644 --- a/routes/todos.routes.js +++ b/routes/todos.routes.js @@ -114,6 +114,30 @@ router.put('/:id', } ); +/** + * PATCH /api/todos/:id/toggle + * Basculer l'état completed d'un todo + */ +router.patch('/:id/toggle', async (req, res) => { + try { + // Vérifier que le todo appartient à l'utilisateur + const todo = await getOne('SELECT id, completed FROM global_todos WHERE id = ? AND user_id = ?', [req.params.id, req.user.id]); + if (!todo) { + return res.status(404).json({ error: 'Todo non trouvé' }); + } + + const newCompleted = todo.completed ? 0 : 1; + await runQuery('UPDATE global_todos SET completed = ? WHERE id = ?', [newCompleted, req.params.id]); + + logger.info(`Todo global ${newCompleted ? 'complété' : 'réouvert'} (ID: ${req.params.id}) par ${req.user.username}`); + + res.json({ message: 'Todo modifié avec succès', completed: newCompleted === 1 }); + } catch (error) { + logger.error('Erreur lors du toggle du todo:', error); + res.status(500).json({ error: 'Erreur serveur' }); + } +}); + /** * DELETE /api/todos/:id * Supprimer un todo global diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 9b74dae..891fa76 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -755,105 +755,145 @@ const Index = () => { {/* Right Sidebar - Todos & RSS */}
- {/* Todos Box */} - - -
- - - Tâches - - -
-
- -
- {todos.length > 0 ? ( - todos.map(todo => ( -
- todo.id && handleToggleTodo(todo.id)} - /> - - {todo.text} - - -
- )) - ) : ( -

Aucune tâche

- )} -
-
-
- - {/* RSS Box */} - - -
- - - Flux RSS - -
- -
-
-
- -
- {rssArticles.length > 0 ? ( - rssArticles.map(article => ( -
article.link && window.open(article.link, '_blank')} - > -
-
-

{article.title}

- {article.description && ( -

- {article.description.replace(/<[^>]*>/g, '')} -

- )} -
- -
+ + + + + Actives + Complétées + + + +
+ {todos.filter(t => !t.completed).length > 0 ? ( + todos.filter(t => !t.completed).map(todo => ( +
+ todo.id && handleToggleTodo(todo.id)} + /> + + {todo.text} + + +
+ )) + ) : ( +

Aucune tâche active

+ )}
- )) - ) : ( -

- Aucun article -
- +

+ )) + ) : ( +

Aucune tâche complétée

+ )} +
+ + +
+
+ + {/* RSS Box */} + + +
+ + + Flux RSS + +
+ -

- )} -
- - + +
+
+ + +
+ {rssArticles.length > 0 ? ( + rssArticles.map(article => ( +
article.link && window.open(article.link, '_blank')} + > +
+
+

{article.title}

+ {article.description && ( +

+ {article.description.replace(/<[^>]*>/g, '')} +

+ )} +
+ +
+
+ )) + ) : ( +

+ Aucun article +
+ +

+ )} +
+
+ +