/** * DamageTable — denser-than-cards damage list with sortable columns. */ import { useMemo, useState } from 'react'; import { ArrowDown, ArrowUp } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import SeverityBadge, { type Severity } from './SeverityBadge'; interface DamageRow { id?: number; part?: string; type?: string; severity?: Severity; confidence?: number; recommended_action?: string; cost_midpoint_tl?: number; } type SortKey = keyof Pick; const SEVERITY_RANK: Record = { minor: 1, hafif: 1, moderate: 2, orta: 2, severe: 3, agir: 3, total_loss: 4, }; export function DamageTable({ damages, onRowHover, }: { damages: DamageRow[]; onRowHover?: (id: number | null) => void; }) { const { t } = useTranslation(); const [sortKey, setSortKey] = useState('severity'); const [dir, setDir] = useState<'asc' | 'desc'>('desc'); const sorted = useMemo(() => { const copy = [...damages]; copy.sort((a, b) => { let av: number | string | undefined; let bv: number | string | undefined; if (sortKey === 'severity') { av = a.severity ? SEVERITY_RANK[a.severity] : 0; bv = b.severity ? SEVERITY_RANK[b.severity] : 0; } else { av = a[sortKey]; bv = b[sortKey]; } if (av === undefined) return 1; if (bv === undefined) return -1; if (av < bv) return dir === 'asc' ? -1 : 1; if (av > bv) return dir === 'asc' ? 1 : -1; return 0; }); return copy; }, [damages, sortKey, dir]); function header(key: SortKey, label: string) { const active = sortKey === key; return ( { if (active) setDir(dir === 'asc' ? 'desc' : 'asc'); else { setSortKey(key); setDir('desc'); } }} > {label} {active && (dir === 'asc' ? : )} ); } return (
{header('part', t('inspections.parts'))} {header('type', t('common.status'))} {header('severity', 'Şiddet')} {header('confidence', 'Güven')} {header('cost_midpoint_tl', t('inspections.cost'))} {sorted.map((d, i) => ( onRowHover?.(d.id ?? null)} onMouseLeave={() => onRowHover?.(null)} className="border-t border-slate-200 hover:bg-slate-50 dark:border-slate-700 dark:hover:bg-slate-800" > ))} {sorted.length === 0 && ( )}
Aksiyon
{d.part ?? '—'} {d.type ?? '—'} {d.severity ? : '—'} {d.confidence !== undefined ? `${Math.round(d.confidence * 100)}%` : '—'} {d.recommended_action ?? '—'} {d.cost_midpoint_tl?.toLocaleString('tr-TR') ?? '—'} ₺
{t('inspections.empty')}
); } export default DamageTable;