'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Switch } from '@/components/ui/switch'; import { Workflow, Plus, Settings, Activity, CheckCircle2, XCircle, Edit, PlayCircle, PauseCircle, } from 'lucide-react'; import { toast } from 'sonner'; import { PageHeader } from '@/components/navigation/page-header'; interface TicketWorkflow { id: number; name: string; description: string | null; is_active: boolean; trigger_event: string; sort_order: number; step_count?: number; executions_today?: number; } export default function WorkflowListPage() { const [globalEnabled, setGlobalEnabled] = useState(false); const [workflows, setWorkflows] = useState([]); const [isLoading, setIsLoading] = useState(true); useEffect(() => { loadData(); }, []); const loadData = async () => { setIsLoading(true); try { const [settingsRes, workflowsRes] = await Promise.all([ fetch('/api/workflow/settings'), fetch('/api/ticket-workflows'), ]); if (settingsRes.ok) { const settings = await settingsRes.json(); setGlobalEnabled(settings.workflow_engine_enabled?.value ?? false); } if (workflowsRes.ok) { const data = await workflowsRes.json(); setWorkflows(data.workflows || []); } } catch (error) { console.error('Failed to load workflows:', error); toast.error('Failed to load workflows'); } finally { setIsLoading(false); } }; const toggleGlobalEngine = async () => { try { const newValue = !globalEnabled; const res = await fetch('/api/workflow/settings', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ workflow_engine_enabled: newValue }), }); if (res.ok) { setGlobalEnabled(newValue); toast.success(`Workflow engine ${newValue ? 'enabled' : 'disabled'}`); } else { toast.error('Failed to toggle engine'); } } catch (error) { console.error('Failed to toggle engine:', error); toast.error('Failed to toggle engine'); } }; const toggleWorkflow = async (workflowId: number, currentState: boolean) => { try { const newState = !currentState; const res = await fetch(`/api/ticket-workflows/${workflowId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ is_active: newState }), }); if (res.ok) { setWorkflows(prev => prev.map(w => w.id === workflowId ? { ...w, is_active: newState } : w) ); toast.success(`Workflow ${newState ? 'enabled' : 'disabled'}`); } else { toast.error('Failed to toggle workflow'); } } catch (error) { console.error('Failed to toggle workflow:', error); toast.error('Failed to toggle workflow'); } }; return ( <> } />
{/* Master Control */}
Master Control Emergency kill switch for all ticket workflows
{globalEnabled ? ( Enabled ) : ( Disabled )}

{globalEnabled ? ( <>All active workflows will process incoming tickets. Individual workflows can be toggled below. ) : ( <>All workflows are currently disabled. Enable the master switch to allow workflows to run. )}

{/* Workflow List */}
{isLoading ? ( Loading workflows... ) : workflows.length === 0 ? (

No workflows yet

) : ( workflows.map((workflow) => (
{workflow.name} {workflow.is_active ? 'Active' : 'Inactive'} {workflow.trigger_event}
{workflow.description || 'No description'}
toggleWorkflow(workflow.id, workflow.is_active)} disabled={!globalEnabled} />
{workflow.step_count || 0} steps
{workflow.executions_today || 0} runs today
{!globalEnabled && ( Master switch disabled )}
)) )}
{/* Quick Links */} Related
); }