import { de } from '@/lib/i18n/de' import { fillPlaceholders, isInputField } from '@/lib/templates/fields' import { RedactedText } from '@/components/Redacted' import { SectionEditor } from './SectionEditor' import { SectionsForm } from './SectionsForm' import { PhotoField } from '@/components/files/PhotoField' import type { SaveSection, SaveSections } from './types' import type { RenderedSection } from '@/lib/sections/render' /** * Ausgefüllte Vorlage: der Sachstand einer Fallakte oder der Inhalt eines * Dokuments. Beide sind dasselbe Gebilde, deshalb dieselbe Darstellung. * * Feste Textbausteine der Vorlage werden gerendert, nicht bearbeitet - ihre * Platzhalter ziehen die Werte der Eingabefelder. Damit trägt dieselbe * Darstellung ein Formular und einen Vertragstext. * * Gespeichert wird das Blatt als Ganzes: ein Knopf unten, nicht einer je Feld. * Lichtbilder sind die Ausnahme - ein Bild wird hochgeladen und geprüft, das * ist ein eigener Vorgang und keine Feldänderung. */ export function Sections({ scope, save, saveAll, saveAllLabel, sections, canEdit, documentNumber, topic, photoUrls, }: { scope: string save: SaveSection /** Alle geänderten Felder in einem Zug. Fehlt sie, trägt jedes Feld seinen Knopf. */ saveAll?: SaveSections saveAllLabel?: string sections: RenderedSection[] canEdit: boolean /** Nur bei Dokumenten gesetzt: Ziel für das Lichtbild. */ documentNumber?: string /** Thema für die Rückmeldung der Dateiprüfung. */ topic?: string /** Bereits geprüfte Lichtbilder, je Feldschlüssel. */ photoUrls?: Record }) { if (sections.length === 0) { return

{de.section.empty}

} const werte = Object.fromEntries( sections.filter((s) => s.visible).map((s) => [s.fieldKey, s.value]), ) const blatt = (
{sections.map((section) => { const field = section.field // Feste Bausteine der Vorlage. if (!isInputField(field)) { if (field.type === 'pagebreak') return
const text = fillPlaceholders(field.text ?? '', werte) return field.type === 'heading' ? (

{text || field.label}

) : (

{text}

) } if (field.type === 'photo') { // Ohne Dokument gibt es kein Ziel für den Upload - Fallabschnitte // tragen keine Bilder, ihre Dateien hängen an der Akte. if (!documentNumber) { return (
{field.label}
{de.document.photoLater}
) } return ( ) } return (
{field.label} {field.requiredToClose ? ( {de.section.requiredToClose} ) : null}
{!section.visible ? ( // Serverseitig ersetzt: der echte Wert ist gar nicht erst hier.

{de.section.lockedField(section.value.requiredLevel)}

) : section.segments ? (
{canEdit ? ( ) : null}
) : ( )}
) })}
) if (!canEdit || !saveAll) return blatt return ( {blatt} ) }