import { AppLayout } from "@/components/layout/AppLayout"; import { useTraceabilityData } from "@/hooks/useTraceabilityData"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { ScrollArea } from "@/components/ui/scroll-area"; import { DataUpdateDialog } from "@/components/DataUpdateDialog"; import { WorkPackage } from "@/types/traceability"; import { Target, CheckSquare, FileText, TestTube, Layers, Bug, AlertTriangle, GitBranch, TrendingUp, Activity, Download, ChevronDown, Terminal, RefreshCw, } from "lucide-react"; import { Link } from "react-router-dom"; import { useState } from "react"; const typeIcons: Record = { feature: , requirements: , swreq: , "test case": , epic: , bug: , risk: , task: , }; const typeColors: Record = { feature: "bg-purple-500/10 text-purple-700 border-purple-500/20", requirements: "bg-blue-500/10 text-blue-700 border-blue-500/20", swreq: "bg-indigo-500/10 text-indigo-700 border-indigo-500/20", "test case": "bg-green-500/10 text-green-700 border-green-500/20", epic: "bg-amber-500/10 text-amber-700 border-amber-500/20", bug: "bg-red-500/10 text-red-700 border-red-500/20", risk: "bg-orange-500/10 text-orange-700 border-orange-500/20", task: "bg-slate-500/10 text-slate-700 border-slate-500/20", }; export default function Dashboard() { const { data, loading, lastUpdated, refresh, reloadFromCSV, syncFromServer, typeCounts, groupedByType, parseLog, setData } = useTraceabilityData(); const [showDebug, setShowDebug] = useState(false); const [showUpload, setShowUpload] = useState(false); const totalItems = data?.workPackages.length || 0; // Calculate traceability coverage const features = groupedByType["feature"] || []; const requirements = groupedByType["requirements"] || []; const swreqs = groupedByType["swreq"] || []; const testCases = groupedByType["test case"] || []; const handleDownloadCSV = () => { window.open('/data/traceability_export.csv', '_blank'); }; const handleDataLoaded = (workPackages: WorkPackage[]) => { setData({ lastUpdated: new Date(), workPackages }); setShowUpload(false); }; return (
{/* Header Stats */}
Total Items
{totalItems}

Work packages tracked

Features
{features.length}

System features defined

Requirements
{requirements.length + swreqs.length}

SR + SWR total

Test Cases
{testCases.length}

Verification tests

{/* Data Management */} Data Management
{showUpload && ( setShowUpload(false)} /> )}
{parseLog.length > 0 ? ( parseLog.map((log, i) => (
{log}
)) ) : (
No logs available. Click "Reload from CSV" to see parsing logs.
)}
{/* Traceability Summary */}
{/* Type Distribution */} Work Package Distribution
{Object.entries(typeCounts) .sort(([, a], [, b]) => b - a) .map(([type, count]) => (
{typeIcons[type] || }
{type}
{count} ))}
{/* Quick Links */} Traceability Chain
Features → Requirements {features.length} → {requirements.length}
Requirements → SW Requirements {requirements.length} → {swreqs.length}
SW Requirements → Test Cases {swreqs.length} → {testCases.length}

Quick Actions

📄 View Documentation 🔍 Gap Analysis 🔗 Traceability Matrix
{/* Loading State */} {loading && (
Loading traceability data...
)}
); }