'use client'; import { useMemo } from 'react'; import { format, startOfWeek, addDays, parseISO } from 'date-fns'; import { cs } from 'date-fns/locale'; import { LocalData, SubstitutionData, ChangeEntry, Hour } from '@/lib/types'; import { Card } from '@/components/ui/card'; interface ScheduleViewerProps { localData: LocalData; substitutionData: SubstitutionData | null; } function getChangesForClass(changes: Record | undefined, className: string): (ChangeEntry | null)[] { if (!changes) return []; if (changes[className]) return changes[className]; const key = Object.keys(changes).find(k => k.toLowerCase() === className.toLowerCase()); if (key) return changes[key]; return []; } export default function ScheduleViewer({ localData, substitutionData }: ScheduleViewerProps) { const referenceDate = useMemo(() => { if (substitutionData?.schedule) { const dates = Object.keys(substitutionData.schedule).sort(); if (dates.length > 0) { return parseISO(dates[0]); } } return new Date(); }, [substitutionData]); const mondayDate = useMemo(() => { return startOfWeek(referenceDate, { weekStartsOn: 1 }); }, [referenceDate]); const weekDays = useMemo(() => { return Array.from({ length: 5 }, (_, i) => addDays(mondayDate, i)); }, [mondayDate]); const maxHours = useMemo(() => { let max = 0; localData.timetable.forEach(day => { if (day.length > max) max = day.length; }); return max; }, [localData]); const currentWeekMaxHours = useMemo(() => { let max = maxHours; if (substitutionData?.schedule) { weekDays.forEach(date => { const dateStr = format(date, 'yyyy-MM-dd'); const dayData = substitutionData.schedule[dateStr]; if (dayData && dayData.changes) { const changes = getChangesForClass(dayData.changes, localData.class); if (changes.length > max) max = changes.length; } }); } return max; }, [maxHours, substitutionData, weekDays, localData.class]); const hours = Array.from({ length: currentWeekMaxHours }, (_, i) => i + 1); return (
Zobrazen týden od {format(mondayDate, 'd. M.', { locale: cs })} do {format(weekDays[4], 'd. M. yyyy', { locale: cs })}
{hours.map(h => ( ))} {weekDays.map((date, dayIndex) => { const dateStr = format(date, 'yyyy-MM-dd'); const dayName = format(date, 'EEEE', { locale: cs }); const staticDay = localData.timetable[dayIndex] || []; const dynamicDay = substitutionData?.schedule?.[dateStr]; const changes = getChangesForClass(dynamicDay?.changes, localData.class); const has3 = hours.some((_, hourIndex) => staticDay[hourIndex].length == 3); return ( {hours.map((_, hourIndex) => { const change = changes[hourIndex]; const staticLessons = staticDay[hourIndex] || []; return ( ); })} ); })}
Den {h}
{dayName}
{format(date, 'd. M.')}
); } function CellContent({ staticLessons, change }: { staticLessons: Hour[], change: ChangeEntry | null | undefined }) { if (change) { return (
{change.text}
); } if (!staticLessons || staticLessons.length === 0) { return null; } if (staticLessons.length > 1) { return (
{staticLessons.map((lesson, idx) => (
{lesson.subject}
{lesson.teacher.code}
{lesson.room} {lesson.group}
))}
); } const lesson = staticLessons[0]; return (
{lesson.subject}
{lesson.room}
{lesson.teacher.code}
); }