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