'use client' import { useState, useEffect } from 'react' import { subjectPreferredPeriodApi, subjectsApi } from '@/lib/stundenplan/api' import type { SubjectPreferredPeriod, TimetableSubject } from '@/app/stundenplan/types' import { useConstraintCrud, ConstraintShell, useShellStyles } from './_shell' type FormState = Omit const initialForm: FormState = { subject_id: '', period_from: 1, period_to: 4, is_hard: false, weight: 40, active: true, note: '', } export function SubjectPreferredPeriodEditor() { const styles = useShellStyles() const crud = useConstraintCrud(subjectPreferredPeriodApi, initialForm, { onBeforeSubmit: (f) => f.period_to < f.period_from ? '"Bis"-Stunde darf nicht kleiner sein als "Von"-Stunde.' : null, }) const [subjects, setSubjects] = useState([]) useEffect(() => { subjectsApi.list().then(setSubjects).catch(() => setSubjects([])) }, []) const sLabel = (id: string): string => { const s = subjects.find(x => x.id === id) return s ? `${s.name} (${s.short_code})` : id.slice(0, 8) + '…' } return (
crud.setForm({ ...crud.form, period_from: parseInt(e.target.value) || 1 })} className={`w-full px-3 py-2 rounded-lg border ${styles.inputClass}`} />
crud.setForm({ ...crud.form, period_to: parseInt(e.target.value) || 1 })} className={`w-full px-3 py-2 rounded-lg border ${styles.inputClass}`} />
crud.setForm({ ...crud.form, weight: parseInt(e.target.value) || 0 })} className={`w-full px-3 py-2 rounded-lg border ${styles.inputClass}`} />
crud.setForm({ ...crud.form, is_hard: e.target.checked })} className="w-5 h-5" />
} renderRow={(item) => { const c = item as SubjectPreferredPeriod return ( {sLabel(c.subject_id)} Stunde {c.period_from}–{c.period_to} {c.is_hard ? '✓' : '—'} {c.weight} ) }} /> ) }