import type { EffectivePermissions } from '@/lib/auth/permissions' import { de } from '@/lib/i18n/de' /** * Die Bereiche der Verwaltung, an einer Stelle. * * Vorher standen Rollenverwaltung, Vorlagen und Änderungsrichtlinie als drei * eigene Einträge in der Kopfzeile - drei Einträge für etwas, das man selten * und dann meist zusammenhängend braucht. Jetzt ist es ein Eintrag mit einer * Leiste darunter. * * Die Rechteprüfung steht hier **nicht** als Berechtigung, sondern nur für die * Anzeige: jede Seite prüft selbst noch einmal mit `requirePermission`. Eine * versteckte Kachel ist kein Schutz. */ export type AdminSection = { key: string href: string label: string description: string } export function adminSections(p: EffectivePermissions): AdminSection[] { const darf = (recht: 'roles.manage' | 'template.manage' | 'audit.read' | 'admin'): boolean => p.isAdmin || (recht !== 'admin' && p.permissions.has(recht)) const alle: (AdminSection & { sichtbar: boolean })[] = [ { key: 'roles', href: '/admin/rollen', sichtbar: darf('roles.manage'), ...text('roles') }, { key: 'departments', href: '/admin/abteilungen', sichtbar: darf('roles.manage'), ...text('departments'), }, { key: 'templates', href: '/admin/vorlagen', sichtbar: darf('template.manage'), ...text('templates'), }, { key: 'policy', href: '/admin/richtlinie', sichtbar: darf('admin'), ...text('policy') }, { key: 'log', href: '/admin/protokoll', sichtbar: darf('audit.read'), ...text('log') }, { key: 'system', href: '/admin/system', sichtbar: darf('admin'), ...text('system') }, ] return alle.filter((bereich) => bereich.sichtbar).map(({ sichtbar: _, ...rest }) => rest) } function text(key: string): { label: string; description: string } { return { label: de.admin.sections[key] ?? key, description: de.admin.descriptions[key] ?? '', } } /** Ob jemand die Verwaltung überhaupt sieht. Für die Kopfzeile. */ export function hasAdminAccess(p: EffectivePermissions): boolean { return ( p.isAdmin || p.permissions.has('roles.manage') || p.permissions.has('template.manage') || p.permissions.has('audit.read') ) }