'use client' /** * DependencyMap Sankey/Connection View * * Extracted from DependencyMap to keep each file under 500 LOC. */ import type { Language } from '@/lib/compliance-i18n' import type { Requirement, Control, Mapping } from './DependencyMapTypes' import { DOMAIN_COLORS, COVERAGE_COLORS } from './DependencyMapTypes' interface DependencyMapSankeyProps { filteredControls: Control[] filteredRequirements: Requirement[] requirements: Requirement[] controls: Control[] mappingLookup: Record> selectedControl: string | null selectedRequirement: string | null onControlClick: (control: Control) => void onRequirementClick: (requirement: Requirement) => void lang: Language } export function DependencyMapSankey({ filteredControls, filteredRequirements, requirements, controls, mappingLookup, selectedControl, selectedRequirement, onControlClick, onRequirementClick, lang, }: DependencyMapSankeyProps) { const getConnectedRequirements = (controlId: string) => { return Object.keys(mappingLookup[controlId] || {}) } const getConnectedControls = (requirementId: string) => { return Object.keys(mappingLookup) .filter((controlId) => mappingLookup[controlId][requirementId]) .map((controlId) => ({ controlId, coverage: mappingLookup[controlId][requirementId].coverage_level, })) } return (
{/* Controls Column */}

Controls ({filteredControls.length})

{filteredControls.map((control) => { const connectedReqs = getConnectedRequirements(control.control_id) const isSelected = selectedControl === control.control_id return ( ) })}
{/* Connection Lines (simplified) */}
{selectedControl && (
{getConnectedRequirements(selectedControl).slice(0, 10).map((reqId) => { const req = requirements.find((r) => r.id === reqId) const mapping = mappingLookup[selectedControl][reqId] if (!req) return null return (
{req.regulation_code} {req.article}
) })} {getConnectedRequirements(selectedControl).length > 10 && ( +{getConnectedRequirements(selectedControl).length - 10} {lang === 'de' ? 'weitere' : 'more'} )}
)} {selectedRequirement && (
{getConnectedControls(selectedRequirement).slice(0, 10).map(({ controlId, coverage }) => { const control = controls.find((c) => c.control_id === controlId) if (!control) return null return (
{control.control_id}
) })}
)} {!selectedControl && !selectedRequirement && (

{lang === 'de' ? 'Waehlen Sie ein Control oder eine Anforderung aus' : 'Select a control or requirement'}

)}
{/* Requirements Column */}

{lang === 'de' ? 'Anforderungen' : 'Requirements'} ({filteredRequirements.length})

{filteredRequirements.slice(0, 15).map((req) => { const connectedCtrls = getConnectedControls(req.id) const isSelected = selectedRequirement === req.id const isHighlighted = selectedControl && connectedCtrls.some((c) => c.controlId === selectedControl) return ( ) })} {filteredRequirements.length > 15 && (

+{filteredRequirements.length - 15} {lang === 'de' ? 'weitere' : 'more'}

)}
) }