mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-23 23:28:17 +02:00
Merge pull request #110 from R0m1k3/claude/fix-note-overwrite-bug-01Rx2KMQBoF8XiWUyEHb4c1K
Fix: Synchronisation des dates de modification et tags après sauvegarde
This commit is contained in:
3 files changed
+64
-12
No files matched your search
+13
-1
@@ -238,7 +238,19 @@ router.put('/:id',
|
|||||||
await runQuery(`UPDATE notes SET ${updates.join(', ')} WHERE id = $${paramCount}`, params);
|
await runQuery(`UPDATE notes SET ${updates.join(', ')} WHERE id = $${paramCount}`, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
res.json({ message: 'Note modifiée avec succès' });
|
// Récupérer la note mise à jour avec sa nouvelle updated_at
|
||||||
|
const updatedNote = await getOne(`
|
||||||
|
SELECT id, title, content, image_filename, archived, priority, created_at, updated_at
|
||||||
|
FROM notes
|
||||||
|
WHERE id = $1
|
||||||
|
`, [req.params.id]);
|
||||||
|
|
||||||
|
logger.info(`[UPDATE NOTE] Note mise à jour - ID: ${req.params.id}, updated_at: ${updatedNote.updated_at}`);
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
message: 'Note modifiée avec succès',
|
||||||
|
note: updatedNote
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('Erreur lors de la modification de la note:', error);
|
logger.error('Erreur lors de la modification de la note:', error);
|
||||||
res.status(500).json({ error: 'Erreur serveur' });
|
res.status(500).json({ error: 'Erreur serveur' });
|
||||||
|
|||||||
+38
-7
@@ -423,6 +423,14 @@ const Index = () => {
|
|||||||
try {
|
try {
|
||||||
const tags = await TagsService.getTags(noteId);
|
const tags = await TagsService.getTags(noteId);
|
||||||
setNoteTags(tags || []);
|
setNoteTags(tags || []);
|
||||||
|
|
||||||
|
// Synchroniser avec openNote.tags (convertir de 'tag' vers 'name')
|
||||||
|
if (openNote && openNote.id === noteId) {
|
||||||
|
setOpenNote({
|
||||||
|
...openNote,
|
||||||
|
tags: (tags || []).map(t => ({ id: t.id, name: t.tag }))
|
||||||
|
});
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Erreur lors du chargement des tags:", error);
|
console.error("Erreur lors du chargement des tags:", error);
|
||||||
setNoteTags([]);
|
setNoteTags([]);
|
||||||
@@ -458,8 +466,12 @@ const Index = () => {
|
|||||||
setNotes(prev => prev.map(note => note.id === updatedNote.id ? updatedNote : note));
|
setNotes(prev => prev.map(note => note.id === updatedNote.id ? updatedNote : note));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const success = await NotesService.updateNote(updatedNote);
|
const savedNote = await NotesService.updateNote(updatedNote);
|
||||||
if (!success) {
|
if (savedNote) {
|
||||||
|
// Mettre à jour avec les données du serveur (updated_at, etc.)
|
||||||
|
setOpenNote(savedNote);
|
||||||
|
setNotes(prev => prev.map(note => note.id === savedNote.id ? savedNote : note));
|
||||||
|
} else {
|
||||||
showError("Erreur lors de la sauvegarde");
|
showError("Erreur lors de la sauvegarde");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -482,9 +494,12 @@ const Index = () => {
|
|||||||
|
|
||||||
saveTimerRef.current = setTimeout(async () => {
|
saveTimerRef.current = setTimeout(async () => {
|
||||||
try {
|
try {
|
||||||
await NotesService.updateNote(updatedNote);
|
const savedNote = await NotesService.updateNote(updatedNote);
|
||||||
// Update notes list silently after save
|
if (savedNote) {
|
||||||
setNotes(prev => prev.map(note => note.id === updatedNote.id ? updatedNote : note));
|
// Mettre à jour avec les données du serveur (updated_at, etc.)
|
||||||
|
setOpenNote(savedNote);
|
||||||
|
setNotes(prev => prev.map(note => note.id === savedNote.id ? savedNote : note));
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
showError("Erreur lors de la sauvegarde automatique");
|
showError("Erreur lors de la sauvegarde automatique");
|
||||||
}
|
}
|
||||||
@@ -701,7 +716,15 @@ const Index = () => {
|
|||||||
try {
|
try {
|
||||||
const newTag = await TagsService.addTag(openNote.id, tagText);
|
const newTag = await TagsService.addTag(openNote.id, tagText);
|
||||||
if (newTag) {
|
if (newTag) {
|
||||||
setNoteTags([...noteTags, newTag]);
|
const updatedNoteTags = [...noteTags, newTag];
|
||||||
|
setNoteTags(updatedNoteTags);
|
||||||
|
|
||||||
|
// Synchroniser avec openNote.tags (convertir de 'tag' vers 'name')
|
||||||
|
setOpenNote({
|
||||||
|
...openNote,
|
||||||
|
tags: updatedNoteTags.map(t => ({ id: t.id, name: t.tag }))
|
||||||
|
});
|
||||||
|
|
||||||
showSuccess("Tag ajouté");
|
showSuccess("Tag ajouté");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -715,7 +738,15 @@ const Index = () => {
|
|||||||
try {
|
try {
|
||||||
const success = await TagsService.deleteTag(openNote.id, tagId);
|
const success = await TagsService.deleteTag(openNote.id, tagId);
|
||||||
if (success) {
|
if (success) {
|
||||||
setNoteTags(noteTags.filter(t => t.id !== tagId));
|
const updatedNoteTags = noteTags.filter(t => t.id !== tagId);
|
||||||
|
setNoteTags(updatedNoteTags);
|
||||||
|
|
||||||
|
// Synchroniser avec openNote.tags (convertir de 'tag' vers 'name')
|
||||||
|
setOpenNote({
|
||||||
|
...openNote,
|
||||||
|
tags: updatedNoteTags.map(t => ({ id: t.id, name: t.tag }))
|
||||||
|
});
|
||||||
|
|
||||||
showSuccess("Tag supprimé");
|
showSuccess("Tag supprimé");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -85,8 +85,8 @@ class NotesService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateNote(note: Note): Promise<boolean> {
|
async updateNote(note: Note): Promise<Note | null> {
|
||||||
if (!note.id) return false;
|
if (!note.id) return null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`/api/notes/${note.id}`, {
|
const response = await fetch(`/api/notes/${note.id}`, {
|
||||||
@@ -103,10 +103,19 @@ class NotesService {
|
|||||||
throw new Error("Erreur lors de la mise à jour de la note");
|
throw new Error("Erreur lors de la mise à jour de la note");
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
const result = await response.json();
|
||||||
|
// Le backend retourne { message, note } avec la note mise à jour incluant updated_at
|
||||||
|
if (result.note) {
|
||||||
|
return {
|
||||||
|
...note, // Garder les todos et images de l'état local
|
||||||
|
...result.note // Écraser avec les données du serveur (updated_at, etc.)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return note; // Fallback si le backend ne retourne pas la note
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
showError(error instanceof Error ? error.message : "Erreur serveur");
|
showError(error instanceof Error ? error.message : "Erreur serveur");
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user