Feature: Affichage tags et icône priorité dans les cartes notes

Ajout de deux nouvelles fonctionnalités pour les notes:

1. Affichage des tags dans les cartes repliées:
- Les tags sont maintenant visibles dans les cartes de notes sans avoir à les ouvrir
- Badge avec icône TagIcon et nom du tag
- Chargement automatique des tags depuis la base de données

2. Icône de priorité cliquable:
- Bouton "!" en haut à droite de chaque carte de note
- Rouge (!) quand la note est prioritaire (toujours visible)
- Gris clair (!) quand non prioritaire (visible au hover)
- Toggle au clic pour marquer/démarquer comme prioritaire
- Les notes prioritaires sont triées en premier

Backend:
- Route PATCH /api/notes/:id/priority pour toggle la priorité
- Modification GET /api/notes pour charger tags et priority
- Tri par priority DESC, updated_at DESC
- Migration automatique pour ajouter colonne priority
- Index pour performance des requêtes de tri

Frontend:
- Interface Note étendue avec tags et priority
- Méthode togglePriority dans NotesService
- Affichage conditionnel de l'icône (toujours visible si prioritaire)
- Empêche le clic sur l'icône d'ouvrir la note (stopPropagation)

Migration:
- Ajout automatique de la colonne priority (INTEGER DEFAULT 0)
- Création d'index idx_notes_priority pour performance
- Fichier de migration 002_add_priority.sql créé pour référence
This commit is contained in:
Claude committed 2025-11-12 21:41:34 +00:00
1 parent b4e2c254ed
commit b36525919f
5 files changed
+119 -7

No files matched your search

+36 -3
View File
@@ -49,16 +49,16 @@ router.get('/', async (req, res) => {
const notes = await getAll(`
SELECT
n.id, n.title, n.content, n.image_filename, n.archived,
n.id, n.title, n.content, n.image_filename, n.archived, n.priority,
n.created_at, n.updated_at,
(SELECT COUNT(*) FROM note_todos WHERE note_id = n.id) as todos_count,
(SELECT COUNT(*) FROM note_todos WHERE note_id = n.id AND completed = 1) as todos_completed
FROM notes n
WHERE n.user_id = ? AND n.archived = ?
ORDER BY n.updated_at DESC
ORDER BY n.priority DESC, n.updated_at DESC
`, [req.user.id, archivedFilter]);
// Charger les todos, images et fichiers pour chaque note
// Charger les todos, images, fichiers et tags pour chaque note
for (const note of notes) {
const todos = await getAll(`
SELECT id, text, completed, position
@@ -84,6 +84,15 @@ router.get('/', async (req, res) => {
`, [note.id]);
note.files = files || [];
note.files_count = files?.length || 0;
const tags = await getAll(`
SELECT t.id, t.name
FROM tags t
INNER JOIN note_tags nt ON t.id = nt.tag_id
WHERE nt.note_id = ?
ORDER BY t.name ASC
`, [note.id]);
note.tags = tags || [];
}
res.json(notes || []);
@@ -895,5 +904,29 @@ router.delete('/:noteId/tags/:tagId', async (req, res) => {
}
});
/**
* PATCH /api/notes/:id/priority
* Modifier la priorité d'une note
*/
router.patch('/:id/priority', async (req, res) => {
try {
const { priority } = req.body;
// Vérifier que la note appartient à l'utilisateur
const note = await getOne('SELECT id FROM notes WHERE id = ? AND user_id = ?', [req.params.id, req.user.id]);
if (!note) {
return res.status(404).json({ error: 'Note non trouvée' });
}
await runQuery('UPDATE notes SET priority = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?', [priority ? 1 : 0, req.params.id]);
logger.info(`Priorité de la note ${req.params.id} modifiée: ${priority}`);
res.json({ message: 'Priorité modifiée avec succès', priority });
} catch (error) {
logger.error('Erreur lors de la modification de la priorité:', error);
res.status(500).json({ error: 'Erreur serveur' });
}
});
module.exports = router;
module.exports.searchNotes = searchNotes;