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.
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import type { ReactNode } from 'react'
|
|
import { notFound } from 'next/navigation'
|
|
import { requireUser } from '@/lib/auth/current'
|
|
import { de } from '@/lib/i18n/de'
|
|
import { adminSections, hasAdminAccess } from './sections'
|
|
import { Tabs } from '@/components/Tabs'
|
|
|
|
export const dynamic = 'force-dynamic'
|
|
|
|
/**
|
|
* Kopf und Leiste der Verwaltung.
|
|
*
|
|
* Wie bei der Fallakte sind die Bereiche **eigene Seiten** unter einem
|
|
* gemeinsamen Layout, keine umgeschalteten Blöcke. Wer gar keinen Bereich
|
|
* sehen darf, bekommt 404 - die Verwaltung ist für ihn nicht vorhanden.
|
|
*/
|
|
export default async function AdminLayout({ children }: { children: ReactNode }) {
|
|
const user = await requireUser()
|
|
if (!hasAdminAccess(user.permissions)) notFound()
|
|
|
|
const bereiche = adminSections(user.permissions)
|
|
|
|
return (
|
|
<main className="mx-auto max-w-5xl px-6 py-10">
|
|
<header>
|
|
<h1 className="font-condensed">{de.admin.heading}</h1>
|
|
<p className="mt-1 text-2xs text-text-dim">{de.admin.intro}</p>
|
|
</header>
|
|
|
|
<Tabs tabs={bereiche.map((bereich) => ({ href: bereich.href, label: bereich.label }))} />
|
|
|
|
<div className="mt-8">{children}</div>
|
|
</main>
|
|
)
|
|
}
|