/** * 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" | "einstellungen"; recht: "lesen" | "ausrollen" | "serverVerwalten" | "katalogVerwalten" | "eigeneZugaenge"; /** 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", ab: "#008" }, { pfad: "/auftraege", titel: "Verlauf", symbol: "verlauf", recht: "lesen" }, { pfad: "/templates", titel: "Templates", symbol: "templates", recht: "lesen", ab: "#007" }, { pfad: "/vorlagen", titel: "Vorlagen", symbol: "vorlagen", recht: "lesen", ab: "#012" }, { pfad: "/katalog", titel: "Katalog", symbol: "katalog", recht: "lesen" }, { pfad: "/server", titel: "Server", symbol: "server", recht: "lesen" }, { pfad: "/einstellungen", titel: "Einstellungen", symbol: "einstellungen", recht: "eigeneZugaenge", ab: "#015", }, ]; /** 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}/`); }