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:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 };
|
||||||
}),
|
}),
|
||||||
|
|||||||
2
todo.md
2
todo.md
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user