/**
* 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;