From 90d99bba086d473154ca685b5026b837251d63fc Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Tue, 10 Mar 2026 08:06:43 +0100 Subject: [PATCH] feat(use-case-workshop): UCCA-Ergebnis-Panel nach Abschluss anzeigen Nach Wizard-Abschluss wird ein Ergebnis-Panel angezeigt: - Bei UCCA-API-Erfolg: AssessmentResultCard mit Regeln, Kontrollen, Architektur - Bei API-Fehler: Lokale Risikobewertung mit Score, Massnahmen, Regulations - Badge zeigt Quelle (API vs Lokal) - Nutzer kann Ergebnis pruefen bevor "Use Case speichern" geklickt wird Co-Authored-By: Claude Opus 4.6 --- .../app/sdk/advisory-board/page.tsx | 119 +++++++++++++++++- 1 file changed, 118 insertions(+), 1 deletion(-) diff --git a/admin-compliance/app/sdk/advisory-board/page.tsx b/admin-compliance/app/sdk/advisory-board/page.tsx index f88f4ca..d866bae 100644 --- a/admin-compliance/app/sdk/advisory-board/page.tsx +++ b/admin-compliance/app/sdk/advisory-board/page.tsx @@ -3,6 +3,7 @@ import React, { useState } from 'react' import Link from 'next/link' import { useSDK, UseCaseAssessment, UseCaseIntake } from '@/lib/sdk' +import { AssessmentResultCard } from '@/components/sdk/use-case-assessment/AssessmentResultCard' // ============================================================================= // WIZARD STEPS @@ -232,6 +233,9 @@ function UseCaseWizard({ const [currentStep, setCurrentStep] = useState(1) const [isSubmitting, setIsSubmitting] = useState(false) const [uccaError, setUccaError] = useState(null) + const [uccaResult, setUccaResult] = useState | null>(null) + const [completedUseCase, setCompletedUseCase] = useState(null) + const [resultSource, setResultSource] = useState<'api' | 'local'>('local') const [formData, setFormData] = useState({ name: '', description: '', @@ -425,16 +429,20 @@ function UseCaseWizard({ riskLevel: data.result.risk_level || newUseCase.assessmentResult!.riskLevel, dsfaRequired: data.result.dsfa_required ?? newUseCase.assessmentResult!.dsfaRequired, } + setUccaResult(data.result) + setResultSource('api') } } else { setUccaError('UCCA-API nicht erreichbar — lokale Risikobewertung wird verwendet.') + setResultSource('local') } } catch { setUccaError('UCCA-API nicht erreichbar — lokale Risikobewertung wird verwendet.') + setResultSource('local') } setIsSubmitting(false) - onComplete(newUseCase) + setCompletedUseCase(newUseCase) } const handleBack = () => { @@ -443,6 +451,115 @@ function UseCaseWizard({ const risk = calculateRiskScore(formData) + // ========== RESULT VIEW (after completion) ========== + if (completedUseCase) { + return ( +
+ {/* Header */} +
+
+

Assessment-Ergebnis: {completedUseCase.name}

+

+ {resultSource === 'api' + ? 'Regelbasierte Bewertung durch UCCA Policy Engine' + : 'Lokale Risikobewertung (UCCA-API nicht verfuegbar)'} +

+
+
+ + {resultSource === 'api' ? 'UCCA API' : 'Lokal'} + +
+
+ + {/* UCCA API Result (detailed) */} + {uccaResult && ( + [0]['result']} /> + )} + + {/* Local result fallback (when API not available) */} + {!uccaResult && completedUseCase.assessmentResult && ( +
+
+
+ {risk.score} +
+
+
+ Risikostufe: {completedUseCase.assessmentResult.riskLevel} +
+
+ AI Act: {completedUseCase.assessmentResult.aiActClassification} +
+
+ {completedUseCase.assessmentResult.dsfaRequired && ( + + DSFA empfohlen + + )} +
+ + {/* Recommended Controls */} + {completedUseCase.assessmentResult.recommendedControls.length > 0 && ( +
+

Empfohlene Massnahmen

+
+ {completedUseCase.assessmentResult.recommendedControls.map((ctrl, i) => ( +
+ + + + {ctrl} +
+ ))} +
+
+ )} + + {/* Applicable Regulations */} +
+ {completedUseCase.assessmentResult.applicableRegulations.map(reg => ( + + {reg} + + ))} +
+
+ )} + + {/* UCCA Error info */} + {uccaError && ( +
+ {uccaError} +
+ )} + + {/* Action buttons */} +
+ + +
+
+ ) + } + return (
{/* Header */}