Files
breakpilot-compliance/breakpilot-compliance-sdk/apps/admin-dashboard/src/app/page.tsx
Benjamin Boenisch 4435e7ea0a Initial commit: breakpilot-compliance - Compliance SDK Platform
Services: Admin-Compliance, Backend-Compliance,
AI-Compliance-SDK, Consent-SDK, Developer-Portal,
PCA-Platform, DSMS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:47:28 +01:00

266 lines
9.5 KiB
TypeScript

'use client';
import { useCompliance } from '@breakpilot/compliance-sdk-react';
import Link from 'next/link';
import {
Shield,
FileText,
Lock,
Search,
AlertTriangle,
CheckCircle,
ArrowRight,
BarChart3,
Settings,
} from 'lucide-react';
export default function DashboardPage() {
const { state, isLoading, error, progress } = useCompliance();
if (isLoading) {
return (
<div className="min-h-screen flex items-center justify-center bg-background">
<div className="text-center">
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto mb-4" />
<p className="text-muted-foreground">Loading compliance data...</p>
</div>
</div>
);
}
if (error) {
return (
<div className="min-h-screen flex items-center justify-center bg-background">
<div className="text-center text-destructive">
<AlertTriangle className="h-12 w-12 mx-auto mb-4" />
<p>Error loading compliance data</p>
<p className="text-sm text-muted-foreground mt-2">{error}</p>
</div>
</div>
);
}
const modules = [
{
id: 'dsgvo',
title: 'DSGVO',
description: 'Datenschutz-Grundverordnung Compliance',
icon: Shield,
href: '/dsgvo',
stats: { completed: 8, total: 12 },
color: 'text-blue-500',
},
{
id: 'compliance',
title: 'Compliance Hub',
description: 'Controls, Evidence & Obligations',
icon: CheckCircle,
href: '/compliance',
stats: { completed: 32, total: 44 },
color: 'text-green-500',
},
{
id: 'rag',
title: 'Legal Assistant',
description: 'AI-powered regulatory search',
icon: Search,
href: '/rag',
stats: { documents: 21 },
color: 'text-purple-500',
},
{
id: 'sbom',
title: 'SBOM',
description: 'Software Bill of Materials',
icon: FileText,
href: '/sbom',
stats: { components: 140 },
color: 'text-orange-500',
},
{
id: 'security',
title: 'Security',
description: 'Vulnerability scanning & findings',
icon: Lock,
href: '/security',
stats: { findings: 5, critical: 0 },
color: 'text-red-500',
},
];
return (
<div className="min-h-screen bg-background">
{/* Header */}
<header className="border-b bg-card">
<div className="container mx-auto px-6 py-4">
<div className="flex items-center justify-between">
<div className="flex items-center gap-3">
<Shield className="h-8 w-8 text-primary" />
<div>
<h1 className="text-xl font-semibold">BreakPilot Compliance</h1>
<p className="text-sm text-muted-foreground">Admin Dashboard</p>
</div>
</div>
<div className="flex items-center gap-4">
<Link
href="/settings"
className="p-2 hover:bg-muted rounded-lg transition-colors"
>
<Settings className="h-5 w-5" />
</Link>
</div>
</div>
</div>
</header>
<main className="container mx-auto px-6 py-8">
{/* Overall Progress */}
<div className="mb-8">
<div className="bg-card border rounded-xl p-6">
<div className="flex items-center justify-between mb-4">
<div>
<h2 className="text-lg font-medium">Overall Compliance Score</h2>
<p className="text-sm text-muted-foreground">
Based on all active modules
</p>
</div>
<div className="text-4xl font-bold text-primary">
{state?.complianceScore ?? progress?.overall ?? 0}%
</div>
</div>
<div className="w-full bg-muted rounded-full h-3">
<div
className="bg-primary h-3 rounded-full transition-all duration-500"
style={{
width: `${state?.complianceScore ?? progress?.overall ?? 0}%`,
}}
/>
</div>
<div className="mt-4 grid grid-cols-5 gap-4 text-center text-sm">
<div>
<div className="text-muted-foreground">DSGVO</div>
<div className="font-medium">{progress?.dsgvo ?? 0}%</div>
</div>
<div>
<div className="text-muted-foreground">Compliance</div>
<div className="font-medium">{progress?.compliance ?? 0}%</div>
</div>
<div>
<div className="text-muted-foreground">Security</div>
<div className="font-medium">{progress?.security ?? 0}%</div>
</div>
<div>
<div className="text-muted-foreground">SBOM</div>
<div className="font-medium">{progress?.sbom ?? 0}%</div>
</div>
<div>
<div className="text-muted-foreground">RAG</div>
<div className="font-medium">{progress?.rag ?? 0}%</div>
</div>
</div>
</div>
</div>
{/* Module Grid */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{modules.map((module) => {
const Icon = module.icon;
return (
<Link
key={module.id}
href={module.href}
className="group bg-card border rounded-xl p-6 hover:shadow-lg transition-all duration-200 hover:border-primary/50"
>
<div className="flex items-start justify-between mb-4">
<div className={`p-3 rounded-lg bg-muted ${module.color}`}>
<Icon className="h-6 w-6" />
</div>
<ArrowRight className="h-5 w-5 text-muted-foreground group-hover:text-primary transition-colors" />
</div>
<h3 className="text-lg font-semibold mb-1">{module.title}</h3>
<p className="text-sm text-muted-foreground mb-4">
{module.description}
</p>
<div className="flex items-center gap-4 text-sm">
{'completed' in module.stats && (
<span className="text-muted-foreground">
<span className="font-medium text-foreground">
{module.stats.completed}
</span>
/{module.stats.total} complete
</span>
)}
{'documents' in module.stats && (
<span className="text-muted-foreground">
<span className="font-medium text-foreground">
{module.stats.documents}
</span>{' '}
documents
</span>
)}
{'components' in module.stats && (
<span className="text-muted-foreground">
<span className="font-medium text-foreground">
{module.stats.components}
</span>{' '}
components
</span>
)}
{'findings' in module.stats && (
<span className="text-muted-foreground">
<span className="font-medium text-foreground">
{module.stats.findings}
</span>{' '}
findings
{module.stats.critical > 0 && (
<span className="text-destructive ml-1">
({module.stats.critical} critical)
</span>
)}
</span>
)}
</div>
</Link>
);
})}
</div>
{/* Quick Actions */}
<div className="mt-8">
<h2 className="text-lg font-medium mb-4">Quick Actions</h2>
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
<Link
href="/rag?action=ask"
className="bg-card border rounded-lg p-4 text-center hover:border-primary/50 transition-colors"
>
<Search className="h-6 w-6 mx-auto mb-2 text-purple-500" />
<span className="text-sm font-medium">Ask Legal Question</span>
</Link>
<Link
href="/security/scan"
className="bg-card border rounded-lg p-4 text-center hover:border-primary/50 transition-colors"
>
<Lock className="h-6 w-6 mx-auto mb-2 text-red-500" />
<span className="text-sm font-medium">Run Security Scan</span>
</Link>
<Link
href="/compliance/export"
className="bg-card border rounded-lg p-4 text-center hover:border-primary/50 transition-colors"
>
<BarChart3 className="h-6 w-6 mx-auto mb-2 text-green-500" />
<span className="text-sm font-medium">Export Report</span>
</Link>
<Link
href="/dsgvo/consent"
className="bg-card border rounded-lg p-4 text-center hover:border-primary/50 transition-colors"
>
<Shield className="h-6 w-6 mx-auto mb-2 text-blue-500" />
<span className="text-sm font-medium">Manage Consents</span>
</Link>
</div>
</div>
</main>
</div>
);
}