Files
Laufzettel/src/app/(app)/vorlagen/version/[versionId]/page.tsx
T
florian.wilde e3d80e5982
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
feat(vorlagen): Editor, Liste und Versionsgeschichte (#24)
2026-09-25 08:23:22 +00:00

54 lines
2.1 KiB
TypeScript

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 { 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;
return (
<Editor
version={{
id: version.id,
vorlageId: version.vorlageId,
vorlageName: version.vorlageName,
version: version.version,
veroeffentlicht,
struktur: version.struktur,
stand: version.stand.toISOString(),
aenderungsnotiz: version.aenderungsnotiz,
}}
lesend={veroeffentlicht || !darfBearbeiten}
darfBearbeiten={darfBearbeiten}
// Auf dem Server formatiert: im Browser waere es eine zweite Uhrzeit und
// damit ein Unterschied zwischen Vorrendern und Hydrieren.
beispielDatum={new Date().toLocaleDateString("de-DE", {
day: "2-digit",
month: "2-digit",
year: "numeric",
})}
/>
);
}