'use client' import React, { useState } from 'react' import { useRouter } from 'next/navigation' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' import { DisplayControl, DisplayControlType, mapControlTypeToDisplay, mapStatusToDisplay, } from './_types' import { ControlCard } from './_components/ControlCard' import { AddControlForm } from './_components/AddControlForm' import { LoadingSkeleton } from './_components/LoadingSkeleton' import { StatsCards } from './_components/StatsCards' import { FilterBar } from './_components/FilterBar' import { RAGPanel } from './_components/RAGPanel' import { useControlsData } from './_hooks/useControlsData' import { useRAGSuggestions } from './_hooks/useRAGSuggestions' export default function ControlsPage() { const router = useRouter() const [filter, setFilter] = useState('all') const [showAddForm, setShowAddForm] = useState(false) const { state, loading, error, setError, effectivenessMap, evidenceMap, handleStatusChange, handleEffectivenessChange, handleAddControl, } = useControlsData() const { ragLoading, ragSuggestions, showRagPanel, setShowRagPanel, selectedRequirementId, setSelectedRequirementId, suggestControlsFromRAG, addSuggestedControl, } = useRAGSuggestions(setError) // Convert SDK controls to display controls const displayControls: DisplayControl[] = state.controls.map(ctrl => { const effectivenessPercent = effectivenessMap[ctrl.id] ?? (ctrl.implementationStatus === 'IMPLEMENTED' ? 85 : ctrl.implementationStatus === 'PARTIAL' ? 50 : 0) return { id: ctrl.id, name: ctrl.name, description: ctrl.description, type: ctrl.type, category: ctrl.category, implementationStatus: ctrl.implementationStatus, evidence: ctrl.evidence, owner: ctrl.owner, dueDate: ctrl.dueDate, code: ctrl.id, displayType: 'preventive' as DisplayControlType, displayCategory: mapControlTypeToDisplay(ctrl.type), displayStatus: mapStatusToDisplay(ctrl.implementationStatus), effectivenessPercent, linkedRequirements: [], linkedEvidence: evidenceMap[ctrl.id] || [], lastReview: new Date(), } }) const filteredControls = filter === 'all' ? displayControls : displayControls.filter(c => c.displayStatus === filter || c.displayType === filter || c.displayCategory === filter ) const implementedCount = displayControls.filter(c => c.displayStatus === 'implemented').length const avgEffectiveness = displayControls.length > 0 ? Math.round(displayControls.reduce((sum, c) => sum + c.effectivenessPercent, 0) / displayControls.length) : 0 const partialCount = displayControls.filter(c => c.displayStatus === 'partial').length const stepInfo = STEP_EXPLANATIONS['controls'] return (
{/* Step Header */}
{/* Add Form */} {showAddForm && ( { handleAddControl(data); setShowAddForm(false) }} onCancel={() => setShowAddForm(false)} /> )} {/* RAG Controls Panel */} {showRagPanel && ( setShowRagPanel(false)} /> )} {/* Error Banner */} {error && (
{error}
)} {/* Requirements Alert */} {state.requirements.length === 0 && !loading && (

Keine Anforderungen definiert

Bitte definieren Sie zuerst Anforderungen, um die zugehoerigen Kontrollen zu laden.

)} {/* Loading State */} {loading && } {/* Controls List */} {!loading && (
{filteredControls.map(control => ( handleStatusChange(control.id, status)} onEffectivenessChange={(effectiveness) => handleEffectivenessChange(control.id, effectiveness)} onLinkEvidence={() => router.push(`/sdk/evidence?control_id=${control.id}`)} /> ))}
)} {!loading && filteredControls.length === 0 && state.requirements.length > 0 && (

Keine Kontrollen gefunden

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

)}
) }