54 lines
2.1 KiB
TypeScript
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",
|
|
})}
|
|
/>
|
|
);
|
|
}
|