/** * ResultsPanel - Shows detailed trial results * * Displays the parameters, objectives, and constraints for a specific trial. * Can be opened by clicking on result badges on nodes. */ import { X, Minimize2, Maximize2, CheckCircle, XCircle, Trophy, SlidersHorizontal, Target, AlertTriangle, Clock, } from 'lucide-react'; import { useResultsPanel, usePanelStore } from '../../../hooks/usePanelStore'; interface ResultsPanelProps { onClose: () => void; } export function ResultsPanel({ onClose }: ResultsPanelProps) { const panel = useResultsPanel(); const { minimizePanel } = usePanelStore(); const data = panel.data; if (!panel.open || !data) return null; const timestamp = new Date(data.timestamp).toLocaleTimeString(); // Minimized view if (panel.minimized) { return (
minimizePanel('results')} > Trial #{data.trialNumber}
); } return (
{/* Header */}
Trial #{data.trialNumber} {data.isBest && ( Best )}
{/* Content */}
{/* Status */}
{data.isFeasible ? (
Feasible
) : (
Infeasible
)}
{timestamp}
{/* Parameters */}

Parameters

{Object.entries(data.params).map(([name, value]) => (
{name} {formatValue(value)}
))}
{/* Objectives */}

Objectives

{Object.entries(data.objectives).map(([name, value]) => (
{name} {formatValue(value)}
))}
{/* Constraints (if any) */} {data.constraints && Object.keys(data.constraints).length > 0 && (

Constraints

{Object.entries(data.constraints).map(([name, constraint]) => (
{constraint.feasible ? ( ) : ( )} {name} {formatValue(constraint.value)}
))}
)}
); } function formatValue(value: number): string { if (Math.abs(value) < 0.001 || Math.abs(value) >= 10000) { return value.toExponential(3); } return value.toFixed(4).replace(/\.?0+$/, ''); } export default ResultsPanel;