'use client'; import { useActionState, useState } from 'react'; import { Absenden, Meldung } from '@/komponenten/Formularmeldung'; import { blattEinreichen, blattSpeichern, type Rueckmeldung } from './aktionen'; import { pruefeWochenblatt, summeStunden, type Wochenblatt } from '@/lib/berichtsheft/pruefung'; import type { Vorschlag } from '@/lib/berichtsheft/vorschlaege'; /** * Das Wochenblatt zum Ausfüllen. * * Die Prüfung läuft im Browser mit, während getippt wird – dieselbe Funktion, * die auch serverseitig verwendet wird. Sie warnt, sie sperrt nicht: Der Knopf * zum Einreichen bleibt immer bedienbar. */ export function Blattformular({ berichtId, anfangsblatt, vorschlaege, status, }: { berichtId: string; anfangsblatt: Wochenblatt; vorschlaege: Vorschlag[]; status: string; }) { const [blatt, setzeBlatt] = useState(() => ({ betrieb: anfangsblatt.betrieb.length > 0 ? anfangsblatt.betrieb : [{ text: '', stunden: 0 }], schule: anfangsblatt.schule.length > 0 ? anfangsblatt.schule : [{ lernfeld: '', themen: '', stunden: 0 }], sonstiges: anfangsblatt.sonstiges, })); const [uebernommen, setzeUebernommen] = useState([]); const [speicherZustand, speichern] = useActionState(blattSpeichern, {}); const [einreichZustand, einreichen] = useActionState(blattEinreichen, {}); const gesperrt = status === 'abgezeichnet'; const warnungen = pruefeWochenblatt(blatt); const ernste = warnungen.filter((w) => w.schwere === 'warnung'); function betriebAendern(stelle: number, teil: Partial<{ text: string; stunden: number }>) { setzeBlatt((v) => ({ ...v, betrieb: v.betrieb.map((e, i) => (i === stelle ? { ...e, ...teil } : e)), })); } function schuleAendern(stelle: number, teil: Partial<{ lernfeld: string; themen: string; stunden: number }>) { setzeBlatt((v) => ({ ...v, schule: v.schule.map((e, i) => (i === stelle ? { ...e, ...teil } : e)), })); } function uebernehmen(vorschlag: Vorschlag) { setzeUebernommen((v) => [...v, vorschlag.id]); if (vorschlag.ziel === 'schule') { setzeBlatt((v) => { const leer = v.schule.findIndex((e) => e.lernfeld === '' && e.themen === ''); const neu = { lernfeld: vorschlag.herkunft, themen: vorschlag.text, stunden: vorschlag.stunden }; return { ...v, schule: leer >= 0 ? v.schule.map((e, i) => (i === leer ? neu : e)) : [...v.schule, neu], }; }); return; } setzeBlatt((v) => { const leer = v.betrieb.findIndex((e) => e.text.trim() === ''); const neu = { text: vorschlag.text, stunden: vorschlag.stunden }; return { ...v, betrieb: leer >= 0 ? v.betrieb.map((e, i) => (i === leer ? neu : e)) : [...v.betrieb, neu], }; }); } const offeneVorschlaege = vorschlaege.filter((v) => !uebernommen.includes(v.id)); return (
{!gesperrt && offeneVorschlaege.length > 0 ? (

Vorschläge aus dieser Woche

Übernehmen und dann in eigene Worte bringen. Ein wörtlich übernommener Satz ist kein Ausbildungsnachweis, und die Stundenangabe ist nur ein Anhaltspunkt.

    {offeneVorschlaege.map((vorschlag) => (
  • ))}
) : null}
{/* --- Betriebliche Tätigkeiten --- */}

Betriebliche Tätigkeiten und Unterweisungen

{zahlText(summeStunden({ ...blatt, schule: [] }))} h
{blatt.betrieb.map((eintrag, stelle) => (