From 810a13b2d8b52e765bd8b3c2efc8d73b45bff4f4 Mon Sep 17 00:00:00 2001 From: CCS Admin Date: Thu, 26 Feb 2026 16:13:13 +0000 Subject: [PATCH] feat: add admin disclosures page for reviewing data access requests Co-Authored-By: Claude Opus 4.6 --- frontend/src/pages/DisclosuresPage.tsx | 94 ++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 frontend/src/pages/DisclosuresPage.tsx diff --git a/frontend/src/pages/DisclosuresPage.tsx b/frontend/src/pages/DisclosuresPage.tsx new file mode 100644 index 0000000..6bddc45 --- /dev/null +++ b/frontend/src/pages/DisclosuresPage.tsx @@ -0,0 +1,94 @@ +import { useState, useEffect } from 'react' +import { Check, X } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { Badge } from '@/components/ui/badge' +import { Skeleton } from '@/components/ui/skeleton' +import type { DisclosureRequest } from '@/types' +import { getDisclosureRequests, reviewDisclosure } from '@/services/disclosureService' + +export function DisclosuresPage() { + const [requests, setRequests] = useState([]) + const [loading, setLoading] = useState(true) + + const load = () => { + setLoading(true) + getDisclosureRequests('pending') + .then(setRequests) + .catch(() => setRequests([])) + .finally(() => setLoading(false)) + } + + useEffect(() => { load() }, []) + + const handleReview = async (id: number, status: 'approved' | 'rejected') => { + try { + await reviewDisclosure(id, status) + load() + } catch { + // Silently reload on error + load() + } + } + + return ( +
+

Freigabe-Anfragen

+ + {loading ? ( +
+ {[1, 2, 3].map((i) => ( + + ))} +
+ ) : requests.length === 0 ? ( +

Keine offenen Anfragen.

+ ) : ( +
+ {requests.map((dr) => ( + + +
+ + Fall {dr.fall_id || dr.case_id} + + {dr.status} +
+
+ +

+ Angefragt von:{' '} + {dr.requester_username || `User #${dr.requester_id}`} +

+

+ Begründung:{' '} + {dr.reason} +

+

+ {new Date(dr.created_at).toLocaleString('de-DE')} +

+
+ + +
+
+
+ ))} +
+ )} +
+ ) +}