/** * Execute Dialog - Choose to update existing study or create new one */ import { useState, useEffect } from 'react'; import { FilePlus, RefreshCw, FolderOpen } from 'lucide-react'; import { useStudy } from '../../../context/StudyContext'; type ExecuteMode = 'create' | 'update'; interface ExecuteDialogProps { isOpen: boolean; onClose: () => void; onExecute: (studyName: string, autoRun: boolean, mode: ExecuteMode, existingStudyId?: string) => void; isExecuting: boolean; defaultStudyId?: string; // Pre-selected study when editing } export function ExecuteDialog({ isOpen, onClose, onExecute, isExecuting, defaultStudyId, }: ExecuteDialogProps) { const { studies } = useStudy(); const [mode, setMode] = useState('create'); const [studyName, setStudyName] = useState(''); const [selectedStudyId, setSelectedStudyId] = useState(''); const [autoRun, setAutoRun] = useState(false); const [error, setError] = useState(null); // Reset state when dialog opens useEffect(() => { if (isOpen) { if (defaultStudyId) { setMode('update'); setSelectedStudyId(defaultStudyId); } else { setMode('create'); setSelectedStudyId(studies[0]?.id || ''); } setStudyName(''); setAutoRun(false); setError(null); } }, [isOpen, defaultStudyId, studies]); if (!isOpen) return null; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (mode === 'create') { // Validate study name const trimmed = studyName.trim(); if (!trimmed) { setError('Study name is required'); return; } // Check for valid snake_case if (!/^[a-z][a-z0-9_]*$/.test(trimmed)) { setError('Study name must be snake_case (lowercase letters, numbers, underscores)'); return; } setError(null); onExecute(trimmed, autoRun, 'create'); } else { // Update mode if (!selectedStudyId) { setError('Please select a study to update'); return; } const selectedStudy = studies.find(s => s.id === selectedStudyId); if (!selectedStudy) { setError('Selected study not found'); return; } setError(null); onExecute(selectedStudy.id, autoRun, 'update', selectedStudyId); } }; const handleClose = () => { setStudyName(''); setAutoRun(false); setError(null); onClose(); }; return (

Execute with Claude

Choose to create a new study or update an existing one

{/* Mode Tabs */}
{mode === 'create' ? ( /* Create New Study */
setStudyName(e.target.value.toLowerCase().replace(/\s+/g, '_'))} placeholder="my_optimization_study" className="w-full px-3 py-2.5 bg-dark-800 border border-dark-600 text-white placeholder-dark-500 rounded-lg font-mono focus:ring-2 focus:ring-primary-500 focus:border-primary-500 focus:outline-none transition-colors" disabled={isExecuting} autoFocus />

Use snake_case (e.g., bracket_mass_v1, mirror_wfe_optimization)

) : ( /* Update Existing Study */

Warning: This will overwrite the study's optimization_config.json

)} {error && (

{error}

)}
); }