From f266e8dde898dc84a37ab9aedc4edc6466fdf7b4 Mon Sep 17 00:00:00 2001 From: Manus Sandbox Date: Wed, 12 Nov 2025 12:01:14 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Am=C3=A9lioration=20de=20la=20ges?= =?UTF-8?q?tion=20d'erreurs=20pour=20la=20modification=20des=20s=C3=A9quen?= =?UTF-8?q?ces=20:=20ajout=20de=20validation=20dans=20parseLocalDateTime,?= =?UTF-8?q?=20protection=20contre=20les=20valeurs=20nulles=20dans=20handle?= =?UTF-8?q?Edit=20avec=20fonction=20safeFormatDate,=20remplacement=20de=20?= =?UTF-8?q?invalidate()=20par=20refetch()=20pour=20forcer=20le=20rafra?= =?UTF-8?q?=C3=AEchissement=20imm=C3=A9diat,=20et=20ajout=20de=20logs=20d?= =?UTF-8?q?=C3=A9taill=C3=A9s=20c=C3=B4t=C3=A9=20serveur=20pour=20facilite?= =?UTF-8?q?r=20le=20d=C3=A9bogage.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/AdminSequences.tsx | 37 ++++++++++++++++++++--------- server/dateUtils.ts | 9 +++++++ server/routers.ts | 4 ++++ todo.md | 2 +- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/client/src/pages/AdminSequences.tsx b/client/src/pages/AdminSequences.tsx index 73ba7b3..435cc3f 100644 --- a/client/src/pages/AdminSequences.tsx +++ b/client/src/pages/AdminSequences.tsx @@ -58,11 +58,12 @@ export default function AdminSequences() { }); const updateMutation = trpc.sequences.update.useMutation({ - onSuccess: () => { + onSuccess: async () => { toast.success("Séquence modifiée avec succès"); setIsEditOpen(false); setEditingSequence(null); - utils.sequences.list.invalidate(); + // Forcer un refetch immédiat au lieu d'une simple invalidation + await utils.sequences.list.refetch(); }, onError: (error) => { toast.error(`Erreur : ${error.message}`); @@ -93,17 +94,31 @@ export default function AdminSequences() { const handleEdit = (sequence: any) => { setEditingSequence(sequence); + + // Fonction helper pour formater une date en toute sécurité + const safeFormatDate = (dateValue: any): string => { + if (!dateValue) return ""; + try { + const date = new Date(dateValue); + if (isNaN(date.getTime())) return ""; + return format(date, "yyyy-MM-dd'T'HH:mm"); + } catch (error) { + console.error('Erreur de formatage de date:', error, dateValue); + return ""; + } + }; + setFormData({ formationId: sequence.formationId.toString(), - nom: sequence.nom, - lieu: sequence.lieu, - capaciteMax: sequence.capaciteMax.toString(), - dateBlocage: format(new Date(sequence.dateBlocage), "yyyy-MM-dd'T'HH:mm"), - statut: sequence.statut, - dates: sequence.dates.map((d: any) => ({ - dateDebut: format(new Date(d.dateDebut), "yyyy-MM-dd'T'HH:mm"), - dateFin: format(new Date(d.dateFin), "yyyy-MM-dd'T'HH:mm"), - ordre: d.ordre, + nom: sequence.nom || "", + lieu: sequence.lieu || "", + capaciteMax: sequence.capaciteMax?.toString() || "12", + dateBlocage: safeFormatDate(sequence.dateBlocage), + statut: sequence.statut || "ouverte", + dates: (sequence.dates || []).map((d: any) => ({ + dateDebut: safeFormatDate(d.dateDebut), + dateFin: safeFormatDate(d.dateFin), + ordre: d.ordre || 1, })), }); setIsEditOpen(true); diff --git a/server/dateUtils.ts b/server/dateUtils.ts index d930f24..f85f9e0 100644 --- a/server/dateUtils.ts +++ b/server/dateUtils.ts @@ -8,6 +8,10 @@ * en préservant l'heure locale (pas de conversion UTC) */ export function parseLocalDateTime(dateTimeString: string): Date { + if (!dateTimeString) { + throw new Error('Date string is required'); + } + // Le format datetime-local est "YYYY-MM-DDTHH:mm" // On ajoute ":00" pour les secondes si nécessaire const normalized = dateTimeString.length === 16 ? `${dateTimeString}:00` : dateTimeString; @@ -15,6 +19,11 @@ export function parseLocalDateTime(dateTimeString: string): Date { // Créer la date en heure locale const date = new Date(normalized); + // Vérifier que la date est valide + if (isNaN(date.getTime())) { + throw new Error(`Invalid date string: ${dateTimeString}`); + } + return date; } diff --git a/server/routers.ts b/server/routers.ts index fead7ef..eb15e31 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -213,12 +213,15 @@ export const appRouter = router({ console.log('[UPDATE SEQUENCE] UpdateData:', JSON.stringify(updateData, null, 2)); await db.updateSequence(id, updateData); + console.log('[UPDATE SEQUENCE] Séquence mise à jour avec succès'); // Supprimer les anciennes dates await db.deleteDatesBySequence(id); + console.log('[UPDATE SEQUENCE] Anciennes dates supprimées'); // Créer les nouvelles dates for (const date of dates) { + console.log('[UPDATE SEQUENCE] Création date:', date); await db.createDateFormation({ sequenceId: id, dateDebut: parseLocalDateTime(date.dateDebut), @@ -226,6 +229,7 @@ export const appRouter = router({ ordre: date.ordre, }); } + console.log('[UPDATE SEQUENCE] Toutes les dates ont été créées'); return { success: true }; }), diff --git a/todo.md b/todo.md index 5c8a515..839f0cd 100644 --- a/todo.md +++ b/todo.md @@ -103,7 +103,7 @@ - [x] Corriger le bug de modification des horaires des séquences -- [ ] Corriger la modification des heures d'une séquence (toujours non fonctionnelle) +- [ ] Corriger la modification des heures d'une séquence (amélioration de la gestion d'erreurs en cours) - [x] Corriger la mise à jour du nombre d'inscrits sur la page d'inscription publique - [x] Corriger le décalage d'une heure entre la saisie et l'affichage des dates de séquences