'use client' import { useState, useTransition } from 'react' import { caseText, entryText } from '@/lib/i18n/cases' import { actionErrorsText, commonText } from '@/lib/i18n/common' import { changeStatusAction, reclassifyAction, setDueDateAction } from '../actions' /** * Statuswechsel und Umklassifizierung. * * Bewusst **nicht** optimistisch: beides ist folgenreich und teils nicht * umkehrbar. Stattdessen ein sofortiger Wartezustand am Knopf und eine klare * Rückmeldung. Siehe docs/09-performance-und-ux.md. */ export function CaseActions({ caseNumber, classification, statusTargets, levels, maxLevel, dueAt, }: { caseNumber: string classification: number statusTargets: string[] levels: { level: number; name: string }[] maxLevel: number /** Als `YYYY-MM-DD`, wie das Datumsfeld es erwartet. Leer heisst: keine. */ dueAt: string }) { const [nextStatus, setNextStatus] = useState(statusTargets[0] ?? '') const [statusReason, setStatusReason] = useState('') const [nextLevel, setNextLevel] = useState(classification) const [levelReason, setLevelReason] = useState('') const [frist, setFrist] = useState(dueAt) const [error, setError] = useState(null) const [pending, startTransition] = useTransition() const lowering = nextLevel < classification function run(action: () => Promise<{ ok: boolean; error?: string }>, confirmText: string) { if (!confirm(confirmText)) return setError(null) startTransition(async () => { const result = await action() if (!result.ok) setError(result.error ?? actionErrorsText.default!) }) } return (
{statusTargets.length > 0 ? (

{caseText.statusChange}

setStatusReason(event.target.value)} placeholder={entryText.changeReason} className="w-56 field" />
{/* Welche Zustände von hier aus erreichbar sind, ergibt sich aus dem Lebenszyklus — aus einem Entwurf führt nur „Offen" heraus. Ohne diesen Satz sieht die kurze Auswahl aus wie ein Fehler. */}

{caseText.statusHints[nextStatus] ?? caseText.statusChangeHint}

) : null}

{caseText.dueAt}

setFrist(event.target.value)} className="field font-mono" />

{caseText.dueAtHint}

{caseText.reclassify}

{/* Eine Herabstufung macht Inhalte für Leute sichtbar, die sie vorher nicht sehen durften. Deshalb ist die Begründung Pflicht. */} {lowering ? ( setLevelReason(event.target.value)} placeholder={caseText.reclassifyReason} className="w-64 field" /> ) : null}
{error ?

{error}

: null}
) }