'use client'; import { BarChart, Donut } from '@/components/charts'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; interface ExtractionEntity { extraction_class: string; extraction_text: string; attributes?: Record; } interface EntityChartProps { extractions: ExtractionEntity[]; title?: string; } const COLORS = [ 'var(--chart-1)', 'var(--chart-2)', 'var(--chart-3)', 'var(--chart-4)', 'var(--chart-5)', ]; export function EntityBarChart({ extractions, title = 'Entities by Class' }: EntityChartProps) { const classCounts = extractions.reduce( (acc, e) => { acc[e.extraction_class] = (acc[e.extraction_class] || 0) + 1; return acc; }, {} as Record ); const data = Object.entries(classCounts) .map(([name, count]) => ({ name, count })) .sort((a, b) => b.count - a.count); if (data.length === 0) return null; return ( {title} ({ id: d.name, value: d.count, label: d.name }))} width={640} height={250} className="h-auto w-full" ariaLabel={title} /> ); } export function EntityPieChart({ extractions, title = 'Class Distribution' }: EntityChartProps) { const classCounts = extractions.reduce( (acc, e) => { acc[e.extraction_class] = (acc[e.extraction_class] || 0) + 1; return acc; }, {} as Record ); const data = Object.entries(classCounts) .map(([name, value]) => ({ name, value })) .sort((a, b) => b.value - a.value); if (data.length === 0) return null; return ( {title} ({ id: d.name, label: d.name, value: d.value, color: COLORS[idx % COLORS.length], }))} size={220} ariaLabel={title} /> ); } export function EntityTimeline({ extractions }: { extractions: ExtractionEntity[] }) { if (extractions.length === 0) return null; return ( Entity Timeline
{extractions.slice(0, 20).map((e, i) => (
{ acc[ex.extraction_class] = true; return acc; }, {} as Record ) ).indexOf(e.extraction_class) % COLORS.length ], }} />
{e.extraction_class}

{e.extraction_text}

))}
); }