'use client' import * as React from 'react' import { useActionState } from 'react' import { AlertCircle, AlertTriangle, CheckCircle2, Copy, Pencil, Plus, Trash2 } from 'lucide-react' import { Alert, AlertDescription } from '@/components/ui/alert' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { Feld } from '@/components/feld' import { Absendeknopf } from '@/components/finanzen/eingaben' import { vorlageLoeschen, vorlageSpeichern, type VorlagenZustand, } from '@/server/actions/vorlagen' import { PLATZHALTER, benutztePlatzhalter } from '@/lib/schreiben/platzhalter' export type VorlagenZeile = { id: string name: string betreff: string text: string } export type MitgelieferteVorlage = { schluessel: string name: string beschreibung: string betreff: string text: string } /** * Verwaltung der eigenen Schreibvorlagen. * * Zwei Listen, ein Editor. Die mitgelieferten Vorlagen sind Code und * unveränderlich — von ihnen führt nur ein Weg hierher: „Als Kopie * übernehmen". Damit kann nichts kaputtgehen, was die Anwendung braucht, * und „wiederherstellen" ist schlicht: noch einmal kopieren. */ export function VorlagenVerwaltung({ betreuteId, eigene, mitgelieferte, }: { betreuteId: string eigene: VorlagenZeile[] mitgelieferte: MitgelieferteVorlage[] }) { const [offen, setOffen] = React.useState(false) const [bearbeitet, setBearbeitet] = React.useState(null) const [name, setName] = React.useState('') const [betreff, setBetreff] = React.useState('') const [text, setText] = React.useState('') function neuBeginnen(vorlage?: Partial) { setBearbeitet(null) setName(vorlage?.name ?? '') setBetreff(vorlage?.betreff ?? '') setText(vorlage?.text ?? '') setOffen(true) } function bearbeiten(vorlage: VorlagenZeile) { setBearbeitet(vorlage) setName(vorlage.name) setBetreff(vorlage.betreff) setText(vorlage.text) setOffen(true) } return (
{/* --- Eigene Vorlagen ---------------------------------------------- */} Eigene Vorlagen Formulierungen, die sich bewährt haben — einmal hinterlegt, beim Schreiben wählbar. {eigene.length === 0 ? (

Noch keine eigene Vorlage. Fang mit einer Kopie einer mitgelieferten an — oder mit einem leeren Blatt.

) : (
    {eigene.map((vorlage) => (
  • {vorlage.name}

    {benutztePlatzhalter(vorlage.text).length} Platzhalter {vorlage.betreff ? ` · Betreff: ${vorlage.betreff}` : ''}

  • ))}
)}
{/* --- Mitgelieferte ------------------------------------------------- */} Mitgelieferte Vorlagen Unveränderlich — sie sind Teil der Anwendung und lassen sich nicht kaputtmachen. Als Grundlage für eigene Fassungen: kopieren und anpassen.
    {mitgelieferte.map((vorlage) => (
  • {vorlage.name}

    {vorlage.beschreibung}

    mitgeliefert
  • ))}
{/* --- Editor --------------------------------------------------------- */} {offen && ( setOffen(false)} /> )}
) } function VorlageLoeschKnopf({ betreuteId, vorlage, }: { betreuteId: string vorlage: VorlagenZeile }) { const [zustand, absenden] = useActionState(vorlageLoeschen, {}) const [gefragt, setGefragt] = React.useState(false) if (!gefragt) { return ( <> {zustand.fehler && {zustand.fehler}} ) } return (
In den Papierkorb
) } /** * Der Editor mit der Platzhalterliste daneben. * * Die Warnung zum Bestellungsabsatz kommt vom Server (zweistufig): Der * erste Speicherversuch ohne ihn liefert die Warnung zurück, erst die * Bestätigung speichert wirklich. So bleibt die Prüfung an EINER Stelle — * eine zweite Prüfung im Browser könnte von der Serverfassung abweichen. */ function VorlagenEditor({ betreuteId, vorlageId, name, betreff, text, onName, onBetreff, onText, onSchliessen, }: { betreuteId: string vorlageId: string name: string betreff: string text: string onName: (wert: string) => void onBetreff: (wert: string) => void onText: (wert: string) => void onSchliessen: () => void }) { const [zustand, absenden] = useActionState(vorlageSpeichern, {}) const [trotzdem, setTrotzdem] = React.useState(false) const textfeld = React.useRef(null) function platzhalterEinfuegen(platzhalterName: string) { const feld = textfeld.current const einschub = `{{${platzhalterName}}}` if (!feld) { onText(`${text}${einschub}`) return } const start = feld.selectionStart ?? text.length const ende = feld.selectionEnd ?? text.length onText(`${text.slice(0, start)}${einschub}${text.slice(ende)}`) } return ( {vorlageId ? 'Vorlage bearbeiten' : 'Neue Vorlage'}
{zustand.fehler && ( )} {zustand.warnung && ( )} {zustand.erfolg && ( )} onName(ereignis.target.value)} maxLength={120} placeholder="z. B. Auskunftsersuchen Krankenkasse" /> onBetreff(ereignis.target.value)} maxLength={200} />