@open-mercato/core 0.4.2-canary-51881f6bf3 → 0.4.2-canary-5f415b8a44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/entities/workflow_event_trigger/index.js +33 -0
- package/dist/generated/entities/workflow_event_trigger/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +59 -58
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +2 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/auth/events.js +30 -0
- package/dist/modules/auth/events.js.map +7 -0
- package/dist/modules/business_rules/api/execute/[ruleId]/route.js +145 -0
- package/dist/modules/business_rules/api/execute/[ruleId]/route.js.map +7 -0
- package/dist/modules/business_rules/data/validators.js +34 -0
- package/dist/modules/business_rules/data/validators.js.map +2 -2
- package/dist/modules/business_rules/index.js +21 -1
- package/dist/modules/business_rules/index.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-engine.js +182 -1
- package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
- package/dist/modules/catalog/events.js +34 -0
- package/dist/modules/catalog/events.js.map +7 -0
- package/dist/modules/customers/events.js +49 -0
- package/dist/modules/customers/events.js.map +7 -0
- package/dist/modules/directory/events.js +23 -0
- package/dist/modules/directory/events.js.map +7 -0
- package/dist/modules/sales/acl.js +1 -0
- package/dist/modules/sales/acl.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +12 -0
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +62 -0
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/events.js +63 -0
- package/dist/modules/sales/events.js.map +7 -0
- package/dist/modules/sales/lib/dictionaries.js +3 -0
- package/dist/modules/sales/lib/dictionaries.js.map +2 -2
- package/dist/modules/sales/lib/frontend/documentDataEvents.js +25 -0
- package/dist/modules/sales/lib/frontend/documentDataEvents.js.map +7 -0
- package/dist/modules/workflows/acl.js +2 -0
- package/dist/modules/workflows/acl.js.map +2 -2
- package/dist/modules/workflows/api/instances/route.js +18 -6
- package/dist/modules/workflows/api/instances/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/route.js +6 -1
- package/dist/modules/workflows/api/tasks/route.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/[id]/page.js +9 -1
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/[id]/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/[id]/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.js +24 -15
- package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +150 -132
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/visual-editor/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/events/[id]/page.js +1 -1
- package/dist/modules/workflows/backend/events/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/[id]/page.meta.js +2 -2
- package/dist/modules/workflows/backend/events/[id]/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js +2 -2
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/[id]/page.js +1 -1
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/[id]/page.meta.js +2 -2
- package/dist/modules/workflows/backend/tasks/[id]/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +5 -6
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/cli.js +81 -3
- package/dist/modules/workflows/cli.js.map +3 -3
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +481 -0
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +7 -0
- package/dist/modules/workflows/components/EventTriggersEditor.js +553 -0
- package/dist/modules/workflows/components/EventTriggersEditor.js.map +7 -0
- package/dist/modules/workflows/data/entities.js +64 -1
- package/dist/modules/workflows/data/entities.js.map +2 -2
- package/dist/modules/workflows/data/validators.js +115 -0
- package/dist/modules/workflows/data/validators.js.map +2 -2
- package/dist/modules/workflows/events.js +38 -0
- package/dist/modules/workflows/events.js.map +7 -0
- package/dist/modules/workflows/examples/checkout-demo-definition.json +1 -5
- package/dist/modules/workflows/examples/order-approval-definition.json +257 -0
- package/dist/modules/workflows/examples/order-approval-guard-rules.json +32 -0
- package/dist/modules/workflows/lib/activity-executor.js +75 -13
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/dist/modules/workflows/lib/event-trigger-service.js +308 -0
- package/dist/modules/workflows/lib/event-trigger-service.js.map +7 -0
- package/dist/modules/workflows/lib/graph-utils.js +71 -2
- package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
- package/dist/modules/workflows/lib/seeds.js +22 -5
- package/dist/modules/workflows/lib/seeds.js.map +2 -2
- package/dist/modules/workflows/lib/start-validator.js +33 -23
- package/dist/modules/workflows/lib/start-validator.js.map +2 -2
- package/dist/modules/workflows/lib/transition-handler.js +157 -45
- package/dist/modules/workflows/lib/transition-handler.js.map +3 -3
- package/dist/modules/workflows/migrations/Migration20260123143500.js +36 -0
- package/dist/modules/workflows/migrations/Migration20260123143500.js.map +7 -0
- package/dist/modules/workflows/subscribers/event-trigger.js +78 -0
- package/dist/modules/workflows/subscribers/event-trigger.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js +323 -0
- package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/order-approval/widget.js +17 -0
- package/dist/modules/workflows/widgets/injection/order-approval/widget.js.map +7 -0
- package/dist/modules/workflows/widgets/injection-table.js +19 -0
- package/dist/modules/workflows/widgets/injection-table.js.map +7 -0
- package/generated/entities/workflow_event_trigger/index.ts +15 -0
- package/generated/entities.ids.generated.ts +59 -58
- package/generated/entity-fields-registry.ts +2 -0
- package/package.json +3 -5
- package/src/modules/auth/events.ts +39 -0
- package/src/modules/business_rules/api/execute/[ruleId]/route.ts +163 -0
- package/src/modules/business_rules/data/validators.ts +40 -0
- package/src/modules/business_rules/index.ts +25 -0
- package/src/modules/business_rules/lib/rule-engine.ts +281 -1
- package/src/modules/catalog/events.ts +45 -0
- package/src/modules/customers/events.ts +63 -0
- package/src/modules/directory/events.ts +31 -0
- package/src/modules/sales/acl.ts +1 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +16 -0
- package/src/modules/sales/commands/documents.ts +74 -1
- package/src/modules/sales/events.ts +82 -0
- package/src/modules/sales/lib/dictionaries.ts +3 -0
- package/src/modules/sales/lib/frontend/documentDataEvents.ts +28 -0
- package/src/modules/workflows/acl.ts +2 -0
- package/src/modules/workflows/api/instances/route.ts +21 -7
- package/src/modules/workflows/api/tasks/route.ts +7 -1
- package/src/modules/workflows/backend/definitions/[id]/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +9 -0
- package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/create/page.tsx +9 -0
- package/src/modules/workflows/backend/definitions/visual-editor/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +21 -3
- package/src/modules/workflows/backend/events/[id]/page.meta.ts +2 -2
- package/src/modules/workflows/backend/events/[id]/page.tsx +1 -1
- package/src/modules/workflows/backend/instances/[id]/page.meta.ts +2 -2
- package/src/modules/workflows/backend/tasks/[id]/page.meta.ts +2 -2
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +1 -1
- package/src/modules/workflows/backend/tasks/page.tsx +5 -6
- package/src/modules/workflows/cli.ts +111 -0
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +581 -0
- package/src/modules/workflows/components/EventTriggersEditor.tsx +664 -0
- package/src/modules/workflows/data/entities.ts +124 -0
- package/src/modules/workflows/data/validators.ts +138 -0
- package/src/modules/workflows/events.ts +49 -0
- package/src/modules/workflows/examples/checkout-demo-definition.json +1 -5
- package/src/modules/workflows/examples/order-approval-definition.json +257 -0
- package/src/modules/workflows/examples/order-approval-guard-rules.json +32 -0
- package/src/modules/workflows/i18n/en.json +71 -0
- package/src/modules/workflows/lib/activity-executor.ts +129 -16
- package/src/modules/workflows/lib/event-trigger-service.ts +557 -0
- package/src/modules/workflows/lib/graph-utils.ts +117 -2
- package/src/modules/workflows/lib/seeds.ts +34 -8
- package/src/modules/workflows/lib/start-validator.ts +38 -28
- package/src/modules/workflows/lib/transition-handler.ts +208 -55
- package/src/modules/workflows/migrations/Migration20260123143500.ts +38 -0
- package/src/modules/workflows/subscribers/event-trigger.ts +109 -0
- package/src/modules/workflows/widgets/injection/order-approval/widget.client.tsx +446 -0
- package/src/modules/workflows/widgets/injection/order-approval/widget.ts +16 -0
- package/src/modules/workflows/widgets/injection-table.ts +21 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/workflows/backend/definitions/visual-editor/page.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport { WorkflowGraph } from '../../../components/WorkflowGraph'\n// Conditional imports based on feature flag\nimport { NodeEditDialog } from '../../../components/NodeEditDialog'\nimport { EdgeEditDialog } from '../../../components/EdgeEditDialog'\nimport { NodeEditDialogCrudForm } from '../../../components/NodeEditDialogCrudForm'\nimport { EdgeEditDialogCrudForm } from '../../../components/EdgeEditDialogCrudForm'\nimport { Node, Edge, addEdge, Connection, applyNodeChanges, applyEdgeChanges, NodeChange, EdgeChange } from '@xyflow/react'\nimport { useState, useCallback, useEffect } from 'react'\nimport Link from 'next/link'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { graphToDefinition, definitionToGraph, validateWorkflowGraph, generateStepId, generateTransitionId, ValidationError } from '../../../lib/graph-utils'\nimport { workflowDefinitionDataSchema } from '../../../data/validators'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { TagsInput } from '@open-mercato/ui/backend/inputs/TagsInput'\nimport { LoadingMessage } from '@open-mercato/ui/backend/detail'\nimport { Alert, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport {CircleQuestionMark, Info, PanelTopClose, PanelTopOpen, Play, Save, Trash2} from 'lucide-react'\nimport { NODE_TYPE_ICONS, NODE_TYPE_COLORS, NODE_TYPE_LABELS } from '../../../lib/node-type-icons'\nimport * as React from \"react\";\n\n/**\n * VisualEditorPage - Visual workflow definition editor\n *\n * Layout:\n * - Page Header: Title, description, and action buttons (Save, Validate, Test)\n * - Workflow Metadata: Collapsible form for workflow details\n * - Page Body:\n * - Left sidebar: Step palette (click to add)\n * - Main canvas: ReactFlow graph editor\n * - Flash Messages: Top-right positioned validation messages\n * - Edit Dialogs: Modal dialogs for editing steps and transitions\n */\nexport default function VisualEditorPage() {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const definitionId = searchParams.get('id')\n\n const [isLoading, setIsLoading] = useState(!!definitionId)\n const [isSaving, setIsSaving] = useState(false)\n const [nodes, setNodes] = useState<Node[]>([])\n const [edges, setEdges] = useState<Edge[]>([])\n const [selectedNode, setSelectedNode] = useState<Node | null>(null)\n const [selectedEdge, setSelectedEdge] = useState<Edge | null>(null)\n const [showMetadata, setShowMetadata] = useState(true)\n const [showNodeDialog, setShowNodeDialog] = useState(false)\n const [showEdgeDialog, setShowEdgeDialog] = useState(false)\n const [showClearConfirm, setShowClearConfirm] = useState(false)\n\n // Workflow metadata state\n const [workflowId, setWorkflowId] = useState('')\n const [workflowName, setWorkflowName] = useState('')\n const [description, setDescription] = useState('')\n const [version, setVersion] = useState(1)\n const [enabled, setEnabled] = useState(true)\n const [category, setCategory] = useState('')\n const [tags, setTags] = useState<string[]>([])\n const [icon, setIcon] = useState('')\n const [effectiveFrom, setEffectiveFrom] = useState('')\n const [effectiveTo, setEffectiveTo] = useState('')\n\n // Load existing definition if ID is provided\n useEffect(() => {\n const loadDefinition = async () => {\n if (!definitionId) {\n setIsLoading(false)\n return\n }\n\n try {\n const result = await apiCall<{ data: any; error?: string }>(`/api/workflows/definitions/${definitionId}`)\n\n if (!result.ok) {\n flash(`Failed to load workflow: ${result.result?.error || 'Unknown error'}`, 'error')\n setIsLoading(false)\n return\n }\n\n const definition = result.result?.data\n\n // Populate metadata\n setWorkflowId(definition.workflowId)\n setWorkflowName(definition.workflowName || definition.definition.workflowName || '')\n setDescription(definition.description || definition.definition.description || '')\n setVersion(definition.version)\n setEnabled(definition.enabled)\n setCategory(definition.metadata?.category || '')\n setTags(definition.metadata?.tags || [])\n setIcon(definition.metadata?.icon || '')\n setEffectiveFrom(definition.effectiveFrom || '')\n setEffectiveTo(definition.effectiveTo || '')\n\n // Convert definition to graph\n const graph = definitionToGraph(definition.definition)\n setNodes(graph.nodes)\n setEdges(graph.edges)\n\n flash('Workflow loaded successfully', 'success')\n } catch (error) {\n console.error('Error loading workflow definition:', error)\n flash('Failed to load workflow definition', 'error')\n } finally {\n setIsLoading(false)\n }\n }\n\n loadDefinition()\n }, [definitionId])\n\n // Handle node changes from ReactFlow\n const handleNodesChange = useCallback((changes: NodeChange[]) => {\n setNodes((nds) => applyNodeChanges(changes, nds))\n }, [])\n\n // Handle edge changes from ReactFlow\n const handleEdgesChange = useCallback((changes: EdgeChange[]) => {\n setEdges((eds) => applyEdgeChanges(changes, eds))\n }, [])\n\n // Handle adding new node from palette\n const handleAddNode = useCallback((nodeType: string) => {\n const newNode: Node = {\n id: generateStepId(nodeType),\n type: nodeType,\n position: {\n x: 250 + nodes.length * 50,\n y: 100 + nodes.length * 150,\n },\n data: {\n label: getDefaultLabel(nodeType),\n description: '',\n badge: getDefaultBadge(nodeType),\n status: 'pending',\n },\n }\n\n setNodes((nds) => [...nds, newNode])\n }, [nodes.length])\n\n // Handle node selection - open edit dialog\n const handleNodeClick = useCallback((_event: React.MouseEvent, node: Node) => {\n setSelectedNode(node)\n setSelectedEdge(null)\n setShowNodeDialog(true)\n }, [])\n\n // Handle edge selection - open edit dialog\n const handleEdgeClick = useCallback((_event: React.MouseEvent, edge: Edge) => {\n setSelectedEdge(edge)\n setSelectedNode(null)\n setShowEdgeDialog(true)\n }, [])\n\n // Save node updates\n const handleSaveNode = useCallback((nodeId: string, updates: Partial<Node['data']>) => {\n setNodes((nds) =>\n nds.map((node) =>\n node.id === nodeId\n ? { ...node, data: { ...node.data, ...updates } }\n : node\n )\n )\n flash('Node updated successfully', 'success')\n }, [])\n\n // Save edge updates\n const handleSaveEdge = useCallback((edgeId: string, updates: Partial<Edge['data']>) => {\n setEdges((eds) =>\n eds.map((edge) =>\n edge.id === edgeId\n ? { ...edge, data: { ...edge.data, ...updates } }\n : edge\n )\n )\n flash('Transition updated successfully', 'success')\n }, [])\n\n // Delete edge\n const handleDeleteEdge = useCallback((edgeId: string) => {\n setEdges((eds) => eds.filter((edge) => edge.id !== edgeId))\n flash('Transition deleted successfully', 'success')\n }, [])\n\n // Delete node\n const handleDeleteNode = useCallback((nodeId: string) => {\n // Remove the node\n setNodes((nds) => nds.filter((node) => node.id !== nodeId))\n\n // Remove all edges connected to this node\n setEdges((eds) => eds.filter((edge) => edge.source !== nodeId && edge.target !== nodeId))\n\n flash('Step deleted successfully', 'success')\n }, [])\n\n // Handle new connections\n const handleConnect = useCallback((connection: Connection) => {\n const newEdge: Edge = {\n id: generateTransitionId(connection.source!, connection.target!),\n source: connection.source!,\n target: connection.target!,\n type: 'smoothstep',\n data: {\n trigger: 'auto',\n preConditions: [],\n postConditions: [],\n activities: [],\n label: '',\n },\n }\n\n setEdges((eds) => addEdge(newEdge, eds))\n }, [])\n\n // Validate workflow\n const handleValidate = useCallback(() => {\n const graphErrors = validateWorkflowGraph(nodes, edges)\n const allErrors: ValidationError[] = [...graphErrors]\n\n // Run Zod schema validation\n try {\n const definitionData = graphToDefinition(nodes, edges, { includePositions: true })\n const result = workflowDefinitionDataSchema.safeParse(definitionData)\n\n if (!result.success) {\n // Convert Zod errors to validation errors\n result.error.issues.forEach((issue) => {\n allErrors.push({\n type: 'error',\n message: `Schema validation: ${issue.path.join('.')} - ${issue.message}`,\n })\n })\n }\n } catch (error) {\n allErrors.push({\n type: 'error',\n message: `Schema validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n })\n }\n\n if (allErrors.length === 0) {\n flash('Validation passed! Your workflow is valid and ready to save.', 'success')\n } else {\n // Show first error/warning message\n const firstError = allErrors[0]\n const errorCount = allErrors.length\n const message = errorCount > 1\n ? `${firstError.message} (and ${errorCount - 1} more ${errorCount === 2 ? 'issue' : 'issues'})`\n : firstError.message\n flash(message, firstError.type === 'error' ? 'error' : 'warning')\n }\n }, [nodes, edges])\n\n // Save workflow definition\n const handleSave = useCallback(async () => {\n // Validate required fields\n if (!workflowId || !workflowName) {\n flash('Workflow ID and Name are required fields', 'error')\n return\n }\n\n // Validate workflow structure\n const errors = validateWorkflowGraph(nodes, edges)\n const criticalErrors = errors.filter(e => e.type === 'error')\n if (criticalErrors.length > 0) {\n flash(`Cannot save: ${criticalErrors.length} validation error(s) found. Please fix them first.`, 'error')\n return\n }\n\n // Generate definition data\n const definitionData = graphToDefinition(nodes, edges, { includePositions: true })\n\n // Run Zod schema validation before saving\n const schemaResult = workflowDefinitionDataSchema.safeParse(definitionData)\n if (!schemaResult.success) {\n const firstIssue = schemaResult.error.issues[0]\n flash(`Schema error: ${firstIssue.path.join('.')} - ${firstIssue.message}`, 'error')\n return\n }\n\n setIsSaving(true)\n\n try {\n\n const metadata: any = {}\n if (category) metadata.category = category\n if (tags.length > 0) metadata.tags = tags\n if (icon) metadata.icon = icon\n\n // Determine if creating new or updating existing\n const isUpdate = !!definitionId\n\n let result\n if (isUpdate) {\n // Update existing definition\n result = await apiCall<{ data: any; error?: string }>(`/api/workflows/definitions/${definitionId}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n definition: definitionData,\n enabled,\n }),\n })\n } else {\n // Create new definition\n result = await apiCall<{ data: any; error?: string }>('/api/workflows/definitions', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n workflowId,\n workflowName,\n description: description || null,\n version,\n definition: definitionData,\n metadata: Object.keys(metadata).length > 0 ? metadata : null,\n enabled,\n effectiveFrom: effectiveFrom || null,\n effectiveTo: effectiveTo || null,\n }),\n })\n }\n\n if (!result.ok) {\n flash(`Failed to save: ${result.result?.error || 'Unknown error'}`, 'error')\n return\n }\n\n const savedDefinition = result.result?.data\n\n flash(`Workflow ${isUpdate ? 'updated' : 'created'} successfully!`, 'success')\n\n // Redirect to definition detail page after short delay\n setTimeout(() => {\n router.push(`/backend/definitions/${savedDefinition.id}`)\n }, 1500)\n\n } catch (error) {\n console.error('Error saving workflow definition:', error)\n flash('Failed to save workflow definition. Please try again.', 'error')\n } finally {\n setIsSaving(false)\n }\n }, [nodes, edges, workflowId, workflowName, description, version, enabled, category, tags, definitionId, router])\n\n // Test workflow\n const handleTest = useCallback(() => {\n // First validate\n const errors = validateWorkflowGraph(nodes, edges)\n const criticalErrors = errors.filter((e) => e.type === 'error')\n if (criticalErrors.length > 0) {\n flash(`Cannot test: ${criticalErrors.length} validation error(s) found. Please fix them first.`, 'error')\n return\n }\n\n // TODO: Implement test logic (create instance, run first step)\n flash('Test functionality will be implemented next', 'info')\n }, [nodes, edges])\n\n // Load example workflow\n const handleLoadExample = useCallback(() => {\n // Set example metadata\n setWorkflowId('approval_workflow')\n setWorkflowName('Simple Approval Workflow')\n setDescription('A basic approval workflow for reviewing and approving requests')\n setVersion(1)\n setEnabled(true)\n setCategory('Approvals')\n setTags(['approval', 'review'])\n\n const exampleNodes: Node[] = [\n {\n id: 'start',\n type: 'start',\n position: { x: 250, y: 50 },\n data: {\n label: 'Start',\n description: 'Workflow begins',\n status: 'pending',\n badge: 'Start',\n },\n },\n {\n id: 'step1',\n type: 'userTask',\n position: { x: 250, y: 250 },\n data: {\n label: 'Review Request',\n description: 'User reviews the incoming request',\n status: 'pending',\n stepNumber: 1,\n badge: 'User Task',\n assignedToRoles: ['Reviewer'],\n },\n },\n {\n id: 'end',\n type: 'end',\n position: { x: 250, y: 450 },\n data: {\n label: 'Complete',\n description: 'Workflow ends',\n status: 'pending',\n badge: 'End',\n },\n },\n ]\n\n const exampleEdges: Edge[] = [\n {\n id: 'e-start-step1',\n source: 'start',\n target: 'step1',\n type: 'smoothstep',\n data: {\n trigger: 'auto',\n preConditions: [],\n postConditions: [],\n activities: [],\n },\n },\n {\n id: 'e-step1-end',\n source: 'step1',\n target: 'end',\n type: 'smoothstep',\n data: {\n trigger: 'auto',\n preConditions: [],\n postConditions: [],\n activities: [],\n },\n },\n ]\n\n setNodes(exampleNodes)\n setEdges(exampleEdges)\n flash('Example workflow loaded', 'success')\n }, [])\n\n // Clear canvas\n const handleClear = useCallback(() => {\n if (nodes.length > 0 || edges.length > 0 || workflowId || workflowName) {\n setShowClearConfirm(true)\n }\n }, [nodes.length, edges.length, workflowId, workflowName])\n\n // Confirm clear action\n const confirmClear = useCallback(() => {\n setNodes([])\n setEdges([])\n setWorkflowId('')\n setWorkflowName('')\n setDescription('')\n setVersion(1)\n setEnabled(true)\n setCategory('')\n setTags([])\n setIcon('')\n setEffectiveFrom('')\n setEffectiveTo('')\n setShowClearConfirm(false)\n flash('Canvas cleared', 'success')\n }, [])\n\n // Show loading spinner while loading definition\n if (isLoading) {\n return (\n <Page className=\"h-screen flex items-center justify-center\">\n <LoadingMessage label=\"Loading workflow definition...\" />\n </Page>\n )\n }\n\n return (\n <Page className=\"h-screen flex flex-col\">\n {/* Page Header */}\n <div className=\"border-b border-gray-200 bg-white px-6 py-4\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Link\n href=\"/backend/definitions\"\n className=\"inline-flex items-center text-sm text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className=\"mr-1 text-base\">\u2190</span>\n <span className=\"sr-only\">{t('workflows.definitions.backToList', 'Back to definitions')}</span>\n </Link>\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-2xl font-semibold text-foreground\">\n {definitionId ? (workflowName || 'Workflow') : t('workflows.backend.definitions.visual_editor.title')}\n </h1>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {definitionId\n ? t('workflows.definitions.detail.summary', 'Editing workflow definition')\n : t('workflows.definitions.create.summary', 'Create and edit workflow definitions visually with a drag-and-drop interface')\n }\n </p>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => setShowMetadata(!showMetadata)}\n disabled={isSaving}\n >\n {showMetadata ? <PanelTopClose className=\"mr-2 h-4 w-4\"/> : <PanelTopOpen className=\"mr-2 h-4 w-4\"/>}\n {showMetadata ? 'Hide' : 'Show'} Metadata\n </Button>\n <Button\n variant=\"outline\"\n onClick={handleLoadExample}\n disabled={isSaving}\n >\n Load Example\n </Button>\n <Button\n variant=\"destructive\"\n onClick={handleClear}\n disabled={isSaving}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Clear\n </Button>\n <div className=\"w-px h-6 bg-gray-300\"></div>\n <Button\n variant=\"outline\"\n onClick={handleValidate}\n disabled={isSaving}\n >\n <CircleQuestionMark className=\"mr-2 h-4 w-4\" />\n Validate\n </Button>\n <Button\n variant=\"outline\"\n onClick={handleTest}\n disabled={isSaving}\n >\n <Play className=\"mr-2 h-4 w-4\" />\n Run Test\n </Button>\n <Button\n onClick={handleSave}\n disabled={isSaving}\n >\n <Save className=\"mr-2 h-4 w-4\" />\n {isSaving ? 'Saving...' : (definitionId ? 'Update' : 'Save')}\n </Button>\n </div>\n </div>\n </div>\n\n {/* Workflow Metadata Form */}\n {showMetadata && (\n <div className=\"bg-white border-b border-gray-200 px-6 py-4\">\n <div className=\"rounded-lg border bg-card p-4\">\n <h2 className=\"text-sm font-semibold uppercase text-muted-foreground mb-4\">Workflow Metadata</h2>\n <div className=\"grid grid-cols-3 gap-4\">\n {/* Workflow ID */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"workflowId\" className=\"text-xs\">Workflow ID *</Label>\n <Input\n id=\"workflowId\"\n value={workflowId}\n onChange={(e) => setWorkflowId(e.target.value)}\n placeholder=\"checkout_workflow\"\n disabled={!!definitionId}\n />\n <p className=\"text-xs text-muted-foreground\">\n {definitionId ? 'Cannot be changed when editing' : 'Lowercase, numbers, hyphens, underscores'}\n </p>\n </div>\n\n {/* Workflow Name */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"workflowName\" className=\"text-xs\">Workflow Name *</Label>\n <Input\n id=\"workflowName\"\n value={workflowName}\n onChange={(e) => setWorkflowName(e.target.value)}\n placeholder=\"Checkout Process\"\n />\n </div>\n\n {/* Category */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"category\" className=\"text-xs\">Category</Label>\n <Input\n id=\"category\"\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n placeholder=\"E-Commerce\"\n />\n </div>\n\n {/* Description */}\n <div className=\"col-span-3 space-y-1\">\n <Label htmlFor=\"description\" className=\"text-xs\">Description</Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Describe the purpose of this workflow...\"\n rows={2}\n />\n </div>\n\n {/* Version */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"version\" className=\"text-xs\">Version *</Label>\n <Input\n id=\"version\"\n type=\"number\"\n value={version}\n onChange={(e) => setVersion(parseInt(e.target.value) || 1)}\n min={1}\n disabled={!!definitionId}\n />\n <p className=\"text-xs text-muted-foreground\">\n Version number (increment for major changes)\n </p>\n </div>\n\n {/* Enabled */}\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">Enabled</Label>\n <div className=\"flex items-center gap-2 mt-2\">\n <Switch\n id=\"enabled\"\n checked={enabled}\n onCheckedChange={setEnabled}\n />\n <Label htmlFor=\"enabled\" className=\"text-sm font-normal cursor-pointer\">\n Only enabled workflows can be started\n </Label>\n </div>\n </div>\n\n {/* Tags */}\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">Tags</Label>\n <TagsInput\n value={tags}\n onChange={setTags}\n placeholder={t('workflows.form.placeholders.tags')}\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.form.descriptions.tags')}\n </p>\n </div>\n\n {/* Icon */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"icon\" className=\"text-xs\">Icon</Label>\n <Input\n id=\"icon\"\n value={icon}\n onChange={(e) => setIcon(e.target.value)}\n placeholder=\"ShoppingCart\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Icon name for visual identification\n </p>\n </div>\n\n {/* Effective From */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"effectiveFrom\" className=\"text-xs\">Effective From</Label>\n <Input\n id=\"effectiveFrom\"\n type=\"date\"\n value={effectiveFrom}\n onChange={(e) => setEffectiveFrom(e.target.value)}\n />\n <p className=\"text-xs text-muted-foreground\">\n Workflow becomes active from this date\n </p>\n </div>\n\n {/* Effective To */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"effectiveTo\" className=\"text-xs\">Effective To</Label>\n <Input\n id=\"effectiveTo\"\n type=\"date\"\n value={effectiveTo}\n onChange={(e) => setEffectiveTo(e.target.value)}\n />\n <p className=\"text-xs text-muted-foreground\">\n Workflow deactivates after this date\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Main Content: Sidebar + Canvas */}\n <PageBody className=\"flex-1 flex overflow-hidden\">\n {/* Left Sidebar - Step Palette */}\n <div className=\"w-88 bg-white border-r border-gray-200 p-6 overflow-y-auto\">\n <div className=\"rounded-lg border bg-card p-4\">\n <h2 className=\"text-sm font-semibold uppercase text-muted-foreground mb-2\">Step Palette</h2>\n <p className=\"text-xs text-muted-foreground mb-4\">\n Click a step type to add it to the canvas\n </p>\n\n <div className=\"space-y-3\">\n {/* START Step */}\n <button\n onClick={() => handleAddNode('start')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.start} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.start\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.start.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.start.description}</div>\n </button>\n\n {/* USER_TASK Step */}\n <button\n onClick={() => handleAddNode('userTask')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.userTask} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.userTask\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.userTask.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.userTask.description}</div>\n </button>\n\n {/* AUTOMATED Step */}\n <button\n onClick={() => handleAddNode('automated')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.automated} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.automated\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.automated.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.automated.description}</div>\n </button>\n\n {/* WAIT_FOR_SIGNAL Step */}\n <button\n onClick={() => handleAddNode('waitForSignal')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.waitForSignal} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.waitForSignal\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.waitForSignal.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.waitForSignal.description}</div>\n </button>\n\n {/* SUB_WORKFLOW Step */}\n <button\n onClick={() => handleAddNode('subWorkflow')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.subWorkflow} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.subWorkflow\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.subWorkflow.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.subWorkflow.description}</div>\n </button>\n\n {/* END Step */}\n <button\n onClick={() => handleAddNode('end')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.end} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.end\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.end.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.end.description}</div>\n </button>\n </div>\n\n {/* Instructions */}\n <Alert variant=\"info\" className=\"mt-6\">\n <Info className=\"size-4\" />\n <AlertTitle className=\"text-xs\">How to use:</AlertTitle>\n <div className=\"mt-2\">\n <ul className=\"text-xs space-y-1\">\n <li>\u2022 Click step types to add them</li>\n <li>\u2022 Drag steps to position them</li>\n <li>\u2022 Connect steps by dragging from handles</li>\n <li>\u2022 Click steps/transitions to edit them</li>\n <li>\u2022 Validate before saving</li>\n </ul>\n </div>\n </Alert>\n </div>\n </div>\n\n {/* Main Canvas */}\n <div className=\"flex-1 relative p-6 overflow-auto\">\n <div className=\"h-full rounded-lg border bg-card\">\n <WorkflowGraph\n initialNodes={nodes}\n initialEdges={edges}\n onNodesChange={handleNodesChange}\n onEdgesChange={handleEdgesChange}\n onNodeClick={handleNodeClick}\n onEdgeClick={handleEdgeClick}\n onConnect={handleConnect}\n editable={true}\n height=\"100%\"\n />\n </div>\n\n {/* Empty State */}\n {nodes.length === 0 && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"text-center\">\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">\n Start Building Your Workflow\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Click a step type from the palette to add it to the canvas\n </p>\n <div className=\"text-sm text-gray-500\">\n or{' '}\n <button\n onClick={handleLoadExample}\n className=\"text-blue-600 hover:underline pointer-events-auto\"\n >\n load an example workflow\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </PageBody>\n\n {/* Node Edit Dialog - Conditional rendering based on feature flag */}\n {process.env.NEXT_PUBLIC_WORKFLOW_CRUDFORM_ENABLED === 'true' ? (\n <NodeEditDialogCrudForm\n node={selectedNode}\n isOpen={showNodeDialog}\n onClose={() => setShowNodeDialog(false)}\n onSave={handleSaveNode}\n onDelete={handleDeleteNode}\n />\n ) : (\n <NodeEditDialog\n node={selectedNode}\n isOpen={showNodeDialog}\n onClose={() => setShowNodeDialog(false)}\n onSave={handleSaveNode}\n onDelete={handleDeleteNode}\n />\n )}\n\n {/* Edge Edit Dialog - Conditional rendering based on feature flag */}\n {process.env.NEXT_PUBLIC_WORKFLOW_CRUDFORM_ENABLED === 'true' ? (\n <EdgeEditDialogCrudForm\n edge={selectedEdge}\n isOpen={showEdgeDialog}\n onClose={() => setShowEdgeDialog(false)}\n onSave={handleSaveEdge}\n onDelete={handleDeleteEdge}\n />\n ) : (\n <EdgeEditDialog\n edge={selectedEdge}\n isOpen={showEdgeDialog}\n onClose={() => setShowEdgeDialog(false)}\n onSave={handleSaveEdge}\n onDelete={handleDeleteEdge}\n />\n )}\n\n {/* Clear Confirmation Dialog */}\n <Dialog open={showClearConfirm} onOpenChange={setShowClearConfirm}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Clear Everything?</DialogTitle>\n <DialogDescription>\n This will clear all metadata and the workflow canvas. This action cannot be undone.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setShowClearConfirm(false)}>\n {t('common.cancel', 'Cancel')}\n </Button>\n <Button variant=\"destructive\" onClick={confirmClear}>\n {t('common.clear', 'Clear')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </Page>\n )\n}\n\n// Helper functions\nfunction getDefaultLabel(nodeType: string): string {\n const labels: Record<string, string> = {\n start: 'Start',\n end: 'End',\n userTask: 'New User Task',\n automated: 'New Automated Task',\n decision: 'Decision Point',\n waitForSignal: 'Wait for Signal',\n }\n return labels[nodeType] || 'New Step'\n}\n\nfunction getDefaultBadge(nodeType: string): string {\n const badges: Record<string, string> = {\n start: 'Start',\n end: 'End',\n userTask: 'User Task',\n automated: 'Automated',\n decision: 'Decision',\n waitForSignal: 'Wait for Signal',\n }\n return badges[nodeType] || 'Task'\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport { WorkflowGraph } from '../../../components/WorkflowGraph'\n// Conditional imports based on feature flag\nimport { NodeEditDialog } from '../../../components/NodeEditDialog'\nimport { EdgeEditDialog } from '../../../components/EdgeEditDialog'\nimport { NodeEditDialogCrudForm } from '../../../components/NodeEditDialogCrudForm'\nimport { EdgeEditDialogCrudForm } from '../../../components/EdgeEditDialogCrudForm'\nimport { Node, Edge, addEdge, Connection, applyNodeChanges, applyEdgeChanges, NodeChange, EdgeChange } from '@xyflow/react'\nimport { useState, useCallback, useEffect } from 'react'\nimport Link from 'next/link'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { graphToDefinition, definitionToGraph, validateWorkflowGraph, generateStepId, generateTransitionId, ValidationError } from '../../../lib/graph-utils'\nimport { workflowDefinitionDataSchema } from '../../../data/validators'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Textarea } from '@open-mercato/ui/primitives/textarea'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { TagsInput } from '@open-mercato/ui/backend/inputs/TagsInput'\nimport { LoadingMessage } from '@open-mercato/ui/backend/detail'\nimport { Alert, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport {CircleQuestionMark, Info, PanelTopClose, PanelTopOpen, Play, Save, Trash2} from 'lucide-react'\nimport { NODE_TYPE_ICONS, NODE_TYPE_COLORS, NODE_TYPE_LABELS } from '../../../lib/node-type-icons'\nimport { DefinitionTriggersEditor } from '../../../components/DefinitionTriggersEditor'\nimport type { WorkflowDefinitionTrigger } from '../../../data/entities'\nimport * as React from \"react\";\n\n/**\n * VisualEditorPage - Visual workflow definition editor\n *\n * Layout:\n * - Page Header: Title, description, and action buttons (Save, Validate, Test)\n * - Workflow Metadata: Collapsible form for workflow details\n * - Page Body:\n * - Left sidebar: Step palette (click to add)\n * - Main canvas: ReactFlow graph editor\n * - Flash Messages: Top-right positioned validation messages\n * - Edit Dialogs: Modal dialogs for editing steps and transitions\n */\nexport default function VisualEditorPage() {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const definitionId = searchParams.get('id')\n\n const [isLoading, setIsLoading] = useState(!!definitionId)\n const [isSaving, setIsSaving] = useState(false)\n const [nodes, setNodes] = useState<Node[]>([])\n const [edges, setEdges] = useState<Edge[]>([])\n const [selectedNode, setSelectedNode] = useState<Node | null>(null)\n const [selectedEdge, setSelectedEdge] = useState<Edge | null>(null)\n const [showMetadata, setShowMetadata] = useState(true)\n const [showNodeDialog, setShowNodeDialog] = useState(false)\n const [showEdgeDialog, setShowEdgeDialog] = useState(false)\n const [showClearConfirm, setShowClearConfirm] = useState(false)\n\n // Workflow metadata state\n const [workflowId, setWorkflowId] = useState('')\n const [workflowName, setWorkflowName] = useState('')\n const [description, setDescription] = useState('')\n const [version, setVersion] = useState(1)\n const [enabled, setEnabled] = useState(true)\n const [category, setCategory] = useState('')\n const [tags, setTags] = useState<string[]>([])\n const [icon, setIcon] = useState('')\n const [effectiveFrom, setEffectiveFrom] = useState('')\n const [effectiveTo, setEffectiveTo] = useState('')\n const [triggers, setTriggers] = useState<WorkflowDefinitionTrigger[]>([])\n\n // Load existing definition if ID is provided\n useEffect(() => {\n const loadDefinition = async () => {\n if (!definitionId) {\n setIsLoading(false)\n return\n }\n\n try {\n const result = await apiCall<{ data: any; error?: string }>(`/api/workflows/definitions/${definitionId}`)\n\n if (!result.ok) {\n flash(`Failed to load workflow: ${result.result?.error || 'Unknown error'}`, 'error')\n setIsLoading(false)\n return\n }\n\n const definition = result.result?.data\n\n // Populate metadata\n setWorkflowId(definition.workflowId)\n setWorkflowName(definition.workflowName || definition.definition.workflowName || '')\n setDescription(definition.description || definition.definition.description || '')\n setVersion(definition.version)\n setEnabled(definition.enabled)\n setCategory(definition.metadata?.category || '')\n setTags(definition.metadata?.tags || [])\n setIcon(definition.metadata?.icon || '')\n setEffectiveFrom(definition.effectiveFrom || '')\n setEffectiveTo(definition.effectiveTo || '')\n\n // Convert definition to graph\n const graph = definitionToGraph(definition.definition)\n setNodes(graph.nodes)\n setEdges(graph.edges)\n\n // Load embedded triggers from definition\n setTriggers(definition.definition?.triggers || [])\n\n flash('Workflow loaded successfully', 'success')\n } catch (error) {\n console.error('Error loading workflow definition:', error)\n flash('Failed to load workflow definition', 'error')\n } finally {\n setIsLoading(false)\n }\n }\n\n loadDefinition()\n }, [definitionId])\n\n // Handle node changes from ReactFlow\n const handleNodesChange = useCallback((changes: NodeChange[]) => {\n setNodes((nds) => applyNodeChanges(changes, nds))\n }, [])\n\n // Handle edge changes from ReactFlow\n const handleEdgesChange = useCallback((changes: EdgeChange[]) => {\n setEdges((eds) => applyEdgeChanges(changes, eds))\n }, [])\n\n // Handle adding new node from palette\n const handleAddNode = useCallback((nodeType: string) => {\n const newNode: Node = {\n id: generateStepId(nodeType),\n type: nodeType,\n position: {\n x: 250 + nodes.length * 50,\n y: 100 + nodes.length * 150,\n },\n data: {\n label: getDefaultLabel(nodeType),\n description: '',\n badge: getDefaultBadge(nodeType),\n status: 'pending',\n },\n }\n\n setNodes((nds) => [...nds, newNode])\n }, [nodes.length])\n\n // Handle node selection - open edit dialog\n const handleNodeClick = useCallback((_event: React.MouseEvent, node: Node) => {\n setSelectedNode(node)\n setSelectedEdge(null)\n setShowNodeDialog(true)\n }, [])\n\n // Handle edge selection - open edit dialog\n const handleEdgeClick = useCallback((_event: React.MouseEvent, edge: Edge) => {\n setSelectedEdge(edge)\n setSelectedNode(null)\n setShowEdgeDialog(true)\n }, [])\n\n // Save node updates\n const handleSaveNode = useCallback((nodeId: string, updates: Partial<Node['data']>) => {\n setNodes((nds) =>\n nds.map((node) =>\n node.id === nodeId\n ? { ...node, data: { ...node.data, ...updates } }\n : node\n )\n )\n flash('Node updated successfully', 'success')\n }, [])\n\n // Save edge updates\n const handleSaveEdge = useCallback((edgeId: string, updates: Partial<Edge['data']>) => {\n setEdges((eds) =>\n eds.map((edge) =>\n edge.id === edgeId\n ? { ...edge, data: { ...edge.data, ...updates } }\n : edge\n )\n )\n flash('Transition updated successfully', 'success')\n }, [])\n\n // Delete edge\n const handleDeleteEdge = useCallback((edgeId: string) => {\n setEdges((eds) => eds.filter((edge) => edge.id !== edgeId))\n flash('Transition deleted successfully', 'success')\n }, [])\n\n // Delete node\n const handleDeleteNode = useCallback((nodeId: string) => {\n // Remove the node\n setNodes((nds) => nds.filter((node) => node.id !== nodeId))\n\n // Remove all edges connected to this node\n setEdges((eds) => eds.filter((edge) => edge.source !== nodeId && edge.target !== nodeId))\n\n flash('Step deleted successfully', 'success')\n }, [])\n\n // Handle new connections\n const handleConnect = useCallback((connection: Connection) => {\n const newEdge: Edge = {\n id: generateTransitionId(connection.source!, connection.target!),\n source: connection.source!,\n target: connection.target!,\n type: 'smoothstep',\n data: {\n trigger: 'auto',\n preConditions: [],\n postConditions: [],\n activities: [],\n label: '',\n },\n }\n\n setEdges((eds) => addEdge(newEdge, eds))\n }, [])\n\n // Validate workflow\n const handleValidate = useCallback(() => {\n const graphErrors = validateWorkflowGraph(nodes, edges)\n const allErrors: ValidationError[] = [...graphErrors]\n\n // Run Zod schema validation\n try {\n const definitionData = graphToDefinition(nodes, edges, { includePositions: true })\n const result = workflowDefinitionDataSchema.safeParse(definitionData)\n\n if (!result.success) {\n // Convert Zod errors to validation errors\n result.error.issues.forEach((issue) => {\n allErrors.push({\n type: 'error',\n message: `Schema validation: ${issue.path.join('.')} - ${issue.message}`,\n })\n })\n }\n } catch (error) {\n allErrors.push({\n type: 'error',\n message: `Schema validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n })\n }\n\n if (allErrors.length === 0) {\n flash('Validation passed! Your workflow is valid and ready to save.', 'success')\n } else {\n // Show first error/warning message\n const firstError = allErrors[0]\n const errorCount = allErrors.length\n const message = errorCount > 1\n ? `${firstError.message} (and ${errorCount - 1} more ${errorCount === 2 ? 'issue' : 'issues'})`\n : firstError.message\n flash(message, firstError.type === 'error' ? 'error' : 'warning')\n }\n }, [nodes, edges])\n\n // Save workflow definition\n const handleSave = useCallback(async () => {\n // Validate required fields\n if (!workflowId || !workflowName) {\n flash('Workflow ID and Name are required fields', 'error')\n return\n }\n\n // Validate workflow structure\n const errors = validateWorkflowGraph(nodes, edges)\n const criticalErrors = errors.filter(e => e.type === 'error')\n if (criticalErrors.length > 0) {\n flash(`Cannot save: ${criticalErrors.length} validation error(s) found. Please fix them first.`, 'error')\n return\n }\n\n // Generate definition data and include triggers\n const graphDefinition = graphToDefinition(nodes, edges, { includePositions: true })\n const definitionData = {\n ...graphDefinition,\n triggers: triggers.length > 0 ? triggers : undefined,\n }\n\n // Run Zod schema validation before saving\n const schemaResult = workflowDefinitionDataSchema.safeParse(definitionData)\n if (!schemaResult.success) {\n const firstIssue = schemaResult.error.issues[0]\n flash(`Schema error: ${firstIssue.path.join('.')} - ${firstIssue.message}`, 'error')\n return\n }\n\n setIsSaving(true)\n\n try {\n\n const metadata: any = {}\n if (category) metadata.category = category\n if (tags.length > 0) metadata.tags = tags\n if (icon) metadata.icon = icon\n\n // Determine if creating new or updating existing\n const isUpdate = !!definitionId\n\n let result\n if (isUpdate) {\n // Update existing definition\n result = await apiCall<{ data: any; error?: string }>(`/api/workflows/definitions/${definitionId}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n definition: definitionData,\n enabled,\n }),\n })\n } else {\n // Create new definition\n result = await apiCall<{ data: any; error?: string }>('/api/workflows/definitions', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n workflowId,\n workflowName,\n description: description || null,\n version,\n definition: definitionData,\n metadata: Object.keys(metadata).length > 0 ? metadata : null,\n enabled,\n effectiveFrom: effectiveFrom || null,\n effectiveTo: effectiveTo || null,\n }),\n })\n }\n\n if (!result.ok) {\n flash(`Failed to save: ${result.result?.error || 'Unknown error'}`, 'error')\n return\n }\n\n const savedDefinition = result.result?.data\n\n flash(`Workflow ${isUpdate ? 'updated' : 'created'} successfully!`, 'success')\n\n // Redirect to definition detail page after short delay\n setTimeout(() => {\n router.push(`/backend/definitions/${savedDefinition.id}`)\n }, 1500)\n\n } catch (error) {\n console.error('Error saving workflow definition:', error)\n flash('Failed to save workflow definition. Please try again.', 'error')\n } finally {\n setIsSaving(false)\n }\n }, [nodes, edges, workflowId, workflowName, description, version, enabled, category, tags, triggers, definitionId, router])\n\n // Test workflow\n const handleTest = useCallback(() => {\n // First validate\n const errors = validateWorkflowGraph(nodes, edges)\n const criticalErrors = errors.filter((e) => e.type === 'error')\n if (criticalErrors.length > 0) {\n flash(`Cannot test: ${criticalErrors.length} validation error(s) found. Please fix them first.`, 'error')\n return\n }\n\n // TODO: Implement test logic (create instance, run first step)\n flash('Test functionality will be implemented next', 'info')\n }, [nodes, edges])\n\n // Load example workflow\n const handleLoadExample = useCallback(() => {\n // Set example metadata\n setWorkflowId('approval_workflow')\n setWorkflowName('Simple Approval Workflow')\n setDescription('A basic approval workflow for reviewing and approving requests')\n setVersion(1)\n setEnabled(true)\n setCategory('Approvals')\n setTags(['approval', 'review'])\n\n const exampleNodes: Node[] = [\n {\n id: 'start',\n type: 'start',\n position: { x: 250, y: 50 },\n data: {\n label: 'Start',\n description: 'Workflow begins',\n status: 'pending',\n badge: 'Start',\n },\n },\n {\n id: 'step1',\n type: 'userTask',\n position: { x: 250, y: 250 },\n data: {\n label: 'Review Request',\n description: 'User reviews the incoming request',\n status: 'pending',\n stepNumber: 1,\n badge: 'User Task',\n assignedToRoles: ['Reviewer'],\n },\n },\n {\n id: 'end',\n type: 'end',\n position: { x: 250, y: 450 },\n data: {\n label: 'Complete',\n description: 'Workflow ends',\n status: 'pending',\n badge: 'End',\n },\n },\n ]\n\n const exampleEdges: Edge[] = [\n {\n id: 'e-start-step1',\n source: 'start',\n target: 'step1',\n type: 'smoothstep',\n data: {\n trigger: 'auto',\n preConditions: [],\n postConditions: [],\n activities: [],\n },\n },\n {\n id: 'e-step1-end',\n source: 'step1',\n target: 'end',\n type: 'smoothstep',\n data: {\n trigger: 'auto',\n preConditions: [],\n postConditions: [],\n activities: [],\n },\n },\n ]\n\n setNodes(exampleNodes)\n setEdges(exampleEdges)\n flash('Example workflow loaded', 'success')\n }, [])\n\n // Clear canvas\n const handleClear = useCallback(() => {\n if (nodes.length > 0 || edges.length > 0 || workflowId || workflowName) {\n setShowClearConfirm(true)\n }\n }, [nodes.length, edges.length, workflowId, workflowName])\n\n // Confirm clear action\n const confirmClear = useCallback(() => {\n setNodes([])\n setEdges([])\n setWorkflowId('')\n setWorkflowName('')\n setDescription('')\n setVersion(1)\n setEnabled(true)\n setCategory('')\n setTags([])\n setIcon('')\n setEffectiveFrom('')\n setEffectiveTo('')\n setTriggers([])\n setShowClearConfirm(false)\n flash('Canvas cleared', 'success')\n }, [])\n\n // Show loading spinner while loading definition\n if (isLoading) {\n return (\n <Page className=\"h-screen flex items-center justify-center\">\n <LoadingMessage label=\"Loading workflow definition...\" />\n </Page>\n )\n }\n\n return (\n <Page className=\"h-screen flex flex-col\">\n {/* Page Header */}\n <div className=\"border-b border-gray-200 bg-white px-6 py-4\">\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Link\n href=\"/backend/definitions\"\n className=\"inline-flex items-center text-sm text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className=\"mr-1 text-base\">\u2190</span>\n <span className=\"sr-only\">{t('workflows.definitions.backToList', 'Back to definitions')}</span>\n </Link>\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-2xl font-semibold text-foreground\">\n {definitionId ? (workflowName || 'Workflow') : t('workflows.backend.definitions.visual_editor.title')}\n </h1>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {definitionId\n ? t('workflows.definitions.detail.summary', 'Editing workflow definition')\n : t('workflows.definitions.create.summary', 'Create and edit workflow definitions visually with a drag-and-drop interface')\n }\n </p>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => setShowMetadata(!showMetadata)}\n disabled={isSaving}\n >\n {showMetadata ? <PanelTopClose className=\"mr-2 h-4 w-4\"/> : <PanelTopOpen className=\"mr-2 h-4 w-4\"/>}\n {showMetadata ? 'Hide' : 'Show'} Metadata\n </Button>\n <Button\n variant=\"outline\"\n onClick={handleLoadExample}\n disabled={isSaving}\n >\n Load Example\n </Button>\n <Button\n variant=\"destructive\"\n onClick={handleClear}\n disabled={isSaving}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Clear\n </Button>\n <div className=\"w-px h-6 bg-gray-300\"></div>\n <Button\n variant=\"outline\"\n onClick={handleValidate}\n disabled={isSaving}\n >\n <CircleQuestionMark className=\"mr-2 h-4 w-4\" />\n Validate\n </Button>\n <Button\n variant=\"outline\"\n onClick={handleTest}\n disabled={isSaving}\n >\n <Play className=\"mr-2 h-4 w-4\" />\n Run Test\n </Button>\n <Button\n onClick={handleSave}\n disabled={isSaving}\n >\n <Save className=\"mr-2 h-4 w-4\" />\n {isSaving ? 'Saving...' : (definitionId ? 'Update' : 'Save')}\n </Button>\n </div>\n </div>\n </div>\n\n {/* Workflow Metadata Form */}\n {showMetadata && (\n <div className=\"bg-white border-b border-gray-200 px-6 py-4\">\n <div className=\"rounded-lg border bg-card p-4\">\n <h2 className=\"text-sm font-semibold uppercase text-muted-foreground mb-4\">Workflow Metadata</h2>\n <div className=\"grid grid-cols-3 gap-4\">\n {/* Workflow ID */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"workflowId\" className=\"text-xs\">Workflow ID *</Label>\n <Input\n id=\"workflowId\"\n value={workflowId}\n onChange={(e) => setWorkflowId(e.target.value)}\n placeholder=\"checkout_workflow\"\n disabled={!!definitionId}\n />\n <p className=\"text-xs text-muted-foreground\">\n {definitionId ? 'Cannot be changed when editing' : 'Lowercase, numbers, hyphens, underscores'}\n </p>\n </div>\n\n {/* Workflow Name */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"workflowName\" className=\"text-xs\">Workflow Name *</Label>\n <Input\n id=\"workflowName\"\n value={workflowName}\n onChange={(e) => setWorkflowName(e.target.value)}\n placeholder=\"Checkout Process\"\n />\n </div>\n\n {/* Category */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"category\" className=\"text-xs\">Category</Label>\n <Input\n id=\"category\"\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n placeholder=\"E-Commerce\"\n />\n </div>\n\n {/* Description */}\n <div className=\"col-span-3 space-y-1\">\n <Label htmlFor=\"description\" className=\"text-xs\">Description</Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Describe the purpose of this workflow...\"\n rows={2}\n />\n </div>\n\n {/* Version */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"version\" className=\"text-xs\">Version *</Label>\n <Input\n id=\"version\"\n type=\"number\"\n value={version}\n onChange={(e) => setVersion(parseInt(e.target.value) || 1)}\n min={1}\n disabled={!!definitionId}\n />\n <p className=\"text-xs text-muted-foreground\">\n Version number (increment for major changes)\n </p>\n </div>\n\n {/* Enabled */}\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">Enabled</Label>\n <div className=\"flex items-center gap-2 mt-2\">\n <Switch\n id=\"enabled\"\n checked={enabled}\n onCheckedChange={setEnabled}\n />\n <Label htmlFor=\"enabled\" className=\"text-sm font-normal cursor-pointer\">\n Only enabled workflows can be started\n </Label>\n </div>\n </div>\n\n {/* Tags */}\n <div className=\"space-y-1\">\n <Label className=\"text-xs\">Tags</Label>\n <TagsInput\n value={tags}\n onChange={setTags}\n placeholder={t('workflows.form.placeholders.tags')}\n />\n <p className=\"text-xs text-muted-foreground\">\n {t('workflows.form.descriptions.tags')}\n </p>\n </div>\n\n {/* Icon */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"icon\" className=\"text-xs\">Icon</Label>\n <Input\n id=\"icon\"\n value={icon}\n onChange={(e) => setIcon(e.target.value)}\n placeholder=\"ShoppingCart\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Icon name for visual identification\n </p>\n </div>\n\n {/* Effective From */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"effectiveFrom\" className=\"text-xs\">Effective From</Label>\n <Input\n id=\"effectiveFrom\"\n type=\"date\"\n value={effectiveFrom}\n onChange={(e) => setEffectiveFrom(e.target.value)}\n />\n <p className=\"text-xs text-muted-foreground\">\n Workflow becomes active from this date\n </p>\n </div>\n\n {/* Effective To */}\n <div className=\"space-y-1\">\n <Label htmlFor=\"effectiveTo\" className=\"text-xs\">Effective To</Label>\n <Input\n id=\"effectiveTo\"\n type=\"date\"\n value={effectiveTo}\n onChange={(e) => setEffectiveTo(e.target.value)}\n />\n <p className=\"text-xs text-muted-foreground\">\n Workflow deactivates after this date\n </p>\n </div>\n </div>\n </div>\n\n {/* Event Triggers - Always visible, managed as part of definition */}\n <DefinitionTriggersEditor\n value={triggers}\n onChange={setTriggers}\n className=\"mt-4\"\n />\n </div>\n )}\n\n {/* Main Content: Sidebar + Canvas */}\n <PageBody className=\"flex-1 flex overflow-hidden\">\n {/* Left Sidebar - Step Palette */}\n <div className=\"w-88 bg-white border-r border-gray-200 p-6 overflow-y-auto\">\n <div className=\"rounded-lg border bg-card p-4\">\n <h2 className=\"text-sm font-semibold uppercase text-muted-foreground mb-2\">Step Palette</h2>\n <p className=\"text-xs text-muted-foreground mb-4\">\n Click a step type to add it to the canvas\n </p>\n\n <div className=\"space-y-3\">\n {/* START Step */}\n <button\n onClick={() => handleAddNode('start')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.start} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.start\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.start.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.start.description}</div>\n </button>\n\n {/* USER_TASK Step */}\n <button\n onClick={() => handleAddNode('userTask')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.userTask} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.userTask\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.userTask.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.userTask.description}</div>\n </button>\n\n {/* AUTOMATED Step */}\n <button\n onClick={() => handleAddNode('automated')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.automated} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.automated\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.automated.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.automated.description}</div>\n </button>\n\n {/* WAIT_FOR_SIGNAL Step */}\n <button\n onClick={() => handleAddNode('waitForSignal')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.waitForSignal} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.waitForSignal\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.waitForSignal.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.waitForSignal.description}</div>\n </button>\n\n {/* SUB_WORKFLOW Step */}\n <button\n onClick={() => handleAddNode('subWorkflow')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.subWorkflow} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.subWorkflow\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.subWorkflow.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.subWorkflow.description}</div>\n </button>\n\n {/* END Step */}\n <button\n onClick={() => handleAddNode('end')}\n className=\"w-full text-left px-4 py-3 bg-white border-2 border-gray-200 rounded-xl hover:shadow-md hover:border-gray-300 transition-all cursor-pointer group relative\"\n >\n <div className={`absolute top-2 right-2 ${NODE_TYPE_COLORS.end} opacity-60 group-hover:opacity-100 transition-opacity`}>\n {(() => {\n const Icon = NODE_TYPE_ICONS.end\n return <Icon className=\"w-4 h-4\" />\n })()}\n </div>\n <div className=\"text-sm font-semibold text-gray-900\">{NODE_TYPE_LABELS.end.title}</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{NODE_TYPE_LABELS.end.description}</div>\n </button>\n </div>\n\n {/* Instructions */}\n <Alert variant=\"info\" className=\"mt-6\">\n <Info className=\"size-4\" />\n <AlertTitle className=\"text-xs\">How to use:</AlertTitle>\n <div className=\"mt-2\">\n <ul className=\"text-xs space-y-1\">\n <li>\u2022 Click step types to add them</li>\n <li>\u2022 Drag steps to position them</li>\n <li>\u2022 Connect steps by dragging from handles</li>\n <li>\u2022 Click steps/transitions to edit them</li>\n <li>\u2022 Validate before saving</li>\n </ul>\n </div>\n </Alert>\n </div>\n </div>\n\n {/* Main Canvas */}\n <div className=\"flex-1 relative p-6 overflow-auto\">\n <div className=\"h-full rounded-lg border bg-card\">\n <WorkflowGraph\n initialNodes={nodes}\n initialEdges={edges}\n onNodesChange={handleNodesChange}\n onEdgesChange={handleEdgesChange}\n onNodeClick={handleNodeClick}\n onEdgeClick={handleEdgeClick}\n onConnect={handleConnect}\n editable={true}\n height=\"100%\"\n />\n </div>\n\n {/* Empty State */}\n {nodes.length === 0 && (\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"text-center\">\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">\n Start Building Your Workflow\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Click a step type from the palette to add it to the canvas\n </p>\n <div className=\"text-sm text-gray-500\">\n or{' '}\n <button\n onClick={handleLoadExample}\n className=\"text-blue-600 hover:underline pointer-events-auto\"\n >\n load an example workflow\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </PageBody>\n\n {/* Node Edit Dialog - Conditional rendering based on feature flag */}\n {process.env.NEXT_PUBLIC_WORKFLOW_CRUDFORM_ENABLED === 'true' ? (\n <NodeEditDialogCrudForm\n node={selectedNode}\n isOpen={showNodeDialog}\n onClose={() => setShowNodeDialog(false)}\n onSave={handleSaveNode}\n onDelete={handleDeleteNode}\n />\n ) : (\n <NodeEditDialog\n node={selectedNode}\n isOpen={showNodeDialog}\n onClose={() => setShowNodeDialog(false)}\n onSave={handleSaveNode}\n onDelete={handleDeleteNode}\n />\n )}\n\n {/* Edge Edit Dialog - Conditional rendering based on feature flag */}\n {process.env.NEXT_PUBLIC_WORKFLOW_CRUDFORM_ENABLED === 'true' ? (\n <EdgeEditDialogCrudForm\n edge={selectedEdge}\n isOpen={showEdgeDialog}\n onClose={() => setShowEdgeDialog(false)}\n onSave={handleSaveEdge}\n onDelete={handleDeleteEdge}\n />\n ) : (\n <EdgeEditDialog\n edge={selectedEdge}\n isOpen={showEdgeDialog}\n onClose={() => setShowEdgeDialog(false)}\n onSave={handleSaveEdge}\n onDelete={handleDeleteEdge}\n />\n )}\n\n {/* Clear Confirmation Dialog */}\n <Dialog open={showClearConfirm} onOpenChange={setShowClearConfirm}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Clear Everything?</DialogTitle>\n <DialogDescription>\n This will clear all metadata and the workflow canvas. This action cannot be undone.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setShowClearConfirm(false)}>\n {t('common.cancel', 'Cancel')}\n </Button>\n <Button variant=\"destructive\" onClick={confirmClear}>\n {t('common.clear', 'Clear')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </Page>\n )\n}\n\n// Helper functions\nfunction getDefaultLabel(nodeType: string): string {\n const labels: Record<string, string> = {\n start: 'Start',\n end: 'End',\n userTask: 'New User Task',\n automated: 'New Automated Task',\n decision: 'Decision Point',\n waitForSignal: 'Wait for Signal',\n }\n return labels[nodeType] || 'New Step'\n}\n\nfunction getDefaultBadge(nodeType: string): string {\n const badges: Record<string, string> = {\n start: 'Start',\n end: 'End',\n userTask: 'User Task',\n automated: 'Automated',\n decision: 'Decision',\n waitForSignal: 'Wait for Signal',\n }\n return badges[nodeType] || 'Task'\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -17,7 +17,7 @@ const metadata = {
|
|
|
17
17
|
pageOrder: 150,
|
|
18
18
|
icon: visualEditorIcon,
|
|
19
19
|
breadcrumb: [
|
|
20
|
-
{ label: "Workflows", labelKey: "workflows.module.name", href: "/backend/
|
|
20
|
+
{ label: "Workflows", labelKey: "workflows.module.name", href: "/backend/definitions" },
|
|
21
21
|
{ label: "Visual Editor", labelKey: "workflows.backend.definitions.visual_editor.title" }
|
|
22
22
|
]
|
|
23
23
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/workflows/backend/definitions/visual-editor/page.meta.ts"],
|
|
4
|
-
"sourcesContent": ["import React from 'react'\n\nconst visualEditorIcon = React.createElement(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2 },\n React.createElement('rect', { x: '3', y: '3', width: '18', height: '18', rx: '2', ry: '2' }),\n React.createElement('line', { x1: '3', y1: '9', x2: '21', y2: '9' }),\n React.createElement('line', { x1: '9', y1: '21', x2: '9', y2: '9' }),\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.manage'],\n pageTitle: 'Workflow Visual Editor',\n pageTitleKey: 'workflows.backend.definitions.visual_editor.title',\n pageGroup: 'Workflows',\n pageGroupKey: 'workflows.module.name',\n pagePriority: 10,\n pageOrder: 150,\n icon: visualEditorIcon,\n breadcrumb: [\n { label: 'Workflows', labelKey: 'workflows.module.name', href: '/backend/
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAElB,MAAM,mBAAmB,MAAM;AAAA,EAC7B;AAAA,EACA,EAAE,OAAO,IAAI,QAAQ,IAAI,SAAS,aAAa,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,EAAE;AAAA,EACpG,MAAM,cAAc,QAAQ,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,MAAM,QAAQ,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,EAC3F,MAAM,cAAc,QAAQ,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC;AAAA,EACnE,MAAM,cAAc,QAAQ,EAAE,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC;AACrE;AAEO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,kBAAkB;AAAA,EACpC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,YAAY;AAAA,IACV,EAAE,OAAO,aAAa,UAAU,yBAAyB,MAAM,
|
|
4
|
+
"sourcesContent": ["import React from 'react'\n\nconst visualEditorIcon = React.createElement(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2 },\n React.createElement('rect', { x: '3', y: '3', width: '18', height: '18', rx: '2', ry: '2' }),\n React.createElement('line', { x1: '3', y1: '9', x2: '21', y2: '9' }),\n React.createElement('line', { x1: '9', y1: '21', x2: '9', y2: '9' }),\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.manage'],\n pageTitle: 'Workflow Visual Editor',\n pageTitleKey: 'workflows.backend.definitions.visual_editor.title',\n pageGroup: 'Workflows',\n pageGroupKey: 'workflows.module.name',\n pagePriority: 10,\n pageOrder: 150,\n icon: visualEditorIcon,\n breadcrumb: [\n { label: 'Workflows', labelKey: 'workflows.module.name', href: '/backend/definitions' },\n { label: 'Visual Editor', labelKey: 'workflows.backend.definitions.visual_editor.title' },\n ],\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAElB,MAAM,mBAAmB,MAAM;AAAA,EAC7B;AAAA,EACA,EAAE,OAAO,IAAI,QAAQ,IAAI,SAAS,aAAa,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,EAAE;AAAA,EACpG,MAAM,cAAc,QAAQ,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,MAAM,QAAQ,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,EAC3F,MAAM,cAAc,QAAQ,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC;AAAA,EACnE,MAAM,cAAc,QAAQ,EAAE,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC;AACrE;AAEO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,kBAAkB;AAAA,EACpC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,YAAY;AAAA,IACV,EAAE,OAAO,aAAa,UAAU,yBAAyB,MAAM,uBAAuB;AAAA,IACtF,EAAE,OAAO,iBAAiB,UAAU,oDAAoD;AAAA,EAC1F;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -138,7 +138,7 @@ function WorkflowEventDetailPage() {
|
|
|
138
138
|
/* @__PURE__ */ jsx("dd", { className: "mt-1", children: /* @__PURE__ */ jsx(
|
|
139
139
|
Link,
|
|
140
140
|
{
|
|
141
|
-
href: `/backend/
|
|
141
|
+
href: `/backend/instances/${event.workflowInstance.id}`,
|
|
142
142
|
className: "text-sm text-primary hover:underline font-mono",
|
|
143
143
|
children: event.workflowInstance.id
|
|
144
144
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/workflows/backend/events/%5Bid%5D/page.tsx"],
|
|
4
|
-
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useParams, useRouter } from 'next/navigation'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiFetch } from '@open-mercato/ui/backend/utils/api'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { JsonDisplay } from '@open-mercato/ui/backend/JsonDisplay'\n\ntype WorkflowEvent = {\n id: string\n workflowInstanceId: string\n stepInstanceId: string | null\n eventType: string\n eventData: any\n occurredAt: string\n userId: string | null\n tenantId: string\n organizationId: string\n workflowInstance: {\n id: string\n workflowId: string\n version: number\n status: string\n currentStepId: string\n correlationKey: string | null\n startedAt: string | null\n completedAt: string | null\n context: any\n } | null\n}\n\nexport default function WorkflowEventDetailPage() {\n const router = useRouter()\n const params = useParams()\n const t = useT()\n\n // Handle both {id: '17'} and {slug: ['events', '17']} formats\n let eventId: string | undefined\n if (params?.id) {\n eventId = Array.isArray(params.id) ? params.id[0] : params.id\n } else if (params?.slug && Array.isArray(params.slug)) {\n // If slug is ['events', '17'], extract '17'\n eventId = params.slug[params.slug.length - 1]\n }\n\n const { data: event, isLoading, error } = useQuery({\n queryKey: ['workflows', 'events', eventId],\n queryFn: async () => {\n const response = await apiFetch(`/api/workflows/events/${eventId}`)\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(t('workflows.events.messages.loadFailed'))\n }\n const result = await response.json()\n return result as WorkflowEvent\n },\n enabled: !!eventId,\n })\n\n if (isLoading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <Spinner className=\"h-6 w-6\" />\n <span>{t('workflows.common.loading')}</span>\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (error || !event) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <p>{error ? t('workflows.events.messages.loadFailed') : t('workflows.events.notFound')}</p>\n <Button asChild variant=\"outline\">\n <Link href=\"/backend/events\">\n {t('workflows.events.backToList')}\n </Link>\n </Button>\n </div>\n </PageBody>\n </Page>\n )\n }\n\n const getEventTypeBadgeClass = (eventType: string) => {\n if (eventType.includes('STARTED')) return 'bg-blue-100 text-blue-800'\n if (eventType.includes('COMPLETED')) return 'bg-green-100 text-green-800'\n if (eventType.includes('FAILED') || eventType.includes('REJECTED')) return 'bg-red-100 text-red-800'\n if (eventType.includes('CANCELLED')) return 'bg-muted text-foreground dark:bg-muted dark:text-foreground'\n if (eventType.includes('ENTERED') || eventType.includes('EXITED')) return 'bg-purple-100 text-purple-800'\n return 'bg-muted text-foreground dark:bg-muted dark:text-foreground'\n }\n\n const getStatusBadgeClass = (status: string) => {\n switch (status) {\n case 'COMPLETED':\n return 'bg-green-100 text-green-800'\n case 'RUNNING':\n return 'bg-blue-100 text-blue-800'\n case 'FAILED':\n return 'bg-red-100 text-red-800'\n case 'CANCELLED':\n return 'bg-muted text-foreground dark:bg-muted dark:text-foreground'\n default:\n return 'bg-muted text-foreground dark:bg-muted dark:text-foreground'\n }\n }\n\n return (\n <Page>\n <PageBody>\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Link\n href=\"/backend/events\"\n className=\"inline-flex items-center text-sm text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className=\"mr-1 text-base\">\u2190</span>\n <span className=\"sr-only\">{t('workflows.events.backToList', 'Back to events')}</span>\n </Link>\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase text-muted-foreground\">\n {t('workflows.events.detail.type', 'Workflow event')}\n </p>\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-2xl font-bold text-foreground\">{event.eventType}</h1>\n <span className=\"font-mono text-sm text-muted-foreground\">#{event.id.slice(0, 8)}</span>\n </div>\n </div>\n </div>\n <span\n className={`inline-flex items-center px-3 py-1 rounded text-sm font-medium ${getEventTypeBadgeClass(\n event.eventType\n )}`}\n >\n {event.eventType}\n </span>\n </div>\n\n {/* Event Summary */}\n <div className=\"rounded-lg border bg-card p-6\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {t('workflows.events.detail.summary')}\n </h2>\n <dl className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.fields.occurredAt')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {new Date(event.occurredAt).toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.fields.eventType')}\n </dt>\n <dd className=\"mt-1\">\n <span\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${getEventTypeBadgeClass(\n event.eventType\n )}`}\n >\n {event.eventType}\n </span>\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.fields.userId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.userId || t('common.none')}\n </dd>\n </div>\n {event.stepInstanceId && (\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.detail.stepInstanceId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.stepInstanceId}\n </dd>\n </div>\n )}\n </dl>\n </div>\n\n {/* Workflow Instance Information */}\n {event.workflowInstance && (\n <div className=\"rounded-lg border bg-card p-6\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {t('workflows.events.detail.workflowInstance')}\n </h2>\n <dl className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.instanceId')}\n </dt>\n <dd className=\"mt-1\">\n <Link\n href={`/backend/workflows/instances/${event.workflowInstance.id}`}\n className=\"text-sm text-primary hover:underline font-mono\"\n >\n {event.workflowInstance.id}\n </Link>\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.status')}\n </dt>\n <dd className=\"mt-1\">\n <span\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${getStatusBadgeClass(\n event.workflowInstance.status\n )}`}\n >\n {event.workflowInstance.status}\n </span>\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.workflowId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.workflowInstance.workflowId}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.version')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {event.workflowInstance.version}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.currentStep')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.workflowInstance.currentStepId}\n </dd>\n </div>\n {event.workflowInstance.correlationKey && (\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.correlationKey')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.workflowInstance.correlationKey}\n </dd>\n </div>\n )}\n {event.workflowInstance.startedAt && (\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.startedAt')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {new Date(event.workflowInstance.startedAt).toLocaleString()}\n </dd>\n </div>\n )}\n {event.workflowInstance.completedAt && (\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.completedAt')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {new Date(event.workflowInstance.completedAt).toLocaleString()}\n </dd>\n </div>\n )}\n </dl>\n </div>\n )}\n\n {/* Event Data */}\n <JsonDisplay\n data={event.eventData}\n title={t('workflows.events.detail.eventData')}\n />\n\n {/* Workflow Context (if available) */}\n {event.workflowInstance?.context && (\n <JsonDisplay\n data={event.workflowInstance.context}\n title={t('workflows.events.detail.workflowContext')}\n />\n )}\n\n {/* Technical Details */}\n <div className=\"rounded-lg border bg-card p-6\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {t('workflows.events.detail.technicalDetails')}\n </h2>\n <dl className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.detail.tenantId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.tenantId}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.detail.organizationId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.organizationId}\n </dd>\n </div>\n </dl>\n </div>\n </div>\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useParams, useRouter } from 'next/navigation'\nimport { useQuery } from '@tanstack/react-query'\nimport { apiFetch } from '@open-mercato/ui/backend/utils/api'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { JsonDisplay } from '@open-mercato/ui/backend/JsonDisplay'\n\ntype WorkflowEvent = {\n id: string\n workflowInstanceId: string\n stepInstanceId: string | null\n eventType: string\n eventData: any\n occurredAt: string\n userId: string | null\n tenantId: string\n organizationId: string\n workflowInstance: {\n id: string\n workflowId: string\n version: number\n status: string\n currentStepId: string\n correlationKey: string | null\n startedAt: string | null\n completedAt: string | null\n context: any\n } | null\n}\n\nexport default function WorkflowEventDetailPage() {\n const router = useRouter()\n const params = useParams()\n const t = useT()\n\n // Handle both {id: '17'} and {slug: ['events', '17']} formats\n let eventId: string | undefined\n if (params?.id) {\n eventId = Array.isArray(params.id) ? params.id[0] : params.id\n } else if (params?.slug && Array.isArray(params.slug)) {\n // If slug is ['events', '17'], extract '17'\n eventId = params.slug[params.slug.length - 1]\n }\n\n const { data: event, isLoading, error } = useQuery({\n queryKey: ['workflows', 'events', eventId],\n queryFn: async () => {\n const response = await apiFetch(`/api/workflows/events/${eventId}`)\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(t('workflows.events.messages.loadFailed'))\n }\n const result = await response.json()\n return result as WorkflowEvent\n },\n enabled: !!eventId,\n })\n\n if (isLoading) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <Spinner className=\"h-6 w-6\" />\n <span>{t('workflows.common.loading')}</span>\n </div>\n </PageBody>\n </Page>\n )\n }\n\n if (error || !event) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex h-[50vh] flex-col items-center justify-center gap-2 text-muted-foreground\">\n <p>{error ? t('workflows.events.messages.loadFailed') : t('workflows.events.notFound')}</p>\n <Button asChild variant=\"outline\">\n <Link href=\"/backend/events\">\n {t('workflows.events.backToList')}\n </Link>\n </Button>\n </div>\n </PageBody>\n </Page>\n )\n }\n\n const getEventTypeBadgeClass = (eventType: string) => {\n if (eventType.includes('STARTED')) return 'bg-blue-100 text-blue-800'\n if (eventType.includes('COMPLETED')) return 'bg-green-100 text-green-800'\n if (eventType.includes('FAILED') || eventType.includes('REJECTED')) return 'bg-red-100 text-red-800'\n if (eventType.includes('CANCELLED')) return 'bg-muted text-foreground dark:bg-muted dark:text-foreground'\n if (eventType.includes('ENTERED') || eventType.includes('EXITED')) return 'bg-purple-100 text-purple-800'\n return 'bg-muted text-foreground dark:bg-muted dark:text-foreground'\n }\n\n const getStatusBadgeClass = (status: string) => {\n switch (status) {\n case 'COMPLETED':\n return 'bg-green-100 text-green-800'\n case 'RUNNING':\n return 'bg-blue-100 text-blue-800'\n case 'FAILED':\n return 'bg-red-100 text-red-800'\n case 'CANCELLED':\n return 'bg-muted text-foreground dark:bg-muted dark:text-foreground'\n default:\n return 'bg-muted text-foreground dark:bg-muted dark:text-foreground'\n }\n }\n\n return (\n <Page>\n <PageBody>\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Link\n href=\"/backend/events\"\n className=\"inline-flex items-center text-sm text-muted-foreground hover:text-foreground\"\n >\n <span aria-hidden className=\"mr-1 text-base\">\u2190</span>\n <span className=\"sr-only\">{t('workflows.events.backToList', 'Back to events')}</span>\n </Link>\n <div className=\"space-y-1\">\n <p className=\"text-xs uppercase text-muted-foreground\">\n {t('workflows.events.detail.type', 'Workflow event')}\n </p>\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-2xl font-bold text-foreground\">{event.eventType}</h1>\n <span className=\"font-mono text-sm text-muted-foreground\">#{event.id.slice(0, 8)}</span>\n </div>\n </div>\n </div>\n <span\n className={`inline-flex items-center px-3 py-1 rounded text-sm font-medium ${getEventTypeBadgeClass(\n event.eventType\n )}`}\n >\n {event.eventType}\n </span>\n </div>\n\n {/* Event Summary */}\n <div className=\"rounded-lg border bg-card p-6\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {t('workflows.events.detail.summary')}\n </h2>\n <dl className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.fields.occurredAt')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {new Date(event.occurredAt).toLocaleString()}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.fields.eventType')}\n </dt>\n <dd className=\"mt-1\">\n <span\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${getEventTypeBadgeClass(\n event.eventType\n )}`}\n >\n {event.eventType}\n </span>\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.fields.userId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.userId || t('common.none')}\n </dd>\n </div>\n {event.stepInstanceId && (\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.detail.stepInstanceId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.stepInstanceId}\n </dd>\n </div>\n )}\n </dl>\n </div>\n\n {/* Workflow Instance Information */}\n {event.workflowInstance && (\n <div className=\"rounded-lg border bg-card p-6\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {t('workflows.events.detail.workflowInstance')}\n </h2>\n <dl className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.instanceId')}\n </dt>\n <dd className=\"mt-1\">\n <Link\n href={`/backend/instances/${event.workflowInstance.id}`}\n className=\"text-sm text-primary hover:underline font-mono\"\n >\n {event.workflowInstance.id}\n </Link>\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.status')}\n </dt>\n <dd className=\"mt-1\">\n <span\n className={`inline-flex items-center px-2 py-1 rounded text-xs font-medium ${getStatusBadgeClass(\n event.workflowInstance.status\n )}`}\n >\n {event.workflowInstance.status}\n </span>\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.workflowId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.workflowInstance.workflowId}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.version')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {event.workflowInstance.version}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.currentStep')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.workflowInstance.currentStepId}\n </dd>\n </div>\n {event.workflowInstance.correlationKey && (\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.correlationKey')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.workflowInstance.correlationKey}\n </dd>\n </div>\n )}\n {event.workflowInstance.startedAt && (\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.startedAt')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {new Date(event.workflowInstance.startedAt).toLocaleString()}\n </dd>\n </div>\n )}\n {event.workflowInstance.completedAt && (\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.instances.fields.completedAt')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground\">\n {new Date(event.workflowInstance.completedAt).toLocaleString()}\n </dd>\n </div>\n )}\n </dl>\n </div>\n )}\n\n {/* Event Data */}\n <JsonDisplay\n data={event.eventData}\n title={t('workflows.events.detail.eventData')}\n />\n\n {/* Workflow Context (if available) */}\n {event.workflowInstance?.context && (\n <JsonDisplay\n data={event.workflowInstance.context}\n title={t('workflows.events.detail.workflowContext')}\n />\n )}\n\n {/* Technical Details */}\n <div className=\"rounded-lg border bg-card p-6\">\n <h2 className=\"text-lg font-semibold mb-4\">\n {t('workflows.events.detail.technicalDetails')}\n </h2>\n <dl className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.detail.tenantId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.tenantId}\n </dd>\n </div>\n <div>\n <dt className=\"text-sm font-medium text-muted-foreground\">\n {t('workflows.events.detail.organizationId')}\n </dt>\n <dd className=\"mt-1 text-sm text-foreground font-mono\">\n {event.organizationId}\n </dd>\n </div>\n </dl>\n </div>\n </div>\n </PageBody>\n </Page>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AAqEU,SACE,KADF;AAlEV,OAAO,UAAU;AACjB,SAAS,WAAW,iBAAiB;AACrC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,MAAM,gBAAgB;AAC/B,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAyBb,SAAR,0BAA2C;AAChD,QAAM,SAAS,UAAU;AACzB,QAAM,SAAS,UAAU;AACzB,QAAM,IAAI,KAAK;AAGf,MAAI;AACJ,MAAI,QAAQ,IAAI;AACd,cAAU,MAAM,QAAQ,OAAO,EAAE,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO;AAAA,EAC7D,WAAW,QAAQ,QAAQ,MAAM,QAAQ,OAAO,IAAI,GAAG;AAErD,cAAU,OAAO,KAAK,OAAO,KAAK,SAAS,CAAC;AAAA,EAC9C;AAEA,QAAM,EAAE,MAAM,OAAO,WAAW,MAAM,IAAI,SAAS;AAAA,IACjD,UAAU,CAAC,aAAa,UAAU,OAAO;AAAA,IACzC,SAAS,YAAY;AACnB,YAAM,WAAW,MAAM,SAAS,yBAAyB,OAAO,EAAE;AAElE,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACxD,cAAM,IAAI,MAAM,EAAE,sCAAsC,CAAC;AAAA,MAC3D;AACA,YAAM,SAAS,MAAM,SAAS,KAAK;AACnC,aAAO;AAAA,IACT;AAAA,IACA,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AAED,MAAI,WAAW;AACb,WACE,oBAAC,QACC,8BAAC,YACC,+BAAC,SAAI,WAAU,kFACb;AAAA,0BAAC,WAAQ,WAAU,WAAU;AAAA,MAC7B,oBAAC,UAAM,YAAE,0BAA0B,GAAE;AAAA,OACvC,GACF,GACF;AAAA,EAEJ;AAEA,MAAI,SAAS,CAAC,OAAO;AACnB,WACE,oBAAC,QACC,8BAAC,YACC,+BAAC,SAAI,WAAU,kFACb;AAAA,0BAAC,OAAG,kBAAQ,EAAE,sCAAsC,IAAI,EAAE,2BAA2B,GAAE;AAAA,MACvF,oBAAC,UAAO,SAAO,MAAC,SAAQ,WACtB,8BAAC,QAAK,MAAK,mBACR,YAAE,6BAA6B,GAClC,GACF;AAAA,OACF,GACF,GACF;AAAA,EAEJ;AAEA,QAAM,yBAAyB,CAAC,cAAsB;AACpD,QAAI,UAAU,SAAS,SAAS,EAAG,QAAO;AAC1C,QAAI,UAAU,SAAS,WAAW,EAAG,QAAO;AAC5C,QAAI,UAAU,SAAS,QAAQ,KAAK,UAAU,SAAS,UAAU,EAAG,QAAO;AAC3E,QAAI,UAAU,SAAS,WAAW,EAAG,QAAO;AAC5C,QAAI,UAAU,SAAS,SAAS,KAAK,UAAU,SAAS,QAAQ,EAAG,QAAO;AAC1E,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,CAAC,WAAmB;AAC9C,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,SACE,oBAAC,QACC,8BAAC,YACC,+BAAC,SAAI,WAAU,aAEb;AAAA,yBAAC,SAAI,WAAU,sEACb;AAAA,2BAAC,SAAI,WAAU,qCACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YAEV;AAAA,kCAAC,UAAK,eAAW,MAAC,WAAU,kBAAiB,oBAAC;AAAA,cAC9C,oBAAC,UAAK,WAAU,WAAW,YAAE,+BAA+B,gBAAgB,GAAE;AAAA;AAAA;AAAA,QAChF;AAAA,QACA,qBAAC,SAAI,WAAU,aACb;AAAA,8BAAC,OAAE,WAAU,2CACV,YAAE,gCAAgC,gBAAgB,GACrD;AAAA,UACA,qBAAC,SAAI,WAAU,qCACb;AAAA,gCAAC,QAAG,WAAU,sCAAsC,gBAAM,WAAU;AAAA,YACpE,qBAAC,UAAK,WAAU,2CAA0C;AAAA;AAAA,cAAE,MAAM,GAAG,MAAM,GAAG,CAAC;AAAA,eAAE;AAAA,aACnF;AAAA,WACF;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,kEAAkE;AAAA,YAC3E,MAAM;AAAA,UACR,CAAC;AAAA,UAEA,gBAAM;AAAA;AAAA,MACT;AAAA,OACF;AAAA,IAGA,qBAAC,SAAI,WAAU,iCACb;AAAA,0BAAC,QAAG,WAAU,8BACX,YAAE,iCAAiC,GACtC;AAAA,MACA,qBAAC,QAAG,WAAU,yCACZ;AAAA,6BAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,oCAAoC,GACzC;AAAA,UACA,oBAAC,QAAG,WAAU,gCACX,cAAI,KAAK,MAAM,UAAU,EAAE,eAAe,GAC7C;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,mCAAmC,GACxC;AAAA,UACA,oBAAC,QAAG,WAAU,QACZ;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,kEAAkE;AAAA,gBAC3E,MAAM;AAAA,cACR,CAAC;AAAA,cAEA,gBAAM;AAAA;AAAA,UACT,GACF;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,gCAAgC,GACrC;AAAA,UACA,oBAAC,QAAG,WAAU,0CACX,gBAAM,UAAU,EAAE,aAAa,GAClC;AAAA,WACF;AAAA,QACC,MAAM,kBACL,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,wCAAwC,GAC7C;AAAA,UACA,oBAAC,QAAG,WAAU,0CACX,gBAAM,gBACT;AAAA,WACF;AAAA,SAEJ;AAAA,OACF;AAAA,IAGC,MAAM,oBACL,qBAAC,SAAI,WAAU,iCACb;AAAA,0BAAC,QAAG,WAAU,8BACX,YAAE,0CAA0C,GAC/C;AAAA,MACA,qBAAC,QAAG,WAAU,yCACZ;AAAA,6BAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,uCAAuC,GAC5C;AAAA,UACA,oBAAC,QAAG,WAAU,QACZ;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,sBAAsB,MAAM,iBAAiB,EAAE;AAAA,cACrD,WAAU;AAAA,cAET,gBAAM,iBAAiB;AAAA;AAAA,UAC1B,GACF;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,mCAAmC,GACxC;AAAA,UACA,oBAAC,QAAG,WAAU,QACZ;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,kEAAkE;AAAA,gBAC3E,MAAM,iBAAiB;AAAA,cACzB,CAAC;AAAA,cAEA,gBAAM,iBAAiB;AAAA;AAAA,UAC1B,GACF;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,uCAAuC,GAC5C;AAAA,UACA,oBAAC,QAAG,WAAU,0CACX,gBAAM,iBAAiB,YAC1B;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,oCAAoC,GACzC;AAAA,UACA,oBAAC,QAAG,WAAU,gCACX,gBAAM,iBAAiB,SAC1B;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,wCAAwC,GAC7C;AAAA,UACA,oBAAC,QAAG,WAAU,0CACX,gBAAM,iBAAiB,eAC1B;AAAA,WACF;AAAA,QACC,MAAM,iBAAiB,kBACtB,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,2CAA2C,GAChD;AAAA,UACA,oBAAC,QAAG,WAAU,0CACX,gBAAM,iBAAiB,gBAC1B;AAAA,WACF;AAAA,QAED,MAAM,iBAAiB,aACtB,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,sCAAsC,GAC3C;AAAA,UACA,oBAAC,QAAG,WAAU,gCACX,cAAI,KAAK,MAAM,iBAAiB,SAAS,EAAE,eAAe,GAC7D;AAAA,WACF;AAAA,QAED,MAAM,iBAAiB,eACtB,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,wCAAwC,GAC7C;AAAA,UACA,oBAAC,QAAG,WAAU,gCACX,cAAI,KAAK,MAAM,iBAAiB,WAAW,EAAE,eAAe,GAC/D;AAAA,WACF;AAAA,SAEJ;AAAA,OACF;AAAA,IAIF;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM;AAAA,QACZ,OAAO,EAAE,mCAAmC;AAAA;AAAA,IAC9C;AAAA,IAGC,MAAM,kBAAkB,WACvB;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM,iBAAiB;AAAA,QAC7B,OAAO,EAAE,yCAAyC;AAAA;AAAA,IACpD;AAAA,IAIF,qBAAC,SAAI,WAAU,iCACb;AAAA,0BAAC,QAAG,WAAU,8BACX,YAAE,0CAA0C,GAC/C;AAAA,MACA,qBAAC,QAAG,WAAU,yCACZ;AAAA,6BAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,kCAAkC,GACvC;AAAA,UACA,oBAAC,QAAG,WAAU,0CACX,gBAAM,UACT;AAAA,WACF;AAAA,QACA,qBAAC,SACC;AAAA,8BAAC,QAAG,WAAU,6CACX,YAAE,wCAAwC,GAC7C;AAAA,UACA,oBAAC,QAAG,WAAU,0CACX,gBAAM,gBACT;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF,GACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,8 +4,8 @@ const metadata = {
|
|
|
4
4
|
pageTitle: "Event Details",
|
|
5
5
|
pageTitleKey: "workflows.events.detail.title",
|
|
6
6
|
breadcrumb: [
|
|
7
|
-
{ label: "Workflows", labelKey: "workflows.module.name", href: "/backend/
|
|
8
|
-
{ label: "Events", labelKey: "workflows.events.plural", href: "/backend/
|
|
7
|
+
{ label: "Workflows", labelKey: "workflows.module.name", href: "/backend/definitions" },
|
|
8
|
+
{ label: "Events", labelKey: "workflows.events.plural", href: "/backend/events" },
|
|
9
9
|
{ label: "Details", labelKey: "common.details" }
|
|
10
10
|
]
|
|
11
11
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/workflows/backend/events/%5Bid%5D/page.meta.ts"],
|
|
4
|
-
"sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.view_logs'],\n pageTitle: 'Event Details',\n pageTitleKey: 'workflows.events.detail.title',\n breadcrumb: [\n { label: 'Workflows', labelKey: 'workflows.module.name', href: '/backend/
|
|
5
|
-
"mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,qBAAqB;AAAA,EACvC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,IACV,EAAE,OAAO,aAAa,UAAU,yBAAyB,MAAM,
|
|
4
|
+
"sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.view_logs'],\n pageTitle: 'Event Details',\n pageTitleKey: 'workflows.events.detail.title',\n breadcrumb: [\n { label: 'Workflows', labelKey: 'workflows.module.name', href: '/backend/definitions' },\n { label: 'Events', labelKey: 'workflows.events.plural', href: '/backend/events' },\n { label: 'Details', labelKey: 'common.details' },\n ],\n}\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,qBAAqB;AAAA,EACvC,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,IACV,EAAE,OAAO,aAAa,UAAU,yBAAyB,MAAM,uBAAuB;AAAA,IACtF,EAAE,OAAO,UAAU,UAAU,2BAA2B,MAAM,kBAAkB;AAAA,IAChF,EAAE,OAAO,WAAW,UAAU,iBAAiB;AAAA,EACjD;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,8 +4,8 @@ const metadata = {
|
|
|
4
4
|
pageTitle: "Workflow Instance Details",
|
|
5
5
|
pageTitleKey: "workflows.instances.singular",
|
|
6
6
|
breadcrumb: [
|
|
7
|
-
{ label: "Workflows", labelKey: "workflows.module.name", href: "/backend/
|
|
8
|
-
{ label: "Instances", labelKey: "workflows.instances.plural", href: "/backend/
|
|
7
|
+
{ label: "Workflows", labelKey: "workflows.module.name", href: "/backend/definitions" },
|
|
8
|
+
{ label: "Instances", labelKey: "workflows.instances.plural", href: "/backend/instances" },
|
|
9
9
|
{ label: "Details", labelKey: "common.details" }
|
|
10
10
|
]
|
|
11
11
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/modules/workflows/backend/instances/%5Bid%5D/page.meta.ts"],
|
|
4
|
-
"sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.view_instances'],\n pageTitle: 'Workflow Instance Details',\n pageTitleKey: 'workflows.instances.singular',\n breadcrumb: [\n { label: 'Workflows', labelKey: 'workflows.module.name', href: '/backend/
|
|
5
|
-
"mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,0BAA0B;AAAA,EAC5C,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,IACV,EAAE,OAAO,aAAa,UAAU,yBAAyB,MAAM,
|
|
4
|
+
"sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['workflows.view_instances'],\n pageTitle: 'Workflow Instance Details',\n pageTitleKey: 'workflows.instances.singular',\n breadcrumb: [\n { label: 'Workflows', labelKey: 'workflows.module.name', href: '/backend/definitions' },\n { label: 'Instances', labelKey: 'workflows.instances.plural', href: '/backend/instances' },\n { label: 'Details', labelKey: 'common.details' },\n ],\n}\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,0BAA0B;AAAA,EAC5C,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,IACV,EAAE,OAAO,aAAa,UAAU,yBAAyB,MAAM,uBAAuB;AAAA,IACtF,EAAE,OAAO,aAAa,UAAU,8BAA8B,MAAM,qBAAqB;AAAA,IACzF,EAAE,OAAO,WAAW,UAAU,iBAAiB;AAAA,EACjD;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -300,7 +300,7 @@ function UserTaskDetailPage({ params }) {
|
|
|
300
300
|
className: `inline-flex items-center px-3 py-1 rounded text-sm font-medium ${getStatusBadgeClass(
|
|
301
301
|
task.status
|
|
302
302
|
)}`,
|
|
303
|
-
children: t(`workflows.tasks.
|
|
303
|
+
children: t(`workflows.tasks.statuses.${task.status}`)
|
|
304
304
|
}
|
|
305
305
|
)
|
|
306
306
|
] }),
|