import Link from "next/link"; import { FileText, Pencil, Plus } from "lucide-react"; import { VorlageAnlegen } from "@/components/vorlage-anlegen"; import { VorlageImportieren } from "@/components/vorlage-importieren"; import { darf } from "@/server/auth/rollen"; import { sitzungErforderlich } from "@/server/auth/sitzungspflicht"; import { kundenEbeneSichtbar } from "@/server/mandant"; import { kundenListe } from "@/server/queries/kunden"; import { vorlagenFilterwerte, vorlagenListe, type VorlagenZeile } from "@/server/queries/vorlagen"; import { FELD } from "@/lib/formular"; /** * Vorlagenliste (#010). * * Die Filter laufen als GET-Formular ueber die Adresse, nicht ueber React-State: * ein gesetzter Filter ist dann verlinkbar, der Zurueck-Knopf tut das Erwartete, * und die Seite bleibt eine Server-Komponente, die nur die sichtbaren Zeilen * ueberhaupt laedt. Die Mandantensicht wenden die Lesemodelle selbst an (#009). */ function Kennzeichen({ zeile }: { zeile: VorlagenZeile }) { return (
{zeile.veroeffentlichteVersion === null ? ( noch nicht veröffentlicht ) : ( v{zeile.veroeffentlichteVersion} )} {zeile.hatEntwurf ? ( Entwurf vorhanden ) : null} {zeile.archiviert ? ( archiviert ) : null} {zeile.kundeName ? ( nur {zeile.kundeName} ) : null}
); } function Zeile({ zeile, darfBearbeiten }: { zeile: VorlagenZeile; darfBearbeiten: boolean }) { return (
  • {/* * Der Entwurf wird direkt verlinkt, wenn es einen gibt. Erst ueber die * Vorlagenseite zu gehen waere ein Klick mehr fuer den haeufigsten Fall: * weiterarbeiten an dem, was man gestern angefangen hat. */} {darfBearbeiten && zeile.entwurfVersionId ? (
  • ); } export default async function VorlagenSeite({ searchParams, }: { searchParams: Promise>; }) { const { benutzer } = await sitzungErforderlich("lesen", "/vorlagen"); const parameter = await searchParams; const einzeln = (name: string): string => (Array.isArray(parameter[name]) ? parameter[name][0] : parameter[name])?.trim() ?? ""; const filter = { suche: einzeln("suche"), kategorie: einzeln("kategorie"), schlagwort: einzeln("schlagwort"), auchArchivierte: einzeln("archiviert") === "1", }; const darfBearbeiten = darf(benutzer.rolle, "vorlagenBearbeiten"); const [zeilen, filterwerte, kundenEbene] = await Promise.all([ vorlagenListe(benutzer, filter), vorlagenFilterwerte(benutzer), kundenEbeneSichtbar(), ]); // Die Kundenwahl im Anlegen-Formular gibt es nur im Modus Dienstleistung. const kunden = kundenEbene ? await kundenListe(benutzer) : []; return ( <>

    Vorlagen

    Eine Vorlage wird veröffentlicht und ist danach unveränderlich. Ein Lauf hängt immer an der Version, mit der er gestartet wurde — deshalb ändert eine neue Veröffentlichung nie einen laufenden oder archivierten Lauf.

    {filter.suche || filter.kategorie || filter.schlagwort || filter.auchArchivierte ? ( zurücksetzen ) : null}
    {zeilen.length === 0 ? (

    Keine Vorlage passt zu diesen Filtern.

    ) : ( )} {darfBearbeiten ? (

    Die neue Vorlage beginnt als Entwurf. Erst das Veröffentlichen macht sie für Läufe verfügbar.

    ({ id, name }))} />
    Vorlage aus einer Datei einspielen
    ) : null} ); }