feat(doku): Anleitung, PDF und Ende-zu-Ende-Abnahme (#36)
This commit was merged in pull request #36.
This commit is contained in:
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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.",
|
||||
}),
|
||||
);
|
||||
|
||||
|
||||
@@ -87,11 +87,18 @@ export async function sitzungErforderlich(recht?: Recht, ziel?: string): Promise
|
||||
redirect(ziel ? `/anmelden?ziel=${encodeURIComponent(ziel)}` : "/anmelden");
|
||||
}
|
||||
if (recht && !darf(vorhanden.benutzer.rolle, recht)) {
|
||||
// Bei einer Seite ist ein geworfener Fehler eine 500er-Seite – fuer jemanden,
|
||||
// der einfach ein altes Lesezeichen geoeffnet hat, die falsche Auskunft.
|
||||
// Deshalb hier eine Weiterleitung mit Erklaerung; in Server Actions bleibt
|
||||
// das Werfen richtig, siehe rechtErforderlich.
|
||||
redirect("/anmelden?fehler=keinrecht");
|
||||
/*
|
||||
* Bei einer Seite ist ein geworfener Fehler eine 500er-Seite – fuer jemanden,
|
||||
* der einfach ein altes Lesezeichen geoeffnet hat, die falsche Auskunft.
|
||||
* Deshalb eine Weiterleitung mit Erklaerung; in Server Actions bleibt das
|
||||
* Werfen richtig, siehe `rechtErforderlich`.
|
||||
*
|
||||
* Und zwar auf **`/kein-zugriff`**, nicht auf die Anmeldeseite: dort leitet
|
||||
* ein Angemeldeter sofort auf die Uebersicht weiter, und die Erklaerung war
|
||||
* damit unerreichbar. Der Kommentar hier versprach sie trotzdem — anderthalb
|
||||
* Jahre haette niemand gemerkt, dass der Hinweis nie ankommt (#018).
|
||||
*/
|
||||
redirect(ziel ? `/kein-zugriff?bereich=${encodeURIComponent(ziel)}` : "/kein-zugriff");
|
||||
}
|
||||
return vorhanden;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user