Files
breakpilot-lehrer/website/app/admin/docs/audit/page.tsx
Benjamin Admin 0b37c5e692 [split-required] Split website + studio-v2 monoliths (Phase 3 continued)
Website (14 monoliths split):
- compliance/page.tsx (1,519 → 9), docs/audit (1,262 → 20)
- quality (1,231 → 16), alerts (1,203 → 10), docs (1,202 → 11)
- i18n.ts (1,173 → 8 language files)
- unity-bridge (1,094 → 12), backlog (1,087 → 6)
- training (1,066 → 8), rag (1,063 → 8)
- Deleted index_original.ts (4,899 LOC dead backup)

Studio-v2 (5 monoliths split):
- meet/page.tsx (1,481 → 9), messages (1,166 → 9)
- AlertsB2BContext.tsx (1,165 → 5 modules)
- alerts-b2b/page.tsx (1,019 → 6), korrektur/archiv (1,001 → 6)

All existing imports preserved. Zero new TypeScript errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 17:52:36 +02:00

106 lines
3.0 KiB
TypeScript

'use client'
/**
* DSGVO-Audit-Dokumentation Seite
*
* Zeigt die vollstaendige Audit-Dokumentation fuer Datenschutzbeauftragte
* und Auditoren mit schoener Markdown-Darstellung inkl. Tabellen.
*/
import { useState, useEffect, useRef } from 'react'
import AdminLayout from '@/components/admin/AdminLayout'
import { SECTIONS } from './constants'
import { TableOfContents } from './_components/TableOfContents'
import { AuditHeader } from './_components/AuditHeader'
import { AuditTitleBlock } from './_components/AuditTitleBlock'
import {
ManagementSummary,
VerarbeitungsTaetigkeiten,
Rechtsgrundlagen,
DatenschutzFolgen,
InformationspflichtenAndArt22,
PrivacyByDesignAndTOM,
BSIAndEUAIAct,
MLTrainingAndRechte,
SchulungReviewVorfall,
KontakteAndVoice,
BQASScheduler,
Anhaenge,
} from './_components/sections'
export default function AuditDocumentationPage() {
const [showToc, setShowToc] = useState(true)
const [activeSection, setActiveSection] = useState<string>('1')
const contentRef = useRef<HTMLDivElement>(null)
const scrollToSection = (sectionId: string) => {
const element = document.getElementById(`section-${sectionId}`)
if (element) {
element.scrollIntoView({ behavior: 'smooth', block: 'start' })
setActiveSection(sectionId)
}
}
// Track active section on scroll
useEffect(() => {
const handleScroll = () => {
const sections = SECTIONS.map(s => ({
id: s.id,
element: document.getElementById(`section-${s.id}`)
})).filter(s => s.element)
for (const section of sections.reverse()) {
if (section.element) {
const rect = section.element.getBoundingClientRect()
if (rect.top <= 150) {
setActiveSection(section.id)
break
}
}
}
}
window.addEventListener('scroll', handleScroll)
return () => window.removeEventListener('scroll', handleScroll)
}, [])
return (
<AdminLayout>
<div className="flex min-h-screen">
{/* Table of Contents Sidebar */}
{showToc && (
<TableOfContents
activeSection={activeSection}
onScrollToSection={scrollToSection}
/>
)}
{/* Main Content */}
<main className={`flex-1 ${showToc ? 'ml-64' : ''}`}>
<AuditHeader
showToc={showToc}
onToggleToc={() => setShowToc(!showToc)}
/>
{/* Document Content */}
<div ref={contentRef} className="px-8 py-8 max-w-4xl">
<AuditTitleBlock />
<ManagementSummary />
<VerarbeitungsTaetigkeiten />
<Rechtsgrundlagen />
<DatenschutzFolgen />
<InformationspflichtenAndArt22 />
<PrivacyByDesignAndTOM />
<BSIAndEUAIAct />
<MLTrainingAndRechte />
<SchulungReviewVorfall />
<KontakteAndVoice />
<BQASScheduler />
<Anhaenge />
</div>
</main>
</div>
</AdminLayout>
)
}