feat(doku): Anleitung, PDF und Ende-zu-Ende-Abnahme (#36)
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s

This commit was merged in pull request #36.
This commit is contained in:
2026-09-26 09:04:15 +00:00
parent 9bd198a531
commit fbbb634e56
104 changed files with 4527 additions and 299 deletions
+67
View File
@@ -0,0 +1,67 @@
import Link from "next/link";
import { ShieldAlert } from "lucide-react";
import { ROLLEN_TEXT } from "@/lib/rollen-text";
import { sitzungErforderlich } from "@/server/auth/sitzungspflicht";
/**
* „Dafür fehlt dir die Berechtigung“ — für jemanden, der **angemeldet** ist (#018).
*
* Vorher schickte `sitzungErforderlich` ihn auf `/anmelden?fehler=keinrecht`, und
* die Anmeldeseite leitete einen Angemeldeten sofort auf die Übersicht weiter:
* die Erklärung war unerreichbar, er stand ohne Hinweis da und wusste nicht, ob
* er sich verklickt hatte oder ob etwas kaputt ist. Der Kommentar in
* `sitzungspflicht.ts` versprach „eine Weiterleitung mit Erklärung“ — die
* Erklärung fehlte.
*
* Die Seite sagt deshalb drei Dinge: dass es an der Rolle liegt, welche Rolle er
* hat, und wohin er stattdessen kann. Sie nennt **nicht**, welche Rolle nötig
* wäre — das ist eine Auskunft über die Rechteverteilung, und wer sie braucht,
* fragt den Administrator.
*/
export default async function KeinZugriffSeite({
searchParams,
}: {
searchParams: Promise<Record<string, string | string[] | undefined>>;
}) {
const { benutzer } = await sitzungErforderlich(undefined, "/kein-zugriff");
const parameter = await searchParams;
const roh = parameter["bereich"];
const bereich = (Array.isArray(roh) ? roh[0] : roh)?.trim();
// Nur eigene Pfade anzeigen: ein fremder Wert in der Adresse waere sonst ein
// Text, den jemand anderes auf diese Seite schreibt.
const gezeigt = bereich?.startsWith("/") && !bereich.startsWith("//") ? bereich : undefined;
return (
<div className="mx-auto flex max-w-prose flex-col items-start gap-5 py-10">
<ShieldAlert className="size-8 text-faellig" strokeWidth={1.75} aria-hidden="true" />
<h1 className="text-2xl font-bold">Dafür fehlt dir die Berechtigung</h1>
<p className="text-nebentext">
{gezeigt ? (
<>
Der Bereich <span className="mono break-all">{gezeigt}</span> ist für deine Rolle nicht
freigegeben.
</>
) : (
"Dieser Bereich ist für deine Rolle nicht freigegeben."
)}{" "}
Du bist angemeldet als <strong>{benutzer.name ?? benutzer.email}</strong> mit der Rolle{" "}
<strong>{ROLLEN_TEXT[benutzer.rolle]}</strong>.
</p>
<p className="text-sm text-nebentext">
In der Navigation steht nur, was du darfst — diese Meldung kommt meist von einem Link, den jemand
weitergegeben hat. Brauchst du den Bereich wirklich, wende dich an einen Administrator. Kommt deine
Rolle vom Anmeldeanbieter, wird sie dort in der Gruppenzuordnung geändert und bei der nächsten
Anmeldung übernommen.
</p>
<Link
href="/"
className="flex min-h-11 w-fit items-center rounded-pille bg-akzent px-5 text-sm font-semibold text-auf-akzent md:min-h-10"
>
Zur Übersicht
</Link>
</div>
);
}
-1
View File
@@ -22,7 +22,6 @@ const MELDUNGEN = new Map<string, string>(
"oidc-aus": "Die Anmeldung über den Anbieter ist nicht eingerichtet.",
"oidc-start": "Der Anbieter war nicht erreichbar. Bitte später erneut versuchen.",
"oidc-rueckruf": "Die Anmeldung beim Anbieter ist fehlgeschlagen.",
keinrecht: "Für diesen Bereich fehlt dir die Berechtigung.",
}),
);