Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die README; an keiner Stelle Bedeutung, nur Zeichensetzung.
65 lines
2.2 KiB
TypeScript
65 lines
2.2 KiB
TypeScript
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')
|
|
)
|
|
}
|