@xtr-dev/payload-automation 0.0.38 → 0.0.40

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.
Files changed (64) hide show
  1. package/README.md +43 -10
  2. package/dist/collections/Workflow.js +2 -4
  3. package/dist/collections/Workflow.js.map +1 -1
  4. package/dist/components/WorkflowBuilder/StepConfigurationForm.js +316 -0
  5. package/dist/components/WorkflowBuilder/StepConfigurationForm.js.map +1 -0
  6. package/dist/components/WorkflowBuilder/WorkflowBuilder.js +211 -0
  7. package/dist/components/WorkflowBuilder/WorkflowBuilder.js.map +1 -0
  8. package/dist/components/WorkflowBuilder/WorkflowToolbar.js +107 -0
  9. package/dist/components/WorkflowBuilder/WorkflowToolbar.js.map +1 -0
  10. package/dist/components/WorkflowBuilder/index.js +6 -0
  11. package/dist/components/WorkflowBuilder/index.js.map +1 -0
  12. package/dist/components/WorkflowBuilder/nodes/StepNode.js +139 -0
  13. package/dist/components/WorkflowBuilder/nodes/StepNode.js.map +1 -0
  14. package/dist/core/workflow-executor.js +150 -116
  15. package/dist/core/workflow-executor.js.map +1 -1
  16. package/dist/fields/WorkflowBuilderField.js +119 -0
  17. package/dist/fields/WorkflowBuilderField.js.map +1 -0
  18. package/dist/plugin/collection-hook.js +34 -0
  19. package/dist/plugin/collection-hook.js.map +1 -1
  20. package/package.json +4 -3
  21. package/dist/collections/Workflow.d.ts +0 -3
  22. package/dist/collections/WorkflowRuns.d.ts +0 -2
  23. package/dist/components/ErrorDisplay.d.ts +0 -9
  24. package/dist/components/StatusCell.d.ts +0 -6
  25. package/dist/core/trigger-custom-workflow.d.ts +0 -52
  26. package/dist/core/workflow-executor.d.ts +0 -90
  27. package/dist/exports/client.d.ts +0 -2
  28. package/dist/exports/fields.d.ts +0 -1
  29. package/dist/exports/rsc.d.ts +0 -1
  30. package/dist/exports/server.d.ts +0 -5
  31. package/dist/exports/views.d.ts +0 -1
  32. package/dist/fields/parameter.d.ts +0 -4
  33. package/dist/index.d.ts +0 -2
  34. package/dist/plugin/collection-hook.d.ts +0 -1
  35. package/dist/plugin/config-types.d.ts +0 -18
  36. package/dist/plugin/global-hook.d.ts +0 -1
  37. package/dist/plugin/index.d.ts +0 -4
  38. package/dist/plugin/logger.d.ts +0 -20
  39. package/dist/steps/create-document-handler.d.ts +0 -2
  40. package/dist/steps/create-document.d.ts +0 -46
  41. package/dist/steps/delete-document-handler.d.ts +0 -2
  42. package/dist/steps/delete-document.d.ts +0 -39
  43. package/dist/steps/http-request-handler.d.ts +0 -2
  44. package/dist/steps/http-request.d.ts +0 -155
  45. package/dist/steps/index.d.ts +0 -12
  46. package/dist/steps/read-document-handler.d.ts +0 -2
  47. package/dist/steps/read-document.d.ts +0 -46
  48. package/dist/steps/send-email-handler.d.ts +0 -2
  49. package/dist/steps/send-email.d.ts +0 -44
  50. package/dist/steps/update-document-handler.d.ts +0 -2
  51. package/dist/steps/update-document.d.ts +0 -46
  52. package/dist/test/basic.test.js +0 -14
  53. package/dist/test/basic.test.js.map +0 -1
  54. package/dist/test/create-document-step.test.js +0 -378
  55. package/dist/test/create-document-step.test.js.map +0 -1
  56. package/dist/test/http-request-step.test.js +0 -361
  57. package/dist/test/http-request-step.test.js.map +0 -1
  58. package/dist/test/workflow-executor.test.js +0 -530
  59. package/dist/test/workflow-executor.test.js.map +0 -1
  60. package/dist/triggers/collection-trigger.d.ts +0 -2
  61. package/dist/triggers/global-trigger.d.ts +0 -2
  62. package/dist/triggers/index.d.ts +0 -2
  63. package/dist/triggers/types.d.ts +0 -5
  64. package/dist/types/index.d.ts +0 -31
@@ -0,0 +1,211 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { useCallback, useMemo, useState } from 'react';
4
+ import { ReactFlow, addEdge, useNodesState, useEdgesState, Controls, Background, BackgroundVariant, MiniMap, Panel } from '@xyflow/react';
5
+ import '@xyflow/react/dist/style.css';
6
+ // Import custom node types
7
+ import { StepNode } from './nodes/StepNode.js';
8
+ import { WorkflowToolbar } from './WorkflowToolbar.js';
9
+ import { StepConfigurationForm } from './StepConfigurationForm.js';
10
+ // Define node types for React Flow
11
+ const nodeTypes = {
12
+ stepNode: StepNode
13
+ };
14
+ export const WorkflowBuilder = ({ workflow, availableStepTypes = [], onSave, readonly = false })=>{
15
+ const [selectedNode, setSelectedNode] = useState(null);
16
+ // Convert workflow steps to React Flow nodes
17
+ const initialNodes = useMemo(()=>{
18
+ if (!workflow?.steps) return [];
19
+ return workflow.steps.map((step, index)=>({
20
+ id: step.name || `step-${index}`,
21
+ type: 'stepNode',
22
+ position: step.position || {
23
+ x: 100 + index * 200,
24
+ y: 100
25
+ },
26
+ data: {
27
+ label: step.name || 'Unnamed Step',
28
+ stepType: step.type,
29
+ color: step.visual?.color || '#3b82f6',
30
+ icon: step.visual?.icon,
31
+ dependencies: step.dependencies || []
32
+ }
33
+ }));
34
+ }, [
35
+ workflow?.steps
36
+ ]);
37
+ // Convert dependencies to React Flow edges
38
+ const initialEdges = useMemo(()=>{
39
+ if (!workflow?.steps) return [];
40
+ const edges = [];
41
+ workflow.steps.forEach((step, index)=>{
42
+ const targetId = step.name || `step-${index}`;
43
+ if (step.dependencies) {
44
+ step.dependencies.forEach((depName)=>{
45
+ // Find the source step
46
+ const sourceStep = workflow.steps?.find((s)=>s.name === depName);
47
+ if (sourceStep) {
48
+ const sourceId = sourceStep.name || `step-${workflow.steps?.indexOf(sourceStep)}`;
49
+ edges.push({
50
+ id: `${sourceId}-${targetId}`,
51
+ source: sourceId,
52
+ target: targetId,
53
+ type: 'smoothstep'
54
+ });
55
+ }
56
+ });
57
+ }
58
+ });
59
+ return edges;
60
+ }, [
61
+ workflow?.steps
62
+ ]);
63
+ const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
64
+ const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
65
+ // Handle new connections
66
+ const onConnect = useCallback((params)=>{
67
+ if (readonly) return;
68
+ setEdges((eds)=>addEdge({
69
+ ...params,
70
+ type: 'smoothstep'
71
+ }, eds));
72
+ }, [
73
+ setEdges,
74
+ readonly
75
+ ]);
76
+ // Handle node selection
77
+ const onNodeClick = useCallback((_event, node)=>{
78
+ console.log('Node clicked:', node.id, node.data.label);
79
+ setSelectedNode(node);
80
+ }, []);
81
+ // Handle adding new step
82
+ const onAddStep = useCallback((stepType)=>{
83
+ if (readonly) return;
84
+ const newStep = {
85
+ id: `step-${Date.now()}`,
86
+ type: 'stepNode',
87
+ position: {
88
+ x: 100,
89
+ y: 100
90
+ },
91
+ data: {
92
+ label: 'New Step',
93
+ stepType,
94
+ color: '#3b82f6',
95
+ dependencies: []
96
+ }
97
+ };
98
+ setNodes((nds)=>[
99
+ ...nds,
100
+ newStep
101
+ ]);
102
+ }, [
103
+ setNodes,
104
+ readonly
105
+ ]);
106
+ // Handle updating a node's data
107
+ const handleNodeUpdate = useCallback((nodeId, newData)=>{
108
+ setNodes((nds)=>nds.map((node)=>node.id === nodeId ? {
109
+ ...node,
110
+ data: {
111
+ ...node.data,
112
+ ...newData
113
+ }
114
+ } : node));
115
+ }, [
116
+ setNodes
117
+ ]);
118
+ // Handle saving workflow
119
+ const handleSave = useCallback(()=>{
120
+ if (!workflow || !onSave) return;
121
+ // Convert nodes and edges back to workflow format
122
+ const updatedSteps = nodes.map((node)=>{
123
+ // Find dependencies from edges
124
+ const dependencies = edges.filter((edge)=>edge.target === node.id).map((edge)=>edge.source);
125
+ return {
126
+ name: node.id,
127
+ type: node.data.stepType,
128
+ position: node.position,
129
+ visual: {
130
+ color: node.data.color,
131
+ icon: node.data.icon
132
+ },
133
+ dependencies: dependencies.length > 0 ? dependencies : undefined
134
+ };
135
+ });
136
+ const updatedWorkflow = {
137
+ ...workflow,
138
+ steps: updatedSteps
139
+ };
140
+ onSave(updatedWorkflow);
141
+ }, [
142
+ workflow,
143
+ nodes,
144
+ edges,
145
+ onSave
146
+ ]);
147
+ return /*#__PURE__*/ _jsxs("div", {
148
+ style: {
149
+ width: '100%',
150
+ height: '600px',
151
+ display: 'flex',
152
+ background: 'var(--theme-bg)',
153
+ borderRadius: '4px',
154
+ border: '1px solid var(--theme-elevation-100)'
155
+ },
156
+ children: [
157
+ /*#__PURE__*/ _jsx("div", {
158
+ style: {
159
+ flex: selectedNode ? '1 1 70%' : '1 1 100%',
160
+ transition: 'flex 0.3s ease'
161
+ },
162
+ children: /*#__PURE__*/ _jsxs(ReactFlow, {
163
+ nodes: nodes,
164
+ edges: edges,
165
+ onNodesChange: onNodesChange,
166
+ onEdgesChange: onEdgesChange,
167
+ onConnect: onConnect,
168
+ onNodeClick: onNodeClick,
169
+ nodeTypes: nodeTypes,
170
+ fitView: true,
171
+ attributionPosition: "top-right",
172
+ children: [
173
+ /*#__PURE__*/ _jsx(Controls, {}),
174
+ /*#__PURE__*/ _jsx(MiniMap, {}),
175
+ /*#__PURE__*/ _jsx(Background, {
176
+ variant: BackgroundVariant.Dots,
177
+ gap: 12,
178
+ size: 1
179
+ }),
180
+ !readonly && /*#__PURE__*/ _jsx(Panel, {
181
+ position: "top-left",
182
+ children: /*#__PURE__*/ _jsx(WorkflowToolbar, {
183
+ availableStepTypes: availableStepTypes,
184
+ onAddStep: onAddStep,
185
+ onSave: handleSave
186
+ })
187
+ })
188
+ ]
189
+ })
190
+ }),
191
+ selectedNode && !readonly && /*#__PURE__*/ _jsx("div", {
192
+ style: {
193
+ flex: '0 0 30%',
194
+ borderLeft: '1px solid var(--theme-elevation-100)',
195
+ background: 'var(--theme-elevation-0)',
196
+ display: 'flex',
197
+ flexDirection: 'column'
198
+ },
199
+ children: /*#__PURE__*/ _jsx(StepConfigurationForm, {
200
+ selectedNode: selectedNode,
201
+ availableStepTypes: availableStepTypes,
202
+ availableSteps: nodes.map((node)=>node.id),
203
+ onNodeUpdate: handleNodeUpdate,
204
+ onClose: ()=>setSelectedNode(null)
205
+ })
206
+ })
207
+ ]
208
+ });
209
+ };
210
+
211
+ //# sourceMappingURL=WorkflowBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/WorkflowBuilder/WorkflowBuilder.tsx"],"sourcesContent":["'use client'\n\nimport React, { useCallback, useMemo, useState } from 'react'\nimport { \n ReactFlow,\n Node,\n Edge,\n addEdge,\n Connection,\n useNodesState,\n useEdgesState,\n Controls,\n Background,\n BackgroundVariant,\n MiniMap,\n Panel\n} from '@xyflow/react'\nimport '@xyflow/react/dist/style.css'\n\n// Import custom node types\nimport { StepNode } from './nodes/StepNode.js'\nimport { WorkflowToolbar } from './WorkflowToolbar.js'\nimport { StepConfigurationForm } from './StepConfigurationForm.js'\n\n// Define node types for React Flow\nconst nodeTypes = {\n stepNode: StepNode,\n}\n\ninterface WorkflowData {\n id: string\n name: string\n steps?: Array<{\n name: string\n type: string\n position?: { x: number; y: number }\n visual?: { color?: string; icon?: string }\n dependencies?: string[]\n }>\n layout?: {\n viewport?: { x: number; y: number; zoom: number }\n }\n}\n\ninterface StepType {\n slug: string\n label?: string\n inputSchema?: any[]\n outputSchema?: any[]\n}\n\ninterface WorkflowBuilderProps {\n workflow?: WorkflowData\n availableStepTypes?: StepType[]\n onSave?: (workflow: WorkflowData) => void\n readonly?: boolean\n}\n\nexport const WorkflowBuilder: React.FC<WorkflowBuilderProps> = ({\n workflow,\n availableStepTypes = [],\n onSave,\n readonly = false\n}) => {\n const [selectedNode, setSelectedNode] = useState<Node | null>(null)\n\n // Convert workflow steps to React Flow nodes\n const initialNodes: Node[] = useMemo(() => {\n if (!workflow?.steps) return []\n\n return workflow.steps.map((step, index) => ({\n id: step.name || `step-${index}`,\n type: 'stepNode',\n position: step.position || { x: 100 + index * 200, y: 100 },\n data: {\n label: step.name || 'Unnamed Step',\n stepType: step.type,\n color: step.visual?.color || '#3b82f6',\n icon: step.visual?.icon,\n dependencies: step.dependencies || []\n }\n }))\n }, [workflow?.steps])\n\n // Convert dependencies to React Flow edges\n const initialEdges: Edge[] = useMemo(() => {\n if (!workflow?.steps) return []\n\n const edges: Edge[] = []\n \n workflow.steps.forEach((step, index) => {\n const targetId = step.name || `step-${index}`\n \n if (step.dependencies) {\n step.dependencies.forEach((depName) => {\n // Find the source step\n const sourceStep = workflow.steps?.find(s => s.name === depName)\n if (sourceStep) {\n const sourceId = sourceStep.name || `step-${workflow.steps?.indexOf(sourceStep)}`\n edges.push({\n id: `${sourceId}-${targetId}`,\n source: sourceId,\n target: targetId,\n type: 'smoothstep'\n })\n }\n })\n }\n })\n\n return edges\n }, [workflow?.steps])\n\n const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes)\n const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges)\n\n // Handle new connections\n const onConnect = useCallback((params: Connection) => {\n if (readonly) return\n \n setEdges((eds) => addEdge({\n ...params,\n type: 'smoothstep'\n }, eds))\n }, [setEdges, readonly])\n\n // Handle node selection\n const onNodeClick = useCallback((_event: React.MouseEvent, node: Node) => {\n console.log('Node clicked:', node.id, node.data.label)\n setSelectedNode(node)\n }, [])\n\n // Handle adding new step\n const onAddStep = useCallback((stepType: string) => {\n if (readonly) return\n\n const newStep: Node = {\n id: `step-${Date.now()}`,\n type: 'stepNode',\n position: { x: 100, y: 100 },\n data: {\n label: 'New Step',\n stepType,\n color: '#3b82f6',\n dependencies: []\n }\n }\n\n setNodes((nds) => [...nds, newStep])\n }, [setNodes, readonly])\n\n // Handle updating a node's data\n const handleNodeUpdate = useCallback((nodeId: string, newData: Partial<Node['data']>) => {\n setNodes((nds) => \n nds.map((node) => \n node.id === nodeId \n ? { ...node, data: { ...node.data, ...newData } }\n : node\n )\n )\n }, [setNodes])\n\n // Handle saving workflow\n const handleSave = useCallback(() => {\n if (!workflow || !onSave) return\n\n // Convert nodes and edges back to workflow format\n const updatedSteps = nodes.map((node) => {\n // Find dependencies from edges\n const dependencies = edges\n .filter(edge => edge.target === node.id)\n .map(edge => edge.source)\n\n return {\n name: node.id,\n type: node.data.stepType as string,\n position: node.position,\n visual: {\n color: node.data.color as string,\n icon: node.data.icon as string\n },\n dependencies: dependencies.length > 0 ? dependencies : undefined\n }\n })\n\n const updatedWorkflow: WorkflowData = {\n ...workflow,\n steps: updatedSteps\n }\n\n onSave(updatedWorkflow)\n }, [workflow, nodes, edges, onSave])\n\n return (\n <div style={{ \n width: '100%', \n height: '600px',\n display: 'flex',\n background: 'var(--theme-bg)',\n borderRadius: '4px',\n border: '1px solid var(--theme-elevation-100)'\n }}>\n {/* Main canvas area */}\n <div style={{ \n flex: selectedNode ? '1 1 70%' : '1 1 100%',\n transition: 'flex 0.3s ease'\n }}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n onNodeClick={onNodeClick}\n nodeTypes={nodeTypes}\n fitView\n attributionPosition=\"top-right\"\n >\n <Controls />\n <MiniMap />\n <Background variant={BackgroundVariant.Dots} gap={12} size={1} />\n \n {!readonly && (\n <Panel position=\"top-left\">\n <WorkflowToolbar \n availableStepTypes={availableStepTypes}\n onAddStep={onAddStep}\n onSave={handleSave}\n />\n </Panel>\n )}\n </ReactFlow>\n </div>\n\n {/* Side panel for step configuration */}\n {selectedNode && !readonly && (\n <div style={{\n flex: '0 0 30%',\n borderLeft: '1px solid var(--theme-elevation-100)',\n background: 'var(--theme-elevation-0)',\n display: 'flex',\n flexDirection: 'column'\n }}>\n <StepConfigurationForm\n selectedNode={selectedNode}\n availableStepTypes={availableStepTypes}\n availableSteps={nodes.map(node => node.id)}\n onNodeUpdate={handleNodeUpdate}\n onClose={() => setSelectedNode(null)}\n />\n </div>\n )}\n </div>\n )\n}"],"names":["React","useCallback","useMemo","useState","ReactFlow","addEdge","useNodesState","useEdgesState","Controls","Background","BackgroundVariant","MiniMap","Panel","StepNode","WorkflowToolbar","StepConfigurationForm","nodeTypes","stepNode","WorkflowBuilder","workflow","availableStepTypes","onSave","readonly","selectedNode","setSelectedNode","initialNodes","steps","map","step","index","id","name","type","position","x","y","data","label","stepType","color","visual","icon","dependencies","initialEdges","edges","forEach","targetId","depName","sourceStep","find","s","sourceId","indexOf","push","source","target","nodes","setNodes","onNodesChange","setEdges","onEdgesChange","onConnect","params","eds","onNodeClick","_event","node","console","log","onAddStep","newStep","Date","now","nds","handleNodeUpdate","nodeId","newData","handleSave","updatedSteps","filter","edge","length","undefined","updatedWorkflow","div","style","width","height","display","background","borderRadius","border","flex","transition","fitView","attributionPosition","variant","Dots","gap","size","borderLeft","flexDirection","availableSteps","onNodeUpdate","onClose"],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React from 'react';
4
+ export const WorkflowToolbar = ({ availableStepTypes, onAddStep, onSave })=>{
5
+ const getStepTypeLabel = (stepType)=>{
6
+ return stepType.label || stepType.slug.replace(/-/g, ' ').replace(/\b\w/g, (l)=>l.toUpperCase());
7
+ };
8
+ const getStepTypeIcon = (stepType)=>{
9
+ // Simple icon mapping based on step type
10
+ switch(stepType.slug){
11
+ case 'http-request-step':
12
+ return '🌐';
13
+ case 'create-document-step':
14
+ return '📄';
15
+ case 'read-document-step':
16
+ return '👁️';
17
+ case 'update-document-step':
18
+ return '✏️';
19
+ case 'delete-document-step':
20
+ return '🗑️';
21
+ case 'send-email-step':
22
+ return '📧';
23
+ default:
24
+ return '⚡';
25
+ }
26
+ };
27
+ return /*#__PURE__*/ _jsxs("div", {
28
+ style: {
29
+ background: 'var(--theme-elevation-0)',
30
+ padding: '12px',
31
+ borderRadius: '4px',
32
+ border: '1px solid var(--theme-elevation-150)',
33
+ minWidth: '200px'
34
+ },
35
+ children: [
36
+ /*#__PURE__*/ _jsx("h4", {
37
+ style: {
38
+ margin: '0 0 12px 0',
39
+ fontSize: '14px',
40
+ fontWeight: '600',
41
+ color: 'var(--theme-text)'
42
+ },
43
+ children: "Add Step"
44
+ }),
45
+ /*#__PURE__*/ _jsx("div", {
46
+ style: {
47
+ marginBottom: '16px'
48
+ },
49
+ children: availableStepTypes.map((stepType)=>/*#__PURE__*/ _jsxs("button", {
50
+ onClick: ()=>onAddStep(stepType.slug),
51
+ style: {
52
+ display: 'block',
53
+ width: '100%',
54
+ padding: '8px 12px',
55
+ margin: '4px 0',
56
+ background: 'var(--theme-elevation-50)',
57
+ border: '1px solid var(--theme-elevation-100)',
58
+ borderRadius: '4px',
59
+ cursor: 'pointer',
60
+ textAlign: 'left',
61
+ fontSize: '12px',
62
+ color: 'var(--theme-text)',
63
+ transition: 'background-color 0.2s'
64
+ },
65
+ onMouseEnter: (e)=>{
66
+ e.currentTarget.style.backgroundColor = 'var(--theme-elevation-100)';
67
+ },
68
+ onMouseLeave: (e)=>{
69
+ e.currentTarget.style.backgroundColor = 'var(--theme-elevation-50)';
70
+ },
71
+ children: [
72
+ /*#__PURE__*/ _jsx("span", {
73
+ style: {
74
+ marginRight: '8px'
75
+ },
76
+ children: getStepTypeIcon(stepType)
77
+ }),
78
+ getStepTypeLabel(stepType)
79
+ ]
80
+ }, stepType.slug))
81
+ }),
82
+ /*#__PURE__*/ _jsx("div", {
83
+ style: {
84
+ borderTop: '1px solid var(--theme-elevation-100)',
85
+ paddingTop: '12px'
86
+ },
87
+ children: /*#__PURE__*/ _jsx("button", {
88
+ onClick: onSave,
89
+ style: {
90
+ width: '100%',
91
+ padding: '8px 16px',
92
+ background: 'var(--theme-success-500)',
93
+ color: 'var(--theme-base-0)',
94
+ border: 'none',
95
+ borderRadius: '4px',
96
+ cursor: 'pointer',
97
+ fontSize: '12px',
98
+ fontWeight: '500'
99
+ },
100
+ children: "💾 Save Workflow"
101
+ })
102
+ })
103
+ ]
104
+ });
105
+ };
106
+
107
+ //# sourceMappingURL=WorkflowToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/WorkflowBuilder/WorkflowToolbar.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\ninterface AvailableStepType {\n slug: string\n label?: string\n inputSchema?: any[]\n outputSchema?: any[]\n}\n\ninterface WorkflowToolbarProps {\n availableStepTypes: AvailableStepType[]\n onAddStep: (stepType: string) => void\n onSave: () => void\n}\n\nexport const WorkflowToolbar: React.FC<WorkflowToolbarProps> = ({\n availableStepTypes,\n onAddStep,\n onSave\n}) => {\n const getStepTypeLabel = (stepType: AvailableStepType) => {\n return stepType.label || stepType.slug.replace(/-/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n const getStepTypeIcon = (stepType: AvailableStepType) => {\n // Simple icon mapping based on step type\n switch (stepType.slug) {\n case 'http-request-step':\n return '🌐'\n case 'create-document-step':\n return '📄'\n case 'read-document-step':\n return '👁️'\n case 'update-document-step':\n return '✏️'\n case 'delete-document-step':\n return '🗑️'\n case 'send-email-step':\n return '📧'\n default:\n return '⚡'\n }\n }\n\n return (\n <div style={{\n background: 'var(--theme-elevation-0)',\n padding: '12px',\n borderRadius: '4px',\n border: '1px solid var(--theme-elevation-150)',\n minWidth: '200px'\n }}>\n <h4 style={{ \n margin: '0 0 12px 0', \n fontSize: '14px', \n fontWeight: '600',\n color: 'var(--theme-text)'\n }}>\n Add Step\n </h4>\n \n <div style={{ marginBottom: '16px' }}>\n {availableStepTypes.map((stepType) => (\n <button\n key={stepType.slug}\n onClick={() => onAddStep(stepType.slug)}\n style={{\n display: 'block',\n width: '100%',\n padding: '8px 12px',\n margin: '4px 0',\n background: 'var(--theme-elevation-50)',\n border: '1px solid var(--theme-elevation-100)',\n borderRadius: '4px',\n cursor: 'pointer',\n textAlign: 'left',\n fontSize: '12px',\n color: 'var(--theme-text)',\n transition: 'background-color 0.2s'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--theme-elevation-100)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--theme-elevation-50)'\n }}\n >\n <span style={{ marginRight: '8px' }}>\n {getStepTypeIcon(stepType)}\n </span>\n {getStepTypeLabel(stepType)}\n </button>\n ))}\n </div>\n\n <div style={{ borderTop: '1px solid var(--theme-elevation-100)', paddingTop: '12px' }}>\n <button\n onClick={onSave}\n style={{\n width: '100%',\n padding: '8px 16px',\n background: 'var(--theme-success-500)',\n color: 'var(--theme-base-0)',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: '500'\n }}\n >\n 💾 Save Workflow\n </button>\n </div>\n </div>\n )\n}"],"names":["React","WorkflowToolbar","availableStepTypes","onAddStep","onSave","getStepTypeLabel","stepType","label","slug","replace","l","toUpperCase","getStepTypeIcon","div","style","background","padding","borderRadius","border","minWidth","h4","margin","fontSize","fontWeight","color","marginBottom","map","button","onClick","display","width","cursor","textAlign","transition","onMouseEnter","e","currentTarget","backgroundColor","onMouseLeave","span","marginRight","borderTop","paddingTop"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAezB,OAAO,MAAMC,kBAAkD,CAAC,EAC9DC,kBAAkB,EAClBC,SAAS,EACTC,MAAM,EACP;IACC,MAAMC,mBAAmB,CAACC;QACxB,OAAOA,SAASC,KAAK,IAAID,SAASE,IAAI,CAACC,OAAO,CAAC,MAAM,KAAKA,OAAO,CAAC,SAASC,CAAAA,IAAKA,EAAEC,WAAW;IAC/F;IAEA,MAAMC,kBAAkB,CAACN;QACvB,yCAAyC;QACzC,OAAQA,SAASE,IAAI;YACnB,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT;gBACE,OAAO;QACX;IACF;IAEA,qBACE,MAACK;QAAIC,OAAO;YACVC,YAAY;YACZC,SAAS;YACTC,cAAc;YACdC,QAAQ;YACRC,UAAU;QACZ;;0BACE,KAACC;gBAAGN,OAAO;oBACTO,QAAQ;oBACRC,UAAU;oBACVC,YAAY;oBACZC,OAAO;gBACT;0BAAG;;0BAIH,KAACX;gBAAIC,OAAO;oBAAEW,cAAc;gBAAO;0BAChCvB,mBAAmBwB,GAAG,CAAC,CAACpB,yBACvB,MAACqB;wBAECC,SAAS,IAAMzB,UAAUG,SAASE,IAAI;wBACtCM,OAAO;4BACLe,SAAS;4BACTC,OAAO;4BACPd,SAAS;4BACTK,QAAQ;4BACRN,YAAY;4BACZG,QAAQ;4BACRD,cAAc;4BACdc,QAAQ;4BACRC,WAAW;4BACXV,UAAU;4BACVE,OAAO;4BACPS,YAAY;wBACd;wBACAC,cAAc,CAACC;4BACbA,EAAEC,aAAa,CAACtB,KAAK,CAACuB,eAAe,GAAG;wBAC1C;wBACAC,cAAc,CAACH;4BACbA,EAAEC,aAAa,CAACtB,KAAK,CAACuB,eAAe,GAAG;wBAC1C;;0CAEA,KAACE;gCAAKzB,OAAO;oCAAE0B,aAAa;gCAAM;0CAC/B5B,gBAAgBN;;4BAElBD,iBAAiBC;;uBA1BbA,SAASE,IAAI;;0BA+BxB,KAACK;gBAAIC,OAAO;oBAAE2B,WAAW;oBAAwCC,YAAY;gBAAO;0BAClF,cAAA,KAACf;oBACCC,SAASxB;oBACTU,OAAO;wBACLgB,OAAO;wBACPd,SAAS;wBACTD,YAAY;wBACZS,OAAO;wBACPN,QAAQ;wBACRD,cAAc;wBACdc,QAAQ;wBACRT,UAAU;wBACVC,YAAY;oBACd;8BACD;;;;;AAMT,EAAC"}
@@ -0,0 +1,6 @@
1
+ export { WorkflowBuilder } from './WorkflowBuilder.js';
2
+ export { WorkflowToolbar } from './WorkflowToolbar.js';
3
+ export { StepConfigurationForm } from './StepConfigurationForm.js';
4
+ export { StepNode } from './nodes/StepNode.js';
5
+
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/WorkflowBuilder/index.ts"],"sourcesContent":["export { WorkflowBuilder } from './WorkflowBuilder.js'\nexport { WorkflowToolbar } from './WorkflowToolbar.js'\nexport { StepConfigurationForm } from './StepConfigurationForm.js'\nexport { StepNode } from './nodes/StepNode.js'"],"names":["WorkflowBuilder","WorkflowToolbar","StepConfigurationForm","StepNode"],"mappings":"AAAA,SAASA,eAAe,QAAQ,uBAAsB;AACtD,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,qBAAqB,QAAQ,6BAA4B;AAClE,SAASC,QAAQ,QAAQ,sBAAqB"}
@@ -0,0 +1,139 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { memo } from 'react';
4
+ import { Handle, Position } from '@xyflow/react';
5
+ export const StepNode = /*#__PURE__*/ memo(({ data, selected })=>{
6
+ const { label, stepType, color = '#3b82f6', icon, dependencies = [] } = data;
7
+ const getStepTypeIcon = (type)=>{
8
+ // Return icon from data or default based on type
9
+ if (icon) return icon;
10
+ switch(type){
11
+ case 'http-request-step':
12
+ return '🌐';
13
+ case 'create-document-step':
14
+ return '📄';
15
+ case 'read-document-step':
16
+ return '👁️';
17
+ case 'update-document-step':
18
+ return '✏️';
19
+ case 'delete-document-step':
20
+ return '🗑️';
21
+ case 'send-email-step':
22
+ return '📧';
23
+ default:
24
+ return '⚡';
25
+ }
26
+ };
27
+ const getStepTypeLabel = (type)=>{
28
+ return type.replace(/-/g, ' ').replace(/\b\w/g, (l)=>l.toUpperCase());
29
+ };
30
+ return /*#__PURE__*/ _jsxs("div", {
31
+ style: {
32
+ background: color,
33
+ color: 'white',
34
+ borderRadius: '8px',
35
+ padding: '12px 16px',
36
+ minWidth: '150px',
37
+ border: selected ? '2px solid #1e40af' : '1px solid rgba(255, 255, 255, 0.2)',
38
+ boxShadow: selected ? '0 8px 25px rgba(0, 0, 0, 0.15)' : '0 4px 15px rgba(0, 0, 0, 0.1)',
39
+ transition: 'all 0.2s ease',
40
+ cursor: 'pointer',
41
+ position: 'relative'
42
+ },
43
+ title: "Click to configure this step",
44
+ children: [
45
+ dependencies.length > 0 && /*#__PURE__*/ _jsx(Handle, {
46
+ type: "target",
47
+ position: Position.Top,
48
+ style: {
49
+ background: '#fff',
50
+ border: '2px solid #3b82f6',
51
+ width: '10px',
52
+ height: '10px'
53
+ }
54
+ }),
55
+ /*#__PURE__*/ _jsxs("div", {
56
+ style: {
57
+ display: 'flex',
58
+ alignItems: 'center',
59
+ gap: '8px',
60
+ marginBottom: '4px'
61
+ },
62
+ children: [
63
+ /*#__PURE__*/ _jsx("span", {
64
+ style: {
65
+ fontSize: '16px'
66
+ },
67
+ children: getStepTypeIcon(stepType)
68
+ }),
69
+ /*#__PURE__*/ _jsx("div", {
70
+ children: /*#__PURE__*/ _jsx("div", {
71
+ style: {
72
+ fontWeight: '600',
73
+ fontSize: '14px',
74
+ lineHeight: '1.2'
75
+ },
76
+ children: label
77
+ })
78
+ })
79
+ ]
80
+ }),
81
+ /*#__PURE__*/ _jsx("div", {
82
+ style: {
83
+ fontSize: '11px',
84
+ opacity: 0.9,
85
+ fontWeight: '400'
86
+ },
87
+ children: getStepTypeLabel(stepType)
88
+ }),
89
+ dependencies.length > 0 && /*#__PURE__*/ _jsx("div", {
90
+ style: {
91
+ position: 'absolute',
92
+ top: '4px',
93
+ right: '20px',
94
+ background: 'rgba(255, 255, 255, 0.2)',
95
+ borderRadius: '50%',
96
+ width: '16px',
97
+ height: '16px',
98
+ display: 'flex',
99
+ alignItems: 'center',
100
+ justifyContent: 'center',
101
+ fontSize: '8px',
102
+ fontWeight: 'bold',
103
+ pointerEvents: 'none' // Allow clicks to pass through to parent
104
+ },
105
+ children: dependencies.length
106
+ }),
107
+ /*#__PURE__*/ _jsx("div", {
108
+ style: {
109
+ position: 'absolute',
110
+ top: '4px',
111
+ right: '4px',
112
+ background: 'rgba(255, 255, 255, 0.3)',
113
+ borderRadius: '50%',
114
+ width: '16px',
115
+ height: '16px',
116
+ display: 'flex',
117
+ alignItems: 'center',
118
+ justifyContent: 'center',
119
+ fontSize: '10px',
120
+ pointerEvents: 'none' // Allow clicks to pass through to parent
121
+ },
122
+ children: "⚙️"
123
+ }),
124
+ /*#__PURE__*/ _jsx(Handle, {
125
+ type: "source",
126
+ position: Position.Bottom,
127
+ style: {
128
+ background: '#fff',
129
+ border: '2px solid #3b82f6',
130
+ width: '10px',
131
+ height: '10px'
132
+ }
133
+ })
134
+ ]
135
+ });
136
+ });
137
+ StepNode.displayName = 'StepNode';
138
+
139
+ //# sourceMappingURL=StepNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/WorkflowBuilder/nodes/StepNode.tsx"],"sourcesContent":["'use client'\n\nimport React, { memo } from 'react'\nimport { Handle, Position, NodeProps } from '@xyflow/react'\n\ninterface StepNodeData {\n label: string\n stepType: string\n color?: string\n icon?: string\n dependencies?: string[]\n}\n\nexport const StepNode: React.FC<NodeProps> = memo(({ data, selected }) => {\n const { label, stepType, color = '#3b82f6', icon, dependencies = [] } = data as unknown as StepNodeData\n\n const getStepTypeIcon = (type: string) => {\n // Return icon from data or default based on type\n if (icon) return icon\n \n switch (type) {\n case 'http-request-step':\n return '🌐'\n case 'create-document-step':\n return '📄'\n case 'read-document-step':\n return '👁️'\n case 'update-document-step':\n return '✏️'\n case 'delete-document-step':\n return '🗑️'\n case 'send-email-step':\n return '📧'\n default:\n return '⚡'\n }\n }\n\n const getStepTypeLabel = (type: string) => {\n return type.replace(/-/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase())\n }\n\n return (\n <div\n style={{\n background: color,\n color: 'white',\n borderRadius: '8px',\n padding: '12px 16px',\n minWidth: '150px',\n border: selected ? '2px solid #1e40af' : '1px solid rgba(255, 255, 255, 0.2)',\n boxShadow: selected \n ? '0 8px 25px rgba(0, 0, 0, 0.15)' \n : '0 4px 15px rgba(0, 0, 0, 0.1)',\n transition: 'all 0.2s ease',\n cursor: 'pointer',\n position: 'relative'\n }}\n title=\"Click to configure this step\"\n >\n {/* Input Handle - only show if this step has dependencies */}\n {dependencies.length > 0 && (\n <Handle\n type=\"target\"\n position={Position.Top}\n style={{\n background: '#fff',\n border: '2px solid #3b82f6',\n width: '10px',\n height: '10px'\n }}\n />\n )}\n\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n gap: '8px',\n marginBottom: '4px'\n }}>\n <span style={{ fontSize: '16px' }}>\n {getStepTypeIcon(stepType)}\n </span>\n <div>\n <div style={{ \n fontWeight: '600', \n fontSize: '14px',\n lineHeight: '1.2'\n }}>\n {label}\n </div>\n </div>\n </div>\n\n <div style={{ \n fontSize: '11px', \n opacity: 0.9,\n fontWeight: '400'\n }}>\n {getStepTypeLabel(stepType)}\n </div>\n\n {/* Status indicator for dependencies */}\n {dependencies.length > 0 && (\n <div style={{\n position: 'absolute',\n top: '4px',\n right: '20px',\n background: 'rgba(255, 255, 255, 0.2)',\n borderRadius: '50%',\n width: '16px',\n height: '16px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '8px',\n fontWeight: 'bold',\n pointerEvents: 'none' // Allow clicks to pass through to parent\n }}>\n {dependencies.length}\n </div>\n )}\n\n {/* Configuration indicator */}\n <div style={{\n position: 'absolute',\n top: '4px',\n right: '4px',\n background: 'rgba(255, 255, 255, 0.3)',\n borderRadius: '50%',\n width: '16px',\n height: '16px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '10px',\n pointerEvents: 'none' // Allow clicks to pass through to parent\n }}>\n ⚙️\n </div>\n\n {/* Output Handle - always show for potential connections */}\n <Handle\n type=\"source\"\n position={Position.Bottom}\n style={{\n background: '#fff',\n border: '2px solid #3b82f6',\n width: '10px',\n height: '10px'\n }}\n />\n </div>\n )\n})\n\nStepNode.displayName = 'StepNode'"],"names":["React","memo","Handle","Position","StepNode","data","selected","label","stepType","color","icon","dependencies","getStepTypeIcon","type","getStepTypeLabel","replace","l","toUpperCase","div","style","background","borderRadius","padding","minWidth","border","boxShadow","transition","cursor","position","title","length","Top","width","height","display","alignItems","gap","marginBottom","span","fontSize","fontWeight","lineHeight","opacity","top","right","justifyContent","pointerEvents","Bottom","displayName"],"mappings":"AAAA;;AAEA,OAAOA,SAASC,IAAI,QAAQ,QAAO;AACnC,SAASC,MAAM,EAAEC,QAAQ,QAAmB,gBAAe;AAU3D,OAAO,MAAMC,yBAAgCH,KAAK,CAAC,EAAEI,IAAI,EAAEC,QAAQ,EAAE;IACnE,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,SAAS,EAAEC,IAAI,EAAEC,eAAe,EAAE,EAAE,GAAGN;IAExE,MAAMO,kBAAkB,CAACC;QACvB,iDAAiD;QACjD,IAAIH,MAAM,OAAOA;QAEjB,OAAQG;YACN,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT,KAAK;gBACH,OAAO;YACT;gBACE,OAAO;QACX;IACF;IAEA,MAAMC,mBAAmB,CAACD;QACxB,OAAOA,KAAKE,OAAO,CAAC,MAAM,KAAKA,OAAO,CAAC,SAASC,CAAAA,IAAKA,EAAEC,WAAW;IACpE;IAEA,qBACE,MAACC;QACCC,OAAO;YACLC,YAAYX;YACZA,OAAO;YACPY,cAAc;YACdC,SAAS;YACTC,UAAU;YACVC,QAAQlB,WAAW,sBAAsB;YACzCmB,WAAWnB,WACP,mCACA;YACJoB,YAAY;YACZC,QAAQ;YACRC,UAAU;QACZ;QACAC,OAAM;;YAGLlB,aAAamB,MAAM,GAAG,mBACrB,KAAC5B;gBACCW,MAAK;gBACLe,UAAUzB,SAAS4B,GAAG;gBACtBZ,OAAO;oBACLC,YAAY;oBACZI,QAAQ;oBACRQ,OAAO;oBACPC,QAAQ;gBACV;;0BAIJ,MAACf;gBAAIC,OAAO;oBACVe,SAAS;oBACTC,YAAY;oBACZC,KAAK;oBACLC,cAAc;gBAChB;;kCACE,KAACC;wBAAKnB,OAAO;4BAAEoB,UAAU;wBAAO;kCAC7B3B,gBAAgBJ;;kCAEnB,KAACU;kCACC,cAAA,KAACA;4BAAIC,OAAO;gCACVqB,YAAY;gCACZD,UAAU;gCACVE,YAAY;4BACd;sCACGlC;;;;;0BAKP,KAACW;gBAAIC,OAAO;oBACVoB,UAAU;oBACVG,SAAS;oBACTF,YAAY;gBACd;0BACG1B,iBAAiBN;;YAInBG,aAAamB,MAAM,GAAG,mBACrB,KAACZ;gBAAIC,OAAO;oBACVS,UAAU;oBACVe,KAAK;oBACLC,OAAO;oBACPxB,YAAY;oBACZC,cAAc;oBACdW,OAAO;oBACPC,QAAQ;oBACRC,SAAS;oBACTC,YAAY;oBACZU,gBAAgB;oBAChBN,UAAU;oBACVC,YAAY;oBACZM,eAAe,OAAO,yCAAyC;gBACjE;0BACGnC,aAAamB,MAAM;;0BAKxB,KAACZ;gBAAIC,OAAO;oBACVS,UAAU;oBACVe,KAAK;oBACLC,OAAO;oBACPxB,YAAY;oBACZC,cAAc;oBACdW,OAAO;oBACPC,QAAQ;oBACRC,SAAS;oBACTC,YAAY;oBACZU,gBAAgB;oBAChBN,UAAU;oBACVO,eAAe,OAAO,yCAAyC;gBACjE;0BAAG;;0BAKH,KAAC5C;gBACCW,MAAK;gBACLe,UAAUzB,SAAS4C,MAAM;gBACzB5B,OAAO;oBACLC,YAAY;oBACZI,QAAQ;oBACRQ,OAAO;oBACPC,QAAQ;gBACV;;;;AAIR,GAAE;AAEF7B,SAAS4C,WAAW,GAAG"}