'use client' import { useState, useMemo } from 'react' import Link from 'next/link' import { useVendorCompliance, ProcessingActivity, ProcessingActivityStatus, ProtectionLevel, DATA_SUBJECT_CATEGORY_META, PERSONAL_DATA_CATEGORY_META, getStatusColor, formatDate, } from '@/lib/sdk/vendor-compliance' type SortField = 'vvtId' | 'name' | 'status' | 'protectionLevel' | 'updatedAt' type SortOrder = 'asc' | 'desc' export default function ProcessingActivitiesPage() { const { processingActivities, deleteProcessingActivity, duplicateProcessingActivity, isLoading } = useVendorCompliance() const [searchTerm, setSearchTerm] = useState('') const [statusFilter, setStatusFilter] = useState('ALL') const [protectionFilter, setProtectionFilter] = useState('ALL') const [sortField, setSortField] = useState('vvtId') const [sortOrder, setSortOrder] = useState('asc') const filteredActivities = useMemo(() => { let result = [...processingActivities] // Search filter if (searchTerm) { const term = searchTerm.toLowerCase() result = result.filter( (a) => a.vvtId.toLowerCase().includes(term) || a.name.de.toLowerCase().includes(term) || a.name.en.toLowerCase().includes(term) ) } // Status filter if (statusFilter !== 'ALL') { result = result.filter((a) => a.status === statusFilter) } // Protection level filter if (protectionFilter !== 'ALL') { result = result.filter((a) => a.protectionLevel === protectionFilter) } // Sort result.sort((a, b) => { let comparison = 0 switch (sortField) { case 'vvtId': comparison = a.vvtId.localeCompare(b.vvtId) break case 'name': comparison = a.name.de.localeCompare(b.name.de) break case 'status': comparison = a.status.localeCompare(b.status) break case 'protectionLevel': const levels = { LOW: 1, MEDIUM: 2, HIGH: 3 } comparison = levels[a.protectionLevel] - levels[b.protectionLevel] break case 'updatedAt': comparison = new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime() break } return sortOrder === 'asc' ? comparison : -comparison }) return result }, [processingActivities, searchTerm, statusFilter, protectionFilter, sortField, sortOrder]) const handleSort = (field: SortField) => { if (sortField === field) { setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc') } else { setSortField(field) setSortOrder('asc') } } const handleDelete = async (id: string) => { if (confirm('Möchten Sie diese Verarbeitungstätigkeit wirklich löschen?')) { await deleteProcessingActivity(id) } } const handleDuplicate = async (id: string) => { await duplicateProcessingActivity(id) } if (isLoading) { return (
) } return (
{/* Header */}

Verarbeitungsverzeichnis (VVT)

Art. 30 DSGVO - Verzeichnis von Verarbeitungstätigkeiten

Neue Verarbeitung
{/* Filters */}
{/* Search */}
setSearchTerm(e.target.value)} />
{/* Status Filter */}
{/* Protection Level Filter */}
{/* Table */}
{filteredActivities.map((activity) => ( ))}
handleSort('vvtId')} >
VVT-ID
handleSort('name')} >
Name
Betroffene Datenkategorien handleSort('protectionLevel')} >
Schutzbedarf
handleSort('status')} >
Status
Aktionen
{activity.vvtId}
{activity.name.de}
{activity.name.en && activity.name.en !== activity.name.de && (
{activity.name.en}
)}
{activity.dataSubjectCategories.slice(0, 2).map((cat) => ( {DATA_SUBJECT_CATEGORY_META[cat]?.de || cat} ))} {activity.dataSubjectCategories.length > 2 && ( +{activity.dataSubjectCategories.length - 2} )}
{activity.personalDataCategories.slice(0, 2).map((cat) => ( {PERSONAL_DATA_CATEGORY_META[cat]?.label.de || cat} ))} {activity.personalDataCategories.length > 2 && ( +{activity.personalDataCategories.length - 2} )}
Bearbeiten
{filteredActivities.length === 0 && (

Keine Verarbeitungstätigkeiten

Erstellen Sie eine neue Verarbeitungstätigkeit, um zu beginnen.

Neue Verarbeitung
)}
{/* Summary */}
{filteredActivities.length} von {processingActivities.length} Verarbeitungstätigkeiten
) } function SortIcon({ field, currentField, order }: { field: SortField; currentField: SortField; order: SortOrder }) { if (field !== currentField) { return ( ) } return order === 'asc' ? ( ) : ( ) } function StatusBadge({ status }: { status: ProcessingActivityStatus }) { const statusConfig = { DRAFT: { label: 'Entwurf', color: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-200' }, REVIEW: { label: 'In Prüfung', color: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200' }, APPROVED: { label: 'Freigegeben', color: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' }, ARCHIVED: { label: 'Archiviert', color: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-200' }, } const config = statusConfig[status] return ( {config.label} ) } function ProtectionLevelBadge({ level }: { level: ProtectionLevel }) { const config = { LOW: { label: 'Niedrig', color: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' }, MEDIUM: { label: 'Mittel', color: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200' }, HIGH: { label: 'Hoch', color: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200' }, } return ( {config[level].label} ) }