-
-
{categoryIcons[category] || '📌'}
-
- {riskLevel}
-
+ {/* Risk Categories Grid with Enhanced Design */}
+
+
+ 📈
+
Category Scores
+
+
+
+ {Object.entries(analyzeResult.risk_assessment.risk_categories || {}).map(([category, score]: [string, any]) => {
+ const riskPct = (score * 100);
+ const riskLevel = riskPct >= 70 ? 'CRITICAL' : riskPct >= 50 ? 'HIGH' : riskPct >= 30 ? 'MEDIUM' : 'LOW';
+ const categoryConfig: Record
= {
+ privacy: { icon: '�', label: 'Privacy', color: 'blue' },
+ ethical: { icon: '🟠', label: 'Ethical', color: 'purple' },
+ compliance: { icon: '�', label: 'Compliance', color: 'indigo' },
+ security: { icon: '�', label: 'Security', color: 'cyan' },
+ operational: { icon: '🟠', label: 'Operational', color: 'orange' },
+ data_quality: { icon: '�', label: 'Data Quality', color: 'green' }
+ };
+
+ const config = categoryConfig[category] || { icon: '📌', label: category, color: 'slate' };
+
+ // Dynamic emoji based on risk level
+ const riskEmoji = riskPct < 25 ? '🟢' : riskPct < 50 ? '🟡' : '🟠';
+
+ return (
+
+
+
+
+
+ {riskEmoji}
+
+ {riskLevel}
+
+
+
+
+ {config.label}
+
+
+
+ {riskPct.toFixed(1)}%
+
+
+ {/* Progress Bar */}
+
+
-
- {category.replace('_', ' ')}
-
-
- {riskPct.toFixed(0)}%
-
-
-
- );
- })}
+ );
+ })}
+
{/* Privacy Risks - PII Detection */}
@@ -810,13 +863,17 @@ export function CenterPanel({ tab, onAnalyze }: CenterPanelProps) {
🔒
Privacy Risks
- {analyzeResult.risk_assessment.privacy_risks.pii_count} PII Types Detected
+ {typeof analyzeResult.risk_assessment.privacy_risks === 'object' && !Array.isArray(analyzeResult.risk_assessment.privacy_risks)
+ ? (analyzeResult.risk_assessment.privacy_risks.pii_count || 0)
+ : (Array.isArray(analyzeResult.risk_assessment.privacy_risks) ? analyzeResult.risk_assessment.privacy_risks.length : 0)} PII Types
- {/* PII Detections */}
- {analyzeResult.risk_assessment.privacy_risks.pii_detected &&
- analyzeResult.risk_assessment.privacy_risks.pii_detected.length > 0 ? (
+ {/* PII Detections - Handle both object and array formats */}
+ {(typeof analyzeResult.risk_assessment.privacy_risks === 'object' &&
+ !Array.isArray(analyzeResult.risk_assessment.privacy_risks) &&
+ analyzeResult.risk_assessment.privacy_risks.pii_detected &&
+ analyzeResult.risk_assessment.privacy_risks.pii_detected.length > 0) ? (
{analyzeResult.risk_assessment.privacy_risks.pii_detected.slice(0, 6).map((pii: any, idx: number) => (
@@ -851,32 +908,39 @@ export function CenterPanel({ tab, onAnalyze }: CenterPanelProps) {
{/* Privacy Metrics */}
-
-
-
Re-ID Risk
-
- {(analyzeResult.risk_assessment.privacy_risks.reidentification_risk * 100).toFixed(0)}%
+ {typeof analyzeResult.risk_assessment.privacy_risks === 'object' &&
+ !Array.isArray(analyzeResult.risk_assessment.privacy_risks) && (
+
+
+
Re-ID Risk
+
+ {analyzeResult.risk_assessment.privacy_risks.reidentification_risk
+ ? (analyzeResult.risk_assessment.privacy_risks.reidentification_risk * 100).toFixed(0)
+ : 0}%
+
+
+
+
Data Minimization
+
+ {analyzeResult.risk_assessment.privacy_risks.data_minimization_score
+ ? (analyzeResult.risk_assessment.privacy_risks.data_minimization_score * 100).toFixed(0)
+ : 0}%
+
+
+
+
Anonymization
+
+ {analyzeResult.risk_assessment.privacy_risks.anonymization_level || 'N/A'}
+
+
+
+
Detection
+
+ {analyzeResult.risk_assessment.privacy_risks.detection_method || 'Auto'}
+
-
-
Data Minimization
-
- {(analyzeResult.risk_assessment.privacy_risks.data_minimization_score * 100).toFixed(0)}%
-
-
-
-
Anonymization
-
- {analyzeResult.risk_assessment.privacy_risks.anonymization_level}
-
-
-
-
Detection
-
- {analyzeResult.risk_assessment.privacy_risks.detection_method}
-
-
-
+ )}
) : (
@@ -886,49 +950,61 @@ export function CenterPanel({ tab, onAnalyze }: CenterPanelProps) {
)}
- {/* Violations */}
+ {/* Violations Section with Enhanced Design */}
{analyzeResult.risk_assessment.violations &&
analyzeResult.risk_assessment.violations.length > 0 && (
-
-
-
⚠️
-
Risk Violations
-
- {analyzeResult.risk_assessment.violations.length} Issues
+
+
+ ⚠️
+
Violations
+
+ {analyzeResult.risk_assessment.violations.length} Issues Found
{analyzeResult.risk_assessment.violations.map((violation: any, idx: number) => (
-
-
-
-
-
+
+
+
+
+
{violation.severity}
-
+
{violation.category}
-
- {violation.message}
-
- {violation.details && (
-
- {violation.details}
+
+
+
+
+ {violation.severity === 'CRITICAL' ? '🔴' :
+ violation.severity === 'HIGH' ? '🟠' :
+ violation.severity === 'MEDIUM' ? '🟡' : '🔵'}
+
+
+
+ {violation.message}
- )}
+ {violation.details && (
+
+ {violation.details}
+
+ )}
+
@@ -937,22 +1013,27 @@ export function CenterPanel({ tab, onAnalyze }: CenterPanelProps) {
)}
- {/* Key Insights */}
+ {/* Key Insights Section with Enhanced Design */}
{analyzeResult.risk_assessment.insights &&
analyzeResult.risk_assessment.insights.length > 0 && (
-
-
- 💡
-
Key Insights
-
+
+
+
+
+
+
+ 💡
+
Key Insights
+
-
- {analyzeResult.risk_assessment.insights.map((insight: string, idx: number) => (
-
- •
- {insight}
-
- ))}
+
+ {analyzeResult.risk_assessment.insights.map((insight: string, idx: number) => (
+
+ •
+ {insight}
+
+ ))}
+
)}
diff --git a/frontend/lib/api.ts b/frontend/lib/api.ts
index 9e65b18..c330ffd 100644
--- a/frontend/lib/api.ts
+++ b/frontend/lib/api.ts
@@ -27,10 +27,15 @@ export interface AnalyzeResponse {
};
risk_assessment: {
overall_risk_score: number;
- privacy_risks: any[];
+ risk_level?: string;
+ presidio_enabled?: boolean;
+ risk_categories?: Record
;
+ privacy_risks: any;
ethical_risks: any[];
- compliance_risks: any[];
+ compliance_risks: any;
data_quality_risks: any[];
+ violations?: any[];
+ insights?: string[];
};
recommendations: string[];
report_file: string;