'use client' import React, { useEffect, useState, useCallback, use } from 'react' import { SeverityBadge } from '../../_components/SeverityBadge' interface Requirement { req_id: string n: number category: string title: string annex_anchor: string iso27001_ref: string[] description: string severity: string mapped_measures: string[] mapped_measure_names: { id: string; name: string }[] evidence_type: string effort_days: number status: string } interface RequirementsResponse { project_id: string classification: string | null total: number items: Requirement[] } export default function RequirementsPage({ params, }: { params: Promise<{ projectId: string }> }) { const { projectId } = use(params) const [data, setData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [filterCategory, setFilterCategory] = useState('all') const [filterSeverity, setFilterSeverity] = useState('all') const [expanded, setExpanded] = useState(null) const load = useCallback(async () => { try { const res = await fetch(`/api/sdk/v1/cra/projects/${projectId}/requirements`, { headers: { 'X-Tenant-ID': '00000000-0000-0000-0000-000000000001' }, }) if (!res.ok) throw new Error(await res.text()) setData(await res.json()) } catch (e) { setError(e instanceof Error ? e.message : 'Fehler beim Laden') } finally { setLoading(false) } }, [projectId]) useEffect(() => { load() }, [load]) if (loading) return

Laedt...

if (error) return

{error}

if (!data) return null const categories = Array.from(new Set(data.items.map(i => i.category))) const filtered = data.items.filter(r => (filterCategory === 'all' || r.category === filterCategory) && (filterSeverity === 'all' || r.severity === filterSeverity) ) return (
← Zurueck zum Projekt

CRA Annex I Requirements

Alle {data.total} Essential Cybersecurity Requirements aus Annex I. Status bleibt "unbewertet" bis Evidence-Checks in Phase 3 verknuepft sind.

{filtered.length} von {data.total}
{filtered.map(req => ( setExpanded(expanded === req.req_id ? null : req.req_id)} > {expanded === req.req_id && ( )} ))}
# Anforderung Kategorie Severity Aufwand Status
{req.n}
{req.title}
{req.annex_anchor} · {req.req_id}
{req.category} {req.effort_days} PT {req.status}

Beschreibung

{req.description}

{req.iso27001_ref.length > 0 && (

ISO 27001:2022 Mapping

{req.iso27001_ref.map(r => ( {r} ))}

)} {req.mapped_measure_names.length > 0 && (

Empfohlene Massnahmen

    {req.mapped_measure_names.map(m => (
  • {m.id} — {m.name}
  • ))}
)}
Evidence-Typ: {req.evidence_type}
) }