import { notFound } from "next/navigation"; import { Editor } from "@/components/vorlagen/editor"; import { VersionStatus } from "@/generated/prisma/enums"; import { darf } from "@/server/auth/rollen"; import { sitzungErforderlich } from "@/server/auth/sitzungspflicht"; import { abteilungsListe } from "@/server/queries/abteilungen"; import { einsetzbareBausteine } from "@/server/queries/bausteine"; import { versionMitAufbau } from "@/server/queries/vorlagen"; /** * Eine Version einer Vorlage im Editor (#010). * * Die Seite prueft ihr Recht selbst — die Huelle darunter ist das zweite Netz, * nicht das erste. `lesen` genuegt zum Ansehen; geaendert werden darf nur ein * Entwurf und nur mit `vorlagenBearbeiten`. Beides entscheidet hier der Server, * der `lesend`-Schalter im Editor ist nur die Anzeige davon: die Server Actions * pruefen dasselbe noch einmal. * * `undefined` aus `versionMitAufbau` heisst „gibt es nicht oder darfst du nicht * sehen“ — die Unterscheidung waere schon die Auskunft, die wir nicht geben. */ export default async function VersionSeite({ params }: { params: Promise<{ versionId: string }> }) { const { versionId } = await params; const { benutzer } = await sitzungErforderlich("lesen", `/vorlagen/version/${versionId}`); const version = await versionMitAufbau(versionId, benutzer); if (!version) notFound(); const darfBearbeiten = darf(benutzer.rolle, "vorlagenBearbeiten"); const veroeffentlicht = version.status === VersionStatus.VEROEFFENTLICHT; /* * Die einsetzbaren Bausteine braucht nur ein Entwurf, den jemand aendern darf * (#030). Eine veroeffentlichte Version bekommt sie trotzdem — sonst stuenden * bei ihren Baustein-Abschnitten statt des Namens nur „nicht mehr verfuegbar“, * und das waere eine Falschaussage ueber die Herkunft. */ const bausteine = await einsetzbareBausteine(); /* * Die gepflegten Abteilungen fuer die Einschraenkung je Abschnitt (#031). * Namen und nicht Kennungen: der Abschnitt gehoert zur Version und muss ein * Umbenennen ueberleben. Dubletten ueber Kunden hinweg fallen weg — die * Einschraenkung gilt ueber den Namen. */ const abteilungen = [ ...new Set( (await abteilungsListe(benutzer)).filter((zeile) => !zeile.archiviert).map((zeile) => zeile.name), ), ].sort((links, rechts) => links.localeCompare(rechts, "de")); return ( ); }