- Remplacement de tous les onclick/onchange par event delegation
- Utilisation de data attributes (data-todo-id, data-note-todo-id, data-user-id)
- Event listeners attachés aux conteneurs (#todoList, #noteTodosList, #usersTableBody)
- Plus besoin d'exposer les fonctions sur window
- Conforme à la Content Security Policy de Helmet.js
- Résout: 'script-src-attr' violations bloquant les actions de la todo list
- Ajout modal de confirmation personnalisé avec icône, titre et message
- Remplacement de tous les confirm() natifs par le nouveau modal
- Modal animé avec backdrop et fermeture Escape
- Style barré automatique pour les todos complétées (déjà présent)
- Exposition globale des fonctions toggleTodo et deleteTodo
- Confirmation visuelle pour :
* Suppression de notes
* Suppression de todos (note et globaux)
* Suppression d'images
* Suppression d'utilisateurs
* Création d'admin
- Design cohérent avec boutons Annuler/Confirmer
- Animations smooth avec transitions CSS
- Ajout event listener pour le bouton Administration
- Fonctions pour ouvrir/fermer le modal admin
- Chargement et affichage des utilisateurs dans une table
- Création d'utilisateurs avec prompts
- Suppression d'utilisateurs avec confirmation
- Style pour le bouton de suppression
- Fermeture du modal avec Escape ou clic sur backdrop
- Résout le problème: impossible d'accéder à l'administration
- Ajout d'une vérification automatique au démarrage
- Utilise PRAGMA table_info pour vérifier les colonnes existantes
- Ajoute image_filename si elle n'existe pas
- Résout l'erreur SQLITE_ERROR: no such column: n.image_filename
- Création du dossier migrations/
- Migration 001: Ajout de la colonne image_filename manquante
- Script run-migrations.sh pour appliquer les migrations
- Documentation dans migrations/README.md
- Correction de l'erreur 'no such column: n.image_filename'
- Remplacement de COUNT(DISTINCT) par une sous-requête dans SQLite
- Ajout de vérification Array.isArray côté client
- Gestion d'erreur améliorée avec fallback sur tableau vide
- Correction du bug 'filtered.forEach is not a function'
- L'API retourne toujours un tableau, même en cas d'erreur
- Remplacement des bind mounts par des volumes Docker nommés
- Les volumes notes_data et notes_uploads ont automatiquement les bonnes permissions
- Correction de l'erreur SQLITE_CANTOPEN
- Mise à jour du README avec les commandes de backup pour volumes Docker
- L'utilisateur node dans le container peut maintenant écrire dans les volumes
- Retrait de la création du .gitkeep au runtime (déjà présent dans le repo)
- Ajout de gestion d'erreur try/catch pour la création des dossiers
- Les volumes Docker montés ne causeront plus d'erreurs de permissions
- Correction de l'erreur EACCES lors de l'écriture dans /app/public/uploads
Modifications:
- docker-compose.yml: port mapping 2222:2222 et variable PORT=2222
- Dockerfile: EXPOSE 2222 et healthcheck sur port 2222
- server.js: port par défaut changé de 3000 à 2222
- .env.example: PORT=2222
- README.md: toutes les références au port 3000 remplacées par 2222
(installation, accès, configuration Nginx)
L'application écoute maintenant sur le port 2222 au lieu de 3000.