'use client' import { useState, useEffect } from 'react' import { classMaxHoursDayApi, classNoGapsApi, classesApi } from '@/lib/stundenplan/api' import type { ClassMaxHoursDay, ClassNoGaps, TimetableClass, } from '@/app/stundenplan/types' import { useConstraintCrud, ConstraintShell, useShellStyles } from './_shell' function useClasses() { const [classes, setClasses] = useState([]) useEffect(() => { classesApi.list().then(setClasses).catch(() => setClasses([])) }, []) return classes } function cLabel(classes: TimetableClass[], id: string): string { const c = classes.find(x => x.id === id) return c ? c.name : id.slice(0, 8) + '…' } // ---------- Max Hours / Day ---------- type DayForm = Omit const initialDay: DayForm = { class_id: '', max_hours: 6, is_hard: true, weight: 100, active: true, note: '' } export function ClassMaxHoursDayEditor() { const styles = useShellStyles() const classes = useClasses() const crud = useConstraintCrud(classMaxHoursDayApi, initialDay) return (
crud.setForm({ ...crud.form, max_hours: 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 ClassMaxHoursDay return ( {cLabel(classes, c.class_id)} {c.max_hours} {c.is_hard ? '✓' : '—'} {c.weight} ) }} /> ) } // ---------- No Gaps ---------- type GapForm = Omit const initialGap: GapForm = { class_id: '', is_hard: false, weight: 80, active: true, note: '' } export function ClassNoGapsEditor() { const styles = useShellStyles() const classes = useClasses() const crud = useConstraintCrud(classNoGapsApi, initialGap) return (
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 ClassNoGaps return ( {cLabel(classes, c.class_id)} {c.is_hard ? '✓' : '—'} {c.weight} ) }} /> ) }