feat(PROJ-50): Admin-Tab "DSGVO-Anfragen" implementiert

Neuer Tab im Admin-Bereich: Antrags-Liste, Formular (Adresse + Zeitraum),
Detail-Dialog mit Mail-Tabelle, PDF-Export und Löschen mit Bestätigung.
Rollen-Gating: admin/auditor sehen den Tab, nur admin kann anlegen/löschen.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-06-30 19:34:25 +02:00
co-authored by Claude Sonnet 4.6
parent 0552ce49e2
commit 261a95437c
4 changed files with 647 additions and 0 deletions
+16
View File
@@ -35,11 +35,20 @@ import { RetentionTab } from "@/components/admin/tabs/RetentionTab";
import { ArchivingRulesTab } from "@/components/admin/tabs/ArchivingRulesTab";
import { QuotaTab } from "@/components/admin/tabs/QuotaTab";
import { SMTPOutTab } from "@/components/admin/tabs/SMTPOutTab";
import { DSGVOTab } from "@/components/admin/tabs/DSGVOTab";
import { ResetPasswordDialog, DeleteUserDialog } from "@/components/admin/UserDialogs";
export default function AdminPage() {
const { user, loading: authLoading } = useAuth("domain_admin", "/admin/login");
const isSuperAdmin = user?.role === "superadmin";
const canManageDSGVO =
user?.role === "superadmin" ||
user?.role === "domain_admin" ||
user?.role === "admin";
const canViewDSGVO =
canManageDSGVO ||
user?.role === "auditor" ||
user?.role === "domain_auditor";
const dashboard = useAdminDashboard(!!user);
const usersState = useAdminUsers();
@@ -144,6 +153,7 @@ export default function AdminPage() {
{isSuperAdmin && <TabsTrigger value="services">Dienste</TabsTrigger>}
<TabsTrigger value="users">Benutzer</TabsTrigger>
<TabsTrigger value="audit">Audit-Log</TabsTrigger>
{canViewDSGVO && <TabsTrigger value="dsgvo">DSGVO-Anfragen</TabsTrigger>}
<TabsTrigger value="import">Import</TabsTrigger>
{isSuperAdmin && <TabsTrigger value="ldap" onClick={loadLDAP}>LDAP (Global)</TabsTrigger>}
{!isSuperAdmin && user?.role === "domain_admin" && (
@@ -234,6 +244,12 @@ export default function AdminPage() {
/>
</TabsContent>
{canViewDSGVO && (
<TabsContent value="dsgvo">
<DSGVOTab canManage={canManageDSGVO} />
</TabsContent>
)}
<TabsContent value="import">
<ImportTab
uploadDragging={upload.uploadDragging}