e1f89f6226
Frontend-Reorganisation (kein Datenmodell-Umbau): - Ebene 1 (Management): CRA-Readiness, offene Risiken (Klartext Kritisch/Hoch/..), Handlungsaufwand nach Evidenz-Typ, betroffene Vorschriften, Top-Risiken, Fristen. - Ebene 2 (Safety × Cyber): "Cyber öffnet CE-Gefährdung erneut" als Hero (USP). - Ebene 3 (Technik): Befund-Tabelle einklappbar, interne IDs (CRA-AI-x/CWE/NIST/ OWASP/ISO) nur im Detail, Maßnahmen-Namen statt M-IDs, größere Schrift. - Brücke: IACE-CRA-Tab ↔ /sdk/cra (Readiness-Check) beidseitig verlinkt. - CRACyberView in Unterkomponenten gesplittet (LOC < 300). scripts/qa/poc_cra_article_assign.py: PoC Artikel/Absatz-Zuordnung (Pfad B2b, zurückgestellt — nicht MVP). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
37 lines
1.4 KiB
TypeScript
37 lines
1.4 KiB
TypeScript
'use client'
|
||
|
||
import { useParams } from 'next/navigation'
|
||
import { useCRA } from './_hooks/useCRA'
|
||
import { CRACyberView } from './_components/CRACyberView'
|
||
import { WeightsControl } from './_components/WeightsControl'
|
||
import { SnapshotPanel } from './_components/SnapshotPanel'
|
||
|
||
export default function CRAPage() {
|
||
const params = useParams()
|
||
const projectId = params?.projectId as string | undefined
|
||
const { data, live, weights, setWeights, snapshots, saveSnapshot, viewSnapshot } = useCRA(projectId)
|
||
if (!data) {
|
||
return <p className="text-sm text-gray-500">CRA-Risikobeurteilung wird geladen …</p>
|
||
}
|
||
return (
|
||
<div className="space-y-6">
|
||
<div className="flex items-center justify-between gap-3">
|
||
<span className="text-sm text-gray-500">
|
||
Projektgebundene CE × Cyber-Analyse
|
||
</span>
|
||
<a href="/sdk/cra" className="text-sm text-purple-600 hover:underline whitespace-nowrap">
|
||
Allgemeiner CRA-Readiness-Check →
|
||
</a>
|
||
</div>
|
||
{!live && (
|
||
<p className="text-sm text-amber-600 dark:text-amber-400">
|
||
Backend nicht erreichbar — statisches Szenario angezeigt.
|
||
</p>
|
||
)}
|
||
<WeightsControl weights={weights} onChange={setWeights} />
|
||
<CRACyberView data={data} />
|
||
<SnapshotPanel snapshots={snapshots} onSave={saveSnapshot} onView={viewSnapshot} />
|
||
</div>
|
||
)
|
||
}
|