File size: 2,317 Bytes
ca28016
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import React from 'react';
import { ChartPanel, TerminalPanel } from './DashboardPanels';

interface InstrumentCardProps {
  jobId: string | null;
  jobStatus: any;
  logs: string[];
  metrics: { epoch: number; loss: number; accuracy: number; val_loss?: number; val_accuracy?: number }[];
  isPolling: boolean;
  isLoading: boolean;
  startJob: (params: any) => void;
  stopJob: () => void;
  freeze: () => void;
  resume: () => void;
  clearLogs: () => void;
  exportLogs: () => void;
  exportMetrics: () => void;
  setJobId: (id: string | null) => void;
  advisorParams?: any;
  onStartAdvisorTraining?: (params: any) => void;
}

const InstrumentCard: React.FC<InstrumentCardProps> = ({
  jobId, jobStatus, logs, metrics, isPolling, isLoading,
  startJob, stopJob, freeze, resume, clearLogs, exportLogs, exportMetrics, setJobId,
  advisorParams, onStartAdvisorTraining
}) => {
  return (
    <div className="instrument-card w-full h-full flex flex-col relative" style={{ 
      fontFamily: 'Share Tech Mono, Space Mono, VT323, monospace', 
      background: '#0a0f1c',
      boxShadow: '0 0 32px 4px #00f0ff55, 0 0 64px 8px #00aaff33',
      border: '3px solid #00ffe7'
    }}>
      {/* Grid Overlay */}
      <div className="absolute inset-0 pointer-events-none z-0">
        <div className="instrument-grid-overlay w-full h-full opacity-20" />
      </div>
      <div className="relative z-10 flex flex-col h-full w-full">
        <div className="flex-none h-[60%] min-h-[320px] max-h-[70vh] relative">
          {/* ChartPanel with config button slot */}
          <div className="absolute top-4 right-6 z-20">
            {/* Config button will be rendered here by parent via portal or prop */}
            {/* Placeholder for config button */}
            <div id="config-btn-slot" />
          </div>
          <ChartPanel metrics={metrics} jobStatus={jobStatus} isLoading={isLoading} freeze={freeze} resume={resume} exportMetrics={exportMetrics} advisorParams={advisorParams} onStartAdvisorTraining={onStartAdvisorTraining} />
        </div>
        <div className="flex-1 min-h-[180px] max-h-[40vh]">
          <TerminalPanel logs={logs} isPolling={isPolling} clearLogs={clearLogs} exportLogs={exportLogs} stopJob={stopJob} />
        </div>
      </div>
    </div>
  );
};

export default InstrumentCard;