'use client' import { ScatterChart, Scatter, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, ReferenceLine, } from 'recharts' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { AlertTriangle } from 'lucide-react' interface JurorMetric { userId: string name: string email: string evaluationCount: number averageScore: number stddev: number deviationFromOverall: number isOutlier: boolean } interface JurorConsistencyProps { data: { overallAverage: number jurors: JurorMetric[] } } export function JurorConsistencyChart({ data }: JurorConsistencyProps) { const scatterData = data.jurors.map((j) => ({ name: j.name, avgScore: parseFloat(j.averageScore.toFixed(2)), stddev: parseFloat(j.stddev.toFixed(2)), evaluations: j.evaluationCount, isOutlier: j.isOutlier, })) const outlierCount = data.jurors.filter((j) => j.isOutlier).length return (
{/* Scatter: Average Score vs Standard Deviation */} Juror Scoring Patterns Overall Avg: {data.overallAverage.toFixed(2)} {outlierCount > 0 && ( {outlierCount} outlier{outlierCount > 1 ? 's' : ''} )}
{scatterData.map((entry, index) => ( ))}

Dot size represents number of evaluations. Red dots indicate outlier jurors (2+ points from mean).

{/* Juror details table */} Juror Consistency Details Juror Evaluations Avg Score Std Dev Deviation from Mean Status {data.jurors.map((juror) => (

{juror.name}

{juror.email}

{juror.evaluationCount} {juror.averageScore.toFixed(2)} {juror.stddev.toFixed(2)} {juror.deviationFromOverall.toFixed(2)} {juror.isOutlier ? ( Outlier ) : ( Normal )}
))}
) }