Files
betreuungs-cockpit/src/app/(app)/einstellungen/page.tsx
T
Florian Wilde f8d7752c27 Eigene Vorlagen fuer Anschreiben
Wer zum dritten Mal denselben Brief tippt, tippt ihn beim vierten Mal
falsch. Neu unter Einstellungen -> Schreibvorlagen: eigene Texte
hinterlegen, beim freien Schreiben auswaehlen, Platzhalter fuellen sich
aus den Daten, die ohnehin im System stehen.

Aufbau:
- Die Ersetzung als reine Funktionen in schreiben/platzhalter.ts. Drei
  Faelle, keiner davon still: Wert einsetzen, sichtbare Luecke
  [Aktenzeichen des Gerichts], unbekannter Platzhalter markiert. Ein
  Tippfehler in der Vorlage darf das Schreiben nicht verhindern - aber
  er muss ins Auge springen.
- Die Bestellungsabsatz-Warnung ist zweistufig: Der erste Speicherversuch
  ohne ihn kommt mit einer Rueckfrage zurueck, erst die Bestaetigung
  speichert. Ohne den Nachweis der Vertretungsmacht kommt keine Auskunft,
  und das faellt erst nach vier Wochen auf. Ein ausformulierter Absatz
  zaehlt so viel wie der Platzhalter, ein halber Nachweis ("Beschluss der
  Eigentuemerversammlung") nicht.
- Vier mitgelieferte Vorlagen bleiben Code und damit unveraenderlich;
  "Als Kopie uebernehmen" legt eine eigene Fassung an. Fuer Rueckkaufswert
  und Kuendigung fuehrt die Oberflaeche weiter zuerst zu den
  fallbezogenen Erzeugern - die rechnen Kuendigungstermine aus, was eine
  Vorlage nicht kann.
- Vorlagen haengen an der betreuten Person, nicht am Benutzer: Sie
  beziehen sich auf ihren Fall, liegen im Papierkorb wie alles andere und
  sind im Vollexport ihrer Akte enthalten.

Der Editor haelt Betreff und Text als eigenen State. Beim Wechsel der
Vorlage ueberlebte der alte Entwurf die Navigation, die Vorlage kam nie
im Textfeld an - ein key auf dem Editor setzt ihn neu auf. Gefunden hat
das erst der End-to-End-Test.

Geprueft: dreizehn Einheitstests fuer die Ersetzung, sechs
End-to-End-Tests fuer Warnung, Kopie, Aufloesung und Papierkorb.

Refs #7
2026-08-23 13:41:51 +02:00

109 lines
4.0 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 Link from 'next/link'
import { KeyRound, FileText, Trash2, Users } from 'lucide-react'
import { SeitenKopf } from '@/components/seiten-kopf'
import { Card, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
import { erfordereBenutzer } from '@/lib/auth/sitzung'
import { ROLLEN_BESCHRIFTUNG } from '@/lib/auth/rollen'
export const metadata = { title: 'Einstellungen' }
/**
* Einstiegsseite der Einstellungen.
*
* Hier liegt alles, was nicht zur Akte gehoert, sondern zur Anwendung
* selbst: wer sie benutzen darf, wer was davon sehen darf, und was
* geloescht, aber noch nicht weg ist.
*/
export default async function EinstellungenSeite() {
const benutzer = await erfordereBenutzer('/einstellungen')
const istAdmin = benutzer.rolle === 'ADMIN'
return (
<div className="space-y-6">
<SeitenKopf
titel="Einstellungen"
pfad={[{ titel: 'Einstellungen' }]}
beschreibung={
<>
Angemeldet als {benutzer.name}{' '}
<Badge variant="outline">{ROLLEN_BESCHRIFTUNG[benutzer.rolle]}</Badge>
</>
}
/>
<div className="grid gap-4 md:grid-cols-2">
{istAdmin && (
<Card>
<CardHeader className="flex flex-row items-start gap-3 space-y-0">
<Users className="mt-0.5 size-5 shrink-0 text-primary" aria-hidden="true" />
<div>
<CardTitle className="text-lg">
<Link href="/einstellungen/benutzer" className="underline-offset-4 hover:underline">
Benutzer
</Link>
</CardTitle>
<CardDescription className="mt-1">
Anlegen, Rolle ändern, deaktivieren, alle Geräte abmelden. Nur für
Administratoren.
</CardDescription>
</div>
</CardHeader>
</Card>
)}
<Card>
<CardHeader className="flex flex-row items-start gap-3 space-y-0">
<KeyRound className="mt-0.5 size-5 shrink-0 text-primary" aria-hidden="true" />
<div>
<CardTitle className="text-lg">
<Link href="/einstellungen/freigaben" className="underline-offset-4 hover:underline">
Freigaben
</Link>
</CardTitle>
<CardDescription className="mt-1">
Wer darf welche Bereiche der Akte lesen? Mitleser bekommen einzelne Bereiche
freigegeben – schreiben dürfen sie nie.
</CardDescription>
</div>
</CardHeader>
</Card>
<Card>
<CardHeader className="flex flex-row items-start gap-3 space-y-0">
<FileText className="mt-0.5 size-5 shrink-0 text-primary" aria-hidden="true" />
<div>
<CardTitle className="text-lg">
<Link href="/einstellungen/vorlagen" className="underline-offset-4 hover:underline">
Schreibvorlagen
</Link>
</CardTitle>
<CardDescription className="mt-1">
Bewährte Formulierungen mit Platzhaltern hinterlegen – beim Erzeugen eines
Schreibens wählbar.
</CardDescription>
</div>
</CardHeader>
</Card>
<Card>
<CardHeader className="flex flex-row items-start gap-3 space-y-0">
<Trash2 className="mt-0.5 size-5 shrink-0 text-primary" aria-hidden="true" />
<div>
<CardTitle className="text-lg">
<Link href="/einstellungen/papierkorb" className="underline-offset-4 hover:underline">
Papierkorb
</Link>
</CardTitle>
<CardDescription className="mt-1">
Was in den letzten 30 Tagen gelöscht wurde – wiederherstellbar, bis die Frist
abgelaufen ist.
</CardDescription>
</div>
</CardHeader>
</Card>
</div>
</div>
)
}