IT-Service-Detail auf Asset-Grundgerüst + Schutzbedarf-Layout gefixt

- ServiceDetailModal spiegelt jetzt das normale Asset-Detail: links
  "■ Stammdaten" (violette Karte, CIA-Badge, Provider/Kritikalität, Notizen,
  zugeordnete Prozesse), rechts "◆ Abhängigkeiten" (Verknüpfte-Assets-Tabelle
  mit Typ + CIA + CiaLegend, Reverse-Liste, Link zum Abhängigkeitsgraph),
  darunter das Risiken-Band — und erst darunter die Verantwortungsmatrix (RACI)
- SERVICE_INCLUDE um Typ/CIA der verknüpften Assets und Risk-Score erweitert,
  RACI nach controlRef sortiert
- Schutzbedarf (C/I/A) in Lieferanten- und IT-Service-Bearbeiten-Formular:
  vom gequetschten flex-Layout auf das saubere Asset-Formular-Muster umgestellt
  (grid mit Einzellabels Vertraulichkeit/Integrität/Verfügbarkeit + Normal…Sehr hoch)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-03 16:31:58 +02:00
co-authored by Claude Opus 4.8
parent d994c94ebb
commit ee4e554554
3 changed files with 162 additions and 60 deletions
+19 -6
View File
@@ -221,6 +221,8 @@ export async function SupplierDetailModal({ supplier, canWrite }: { supplier: Su
async function SupplierFields({ supplier, formId }: { supplier?: SupplierAssetDetail; formId?: string }) {
const t = await getTranslations("suppliers");
const tLife = await getTranslations("supplierStatus");
const tA = await getTranslations("assets");
const tLevel = await getTranslations("protectionLevel");
const f = formId ? { form: formId } : {};
const p = supplier?.supplierProfile;
return (
@@ -253,14 +255,25 @@ async function SupplierFields({ supplier, formId }: { supplier?: SupplierAssetDe
<Label>{t("criticality")}</Label>
<div className="mt-1"><SegmentedRating name="criticality" defaultValue={p?.criticality ?? 1} form={formId} /></div>
</div>
<div>
<Label>{t("protection")} (C/I/A)</Label>
<div className="mt-1 flex gap-2">
{(["confidentiality", "integrity", "availability"] as const).map((n) => (
<SegmentedRating key={n} name={n} defaultValue={(supplier?.[n] as number) ?? 1} form={formId} />
<fieldset className="md:col-span-2">
<legend className="text-sm font-medium">{t("protection")} (14)</legend>
<div className="mt-2 grid grid-cols-3 gap-4">
{(
[
["confidentiality", tA("confidentiality")],
["integrity", tA("integrity")],
["availability", tA("availability")],
] as const
).map(([n, label]) => (
<div key={n}>
<Label>{label}</Label>
<div className="mt-1">
<SegmentedRating name={n} defaultValue={(supplier?.[n] as number) ?? 1} low={tLevel("1")} high={tLevel("4")} form={formId} />
</div>
</div>
))}
</div>
</div>
</fieldset>
<div>
<Label htmlFor="nextReview">{t("nextReview")}</Label>
<Input id="nextReview" name="nextReview" type="date" defaultValue={p?.nextReview ? p.nextReview.toISOString().slice(0, 10) : ""} className="mt-1" {...f} />