'use client'; import { useState, useEffect, useMemo } from 'react'; import { format, parseISO } from 'date-fns'; import { SubstitutionData, ChangeEntry } from '@/lib/types'; import { Button } from '@/components/ui/button'; import { Card } from '@/components/ui/card'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Label } from '@/components/ui/label'; import TakesPlace from '@/components/own/takes-place'; import { TeacherAbsenceItem } from '@/components/own/teacher-absence'; import UpdateStatus from '@/components/own/update-status'; interface SubstitutionViewerProps { initialData: SubstitutionData | null; } export default function SubstitutionViewer({ initialData }: SubstitutionViewerProps) { const data = initialData; const [selectedDate, setSelectedDate] = useState(''); useEffect(() => { if (data?.schedule) { const dates = Object.keys(data.schedule).sort(); if (dates.length > 0) { if (!selectedDate || !data.schedule[selectedDate]) { setSelectedDate(dates[0]); } } } }, [data, selectedDate]); const currentDayData = data?.schedule?.[selectedDate]; const dates = data ? Object.keys(data.schedule).sort() : []; if (!data) { return (

Nepodařilo se načíst data.

); } return (
{currentDayData ? (

Změny v rozvrhu

Absence učitelů

{currentDayData.absence.length > 0 ? (
{currentDayData.absence.map((entry, idx) => ( ))}
) : (
Žádní učitelé nemají absenci
)}
) : (

Pro vybrané datum nejsou k dispozici žádná data.

)}
); } function SubstitutionsTable({ changes }: { changes: Record }) { const sortedClasses = useMemo(() => { return Object.keys(changes).sort((a, b) => { const regex = /^([A-Z]+)(\d+)([a-z]*)$/; const ma = a.match(regex); const mb = b.match(regex); if (ma && mb) { const [, pa, na, sa] = ma; const [, pb, nb, sb] = mb; const numDiff = parseInt(na) - parseInt(nb); if (numDiff !== 0) return numDiff; const prefixDiff = pa.localeCompare(pb); if (prefixDiff !== 0) return prefixDiff; return sa.localeCompare(sb); } return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' }); }); }, [changes]); const maxHours = useMemo(() => { let max = 0; Object.values(changes).forEach(list => { if (list.length > max) max = list.length; }); return max; }, [changes]); const hours = Array.from({ length: maxHours }, (_, i) => i + 1); return (
{hours.map(h => ( ))} {sortedClasses.map((className) => ( {hours.map((_, idx) => { const change = changes[className][idx]; return ( ); })} ))}
{h}
{className} {change ? (
{change.text}
) : (
)}
); }