mirror of
https://github.com/complexcaresolutions/dak.c2s.git
synced 2026-03-17 17:13:42 +00:00
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>
95 lines
4.1 KiB
TypeScript
95 lines
4.1 KiB
TypeScript
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' },
|
||
],
|
||
},
|
||
]
|