import { useMemo } from 'react'; import { FormGenerator, ColumnConfig } from '../FormGenerator/FormGenerator'; import { useWorkflows, useWorkflowOperations, Workflow } from '../../hooks/useWorkflows'; import { useLanguage } from '../../contexts/LanguageContext'; import styles from './WorkflowsTable.module.css'; interface WorkflowsTableProps { className?: string; } function WorkflowsTable({ className = '' }: WorkflowsTableProps) { const { workflows, loading, error, refetch } = useWorkflows(); const { stopWorkflow, deleteWorkflow, stoppingWorkflows, deletingWorkflows } = useWorkflowOperations(); const { t } = useLanguage(); // Configure columns for the workflows table const columns: ColumnConfig[] = useMemo(() => [ { key: 'id', label: t('workflows.column.id'), type: 'string', width: 180, minWidth: 150, maxWidth: 250, sortable: true, filterable: true, searchable: true, formatter: (value: string) => ( {value.length > 8 ? `${value.substring(0, 8)}...` : value} ) }, { key: 'name', label: t('workflows.column.name'), type: 'string', width: 200, minWidth: 150, maxWidth: 300, sortable: true, filterable: true, searchable: true, formatter: (value: string | undefined, row: Workflow) => ( {value || row.title || t('workflows.unnamed')} ) }, { key: 'status', label: t('workflows.column.status'), type: 'enum', width: 120, minWidth: 100, maxWidth: 150, sortable: true, filterable: true, filterOptions: ['running', 'completed', 'failed', 'stopped', 'pending'], formatter: (value: string) => ( {t(`workflows.status.${value}`, value)} ) }, { key: 'currentRound', label: t('workflows.column.round'), type: 'number', width: 80, minWidth: 60, maxWidth: 100, sortable: true, filterable: true, formatter: (value: number | undefined) => ( {value || 1} ) }, { key: 'startedAt', label: t('workflows.column.started'), type: 'date', width: 140, minWidth: 120, maxWidth: 180, sortable: true, filterable: true, formatter: (value: string | undefined) => { if (!value) return '-'; try { const date = new Date(value); return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); } catch { return value; } } }, { key: 'lastActivity', label: t('workflows.column.lastActivity'), type: 'date', width: 140, minWidth: 120, maxWidth: 180, sortable: true, filterable: true, formatter: (value: string | undefined) => { if (!value) return '-'; try { const date = new Date(value); return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); } catch { return value; } } }, { key: 'messages', label: t('workflows.column.messages'), type: 'number', width: 100, minWidth: 80, maxWidth: 120, sortable: true, filterable: false, formatter: (value: any[] | undefined) => ( {value?.length || 0} ) } ], [t]); // Handle workflow actions const handleStopWorkflow = async (workflow: Workflow) => { const success = await stopWorkflow(workflow.id); if (success) { refetch(); // Refresh the workflows list } }; const handleDeleteWorkflow = async (workflow: Workflow) => { const workflowName = workflow.name || workflow.title || workflow.id; if (window.confirm(t('workflows.delete.confirm').replace('{name}', workflowName))) { const success = await deleteWorkflow(workflow.id); if (success) { refetch(); // Refresh the workflows list } } }; // Configure action buttons const actions = useMemo(() => [ { label: t('workflows.action.stop'), icon: (row: Workflow) => { const isStoppingThis = stoppingWorkflows.has(row.id); if (isStoppingThis) return '⏳'; return '⏹️'; }, onClick: (row: Workflow) => { if (row.status === 'running' && !stoppingWorkflows.has(row.id)) { handleStopWorkflow(row); } } }, { label: t('workflows.action.delete'), icon: (row: Workflow) => { const isDeletingThis = deletingWorkflows.has(row.id); if (isDeletingThis) return '⏳'; return '🗑️'; }, onClick: (row: Workflow) => { if (!deletingWorkflows.has(row.id)) { handleDeleteWorkflow(row); } } } ], [t, stoppingWorkflows, deletingWorkflows, handleStopWorkflow, handleDeleteWorkflow]); // Show error state if (error) { return (
{t('workflows.error.loading')} {error}