import { useState, useEffect } from 'react' import { ExperimentModal } from './ExperimentModal' import { experimentManagement, userManagement } from '../lib/supabase' import type { Experiment, User, ScheduleStatus, ResultsStatus } from '../lib/supabase' export function Experiments() { const [experiments, setExperiments] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showModal, setShowModal] = useState(false) const [editingExperiment, setEditingExperiment] = useState(undefined) const [currentUser, setCurrentUser] = useState(null) const [filterStatus, setFilterStatus] = useState('all') useEffect(() => { loadData() }, []) const loadData = async () => { try { setLoading(true) setError(null) const [experimentsData, userData] = await Promise.all([ experimentManagement.getAllExperiments(), userManagement.getCurrentUser() ]) setExperiments(experimentsData) setCurrentUser(userData) } catch (err: any) { setError(err.message || 'Failed to load experiments') console.error('Load experiments error:', err) } finally { setLoading(false) } } const canManageExperiments = currentUser?.roles.includes('admin') || currentUser?.roles.includes('conductor') const handleCreateExperiment = () => { setEditingExperiment(undefined) setShowModal(true) } const handleEditExperiment = (experiment: Experiment) => { setEditingExperiment(experiment) setShowModal(true) } const handleExperimentSaved = (experiment: Experiment) => { if (editingExperiment) { // Update existing experiment setExperiments(prev => prev.map(exp => exp.id === experiment.id ? experiment : exp)) } else { // Add new experiment setExperiments(prev => [experiment, ...prev]) } } const handleDeleteExperiment = async (experiment: Experiment) => { if (!currentUser?.roles.includes('admin')) { alert('Only administrators can delete experiments.') return } if (!confirm(`Are you sure you want to delete Experiment #${experiment.experiment_number}? This action cannot be undone.`)) { return } try { await experimentManagement.deleteExperiment(experiment.id) setExperiments(prev => prev.filter(exp => exp.id !== experiment.id)) } catch (err: any) { alert(`Failed to delete experiment: ${err.message}`) console.error('Delete experiment error:', err) } } const handleStatusUpdate = async (experiment: Experiment, scheduleStatus?: ScheduleStatus, resultsStatus?: ResultsStatus) => { try { const updatedExperiment = await experimentManagement.updateExperimentStatus( experiment.id, scheduleStatus, resultsStatus ) setExperiments(prev => prev.map(exp => exp.id === experiment.id ? updatedExperiment : exp)) } catch (err: any) { alert(`Failed to update status: ${err.message}`) console.error('Update status error:', err) } } const getStatusBadgeColor = (status: ScheduleStatus | ResultsStatus) => { switch (status) { case 'pending schedule': return 'bg-yellow-100 text-yellow-800' case 'scheduled': return 'bg-blue-100 text-blue-800' case 'canceled': return 'bg-red-100 text-red-800' case 'aborted': return 'bg-red-100 text-red-800' case 'valid': return 'bg-green-100 text-green-800' case 'invalid': return 'bg-red-100 text-red-800' default: return 'bg-gray-100 text-gray-800' } } const filteredExperiments = filterStatus === 'all' ? experiments : experiments.filter(exp => exp.schedule_status === filterStatus) if (loading) { return (
) } return (
{/* Header */}

Experiments

Manage pecan processing experiment definitions

{canManageExperiments && ( )}
{/* Error Message */} {error && (
{error}
)} {/* Filters */}
{/* Experiments Table */}

Experiments ({filteredExperiments.length})

{canManageExperiments ? 'Click on any experiment to edit details' : 'View experiment definitions and status'}

{canManageExperiments && ( )} {filteredExperiments.map((experiment) => ( handleEditExperiment(experiment) : undefined} > {canManageExperiments && ( )} ))}
Experiment # Repetitions Process Parameters Schedule Status Results Status Created Actions
#{experiment.experiment_number} {experiment.rep_number} / {experiment.reps_required}
Soaking: {experiment.soaking_duration_hr}h
Drying: {experiment.air_drying_time_min}min
Frequency: {experiment.plate_contact_frequency_hz}Hz
{experiment.schedule_status} {experiment.results_status} {new Date(experiment.created_at).toLocaleDateString()}
{currentUser?.roles.includes('admin') && ( )}
{filteredExperiments.length === 0 && (

No experiments found

{filterStatus === 'all' ? 'Get started by creating your first experiment.' : `No experiments with status "${filterStatus}".`}

{canManageExperiments && filterStatus === 'all' && (
)}
)}
{/* Modal */} {showModal && ( setShowModal(false)} onExperimentSaved={handleExperimentSaved} /> )}
) }