Checkpoint: Amélioration de la gestion d'erreurs pour la modification des séquences : ajout de validation dans parseLocalDateTime, protection contre les valeurs nulles dans handleEdit avec fonction safeFormatDate, remplacement de invalidate() par refetch() pour forcer le rafraîchissement immédiat, et ajout de logs détaillés côté serveur pour faciliter le débogage.

This commit is contained in:
Manus Sandbox
2025-11-12 12:01:14 -05:00
parent 7135a9d2c6
commit f266e8dde8
4 changed files with 40 additions and 12 deletions

View File

@@ -58,11 +58,12 @@ export default function AdminSequences() {
}); });
const updateMutation = trpc.sequences.update.useMutation({ const updateMutation = trpc.sequences.update.useMutation({
onSuccess: () => { onSuccess: async () => {
toast.success("Séquence modifiée avec succès"); toast.success("Séquence modifiée avec succès");
setIsEditOpen(false); setIsEditOpen(false);
setEditingSequence(null); setEditingSequence(null);
utils.sequences.list.invalidate(); // Forcer un refetch immédiat au lieu d'une simple invalidation
await utils.sequences.list.refetch();
}, },
onError: (error) => { onError: (error) => {
toast.error(`Erreur : ${error.message}`); toast.error(`Erreur : ${error.message}`);
@@ -93,17 +94,31 @@ export default function AdminSequences() {
const handleEdit = (sequence: any) => { const handleEdit = (sequence: any) => {
setEditingSequence(sequence); 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({ setFormData({
formationId: sequence.formationId.toString(), formationId: sequence.formationId.toString(),
nom: sequence.nom, nom: sequence.nom || "",
lieu: sequence.lieu, lieu: sequence.lieu || "",
capaciteMax: sequence.capaciteMax.toString(), capaciteMax: sequence.capaciteMax?.toString() || "12",
dateBlocage: format(new Date(sequence.dateBlocage), "yyyy-MM-dd'T'HH:mm"), dateBlocage: safeFormatDate(sequence.dateBlocage),
statut: sequence.statut, statut: sequence.statut || "ouverte",
dates: sequence.dates.map((d: any) => ({ dates: (sequence.dates || []).map((d: any) => ({
dateDebut: format(new Date(d.dateDebut), "yyyy-MM-dd'T'HH:mm"), dateDebut: safeFormatDate(d.dateDebut),
dateFin: format(new Date(d.dateFin), "yyyy-MM-dd'T'HH:mm"), dateFin: safeFormatDate(d.dateFin),
ordre: d.ordre, ordre: d.ordre || 1,
})), })),
}); });
setIsEditOpen(true); setIsEditOpen(true);

View File

@@ -8,6 +8,10 @@
* en préservant l'heure locale (pas de conversion UTC) * en préservant l'heure locale (pas de conversion UTC)
*/ */
export function parseLocalDateTime(dateTimeString: string): Date { export function parseLocalDateTime(dateTimeString: string): Date {
if (!dateTimeString) {
throw new Error('Date string is required');
}
// Le format datetime-local est "YYYY-MM-DDTHH:mm" // Le format datetime-local est "YYYY-MM-DDTHH:mm"
// On ajoute ":00" pour les secondes si nécessaire // On ajoute ":00" pour les secondes si nécessaire
const normalized = dateTimeString.length === 16 ? `${dateTimeString}:00` : dateTimeString; 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 // Créer la date en heure locale
const date = new Date(normalized); 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; return date;
} }

View File

@@ -213,12 +213,15 @@ export const appRouter = router({
console.log('[UPDATE SEQUENCE] UpdateData:', JSON.stringify(updateData, null, 2)); console.log('[UPDATE SEQUENCE] UpdateData:', JSON.stringify(updateData, null, 2));
await db.updateSequence(id, updateData); await db.updateSequence(id, updateData);
console.log('[UPDATE SEQUENCE] Séquence mise à jour avec succès');
// Supprimer les anciennes dates // Supprimer les anciennes dates
await db.deleteDatesBySequence(id); await db.deleteDatesBySequence(id);
console.log('[UPDATE SEQUENCE] Anciennes dates supprimées');
// Créer les nouvelles dates // Créer les nouvelles dates
for (const date of dates) { for (const date of dates) {
console.log('[UPDATE SEQUENCE] Création date:', date);
await db.createDateFormation({ await db.createDateFormation({
sequenceId: id, sequenceId: id,
dateDebut: parseLocalDateTime(date.dateDebut), dateDebut: parseLocalDateTime(date.dateDebut),
@@ -226,6 +229,7 @@ export const appRouter = router({
ordre: date.ordre, ordre: date.ordre,
}); });
} }
console.log('[UPDATE SEQUENCE] Toutes les dates ont été créées');
return { success: true }; return { success: true };
}), }),

View File

@@ -103,7 +103,7 @@
- [x] Corriger le bug de modification des horaires des séquences - [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 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 - [x] Corriger le décalage d'une heure entre la saisie et l'affichage des dates de séquences