skillguard/artifacts/skillguard/src/components/ui-helpers.tsx
Replit Agent 434ec07885 Add live progress updates and detailed scan checkpoints to scan results
Introduce streaming endpoint for NDJSON scan progress, incorporate scan checkpoints into scan details, and update UI components to display this new information.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 0d01f99a-ea6a-447d-82fd-311715434a39
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 2852b526-3bf8-4a93-a62a-a50e26291074
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/e32d2b99-1721-47dd-833c-98b372f48008/0d01f99a-ea6a-447d-82fd-311715434a39/8MCgDZm
Replit-Helium-Checkpoint-Created: true
2026-06-10 18:53:17 +00:00

62 lines
3.6 KiB
TypeScript

import { Badge } from "@/components/ui/badge";
import { ShieldCheck, ShieldAlert, Shield, AlertTriangle, Info, AlertCircle, AlertOctagon, CheckCircle2, MinusCircle, XCircle } from "lucide-react";
export const CHECKPOINT_STATUS_LABELS: Record<string, string> = {
pass: "Unauffällig",
flagged: "Auffällig",
skipped: "Übersprungen",
error: "Fehler",
};
export function CheckpointStatusBadge({ status, className }: { status: string, className?: string }) {
switch (status) {
case "pass":
return <Badge className={`bg-emerald-500 hover:bg-emerald-600 text-white border-transparent ${className}`}><CheckCircle2 className="w-3 h-3 mr-1"/> Unauffällig</Badge>;
case "flagged":
return <Badge className={`bg-rose-500 hover:bg-rose-600 text-white border-transparent ${className}`}><AlertTriangle className="w-3 h-3 mr-1"/> Auffällig</Badge>;
case "skipped":
return <Badge variant="outline" className={`text-muted-foreground ${className}`}><MinusCircle className="w-3 h-3 mr-1"/> Übersprungen</Badge>;
case "error":
return <Badge className={`bg-amber-500 hover:bg-amber-600 text-white border-transparent ${className}`}><XCircle className="w-3 h-3 mr-1"/> Fehler</Badge>;
default:
return <Badge variant="outline" className={className}>{status}</Badge>;
}
}
export function VerdictBadge({ verdict, className }: { verdict: string, className?: string }) {
switch (verdict) {
case "pass":
return <Badge className={`bg-emerald-500 hover:bg-emerald-600 text-white ${className}`}><ShieldCheck className="w-3 h-3 mr-1"/> Freigabe</Badge>;
case "review":
return <Badge className={`bg-amber-500 hover:bg-amber-600 text-white ${className}`}><ShieldAlert className="w-3 h-3 mr-1"/> Manuelle Prüfung</Badge>;
case "block":
return <Badge className={`bg-rose-500 hover:bg-rose-600 text-white ${className}`}><Shield className="w-3 h-3 mr-1"/> Blockieren</Badge>;
default:
return <Badge variant="outline" className={className}>{verdict}</Badge>;
}
}
export function SeverityBadge({ severity, className }: { severity: string, className?: string }) {
switch (severity) {
case "critical":
return <Badge className={`bg-rose-600 hover:bg-rose-700 text-white border-transparent ${className}`}><AlertOctagon className="w-3 h-3 mr-1"/> Kritisch</Badge>;
case "high":
return <Badge className={`bg-orange-500 hover:bg-orange-600 text-white border-transparent ${className}`}><AlertTriangle className="w-3 h-3 mr-1"/> Hoch</Badge>;
case "medium":
return <Badge className={`bg-amber-400 hover:bg-amber-500 text-white border-transparent ${className}`}><AlertCircle className="w-3 h-3 mr-1"/> Mittel</Badge>;
case "low":
return <Badge className={`bg-blue-400 hover:bg-blue-500 text-white border-transparent ${className}`}><Info className="w-3 h-3 mr-1"/> Niedrig</Badge>;
case "info":
return <Badge className={`bg-slate-400 hover:bg-slate-500 text-white border-transparent ${className}`}><Info className="w-3 h-3 mr-1"/> Info</Badge>;
default:
return <Badge variant="outline" className={className}>{severity}</Badge>;
}
}
export function AxisBadge({ axis, className }: { axis: string, className?: string }) {
return axis === "security" ? (
<Badge variant="outline" className={`border-blue-200 text-blue-700 bg-blue-50 dark:bg-blue-900/20 dark:border-blue-800 dark:text-blue-400 ${className}`}>IT-Sicherheit</Badge>
) : (
<Badge variant="outline" className={`border-purple-200 text-purple-700 bg-purple-50 dark:bg-purple-900/20 dark:border-purple-800 dark:text-purple-400 ${className}`}>Datenschutz</Badge>
);
}