Referenzmatrix nach Mockup + Risiko-Bewertungsmatrix editierbar

Referenz-/Coverage-Matrix (§9.3) wie im GEFIM-Mockup aufgebaut:
- Zwei Richtungen „nach Control" und „nach Dokument" (Umschalter) + Assessment-
  Export-Button (Platzhalter).
- nach Control: Control-Nr + -Titel, je Anforderung MUSS/SOLL-Badge + Text,
  Richtlinie-Link, Verfahren-Chips.
- nach Dokument: gruppiert je Richtlinie (Kopfzeile), Zeilen Control · Anforderung
  · Umsetzung (Variablen aufgelöst, BL entfernt) · Verfahren.
- 44 Control-Titel aus dem Mockup übernommen (lib/control-titles.ts), numerische
  Control-Sortierung.

Risiko-Bewertungsmatrix jetzt editierbar (war nur anzeigend / Edit-Popover wurde
vom overflow-Container abgeschnitten):
- Risikoklassen, Eintrittswahrscheinlichkeit UND Schadenskategorien inline
  bearbeitbar (Klick auf Zeile klappt Formular auf — kein abgeschnittenes Popover).
- Neue Actions updateEwLevel/updateDamageDimension; Krypto-Register-Clipping
  (overflow-x-auto) ebenfalls entfernt.

Verifiziert: beide Referenz-Richtungen gerendert; Risikoklasse-Edit end-to-end
gespeichert (persistiert).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 07:20:12 +02:00
co-authored by Claude Opus 4.8
parent 92c184dfc6
commit 222046a362
6 changed files with 320 additions and 112 deletions
+63
View File
@@ -0,0 +1,63 @@
/**
* VDA-ISA-2027 Control-Titel (aus dem GEFIM-Mockup übernommen) für die
* Referenz-/Coverage-Matrix. Fallback: „ISA <ref>“ wenn nicht enthalten.
*/
export const CONTROL_TITLES: Record<string, string> = {
"1.2.1": "Steuerung der Informationssicherheit",
"1.2.2": "Organisation der Verantwortlichkeiten",
"1.2.3": "Informationssicherheit in Projekten",
"1.3.1": "Identifikation von Assets",
"1.3.2": "Klassifizierung",
"1.3.3": "Zugelassene Hardware",
"1.3.4": "Zugelassene Software",
"1.4.1": "Risikomanagement",
"1.5.1": "Compliance-Prüfung im IS-Betrieb",
"1.5.2": "Unabhängige Überprüfung",
"1.6.1": "Meldung von Ereignissen",
"1.6.2": "Behandlung von Sicherheitsereignissen",
"1.6.3": "Krisenmanagement",
"2.1.1": "Qualifikation für sensible Tätigkeiten",
"2.1.2": "Vertragliche Verpflichtung",
"2.1.3": "Sensibilisierung und Schulung",
"2.1.4": "Mobiles Arbeiten",
"3.1.1": "Sicherheitszonen und Zutritt",
"3.1.3": "Umgang mit unterstützenden Betriebsmitteln",
"3.1.4": "Mobile Geräte und Datenträger",
"4.1.1": "Identifikationsmittel",
"4.1.2": "Sichere Anmeldung",
"4.1.3": "Konten und Anmeldeinformationen",
"4.2.1": "Zugriffsrechte",
"5.1.1": "Einsatz kryptografischer Verfahren",
"5.1.2": "Schutz bei Uebertragung",
"5.2.1": "Change-Management",
"5.2.2": "Trennung der Umgebungen",
"5.2.3": "Schutz vor Malware",
"5.2.4": "Protokollierung und Auswertung",
"5.2.5": "Schwachstellen- und Patch-Management",
"5.2.6": "Technische Überprüfung",
"5.2.7": "Netzwerksicherheit",
"5.2.8": "Kontinuitätsplanung IT",
"5.2.9": "Backup und Wiederherstellung",
"5.3.1": "Sicherheit bei Beschaffung/Entwicklung",
"5.3.2": "Anforderungen an Netzdienste",
"5.3.3": "Rückgabe und sichere Löschung",
"5.3.4": "Externe/geteilte IT-Dienste und Cloud",
"6.1.1": "Informationssicherheit bei Lieferanten",
"6.1.2": "Vertraulichkeit",
"6.1.3": "Abgrenzung der Verantwortlichkeiten",
"7.1.1": "Regulatorische und vertragliche Compliance",
"7.1.2": "Schutz personenbezogener Daten",
};
export function controlTitle(ref: string): string {
return CONTROL_TITLES[ref] ?? `ISA ${ref}`;
}
/** Numerischer Vergleich gepunkteter Control-Refs (1.2.10 nach 1.2.2). */
export function compareControl(a: string, b: string): number {
const pa = a.split('.').map(Number), pb = b.split('.').map(Number);
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
if ((pa[i] || 0) !== (pb[i] || 0)) return (pa[i] || 0) - (pb[i] || 0);
}
return 0;
}