/** * WorkflowsPage * * Page for viewing and managing workflows using FormGeneratorTable. * Follows the pattern established in AdminUsersPage. */ import React, { useState, useMemo, useEffect } from 'react'; import { useUserWorkflows, useWorkflowOperations } from '../../hooks/useWorkflows'; import { FormGeneratorTable } from '../../components/FormGenerator/FormGeneratorTable'; import { FormGeneratorForm } from '../../components/FormGenerator/FormGeneratorForm'; import { FaSync, FaList, FaPlay } from 'react-icons/fa'; import { useNavigate } from 'react-router-dom'; import styles from '../admin/Admin.module.css'; interface Workflow { id: string; name?: string; status: string; workflowMode?: string; [key: string]: any; } export const WorkflowsPage: React.FC = () => { const navigate = useNavigate(); // Data hook const { data: workflows, attributes, permissions, pagination, loading, error, refetch, fetchWorkflowById, updateOptimistically, } = useUserWorkflows(); // Operations hook const { handleWorkflowDelete, handleWorkflowDeleteMultiple, handleWorkflowUpdate, handleInlineUpdate, deletingWorkflows, editingWorkflows, } = useWorkflowOperations(); const [editingWorkflow, setEditingWorkflow] = useState(null); // Initial fetch on mount useEffect(() => { refetch(); }, []); // Generate columns from attributes const columns = useMemo(() => { return (attributes || []).map(attr => ({ key: attr.name, label: attr.label || attr.name, type: attr.type as any, sortable: attr.sortable !== false, filterable: attr.filterable !== false, searchable: attr.searchable !== false, width: attr.width || 150, minWidth: attr.minWidth || 100, maxWidth: attr.maxWidth || 400, fkSource: (attr as any).fkSource, fkDisplayField: (attr as any).fkDisplayField, })); }, [attributes]); // Check permissions const canUpdate = permissions?.update !== 'n'; const canDelete = permissions?.delete !== 'n'; // Handle edit click - fetch full workflow data const handleEditClick = async (workflow: Workflow) => { const fullWorkflow = await fetchWorkflowById(workflow.id); if (fullWorkflow) { setEditingWorkflow(fullWorkflow as Workflow); } }; // Handle continue workflow - navigate to playground const handleContinueWorkflow = (workflow: Workflow) => { navigate(`/workflows/playground?workflowId=${workflow.id}`); }; // Handle edit submit const handleEditSubmit = async (data: Partial) => { if (!editingWorkflow) return; const result = await handleWorkflowUpdate(editingWorkflow.id, data); if (result.success) { setEditingWorkflow(null); refetch(); } }; // Handle delete single workflow const handleDelete = async (workflow: Workflow) => { if (window.confirm(`Möchten Sie den Workflow "${workflow.name || workflow.id}" wirklich löschen?`)) { const success = await handleWorkflowDelete(workflow.id); if (success) { refetch(); } } }; // Handle delete multiple workflows const handleDeleteMultiple = async (workflowsToDelete: Workflow[]) => { const count = workflowsToDelete.length; if (window.confirm(`Möchten Sie ${count} Workflow(s) wirklich löschen?`)) { const ids = workflowsToDelete.map(w => w.id); const success = await handleWorkflowDeleteMultiple(ids); if (success) { refetch(); } } }; // Form attributes for edit modal - filter out non-editable fields const formAttributes = useMemo(() => { const excludedFields = ['id', 'mandateId', '_createdBy', '_createdAt', '_modifiedAt']; return (attributes || []) .filter(attr => !excludedFields.includes(attr.name)); }, [attributes]); if (error) { return (
⚠️

Fehler beim Laden der Workflows: {error}

); } return (

Workflows

Übersicht aller Workflows

{loading && (!workflows || workflows.length === 0) ? (
Lade Workflows...
) : !workflows || workflows.length === 0 ? (

Keine Workflows vorhanden

Starten Sie einen neuen Workflow im Chat Playground.

) : ( deletingWorkflows.has(row.id), }] : []), ]} customActions={[ { id: 'continue', icon: , onClick: handleContinueWorkflow, title: 'Workflow fortsetzen', } ]} onDelete={handleDelete} onDeleteMultiple={handleDeleteMultiple} hookData={{ refetch, permissions, pagination, handleDelete: handleWorkflowDelete, handleInlineUpdate, updateOptimistically, }} emptyMessage="Keine Workflows gefunden" /> )}
{/* Edit Modal */} {editingWorkflow && (
setEditingWorkflow(null)}>
e.stopPropagation()}>

Workflow bearbeiten

{formAttributes.length === 0 ? (
Lade Formular...
) : ( setEditingWorkflow(null)} submitButtonText="Speichern" cancelButtonText="Abbrechen" /> )}
)}
); }; export default WorkflowsPage;