'use client' import { useState, useEffect, useCallback } from 'react' import { useTheme } from '@/lib/ThemeContext' import { teacherUnavailableWindowApi, teachersApi } from '@/lib/stundenplan/api' import type { TeacherUnavailableWindow, TimetableTeacher } from '@/app/stundenplan/types' const DAYS = [ { v: 1, label: 'Montag' }, { v: 2, label: 'Dienstag' }, { v: 3, label: 'Mittwoch' }, { v: 4, label: 'Donnerstag' }, { v: 5, label: 'Freitag' }, { v: 6, label: 'Samstag' }, { v: 7, label: 'Sonntag' }, ] type FormState = Omit const initialForm: FormState = { teacher_id: '', day_of_week: 2, start_time: '13:00', end_time: '17:00', is_hard: true, weight: 100, active: true, note: '', } export function TeacherUnavailableWindowEditor() { const { isDark } = useTheme() const [items, setItems] = useState([]) const [teachers, setTeachers] = 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 [rules, t] = await Promise.all([teacherUnavailableWindowApi.list(), teachersApi.list()]) setItems(rules || []) setTeachers(t || []) } 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 teacherUnavailableWindowApi.create(form) setForm(initialForm); setShowForm(false); await load() } catch (err) { setError(err instanceof Error ? err.message : 'Anlegen fehlgeschlagen') } finally { setSubmitting(false) } } const handleDelete = async (id: string) => { if (!confirm('Regel wirklich loeschen?')) return try { await teacherUnavailableWindowApi.remove(id); await load() } catch (err) { setError(err instanceof Error ? err.message : 'Loeschen fehlgeschlagen') } } const tLabel = (id: string): string => { const t = teachers.find(x => x.id === id) return t ? `${t.last_name}, ${t.first_name}` : id.slice(0, 8) + '…' } 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' return (

Lehrer: Zeitfenster nicht verfuegbar

Beispiel: „Lehrer Z Dienstags 13:00–17:00 nicht".

{teachers.length === 0 && !loading && (
Zuerst Lehrer anlegen.
)} {error &&
{error}
} {showForm && (
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}`} />
setForm({ ...form, is_hard: e.target.checked })} className="w-5 h-5" />
setForm({ ...form, weight: parseInt(e.target.value) || 0 })} className={`w-full px-3 py-2 rounded-lg border ${inputClass}`} />
setForm({ ...form, note: e.target.value })} className={`w-full px-3 py-2 rounded-lg border ${inputClass}`} />
)} {loading ? (
Laedt…
) : items.length === 0 ? (
Keine Regeln vorhanden.
) : (
{items.map(c => ( ))}
Lehrer Tag Zeitfenster Hart Notiz
{tLabel(c.teacher_id)} {DAYS.find(d => d.v === c.day_of_week)?.label || c.day_of_week} {c.start_time}–{c.end_time} {c.is_hard ? '✓' : '—'} {c.note || '—'}
)}
) }