'use client' import React from 'react' import { DSFA, DSFA_SECTIONS, DSFASectionProgress } from '@/lib/sdk/dsfa/types' interface DSFASidebarProps { dsfa: DSFA activeSection: number onSectionChange: (section: number) => void } // Calculate completion percentage for a section function calculateSectionProgress(dsfa: DSFA, sectionNumber: number): number { switch (sectionNumber) { case 0: // Threshold Analysis if (!dsfa.threshold_analysis) return 0 const ta = dsfa.threshold_analysis if (ta.dsfa_required !== undefined && ta.decision_justification) return 100 if (ta.criteria_assessment?.some(c => c.applies)) return 50 return 0 case 1: // Processing Description const s1Fields = [ dsfa.processing_purpose, dsfa.processing_description, dsfa.data_categories?.length, dsfa.legal_basis, ] return Math.round((s1Fields.filter(Boolean).length / s1Fields.length) * 100) case 2: // Necessity & Proportionality const s2Fields = [ dsfa.necessity_assessment, dsfa.proportionality_assessment, ] return Math.round((s2Fields.filter(Boolean).length / s2Fields.length) * 100) case 3: // Risk Assessment if (!dsfa.risks?.length) return 0 if (dsfa.overall_risk_level) return 100 return 50 case 4: // Mitigation Measures if (!dsfa.mitigations?.length) return 0 if (dsfa.residual_risk_level) return 100 return 50 case 5: // Stakeholder Consultation (optional) if (dsfa.stakeholder_consultation_not_appropriate && dsfa.stakeholder_consultation_not_appropriate_reason) return 100 if (dsfa.stakeholder_consultations?.length) return 100 return 0 case 6: // DPO & Authority Consultation const s6Fields = [ dsfa.dpo_consulted, dsfa.dpo_opinion, ] const s6Progress = Math.round((s6Fields.filter(Boolean).length / s6Fields.length) * 100) // Add extra progress if authority consultation is documented when required if (dsfa.consultation_requirement?.consultation_required) { if (dsfa.authority_consulted) return s6Progress return Math.min(s6Progress, 75) } return s6Progress case 7: // Review & Maintenance if (!dsfa.review_schedule) return 0 const rs = dsfa.review_schedule if (rs.next_review_date && rs.review_frequency_months && rs.review_responsible) return 100 if (rs.next_review_date) return 50 return 25 case 8: // KI-Anwendungsfälle (optional) const aiModules = dsfa.ai_use_case_modules || [] if (aiModules.length === 0) return 0 const avgCompletion = aiModules.reduce((sum, m) => { const checks = [!!m.name, !!m.model_description, m.input_data_categories?.length > 0, !!m.processing_purpose, !!m.legal_basis, !!m.ai_act_risk_class] return sum + Math.round((checks.filter(Boolean).length / checks.length) * 100) }, 0) / aiModules.length return Math.round(avgCompletion) default: return 0 } } // Check if a section is complete function isSectionComplete(dsfa: DSFA, sectionNumber: number): boolean { const progress = dsfa.section_progress switch (sectionNumber) { case 0: return progress.section_0_complete ?? false case 1: return progress.section_1_complete ?? false case 2: return progress.section_2_complete ?? false case 3: return progress.section_3_complete ?? false case 4: return progress.section_4_complete ?? false case 5: return progress.section_5_complete ?? false case 6: return progress.section_6_complete ?? false case 7: return progress.section_7_complete ?? false case 8: return progress.section_8_complete ?? false default: return false } } // Calculate overall DSFA progress function calculateOverallProgress(dsfa: DSFA): number { const requiredSections = DSFA_SECTIONS.filter(s => s.required) let totalProgress = 0 for (const section of requiredSections) { totalProgress += calculateSectionProgress(dsfa, section.number) } return Math.round(totalProgress / requiredSections.length) } export function DSFASidebar({ dsfa, activeSection, onSectionChange }: DSFASidebarProps) { const overallProgress = calculateOverallProgress(dsfa) // Group sections by category const thresholdSection = DSFA_SECTIONS.find(s => s.number === 0) const art35Sections = DSFA_SECTIONS.filter(s => s.number >= 1 && s.number <= 4) const stakeholderSection = DSFA_SECTIONS.find(s => s.number === 5) const consultationSection = DSFA_SECTIONS.find(s => s.number === 6) const reviewSection = DSFA_SECTIONS.find(s => s.number === 7) const aiSection = DSFA_SECTIONS.find(s => s.number === 8) const renderSectionItem = (section: typeof DSFA_SECTIONS[0]) => { const progress = calculateSectionProgress(dsfa, section.number) const isComplete = isSectionComplete(dsfa, section.number) || progress === 100 const isActive = activeSection === section.number return ( ) } return (