'use client' import React, { useState, useEffect } from 'react' import { useSDK, Evidence as SDKEvidence, EvidenceType } from '@/lib/sdk' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' // ============================================================================= // TYPES // ============================================================================= type DisplayEvidenceType = 'document' | 'screenshot' | 'log' | 'audit-report' | 'certificate' type DisplayFormat = 'pdf' | 'image' | 'text' | 'json' type DisplayStatus = 'valid' | 'expired' | 'pending-review' interface DisplayEvidence { id: string name: string description: string displayType: DisplayEvidenceType format: DisplayFormat controlId: string linkedRequirements: string[] linkedControls: string[] uploadedBy: string uploadedAt: Date validFrom: Date validUntil: Date | null status: DisplayStatus fileSize: string fileUrl: string | null } // ============================================================================= // HELPER FUNCTIONS // ============================================================================= function mapEvidenceTypeToDisplay(type: EvidenceType): DisplayEvidenceType { switch (type) { case 'DOCUMENT': return 'document' case 'SCREENSHOT': return 'screenshot' case 'LOG': return 'log' case 'CERTIFICATE': return 'certificate' case 'AUDIT_REPORT': return 'audit-report' default: return 'document' } } function mapDisplayTypeToEvidence(type: DisplayEvidenceType): EvidenceType { switch (type) { case 'document': return 'DOCUMENT' case 'screenshot': return 'SCREENSHOT' case 'log': return 'LOG' case 'certificate': return 'CERTIFICATE' case 'audit-report': return 'AUDIT_REPORT' default: return 'DOCUMENT' } } function getEvidenceStatus(validUntil: Date | null): DisplayStatus { if (!validUntil) return 'pending-review' const now = new Date() if (validUntil < now) return 'expired' return 'valid' } // ============================================================================= // EVIDENCE TEMPLATES // ============================================================================= interface EvidenceTemplate { id: string name: string description: string type: EvidenceType displayType: DisplayEvidenceType format: DisplayFormat controlId: string linkedRequirements: string[] linkedControls: string[] uploadedBy: string validityDays: number fileSize: string } const evidenceTemplates: EvidenceTemplate[] = [ { id: 'ev-dse-001', name: 'Datenschutzerklaerung v2.3', description: 'Aktuelle Datenschutzerklaerung fuer Website und App', type: 'DOCUMENT', displayType: 'document', format: 'pdf', controlId: 'ctrl-org-001', linkedRequirements: ['req-gdpr-13', 'req-gdpr-14'], linkedControls: ['ctrl-org-001'], uploadedBy: 'DSB', validityDays: 365, fileSize: '245 KB', }, { id: 'ev-pentest-001', name: 'Penetrationstest Report Q4/2024', description: 'Externer Penetrationstest durch Security-Partner', type: 'AUDIT_REPORT', displayType: 'audit-report', format: 'pdf', controlId: 'ctrl-tom-001', linkedRequirements: ['req-gdpr-32', 'req-iso-a12'], linkedControls: ['ctrl-tom-001', 'ctrl-tom-002', 'ctrl-det-001'], uploadedBy: 'IT Security Team', validityDays: 365, fileSize: '2.1 MB', }, { id: 'ev-iso-cert', name: 'ISO 27001 Zertifikat', description: 'Zertifizierung des ISMS', type: 'CERTIFICATE', displayType: 'certificate', format: 'pdf', controlId: 'ctrl-tom-001', linkedRequirements: ['req-iso-4.1', 'req-iso-5.1'], linkedControls: [], uploadedBy: 'QM Abteilung', validityDays: 365, fileSize: '156 KB', }, { id: 'ev-schulung-001', name: 'Schulungsnachweis Datenschutz 2024', description: 'Teilnehmerliste und Schulungsinhalt', type: 'DOCUMENT', displayType: 'document', format: 'pdf', controlId: 'ctrl-org-001', linkedRequirements: ['req-gdpr-39'], linkedControls: ['ctrl-org-001'], uploadedBy: 'HR Team', validityDays: 365, fileSize: '890 KB', }, { id: 'ev-rbac-001', name: 'Access Control Screenshot', description: 'Nachweis der RBAC-Konfiguration', type: 'SCREENSHOT', displayType: 'screenshot', format: 'image', controlId: 'ctrl-tom-001', linkedRequirements: ['req-gdpr-32'], linkedControls: ['ctrl-tom-001'], uploadedBy: 'Admin', validityDays: 0, fileSize: '1.2 MB', }, { id: 'ev-log-001', name: 'Audit Log Export', description: 'Monatlicher Audit-Log Export', type: 'LOG', displayType: 'log', format: 'json', controlId: 'ctrl-det-001', linkedRequirements: ['req-gdpr-32'], linkedControls: ['ctrl-det-001'], uploadedBy: 'System', validityDays: 90, fileSize: '4.5 MB', }, ] // ============================================================================= // COMPONENTS // ============================================================================= function EvidenceCard({ evidence, onDelete }: { evidence: DisplayEvidence; onDelete: () => void }) { const typeIcons = { document: ( ), screenshot: ( ), log: ( ), 'audit-report': ( ), certificate: ( ), } const statusColors = { valid: 'bg-green-100 text-green-700 border-green-200', expired: 'bg-red-100 text-red-700 border-red-200', 'pending-review': 'bg-yellow-100 text-yellow-700 border-yellow-200', } const statusLabels = { valid: 'Gueltig', expired: 'Abgelaufen', 'pending-review': 'Pruefung ausstehend', } return (
{evidence.description}
Bitte definieren Sie zuerst Kontrollen, um die zugehoerigen Nachweise zu laden.
Passen Sie den Filter an oder laden Sie neue Nachweise hoch.