dak.c2s/frontend/src/pages/cases/fieldConfig.ts
CCS Admin 19db4c5def feat: make all case detail fields editable with edit-mode toggle
Replace individual field editors (KVNR, ICD) with a unified edit-mode
approach using data-driven field configuration. A single "Bearbeiten"
button toggles all fields into edit mode with dirty-tracking and
split-save (KVNR via dedicated endpoint for all users, remaining fields
via admin-only general update endpoint).

- Extend Case TypeScript interface with 17 missing backend fields
- Add declarative field config (7 sections, 30 fields) in fieldConfig.ts
- Add useInlineEdit hook with dirty-tracking and split-save logic
- Add EditableField dual-mode component (text/date/boolean/select/textarea)
- Refactor CaseDetail to render sections from config
- ICD section retains its own endpoint with separate save button

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 11:23:03 +00:00

95 lines
4.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { Case } from '@/types'
export type FieldType = 'text' | 'date' | 'boolean' | 'select' | 'textarea'
export interface FieldConfig {
key: keyof Case
label: string
type: FieldType
colSpan?: 1 | 2
editableBy: 'admin' | 'all'
placeholder?: string
options?: { value: string; label: string }[]
}
export interface SectionConfig {
title: string
fields: FieldConfig[]
}
const ANREDE_OPTIONS = [
{ value: '', label: '' },
{ value: 'Herr', label: 'Herr' },
{ value: 'Frau', label: 'Frau' },
{ value: 'Divers', label: 'Divers' },
]
export const CASE_SECTIONS: SectionConfig[] = [
{
title: 'Persönliche Daten',
fields: [
{ key: 'anrede', label: 'Anrede', type: 'select', editableBy: 'admin', options: ANREDE_OPTIONS },
{ key: 'vorname', label: 'Vorname', type: 'text', editableBy: 'admin', placeholder: 'Vorname' },
{ key: 'nachname', label: 'Nachname', type: 'text', editableBy: 'admin', placeholder: 'Nachname' },
{ key: 'geburtsdatum', label: 'Geburtsdatum', type: 'date', editableBy: 'admin' },
{ key: 'kvnr', label: 'KVNR', type: 'text', editableBy: 'all', placeholder: 'z.B. A123456789' },
{ key: 'versicherung', label: 'Versicherung', type: 'text', editableBy: 'admin', placeholder: 'z.B. DAK' },
],
},
{
title: 'Kontakt',
fields: [
{ key: 'strasse', label: 'Straße', type: 'text', editableBy: 'admin', placeholder: 'Straße + Nr.' },
{ key: 'plz', label: 'PLZ', type: 'text', editableBy: 'admin', placeholder: 'PLZ' },
{ key: 'ort', label: 'Ort', type: 'text', editableBy: 'admin', placeholder: 'Ort' },
{ key: 'email', label: 'E-Mail', type: 'text', editableBy: 'admin', placeholder: 'E-Mail' },
{ key: 'telefonnummer', label: 'Telefon', type: 'text', editableBy: 'admin', placeholder: 'Telefonnummer' },
{ key: 'mobiltelefon', label: 'Mobil', type: 'text', editableBy: 'admin', placeholder: 'Mobilnummer' },
{ key: 'ansprechpartner', label: 'Ansprechpartner', type: 'text', editableBy: 'admin', colSpan: 2, placeholder: 'Ansprechpartner' },
],
},
{
title: 'Falldetails',
fields: [
{ key: 'kurzbeschreibung', label: 'Kurzbeschreibung', type: 'textarea', editableBy: 'admin', colSpan: 2 },
{ key: 'fragestellung', label: 'Fragestellung', type: 'textarea', editableBy: 'admin', colSpan: 2 },
{ key: 'kommentar', label: 'Kommentar', type: 'textarea', editableBy: 'admin', colSpan: 2 },
{ key: 'sonstiges', label: 'Sonstiges', type: 'textarea', editableBy: 'admin', colSpan: 2 },
],
},
{
title: 'Unterlagen',
fields: [
{ key: 'unterlagen', label: 'Unterlagen vorhanden', type: 'boolean', editableBy: 'admin' },
{ key: 'erhalten', label: 'Erhalten', type: 'boolean', editableBy: 'admin' },
{ key: 'unterlagen_verschickt', label: 'Verschickt am', type: 'date', editableBy: 'admin' },
{ key: 'unterlagen_erhalten', label: 'Erhalten am', type: 'date', editableBy: 'admin' },
{ key: 'unterlagen_an_gutachter', label: 'An Gutachter am', type: 'date', editableBy: 'admin' },
],
},
{
title: 'Gutachten',
fields: [
{ key: 'gutachten', label: 'Gutachten vorhanden', type: 'boolean', editableBy: 'admin' },
{ key: 'gutachter', label: 'Gutachter', type: 'text', editableBy: 'admin', placeholder: 'Name des Gutachters' },
{ key: 'gutachten_erstellt', label: 'Erstellt am', type: 'date', editableBy: 'admin' },
{ key: 'gutachten_versendet', label: 'Versendet am', type: 'date', editableBy: 'admin' },
{ key: 'schweigepflicht', label: 'Schweigepflichtentbindung', type: 'boolean', editableBy: 'admin' },
],
},
{
title: 'Status',
fields: [
{ key: 'ablehnung', label: 'Ablehnung', type: 'boolean', editableBy: 'admin' },
{ key: 'abbruch', label: 'Abbruch', type: 'boolean', editableBy: 'admin' },
{ key: 'abbruch_datum', label: 'Abbruch-Datum', type: 'date', editableBy: 'admin' },
],
},
{
title: 'Abrechnung',
fields: [
{ key: 'abgerechnet', label: 'Abgerechnet', type: 'boolean', editableBy: 'admin' },
{ key: 'abrechnung_datum', label: 'Abrechnungsdatum', type: 'date', editableBy: 'admin' },
],
},
]