'use client' import React, { useState, useEffect } from 'react' import { useSDK, ServiceModule } from '@/lib/sdk' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' // ============================================================================= // TYPES // ============================================================================= type ModuleCategory = 'gdpr' | 'ai-act' | 'iso27001' | 'nis2' | 'custom' type ModuleStatus = 'active' | 'inactive' | 'pending' interface DisplayModule extends ServiceModule { category: ModuleCategory status: ModuleStatus requirementsCount: number controlsCount: number completionPercent: number } // ============================================================================= // AVAILABLE MODULES (Templates) // ============================================================================= const availableModules: Omit[] = [ { id: 'mod-gdpr', name: 'DSGVO Compliance', description: 'Datenschutz-Grundverordnung - Vollstaendige Umsetzung aller Anforderungen', category: 'gdpr', regulations: ['DSGVO', 'BDSG'], criticality: 'HIGH', processesPersonalData: true, hasAIComponents: false, requirementsCount: 45, controlsCount: 32, }, { id: 'mod-ai-act', name: 'AI Act Compliance', description: 'EU AI Act - Klassifizierung und Anforderungen fuer KI-Systeme', category: 'ai-act', regulations: ['EU AI Act'], criticality: 'HIGH', processesPersonalData: false, hasAIComponents: true, requirementsCount: 28, controlsCount: 18, }, { id: 'mod-iso27001', name: 'ISO 27001', description: 'Informationssicherheits-Managementsystem nach ISO/IEC 27001', category: 'iso27001', regulations: ['ISO 27001', 'ISO 27002'], criticality: 'MEDIUM', processesPersonalData: false, hasAIComponents: false, requirementsCount: 114, controlsCount: 93, }, { id: 'mod-nis2', name: 'NIS2 Richtlinie', description: 'Netz- und Informationssicherheit fuer kritische Infrastrukturen', category: 'nis2', regulations: ['NIS2'], criticality: 'HIGH', processesPersonalData: false, hasAIComponents: false, requirementsCount: 36, controlsCount: 24, }, ] // ============================================================================= // COMPONENTS // ============================================================================= function ModuleCard({ module, isActive, onActivate, onDeactivate, }: { module: DisplayModule isActive: boolean onActivate: () => void onDeactivate: () => void }) { const categoryColors = { gdpr: 'bg-blue-100 text-blue-700', 'ai-act': 'bg-purple-100 text-purple-700', iso27001: 'bg-green-100 text-green-700', nis2: 'bg-orange-100 text-orange-700', custom: 'bg-gray-100 text-gray-700', } const statusColors = { active: 'bg-green-100 text-green-700', inactive: 'bg-gray-100 text-gray-500', pending: 'bg-yellow-100 text-yellow-700', } return (
{module.category.toUpperCase()} {module.status === 'active' ? 'Aktiv' : module.status === 'pending' ? 'Ausstehend' : 'Inaktiv'} {module.hasAIComponents && ( KI )}

{module.name}

{module.description}

{module.regulations.map(reg => ( {reg} ))}
Anforderungen: {module.requirementsCount}
Kontrollen: {module.controlsCount}
Fortschritt {module.completionPercent}%
{isActive ? ( <> ) : ( )}
) } // ============================================================================= // MAIN PAGE // ============================================================================= export default function ModulesPage() { const { state, dispatch } = useSDK() const [filter, setFilter] = useState('all') // Convert SDK modules to display modules with additional UI properties const displayModules: DisplayModule[] = availableModules.map(template => { const activeModule = state.modules.find(m => m.id === template.id) const isActive = !!activeModule // Calculate completion based on linked requirements and controls const linkedRequirements = state.requirements.filter(r => r.applicableModules.includes(template.id) ) const completedRequirements = linkedRequirements.filter( r => r.status === 'IMPLEMENTED' || r.status === 'VERIFIED' ) const completionPercent = linkedRequirements.length > 0 ? Math.round((completedRequirements.length / linkedRequirements.length) * 100) : 0 return { ...template, status: isActive ? 'active' as ModuleStatus : 'inactive' as ModuleStatus, completionPercent, } }) const filteredModules = filter === 'all' ? displayModules : displayModules.filter(m => m.category === filter || m.status === filter) const activeModulesCount = state.modules.length const totalRequirements = displayModules .filter(m => state.modules.some(sm => sm.id === m.id)) .reduce((sum, m) => sum + m.requirementsCount, 0) const totalControls = displayModules .filter(m => state.modules.some(sm => sm.id === m.id)) .reduce((sum, m) => sum + m.controlsCount, 0) const handleActivateModule = (module: DisplayModule) => { const serviceModule: ServiceModule = { id: module.id, name: module.name, description: module.description, regulations: module.regulations, criticality: module.criticality, processesPersonalData: module.processesPersonalData, hasAIComponents: module.hasAIComponents, } dispatch({ type: 'ADD_MODULE', payload: serviceModule }) } const handleDeactivateModule = (moduleId: string) => { // Remove module by updating state without it const updatedModules = state.modules.filter(m => m.id !== moduleId) dispatch({ type: 'SET_STATE', payload: { modules: updatedModules } }) } const stepInfo = STEP_EXPLANATIONS['modules'] return (
{/* Step Header */} {/* Stats */}
Verfuegbare Module
{availableModules.length}
Aktivierte Module
{activeModulesCount}
Anforderungen (aktiv)
{totalRequirements}
Kontrollen (aktiv)
{totalControls}
{/* Active Modules Alert */} {activeModulesCount === 0 && (

Keine Module aktiviert

Aktivieren Sie mindestens ein Compliance-Modul, um mit der Erfassung von Anforderungen und Kontrollen fortzufahren.

)} {/* Filter */}
Filter: {['all', 'active', 'inactive', 'gdpr', 'ai-act', 'iso27001', 'nis2'].map(f => ( ))}
{/* Module Grid */}
{filteredModules.map(module => ( m.id === module.id)} onActivate={() => handleActivateModule(module)} onDeactivate={() => handleDeactivateModule(module.id)} /> ))}
{filteredModules.length === 0 && (

Keine Module gefunden

Passen Sie den Filter an oder fuegen Sie neue Module hinzu.

)}
) }