diff --git a/admin-compliance/app/sdk/dsr/_components/DSRBanners.tsx b/admin-compliance/app/sdk/dsr/_components/DSRBanners.tsx new file mode 100644 index 0000000..df734c0 --- /dev/null +++ b/admin-compliance/app/sdk/dsr/_components/DSRBanners.tsx @@ -0,0 +1,136 @@ +'use client' + +import type { DSRType, DSRStatus } from '@/lib/sdk/dsr/types' + +export function LoadingSpinner() { + return ( +
+ + + + +
+ ) +} + +export function SettingsTab() { + return ( +
+
+ + + + +
+

Einstellungen

+

+ DSR-Portal-Einstellungen, E-Mail-Vorlagen und Workflow-Konfiguration + werden in einer spaeteren Version verfuegbar sein. +

+
+ ) +} + +export function OverdueAlert({ + overdueCount, + onShowOverdue, +}: { + overdueCount: number + onShowOverdue: () => void +}) { + return ( +
+
+ + + +
+
+

+ Achtung: {overdueCount} ueberfaellige Anfrage(n) +

+

+ Die gesetzliche Frist ist abgelaufen. Handeln Sie umgehend, um Bussgelder zu vermeiden. +

+
+ +
+ ) +} + +export function DeadlineInfoBox() { + return ( +
+
+ + + +
+

Fristen beachten

+

+ Nach Art. 12 DSGVO muessen Anfragen innerhalb von einem Monat beantwortet werden. + Eine Verlaengerung um zwei weitere Monate ist bei komplexen Anfragen moeglich, + sofern der Betroffene innerhalb eines Monats darueber informiert wird. +

+
+
+
+ ) +} + +export function EmptyState({ + selectedType, + selectedStatus, + selectedPriority, + onClearFilters, + onOpenCreate, +}: { + selectedType: DSRType | 'all' + selectedStatus: DSRStatus | 'all' + selectedPriority: string + onClearFilters: () => void + onOpenCreate: () => void +}) { + const hasFilters = + selectedType !== 'all' || selectedStatus !== 'all' || selectedPriority !== 'all' + + return ( +
+
+ + + +
+

Keine Anfragen gefunden

+

+ {hasFilters + ? 'Passen Sie die Filter an oder' + : 'Es sind noch keine Anfragen vorhanden.' + } +

+ {hasFilters ? ( + + ) : ( + + )} +
+ ) +} diff --git a/admin-compliance/app/sdk/dsr/_components/DSRCreateModal.tsx b/admin-compliance/app/sdk/dsr/_components/DSRCreateModal.tsx new file mode 100644 index 0000000..07a08a8 --- /dev/null +++ b/admin-compliance/app/sdk/dsr/_components/DSRCreateModal.tsx @@ -0,0 +1,187 @@ +'use client' + +import React, { useState } from 'react' +import { createSDKDSR } from '@/lib/sdk/dsr/api' + +export function DSRCreateModal({ + onClose, + onSuccess +}: { + onClose: () => void + onSuccess: () => void +}) { + const [type, setType] = useState('access') + const [subjectName, setSubjectName] = useState('') + const [subjectEmail, setSubjectEmail] = useState('') + const [description, setDescription] = useState('') + const [source, setSource] = useState('web_form') + const [isSaving, setIsSaving] = useState(false) + const [error, setError] = useState(null) + + const deadline = new Date() + deadline.setDate(deadline.getDate() + 30) + const deadlineStr = deadline.toLocaleDateString('de-DE') + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + if (!subjectName.trim() || !subjectEmail.trim()) return + + setIsSaving(true) + setError(null) + try { + await createSDKDSR({ + type, + requester: { name: subjectName.trim(), email: subjectEmail.trim() }, + requestText: description.trim(), + source + }) + onSuccess() + } catch (err: unknown) { + setError(err instanceof Error ? err.message : 'Unbekannter Fehler') + } finally { + setIsSaving(false) + } + } + + return ( +
+ {/* Backdrop */} +
+ + {/* Modal */} +
+
+
+

Neue Anfrage anlegen

+ +
+ + {error && ( +
+ {error} +
+ )} + +
+ {/* Type */} +
+ + +
+ + {/* Subject Name */} +
+ + setSubjectName(e.target.value)} + required + className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 text-sm" + placeholder="Vor- und Nachname" + /> +
+ + {/* Subject Email */} +
+ + setSubjectEmail(e.target.value)} + required + className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 text-sm" + placeholder="email@beispiel.de" + /> +
+ + {/* Description */} +
+ +