diff --git a/src/app/dashboard/kalender/_components/calendar-overview-client.tsx b/src/app/dashboard/kalender/_components/calendar-overview-client.tsx index 889df2a..2009011 100644 --- a/src/app/dashboard/kalender/_components/calendar-overview-client.tsx +++ b/src/app/dashboard/kalender/_components/calendar-overview-client.tsx @@ -62,6 +62,8 @@ const categories = [ { label: "Fest", type: TerminType.KITA_FEST, color: "var(--good)" }, { label: "Geburtstag", type: TerminType.GEBURTSTAG_INTERN, color: "oklch(0.50 0.10 320)" }, { label: "Elterndienst", type: "elterndienst", color: "oklch(0.60 0.15 160)" }, + { label: "Mein Notdienst", type: "mein-notdienst", color: "oklch(0.60 0.18 45)" }, + { label: "Notdienst", type: "notdienst", color: "oklch(0.75 0.10 50)" }, { label: "Sonstiges", type: TerminType.SONSTIGES, color: "var(--ink-muted)" }, ]; @@ -113,15 +115,26 @@ export function CalendarOverviewClient({ ? item.description.toLowerCase().includes(query) : false; const familyMatch = - item.kind === "duty" && item.familyName + (item.kind === "duty" || item.kind === "notdienst") && item.familyName ? item.familyName.toLowerCase().includes(query) : false; - if (!titleMatch && !descMatch && !familyMatch) return false; + const childMatch = + item.kind === "notdienst" && item.childName + ? item.childName.toLowerCase().includes(query) + : false; + if (!titleMatch && !descMatch && !familyMatch && !childMatch) return false; } // 2. Category filter if (activeTypes.size > 0) { - const itemType = item.kind === "duty" ? "elterndienst" : item.type; + const itemType = + item.kind === "duty" + ? "elterndienst" + : item.kind === "notdienst" + ? item.isOwn + ? "mein-notdienst" + : "notdienst" + : item.type; if (!activeTypes.has(itemType)) return false; } @@ -309,6 +322,59 @@ export function CalendarOverviewClient({ )} + ) : item.kind === "notdienst" ? ( +
+
+
+
+

+ {item.title} +

+ + {item.isOwn ? "Mein Notdienst" : "Notdienst"} + +
+

+ Kind: {item.childName} (Familie: {item.familyName}) +

+

+ + {format(new Date(item.startDate), "dd.MM.yyyy")} +

+ {isAdmin && ( +
+ + + +
+ )} +
+
) : (
{group.items.map((item) => { - const isTermin = item.kind === "termin"; - const color = isTermin ? getCategoryColor(item.type) : "oklch(0.60 0.15 160)"; + const color = + item.kind === "termin" + ? getCategoryColor(item.type) + : item.kind === "notdienst" + ? item.isOwn + ? "oklch(0.60 0.18 45)" + : "oklch(0.75 0.10 50)" + : "oklch(0.60 0.15 160)"; return (
{item.title} - {isTermin ? ( + {item.kind === "termin" ? ( {getTypeLabel(item.type)} + ) : item.kind === "notdienst" ? ( + + {item.isOwn ? "Mein Notdienst" : "Notdienst"} + ) : ( Elterndienst )} - {isTermin && item.status === TerminStatus.PENDING && ( + {item.kind === "termin" && item.status === TerminStatus.PENDING && ( Ausstehend )}

- {isTermin + {item.kind === "termin" ? item.allDay ? "Ganztägig" : `${format(new Date(item.startDate), "HH:mm")} - ${format( new Date(item.endDate), "HH:mm", )}` + : item.kind === "notdienst" + ? `${format(new Date(item.startDate), "dd.MM.yyyy")} (ganztägig)` : `${format(new Date(item.startDate), "dd.MM.")} - ${format( new Date(item.endDate), "dd.MM.yyyy", )}`} - {isTermin && } - {isTermin ? "Kita" : `Familie: ${item.familyName}`} + {item.kind === "termin" && } + {item.kind === "termin" + ? "Kita" + : item.kind === "notdienst" + ? `Kind: ${item.childName} · Familie: ${item.familyName}` + : `Familie: ${item.familyName}`}

- {isTermin && item.description && ( + {item.kind === "termin" && item.description && (

{item.description}

@@ -697,7 +791,7 @@ function AgendaView({
{/* Actions for admins */} - {isAdmin && isTermin && ( + {isAdmin && item.kind === "termin" && (
item.kind === "duty" ? ( + ) : item.kind === "notdienst" ? ( + ) : ( ), @@ -474,3 +488,64 @@ function getTypeLabel(type: TerminType): string { return "Sonstiges"; } } + +function NotdienstRow({ notdienst, isAdmin }: { notdienst: NotdienstCalendarItemDto; isAdmin: boolean }) { + const color = notdienst.isOwn ? "oklch(0.60 0.18 45)" : "oklch(0.75 0.10 50)"; + const [menuOpen, setMenuOpen] = useState(false); + + return ( +
+
+ +
+

+ {notdienst.title} +

+

+ + {format(notdienst.startDate, "dd.MM.yyyy", { locale: de })} (ganztägig) + + + Kind: {notdienst.childName} + +

+
+
+ + {notdienst.isOwn ? "Mein Notdienst" : "Notdienst"} + + {isAdmin ? ( +
+ + {menuOpen && ( + <> + + ) : ( +
+ )} +
+
+ ); +} diff --git a/src/app/dashboard/kalender/page.tsx b/src/app/dashboard/kalender/page.tsx index b06e081..37ed688 100644 --- a/src/app/dashboard/kalender/page.tsx +++ b/src/app/dashboard/kalender/page.tsx @@ -148,6 +148,32 @@ export default async function KalenderPage({ orderBy: { startDate: "asc" }, }); + const notdienstAssignmentRows = await prisma.notdienstAssignment.findMany({ + where: { + kitaId: session.user.kitaId, + plan: { + status: "PUBLISHED", + }, + }, + select: { + id: true, + date: true, + child: { + select: { + firstName: true, + lastName: true, + familyId: true, + family: { + select: { + name: true, + }, + }, + }, + }, + }, + orderBy: { date: "asc" }, + }); + const allUserTermine: CalendarListItemDto[] = [ ...confirmedTermineRows.map((termin) => ({ ...termin, @@ -178,6 +204,21 @@ export default async function KalenderPage({ startDate: assignment.startDate, endDate: assignment.endDate, })), + ...notdienstAssignmentRows.map((assignment) => { + const isOwn = assignment.child.familyId === familyIdForParticipation; + return { + kind: "notdienst" as const, + id: assignment.id, + title: isOwn + ? `Mein Notdienst (${assignment.child.firstName})` + : `Notdienst (${assignment.child.family.name})`, + familyName: assignment.child.family.name, + childName: `${assignment.child.firstName} ${assignment.child.lastName}`, + isOwn, + startDate: assignment.date, + endDate: assignment.date, + }; + }), ].sort((a, b) => a.startDate.getTime() - b.startDate.getTime()); let allPendingTermine: PendingTerminDto[] = [];