'use client' import { useState } from 'react' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' import { DisplayRequirement, mapCriticalityToPriority, mapStatusToDisplayStatus, AddRequirementData } from './_types' import { requirementTemplates } from './_data' import { AddRequirementForm } from './_components/AddRequirementForm' import { RequirementCard } from './_components/RequirementCard' import { LoadingSkeleton } from './_components/LoadingSkeleton' import { useRequirementsData } from './_hooks/useRequirementsData' export default function RequirementsPage() { const { state, loading, error, setError, ragExtracting, ragResult, setRagResult, extractFromRAG, handleStatusChange, handleDeleteRequirement, handleAddRequirement, } = useRequirementsData() const [filter, setFilter] = useState('all') const [searchQuery, setSearchQuery] = useState('') const [showAddForm, setShowAddForm] = useState(false) const [expandedId, setExpandedId] = useState(null) const onSubmitAdd = async (data: AddRequirementData) => { const ok = await handleAddRequirement(data) if (ok) setShowAddForm(false) } // Convert SDK requirements to display requirements const displayRequirements: DisplayRequirement[] = state.requirements.map(req => { const template = requirementTemplates.find(t => t.id === req.id) const linkedControls = state.controls.filter(c => c.evidence.includes(req.id)) const linkedEvidence = state.evidence.filter(e => e.controlId && linkedControls.some(c => c.id === e.controlId)) return { ...req, code: template?.code || req.id, source: template?.source || `${req.regulation} ${req.article}`, category: template?.category || req.regulation, priority: mapCriticalityToPriority(req.criticality), displayStatus: mapStatusToDisplayStatus(req.status), controlsLinked: linkedControls.length, evidenceCount: linkedEvidence.length, } }) const filteredRequirements = displayRequirements.filter(req => { const matchesFilter = filter === 'all' || req.displayStatus === filter || req.priority === filter const matchesSearch = searchQuery === '' || req.title.toLowerCase().includes(searchQuery.toLowerCase()) || req.code.toLowerCase().includes(searchQuery.toLowerCase()) return matchesFilter && matchesSearch }) const compliantCount = displayRequirements.filter(r => r.displayStatus === 'compliant').length const partialCount = displayRequirements.filter(r => r.displayStatus === 'partial').length const nonCompliantCount = displayRequirements.filter(r => r.displayStatus === 'non-compliant').length const stepInfo = STEP_EXPLANATIONS['requirements'] return (
{/* Step Header */}
{/* RAG Extraction Result Banner */} {ragResult && (
0 ? 'bg-green-50 border-green-200' : 'bg-blue-50 border-blue-200'}`}> {ragResult.created > 0 ? '✅' : 'ℹ️'} {ragResult.message}
)} {/* Add Form */} {showAddForm && ( setShowAddForm(false)} /> )} {/* Error Banner */} {error && (
{error}
)} {/* Module Alert */} {state.modules.length === 0 && !loading && (

Keine Module aktiviert

Bitte aktivieren Sie zuerst Compliance-Module, um die zugehoerigen Anforderungen zu laden.

)} {/* Stats */}
Gesamt
{displayRequirements.length}
Konform
{compliantCount}
In Bearbeitung
{partialCount}
Offen
{nonCompliantCount}
{/* Search and Filter */}
setSearchQuery(e.target.value)} placeholder="Anforderungen durchsuchen..." className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" />
{['all', 'compliant', 'partial', 'non-compliant', 'critical'].map(f => ( ))}
{/* Loading State */} {loading && } {/* Requirements List */} {!loading && (
{filteredRequirements.map(requirement => { const linkedControls = state.controls .filter(c => c.evidence.includes(requirement.id)) .map(c => ({ id: c.id, name: c.name })) return ( handleStatusChange(requirement.id, status)} onDelete={() => handleDeleteRequirement(requirement.id)} expanded={expandedId === requirement.id} onToggleDetails={() => setExpandedId(expandedId === requirement.id ? null : requirement.id)} linkedControls={linkedControls} /> ) })}
)} {!loading && filteredRequirements.length === 0 && state.modules.length > 0 && (

Keine Anforderungen gefunden

Passen Sie die Suche oder den Filter an.

)}
) }