diff --git a/frontend/components/try/CenterPanel.tsx b/frontend/components/try/CenterPanel.tsx index aac2bc0..decb9f0 100644 --- a/frontend/components/try/CenterPanel.tsx +++ b/frontend/components/try/CenterPanel.tsx @@ -716,91 +716,144 @@ export function CenterPanel({ tab, onAnalyze }: CenterPanelProps) { case "risk-analysis": return (
-

🔒 Risk Analysis

{analyzeResult ? (
- {/* Overall Risk Score Card */} -
-
+ {/* Header: RISK ANALYSIS SUMMARY */} +
+
-
-
-
Overall Risk Score
-
- {(analyzeResult.risk_assessment.overall_risk_score * 100).toFixed(1)}% -
-
-
- {analyzeResult.risk_assessment.risk_level} RISK -
+
+ 🔒 +

RISK ANALYSIS SUMMARY

- {analyzeResult.risk_assessment.presidio_enabled && ( -
- - Presidio-Enhanced Detection +
+ {/* Overall Risk */} +
+
📊 Overall Risk
+
+ {(analyzeResult.risk_assessment.overall_risk_score * 100).toFixed(1)}% +
+
+ {analyzeResult.risk_assessment.risk_level} +
- )} + + {/* Presidio Status */} +
+
🔒 Detection Engine
+
+ {analyzeResult.risk_assessment.presidio_enabled ? 'Presidio' : 'Regex'} +
+
+ + {analyzeResult.risk_assessment.presidio_enabled ? 'Enhanced' : 'Standard'} +
+
+ + {/* Violations */} +
+
⚠️ Violations
+
0 + ? 'text-red-400' + : 'text-green-400' + }`}> + {analyzeResult.risk_assessment.violations?.length || 0} +
+
+ {(analyzeResult.risk_assessment.violations?.filter((v: any) => v.severity === 'CRITICAL').length || 0)} Critical Issues +
+
+
- {/* Risk Categories Grid */} -
- {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 categoryIcons: Record = { - privacy: '🔒', - ethical: '⚖️', - compliance: '📋', - security: '🛡️', - operational: '⚙️', - data_quality: '📊' - }; - - return ( -
-
-
{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;