Admins verwalten Benutzer (anlegen, Rolle, sperren, Passwort setzen); jeder ändert sein Passwort; das Audit-Log ist filterbar einsehbar. Sperre und Passwortwechsel beenden ältere Sitzungen über Benutzer.sitzungenAb. Der letzte Admin und das eigene Konto sind geschützt. Closes #015 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
41 lines
1.8 KiB
TypeScript
41 lines
1.8 KiB
TypeScript
/**
|
||
* Navigation der Seitenleiste. Jeder Eintrag nennt sein Recht als Schlüssel aus RECHTE
|
||
* (`src/server/auth/rechte.ts`); die Hülle blendet aus, was die Rolle nicht darf.
|
||
* Hier nur Text und Pfade, damit Client-Komponenten es importieren dürfen.
|
||
*/
|
||
export type NavigationsEintrag = {
|
||
pfad: string;
|
||
titel: string;
|
||
symbol:
|
||
| "uebersicht"
|
||
| "ausrollen"
|
||
| "verlauf"
|
||
| "templates"
|
||
| "vorlagen"
|
||
| "katalog"
|
||
| "server"
|
||
| "protokoll"
|
||
| "einstellungen";
|
||
recht: "lesen" | "ausrollen" | "serverVerwalten" | "katalogVerwalten" | "eigeneZugaenge" | "protokollLesen";
|
||
/** Erscheint erst, wenn das Issue umgesetzt ist – bis dahin nicht anzeigen statt ins Leere führen. */
|
||
ab?: string;
|
||
};
|
||
|
||
export const NAVIGATION: readonly NavigationsEintrag[] = [
|
||
{ pfad: "/", titel: "Übersicht", symbol: "uebersicht", recht: "lesen" },
|
||
{ pfad: "/ausrollen", titel: "Ausrollen", symbol: "ausrollen", recht: "ausrollen" },
|
||
{ pfad: "/auftraege", titel: "Verlauf", symbol: "verlauf", recht: "lesen" },
|
||
{ pfad: "/templates", titel: "Templates", symbol: "templates", recht: "lesen" },
|
||
{ pfad: "/vorlagen", titel: "Vorlagen", symbol: "vorlagen", recht: "lesen" },
|
||
{ pfad: "/katalog", titel: "Katalog", symbol: "katalog", recht: "lesen" },
|
||
{ pfad: "/server", titel: "Server", symbol: "server", recht: "lesen" },
|
||
{ pfad: "/protokoll", titel: "Audit-Log", symbol: "protokoll", recht: "protokollLesen" },
|
||
{ pfad: "/einstellungen", titel: "Einstellungen", symbol: "einstellungen", recht: "eigeneZugaenge" },
|
||
];
|
||
|
||
/** Aktiv ist ein Eintrag auch für Unterseiten – außer der Übersicht, sonst wäre sie immer aktiv. */
|
||
export function istAktiv(eintrag: string, pfad: string): boolean {
|
||
if (eintrag === "/") return pfad === "/";
|
||
return pfad === eintrag || pfad.startsWith(`${eintrag}/`);
|
||
}
|