'use client' import { useState, useTransition } from 'react' import { caseText } from '@/lib/i18n/cases' import { actionErrorsText, commonText } from '@/lib/i18n/common' import { reclassifyAction, setDueDateAction } from '../actions' import { StatusMap } from '@/components/cases/StatusMap' import type { StatusOption } from '@/lib/cases/lifecycle' /** * 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, status, statusOptions, levels, maxLevel, dueAt, }: { caseNumber: string classification: number status: string /** Zu jedem Zustand des Lebenszyklus, ob er von hier aus geht. */ statusOptions: StatusOption[] levels: { level: number; name: string }[] maxLevel: number /** Als `YYYY-MM-DD`, wie das Datumsfeld es erwartet. Leer heisst: keine. */ dueAt: string }) { 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 (

{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}
) }