import type { Metadata } from 'next' import { Suspense } from 'react' import Link from 'next/link' import { notFound } from 'next/navigation' import { db } from '@/lib/db' import { requireUser } from '@/lib/auth/current' import { caseTypesOfDepartment, listDepartmentCases, listDepartmentDocuments, listMembers, loadVisibleDepartment, } from '@/lib/departments/service' import { listEntries } from '@/lib/departments/entries' import { loadChatView } from '@/lib/chat/load' import { de } from '@/lib/i18n/de' import { PieChart } from '@/components/PieChart' import { StampMark, classificationEdgeStyle } from '@/components/StampMark' import { SkeletonLine } from '@/components/Skeleton' import { ChatLazy } from '@/components/chat/ChatLazy' import { DepartmentEntries } from './DepartmentEntries' import type { EffectivePermissions } from '@/lib/auth/permissions' export const dynamic = 'force-dynamic' export async function generateMetadata({ params, }: { params: Promise<{ key: string }> }): Promise { const user = await requireUser() const { key } = await params const abteilung = await loadVisibleDepartment(user.permissions, key) return { title: abteilung?.name ?? de.department.one } } /** * Eine Abteilung. * * Dasselbe Bild wie eine Personalakte, eine Stufe höher: wer gehört dazu, was * ist dazu aktenkundig, was ist dazu vermerkt, und worüber wird geredet. Der * Unterschied ist, dass hier **nichts eingetragen** wird - die Fälle ergeben * sich aus den Beteiligten und deren Personalakten. */ export default async function DepartmentPage({ params }: { params: Promise<{ key: string }> }) { const user = await requireUser() const { key } = await params const abteilung = await loadVisibleDepartment(user.permissions, key) // Kein Zugriff heisst 404, nicht 403. if (!abteilung) notFound() const [levels, verteilung] = await Promise.all([ db.clearanceLevelConfig.findMany({ orderBy: { level: 'asc' } }), caseTypesOfDepartment(user.permissions, abteilung.id), ]) const levelName = new Map(levels.map((l) => [l.level, l.name])) return (
{abteilung.key} {de.department.one} {abteilung.isArchived ? ( {de.department.archived} ) : null}

{abteilung.name}

{abteilung.description ? (

{abteilung.description}

) : null}

{de.department.chart}

{de.department.derivedHint}

{de.department.members}

}>

{de.department.cases}

}>

{de.department.documents}

}>

{de.departmentEntry.heading}

}>

{de.chat.heading}

}>
) } async function Members({ departmentId, permissions, levelName, }: { departmentId: string permissions: EffectivePermissions levelName: Map }) { const mitglieder = await listMembers(permissions, departmentId) if (mitglieder.length === 0) { return

{de.department.membersEmpty}

} return ( ) } async function Cases({ departmentId, permissions, levelName, }: { departmentId: string permissions: EffectivePermissions levelName: Map }) { const faelle = await listDepartmentCases(permissions, departmentId) if (faelle.length === 0) return

{de.department.casesEmpty}

return (
    {faelle.map((akte) => (
  • {akte.caseNumber} {akte.title} {de.case.statusNames[akte.status] ?? akte.status}
  • ))}
) } async function Documents({ departmentId, permissions, }: { departmentId: string permissions: EffectivePermissions }) { const dokumente = await listDepartmentDocuments(permissions, departmentId) if (dokumente.length === 0) { return

{de.department.documentsEmpty}

} return (
    {dokumente.map((dokument) => (
  • {dokument.documentNumber} {dokument.title}
  • ))}
) } async function Entries({ departmentKey, departmentId, user, levels, }: { departmentKey: string departmentId: string user: { id: string; permissions: EffectivePermissions } levels: { level: number; name: string }[] }) { const vermerke = await listEntries(user.permissions, departmentId) const autoren = await db.user.findMany({ where: { id: { in: [...new Set(vermerke.flatMap((v) => [v.authorId, v.retractedById ?? ''])) ].filter(Boolean) } }, select: { id: true, displayName: true }, }) const nameVon = new Map(autoren.map((a) => [a.id, a.displayName])) return ( l.level <= user.permissions.clearanceLevel)} entries={vermerke.map((vermerk) => ({ id: vermerk.id, body: vermerk.body, minClearance: vermerk.minClearance, authorId: vermerk.authorId, authorName: nameVon.get(vermerk.authorId) ?? vermerk.authorId, createdAt: vermerk.createdAt.toISOString(), version: vermerk.version, editedAt: vermerk.editedAt?.toISOString() ?? null, retractedAt: vermerk.retractedAt?.toISOString() ?? null, retractedByName: vermerk.retractedById ? (nameVon.get(vermerk.retractedById) ?? vermerk.retractedById) : null, retractionReason: vermerk.retractionReason, }))} /> ) } async function ChatBlock({ departmentId, user, }: { departmentId: string user: { id: string; permissions: EffectivePermissions } }) { const ansicht = await loadChatView(user.permissions, { kind: 'department', departmentId, }) return ( ) }