'use client' import { useState, useEffect, useCallback } from 'react' import { useTheme } from '@/lib/ThemeContext' import { periodsApi } from '@/lib/stundenplan/api' import type { TimetablePeriod, CreateTimetablePeriod } from '@/app/stundenplan/types' const DAYS = [ { v: 1, label: 'Mo' }, { v: 2, label: 'Di' }, { v: 3, label: 'Mi' }, { v: 4, label: 'Do' }, { v: 5, label: 'Fr' }, { v: 6, label: 'Sa' }, { v: 7, label: 'So' }, ] const initialForm: CreateTimetablePeriod = { day_of_week: 1, period_index: 1, start_time: '08:00', end_time: '08:45', is_break: false, label: '', } export function PeriodsManager() { const { isDark } = useTheme() const [items, setItems] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showForm, setShowForm] = useState(false) const [submitting, setSubmitting] = useState(false) const [form, setForm] = useState(initialForm) const load = useCallback(async () => { setLoading(true); setError(null) try { const data = await periodsApi.list() setItems(data || []) } catch (e) { setError(e instanceof Error ? e.message : 'Laden fehlgeschlagen') } finally { setLoading(false) } }, []) useEffect(() => { load() }, [load]) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setSubmitting(true); setError(null) try { await periodsApi.create(form) setForm({ ...initialForm, day_of_week: form.day_of_week, period_index: form.period_index + 1 }) await load() } catch (err) { setError(err instanceof Error ? err.message : 'Anlegen fehlgeschlagen') } finally { setSubmitting(false) } } const handleDelete = async (id: string) => { if (!confirm('Zeitraster-Eintrag wirklich loeschen?')) return try { await periodsApi.remove(id) await load() } catch (err) { setError(err instanceof Error ? err.message : 'Loeschen fehlgeschlagen') } } const cardClass = isDark ? 'bg-white/10 border-white/20 text-white' : 'bg-white/80 border-black/10 text-slate-900' const inputClass = isDark ? 'bg-white/10 border-white/20 text-white' : 'bg-white border-slate-300 text-slate-900' // Group periods by period_index for an at-a-glance week grid. const periodIndices = Array.from(new Set(items.map(i => i.period_index))).sort((a, b) => a - b) const periodByDay = (day: number, idx: number) => items.find(p => p.day_of_week === day && p.period_index === idx) return (

Zeitraster ({items.length})

Pro Wochentag die Stunden-Slots (z.B. 1. Stunde 08:00–08:45).

{error &&
{error}
} {showForm && (
setForm({ ...form, period_index: parseInt(e.target.value) || 1 })} className={`w-full px-3 py-2 rounded-lg border ${inputClass}`} />
setForm({ ...form, is_break: e.target.checked })} className="w-5 h-5" />
setForm({ ...form, start_time: e.target.value })} className={`w-full px-3 py-2 rounded-lg border ${inputClass}`} />
setForm({ ...form, end_time: e.target.value })} className={`w-full px-3 py-2 rounded-lg border ${inputClass}`} />
)} {loading ? (
Laedt…
) : items.length === 0 ? (
Noch kein Zeitraster definiert.
) : (
{DAYS.map(d => )} {periodIndices.map(idx => ( {DAYS.map(d => { const p = periodByDay(d.v, idx) if (!p) return return ( ) })} ))}
Stunde{d.label}
{idx}.
{p.start_time}–{p.end_time}
)}
) }