diff --git a/app/agenda/page.tsx b/app/agenda/page.tsx index 3461ec8..49415e8 100644 --- a/app/agenda/page.tsx +++ b/app/agenda/page.tsx @@ -647,6 +647,37 @@ export default async function CalendarPage() { } }); + // Sort calendars: "Mon Calendrier" first, then synced, then groups, then missions + calendars = calendars.sort((a, b) => { + const aIsMonCalendrier = a.name === "Mon Calendrier"; + const bIsMonCalendrier = b.name === "Mon Calendrier"; + const aIsSynced = a.syncConfig?.syncEnabled && a.syncConfig?.mailCredential; + const bIsSynced = b.syncConfig?.syncEnabled && b.syncConfig?.mailCredential; + const aIsGroup = a.name?.startsWith("Groupe:"); + const bIsGroup = b.name?.startsWith("Groupe:"); + const aIsMission = a.name?.startsWith("Mission:"); + const bIsMission = b.name?.startsWith("Mission:"); + + // "Mon Calendrier" always first + if (aIsMonCalendrier && !bIsMonCalendrier) return -1; + if (!aIsMonCalendrier && bIsMonCalendrier) return 1; + + // Synced calendars second + if (aIsSynced && !bIsSynced) return -1; + if (!aIsSynced && bIsSynced) return 1; + + // Groups third + if (aIsGroup && !bIsGroup && !bIsSynced) return -1; + if (!aIsGroup && bIsGroup && !aIsSynced) return 1; + + // Missions fourth + if (aIsMission && !bIsMission && !bIsGroup && !bIsSynced) return -1; + if (!aIsMission && bIsMission && !aIsGroup && !aIsSynced) return 1; + + // Same type, sort by name + return (a.name || '').localeCompare(b.name || ''); + }); + const now = new Date(); const nextWeek = add(now, { days: 7 }); diff --git a/app/api/calendars/route.ts b/app/api/calendars/route.ts index f78e6c3..8ec2935 100644 --- a/app/api/calendars/route.ts +++ b/app/api/calendars/route.ts @@ -169,18 +169,49 @@ export async function GET(req: NextRequest) { new Map(calendars.map(cal => [cal.id, cal])).values() ); + // Sort calendars: "Mon Calendrier" first, then synced, then groups, then missions + const sortedCalendars = uniqueCalendars.sort((a, b) => { + const aIsMonCalendrier = a.name === "Mon Calendrier"; + const bIsMonCalendrier = b.name === "Mon Calendrier"; + const aIsSynced = a.syncConfig?.syncEnabled && a.syncConfig?.mailCredential; + const bIsSynced = b.syncConfig?.syncEnabled && b.syncConfig?.mailCredential; + const aIsGroup = a.name?.startsWith("Groupe:"); + const bIsGroup = b.name?.startsWith("Groupe:"); + const aIsMission = a.name?.startsWith("Mission:"); + const bIsMission = b.name?.startsWith("Mission:"); + + // "Mon Calendrier" always first + if (aIsMonCalendrier && !bIsMonCalendrier) return -1; + if (!aIsMonCalendrier && bIsMonCalendrier) return 1; + + // Synced calendars second + if (aIsSynced && !bIsSynced) return -1; + if (!aIsSynced && bIsSynced) return 1; + + // Groups third + if (aIsGroup && !bIsGroup && !bIsSynced) return -1; + if (!aIsGroup && bIsGroup && !aIsSynced) return 1; + + // Missions fourth + if (aIsMission && !bIsMission && !bIsGroup && !bIsSynced) return -1; + if (!aIsMission && bIsMission && !aIsGroup && !aIsSynced) return 1; + + // Same type, sort by name + return (a.name || '').localeCompare(b.name || ''); + }); + logger.debug('[CALENDAR] Fetched calendars with events', { userId: session.user.id, personalCount: filteredPersonalCalendars.length, missionCount: missionCalendars.length, - totalCount: uniqueCalendars.length, + totalCount: sortedCalendars.length, filteredOut: personalCalendars.length - filteredPersonalCalendars.length, }); // Cache the results - await cacheCalendarData(session.user.id, uniqueCalendars); + await cacheCalendarData(session.user.id, sortedCalendars); - return NextResponse.json(uniqueCalendars); + return NextResponse.json(sortedCalendars); } catch (error) { logger.error('[CALENDAR] Erreur lors de la récupération des calendriers', { error: error instanceof Error ? error.message : String(error), diff --git a/components/calendar/calendar-client.tsx b/components/calendar/calendar-client.tsx index 9dc17c0..c677b08 100644 --- a/components/calendar/calendar-client.tsx +++ b/components/calendar/calendar-client.tsx @@ -255,15 +255,16 @@ function CalendarDialog({ open, onClose, onSave, onDelete, onSyncSetup, initialD setIsSubmitting(true); try { + // Only update color, preserve name and description from initialData await onSave({ id: initialData?.id, - name, - color, - description + name: initialData?.name || name, // Keep original name + color, // Only color can be changed + description: initialData?.description || description // Keep original description }); resetForm(); } catch (error) { - console.error("Erreur lors de la création du calendrier:", error); + console.error("Erreur lors de la mise à jour du calendrier:", error); } finally { setIsSubmitting(false); } @@ -301,24 +302,36 @@ function CalendarDialog({ open, onClose, onSave, onDelete, onSyncSetup, initialD - {initialData?.id ? "Modifier le calendrier" : "Créer un nouveau calendrier"} + {initialData?.id ? "Paramètres du calendrier" : "Créer un nouveau calendrier"}
-
- - setName(e.target.value)} - placeholder="Nom du calendrier" - required - disabled={isMainCalendar || isMissionOrGroupCalendar} - className="rounded-lg border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 bg-white text-gray-900" - /> -
+ {/* Display calendar name (read-only) */} + {initialData?.id && ( +
+ +
+ {initialData?.name || name} +
+
+ )} + + {/* Name input only for new calendars */} + {!initialData?.id && ( +
+ + setName(e.target.value)} + placeholder="Nom du calendrier" + required + className="rounded-lg border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 bg-white text-gray-900" + /> +
+ )}
@@ -384,20 +397,32 @@ function CalendarDialog({ open, onClose, onSave, onDelete, onSyncSetup, initialD )}
-
- -