'use client' import { useMemo, useState } from 'react' import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { BarChart3, FileText, Search, AlertCircle, CheckCircle2, Download, Database, Code, MessageSquare, TrendingUp } from 'lucide-react' interface DashboardData { missingManuals: any qaData: any[] metadata: any[] structuredData: any[] semanticIndex: any acquisitionList: any nameMapping: any[] } interface ManualsDashboardClientProps { data: DashboardData } export function ManualsDashboardClient({ data }: ManualsDashboardClientProps) { const [searchTerm, setSearchTerm] = useState('') // Calculate statistics const stats = useMemo(() => { const missing = data.missingManuals?.summary || {} const qaCategories = data.qaData.reduce((acc: any, item: any) => { const cat = item.category || 'unknown' acc[cat] = (acc[cat] || 0) + 1 return acc }, {}) const metadataWithSpecs = data.metadata.filter((m: any) => m.specifications?.dimensions && Object.keys(m.specifications.dimensions).length > 0 ).length const metadataWithParts = data.metadata.filter((m: any) => m.parts_list && m.parts_list.length > 0 ).length const metadataWithTroubleshooting = data.metadata.filter((m: any) => m.troubleshooting && m.troubleshooting.length > 0 ).length const schemaTypes = data.structuredData.reduce((acc: any, item: any) => { item.schemas?.forEach((schema: any) => { const type = schema['@type'] || 'unknown' acc[type] = (acc[type] || 0) + 1 }) return acc }, {}) return { totalModels: missing.total_expected_models || 0, missingAll: missing.models_missing_all || 0, partial: missing.models_partial || 0, totalQAPairs: data.qaData.length, qaCategories, totalManuals: data.metadata.length, metadataWithSpecs, metadataWithParts, metadataWithTroubleshooting, totalChunks: data.semanticIndex?.total_chunks || 0, schemaTypes, highPriority: data.acquisitionList?.high_priority || 0, mediumPriority: data.acquisitionList?.medium_priority || 0, lowPriority: data.acquisitionList?.low_priority || 0, } }, [data]) // Filter Q&A data const filteredQA = useMemo(() => { if (!searchTerm) return data.qaData.slice(0, 50) const term = searchTerm.toLowerCase() return data.qaData.filter((item: any) => item.question?.toLowerCase().includes(term) || item.answer?.toLowerCase().includes(term) ).slice(0, 50) }, [data.qaData, searchTerm]) // Get high priority missing manuals const highPriorityMissing = useMemo(() => { return (data.acquisitionList?.acquisition_list || []) .filter((item: any) => item.priority === 'high') .slice(0, 20) }, [data.acquisitionList]) return (
In database
With metadata
Generated
No manuals found
Q&A Categories
{item.model_name}
Missing: {item.missing_types?.join(', ')}
Sources: {item.source_urls?.length || 0} URLs found
{item.answer}
Manufacturer: {data.metadata[0].manufacturer}
Model: {data.metadata[0].model_number || 'N/A'}
Type: {data.metadata[0].manual_type}
{data.metadata[0].specifications?.interfaces && (Interfaces: {data.metadata[0].specifications.interfaces.join(', ')}
)}Total Schemas: {data.structuredData.length}
Schema Types:
{Object.entries(stats.schemaTypes).map(([type, count]: [string, any]) => (Note: Using placeholder embeddings. Ready for production integration.