'use client' import React from 'react' import type { Risk, RiskLikelihood, RiskImpact } from '@breakpilot/compliance-sdk-types' export interface RiskMatrixProps { risks: Risk[] onRiskClick?: (risk: Risk) => void className?: string style?: React.CSSProperties } export function RiskMatrix({ risks, onRiskClick, className, style }: RiskMatrixProps) { const getColor = (likelihood: number, impact: number): string => { const score = likelihood * impact if (score >= 20) return '#dc2626' // Critical - Red if (score >= 12) return '#f97316' // High - Orange if (score >= 6) return '#f59e0b' // Medium - Yellow return '#16a34a' // Low - Green } const getCellRisks = (likelihood: RiskLikelihood, impact: RiskImpact): Risk[] => { return risks.filter(r => r.likelihood === likelihood && r.impact === impact) } const containerStyle: React.CSSProperties = { fontFamily: 'system-ui, -apple-system, sans-serif', ...style, } const gridStyle: React.CSSProperties = { display: 'grid', gridTemplateColumns: '60px repeat(5, 1fr)', gridTemplateRows: '30px repeat(5, 60px)', gap: '2px', backgroundColor: '#e5e5e5', padding: '2px', borderRadius: '8px', } const cellStyle: React.CSSProperties = { display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: '#fff', position: 'relative', } const headerStyle: React.CSSProperties = { ...cellStyle, fontWeight: 600, fontSize: '12px', color: '#666', } const likelihoodLabels = ['Sehr niedrig', 'Niedrig', 'Mittel', 'Hoch', 'Sehr hoch'] const impactLabels = ['1', '2', '3', '4', '5'] return (
Risikomatrix {risks.length} Risiken
Niedrig Mittel Hoch Kritisch
{/* Header row */}
{impactLabels.map((label, i) => (
Auswirkung {label}
))} {/* Data rows (reversed so high likelihood is at top) */} {[5, 4, 3, 2, 1].map(likelihood => (
{likelihoodLabels[likelihood - 1]}
{[1, 2, 3, 4, 5].map(impact => { const cellRisks = getCellRisks(likelihood as RiskLikelihood, impact as RiskImpact) return (
0 ? 1 : 0.3, cursor: cellRisks.length > 0 ? 'pointer' : 'default', }} onClick={() => { if (cellRisks.length > 0 && onRiskClick) { onRiskClick(cellRisks[0]) } }} > {cellRisks.length > 0 && (
{cellRisks.length}
)}
) })}
))}
Wahrscheinlichkeit → Auswirkung →
) }