@burdenoff/fluidgrids-fe-sdk 2026.827.1 → 2026.915.1

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 (91) hide show
  1. package/dist/ExecutionDetailPage-OWNO2BEW.js +11 -0
  2. package/dist/{ExecutionDetailPage-FF2DYKAZ.js.map → ExecutionDetailPage-OWNO2BEW.js.map} +1 -1
  3. package/dist/ExecutionsListPage-6O4AS3CM.js +10 -0
  4. package/dist/{ExecutionsListPage-NKISRFMA.js.map → ExecutionsListPage-6O4AS3CM.js.map} +1 -1
  5. package/dist/{MissingNodesInstallModal-HA5L3FK2.js → MissingNodesInstallModal-QAXLWW35.js} +43 -7
  6. package/dist/MissingNodesInstallModal-QAXLWW35.js.map +1 -0
  7. package/dist/{TemplateConfigurationModal-MXNGZQIC.js → TemplateConfigurationModal-TB7DJBTR.js} +11 -8
  8. package/dist/TemplateConfigurationModal-TB7DJBTR.js.map +1 -0
  9. package/dist/{TemplateDetailPanel-CJ3NPVTP.js → TemplateDetailPanel-KS3LQIBD.js} +3 -4
  10. package/dist/TemplateDetailPanel-KS3LQIBD.js.map +1 -0
  11. package/dist/WorkflowBuilder-S2PXF5RZ.js +19 -0
  12. package/dist/{WorkflowBuilder-XFXFAMUE.js.map → WorkflowBuilder-S2PXF5RZ.js.map} +1 -1
  13. package/dist/WorkflowsList-XQW7YPZX.js +12 -0
  14. package/dist/{WorkflowsList-TZAN3YBA.js.map → WorkflowsList-XQW7YPZX.js.map} +1 -1
  15. package/dist/{chunk-7VNIEIR6.js → chunk-7YWBH2A5.js} +9 -3
  16. package/dist/chunk-7YWBH2A5.js.map +1 -0
  17. package/dist/chunk-ACRXNUU2.js +504 -0
  18. package/dist/chunk-ACRXNUU2.js.map +1 -0
  19. package/dist/{chunk-6PNRM3KQ.js → chunk-AE7FZRTH.js} +5 -4
  20. package/dist/chunk-AE7FZRTH.js.map +1 -0
  21. package/dist/{chunk-YJKZSUNC.js → chunk-BF4YC7XN.js} +32 -15
  22. package/dist/chunk-BF4YC7XN.js.map +1 -0
  23. package/dist/chunk-CLPFGB5Y.js +453 -0
  24. package/dist/chunk-CLPFGB5Y.js.map +1 -0
  25. package/dist/{chunk-MH4AHYK3.js → chunk-ELB3LXRJ.js} +17 -5
  26. package/dist/chunk-ELB3LXRJ.js.map +1 -0
  27. package/dist/{chunk-IWKLEFC7.js → chunk-GBDXBJPH.js} +7 -6
  28. package/dist/chunk-GBDXBJPH.js.map +1 -0
  29. package/dist/{chunk-Y36DJHU3.js → chunk-KT72XMAB.js} +4 -176
  30. package/dist/chunk-KT72XMAB.js.map +1 -0
  31. package/dist/chunk-LMO5ASOE.js +43 -0
  32. package/dist/chunk-LMO5ASOE.js.map +1 -0
  33. package/dist/{chunk-OHGXRM6Z.js → chunk-NH5YCY37.js} +3 -3
  34. package/dist/{chunk-OHGXRM6Z.js.map → chunk-NH5YCY37.js.map} +1 -1
  35. package/dist/chunk-RXMBIJ5Z.js +3 -0
  36. package/dist/chunk-RXMBIJ5Z.js.map +1 -0
  37. package/dist/chunk-TVZ5UUGI.js +541 -0
  38. package/dist/chunk-TVZ5UUGI.js.map +1 -0
  39. package/dist/{chunk-SG7Z2IRQ.js → chunk-UPN73SK4.js} +5 -5
  40. package/dist/{chunk-SG7Z2IRQ.js.map → chunk-UPN73SK4.js.map} +1 -1
  41. package/dist/{chunk-A54HLFJE.js → chunk-UVBJY5FB.js} +5668 -5901
  42. package/dist/chunk-UVBJY5FB.js.map +1 -0
  43. package/dist/chunk-UVG4SYBS.js +405 -0
  44. package/dist/chunk-UVG4SYBS.js.map +1 -0
  45. package/dist/chunk-VJDLWE5S.js +505 -0
  46. package/dist/chunk-VJDLWE5S.js.map +1 -0
  47. package/dist/{chunk-V5UEEB74.js → chunk-WO3AHQVD.js} +17 -41
  48. package/dist/chunk-WO3AHQVD.js.map +1 -0
  49. package/dist/chunk-ZWQBPYWX.js +4901 -0
  50. package/dist/chunk-ZWQBPYWX.js.map +1 -0
  51. package/dist/executions.d.ts +7 -0
  52. package/dist/executions.js +14 -0
  53. package/dist/executions.js.map +1 -0
  54. package/dist/history.d.ts +5 -0
  55. package/dist/history.js +9 -0
  56. package/dist/history.js.map +1 -0
  57. package/dist/index.d.ts +147 -616
  58. package/dist/index.js +61 -6870
  59. package/dist/index.js.map +1 -1
  60. package/dist/nodes.d.ts +5 -0
  61. package/dist/nodes.js +6 -0
  62. package/dist/nodes.js.map +1 -0
  63. package/dist/settings.d.ts +5 -0
  64. package/dist/settings.js +4 -0
  65. package/dist/settings.js.map +1 -0
  66. package/dist/templates.d.ts +17 -0
  67. package/dist/templates.js +19 -0
  68. package/dist/templates.js.map +1 -0
  69. package/dist/workflow-builder-JKkdIJoP.d.ts +473 -0
  70. package/dist/workflow-builder.d.ts +5 -0
  71. package/dist/workflow-builder.js +20 -0
  72. package/dist/workflow-builder.js.map +1 -0
  73. package/dist/workflows-list.d.ts +5 -0
  74. package/dist/workflows-list.js +12 -0
  75. package/dist/workflows-list.js.map +1 -0
  76. package/package.json +29 -1
  77. package/dist/ExecutionDetailPage-FF2DYKAZ.js +0 -10
  78. package/dist/ExecutionsListPage-NKISRFMA.js +0 -9
  79. package/dist/MissingNodesInstallModal-HA5L3FK2.js.map +0 -1
  80. package/dist/TemplateConfigurationModal-MXNGZQIC.js.map +0 -1
  81. package/dist/TemplateDetailPanel-CJ3NPVTP.js.map +0 -1
  82. package/dist/WorkflowBuilder-XFXFAMUE.js +0 -17
  83. package/dist/WorkflowsList-TZAN3YBA.js +0 -11
  84. package/dist/chunk-6PNRM3KQ.js.map +0 -1
  85. package/dist/chunk-7VNIEIR6.js.map +0 -1
  86. package/dist/chunk-A54HLFJE.js.map +0 -1
  87. package/dist/chunk-IWKLEFC7.js.map +0 -1
  88. package/dist/chunk-MH4AHYK3.js.map +0 -1
  89. package/dist/chunk-V5UEEB74.js.map +0 -1
  90. package/dist/chunk-Y36DJHU3.js.map +0 -1
  91. package/dist/chunk-YJKZSUNC.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { cn } from './chunk-3ZYUGTIT.js';
2
- import { useTr } from './chunk-7VNIEIR6.js';
2
+ import { useTr } from './chunk-7YWBH2A5.js';
3
3
  import * as DialogPrimitive from '@radix-ui/react-dialog';
4
4
  import { XIcon } from 'lucide-react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -135,5 +135,5 @@ function DialogDescription({
135
135
  }
136
136
 
137
137
  export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
138
- //# sourceMappingURL=chunk-OHGXRM6Z.js.map
139
- //# sourceMappingURL=chunk-OHGXRM6Z.js.map
138
+ //# sourceMappingURL=chunk-NH5YCY37.js.map
139
+ //# sourceMappingURL=chunk-NH5YCY37.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/dialog.tsx"],"names":[],"mappings":"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","file":"chunk-OHGXRM6Z.js","sourcesContent":["import * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { useTr } from \"../hooks/useTr\";\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n size?: \"default\" | \"lg\" | \"xl\" | \"full\";\n}) {\n const tr = useTr();\n const sizeClasses = {\n default: \"sm:max-w-lg\",\n lg: \"sm:max-w-3xl\",\n xl: \"sm:max-w-[1400px] w-[90vw]\",\n full: \"sm:max-w-[95vw] w-[95vw]\",\n };\n\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none\",\n sizeClasses[size],\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\"\n >\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">\n {tr(\"fluidgrids.ui.dialog.closeLabel\", \"Close\")}\n </span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n"]}
1
+ {"version":3,"sources":["../src/ui/dialog.tsx"],"names":[],"mappings":"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","file":"chunk-NH5YCY37.js","sourcesContent":["import * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { useTr } from \"../hooks/useTr\";\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n size?: \"default\" | \"lg\" | \"xl\" | \"full\";\n}) {\n const tr = useTr();\n const sizeClasses = {\n default: \"sm:max-w-lg\",\n lg: \"sm:max-w-3xl\",\n xl: \"sm:max-w-[1400px] w-[90vw]\",\n full: \"sm:max-w-[95vw] w-[95vw]\",\n };\n\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none\",\n sizeClasses[size],\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none\"\n >\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">\n {tr(\"fluidgrids.ui.dialog.closeLabel\", \"Close\")}\n </span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-RXMBIJ5Z.js.map
3
+ //# sourceMappingURL=chunk-RXMBIJ5Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-RXMBIJ5Z.js"}
@@ -0,0 +1,541 @@
1
+ import { FluidGridsProvider, Card } from './chunk-UVBJY5FB.js';
2
+ import { Input } from './chunk-P5PKRQAO.js';
3
+ import { Button } from './chunk-DBOMRIP5.js';
4
+ import { useFlowStore } from './chunk-KT72XMAB.js';
5
+ import { cn } from './chunk-3ZYUGTIT.js';
6
+ import { useWorkflowDefinition } from './chunk-ELB3LXRJ.js';
7
+ import { useTr } from './chunk-7YWBH2A5.js';
8
+ import { useState, useRef, useEffect, useCallback } from 'react';
9
+ import { MarkerType, ReactFlowProvider, useReactFlow, ReactFlow, Background, Controls, MiniMap, Handle, Position } from '@xyflow/react';
10
+ import { useShallow } from 'zustand/shallow';
11
+ import '@xyflow/react/dist/style.css';
12
+ import { ArrowLeft, Save, Play, Trash2 } from 'lucide-react';
13
+ import { useTheme } from '@burdenoff/fe-libs/shared/hooks/shell';
14
+ import { Toaster as Toaster$1 } from 'sonner';
15
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
16
+ import { useParams, Navigate } from 'react-router';
17
+ import { Icon } from '@iconify/react';
18
+
19
+ var Toaster = ({ ...props }) => {
20
+ const { resolvedTheme = "light" } = useTheme();
21
+ return /* @__PURE__ */ jsx(
22
+ Toaster$1,
23
+ {
24
+ theme: resolvedTheme,
25
+ className: "toaster group",
26
+ toastOptions: {
27
+ classNames: {
28
+ toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
29
+ description: "group-[.toast]:text-muted-foreground",
30
+ actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
31
+ cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"
32
+ }
33
+ },
34
+ ...props
35
+ }
36
+ );
37
+ };
38
+ var defaultEdgeOptions = {
39
+ type: "smoothstep",
40
+ markerEnd: {
41
+ type: MarkerType.ArrowClosed,
42
+ width: 21,
43
+ height: 21
44
+ },
45
+ style: {
46
+ stroke: "#888"
47
+ }
48
+ };
49
+ var handleStyle = {
50
+ width: 10,
51
+ height: 10,
52
+ background: "#3b82f6",
53
+ // blue-500
54
+ border: "2px solid white"
55
+ };
56
+ var baseNodeStyle = {
57
+ padding: "8px 16px",
58
+ borderRadius: "8px",
59
+ fontWeight: 500,
60
+ boxShadow: "0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)",
61
+ position: "relative",
62
+ color: "white"
63
+ };
64
+ var NODE_COLORS = {
65
+ "trigger:api": "#22c55e",
66
+ end: "#ef4444",
67
+ "internal:if": "#8b5cf6",
68
+ "internal:switch": "#8b5cf6",
69
+ "internal:loop": "#f59e0b",
70
+ "internal:merge": "#6366f1",
71
+ "internal:set": "#3b82f6",
72
+ "internal:filter": "#06b6d4",
73
+ "internal:aggregate": "#0891b2",
74
+ "internal:wait": "#64748b",
75
+ "internal:noop": "#94a3b8",
76
+ "internal:http": "#f97316",
77
+ default: "#3b82f6"
78
+ };
79
+ function getNodeColor(type) {
80
+ return NODE_COLORS[type] ?? NODE_COLORS.default;
81
+ }
82
+ function TriggerNode({ data }) {
83
+ const tr = useTr();
84
+ const label = data.label;
85
+ return /* @__PURE__ */ jsxs("div", { style: { ...baseNodeStyle, background: getNodeColor("trigger:api") }, children: [
86
+ label || tr(
87
+ "fluidgrids.components.workflowBuilderCore.triggerNodeLabel",
88
+ "API Trigger"
89
+ ),
90
+ /* @__PURE__ */ jsx(Handle, { type: "source", position: Position.Bottom, style: handleStyle })
91
+ ] });
92
+ }
93
+ function EndNode({ data }) {
94
+ const tr = useTr();
95
+ const label = data.label;
96
+ return /* @__PURE__ */ jsxs("div", { style: { ...baseNodeStyle, background: getNodeColor("end") }, children: [
97
+ /* @__PURE__ */ jsx(Handle, { type: "target", position: Position.Top, style: handleStyle }),
98
+ label || tr("fluidgrids.components.workflowBuilderCore.endNodeLabel", "End")
99
+ ] });
100
+ }
101
+ function ActionNode({ data, type }) {
102
+ const tr = useTr();
103
+ const label = data.label;
104
+ const color = getNodeColor(type || "default");
105
+ return /* @__PURE__ */ jsxs(
106
+ "div",
107
+ {
108
+ style: {
109
+ ...baseNodeStyle,
110
+ background: color,
111
+ minWidth: 120,
112
+ textAlign: "center"
113
+ },
114
+ children: [
115
+ /* @__PURE__ */ jsx(Handle, { type: "target", position: Position.Top, style: handleStyle }),
116
+ label || tr(
117
+ "fluidgrids.components.workflowBuilderCore.actionNodeLabel",
118
+ "Action"
119
+ ),
120
+ /* @__PURE__ */ jsx(Handle, { type: "source", position: Position.Bottom, style: handleStyle })
121
+ ]
122
+ }
123
+ );
124
+ }
125
+ var NODE_TYPES = {
126
+ "trigger:api": TriggerNode,
127
+ end: EndNode,
128
+ "internal:if": ActionNode,
129
+ "internal:switch": ActionNode,
130
+ "internal:loop": ActionNode,
131
+ "internal:merge": ActionNode,
132
+ "internal:set": ActionNode,
133
+ "internal:filter": ActionNode,
134
+ "internal:aggregate": ActionNode,
135
+ "internal:wait": ActionNode,
136
+ "internal:noop": ActionNode,
137
+ "internal:http": ActionNode,
138
+ "internal:subworkflow": ActionNode,
139
+ default: ActionNode
140
+ };
141
+ var nodeIdCounter = 0;
142
+ function FlowBuilderInner({
143
+ workflow,
144
+ readonly = false,
145
+ hideHeader = false,
146
+ hideSidebar = false,
147
+ hideLogsPanel = false,
148
+ onSave,
149
+ onExecute,
150
+ onNodeClick,
151
+ onBack,
152
+ className
153
+ }) {
154
+ const reactFlowInstance = useReactFlow();
155
+ const tr = useTr();
156
+ const setWorkflow = useFlowStore((s) => s.actions.setWorkflow);
157
+ const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);
158
+ const deleteNode = useFlowStore((s) => s.actions.nodes.deleteNode);
159
+ const setNodes = useFlowStore((s) => s.actions.nodes.setNodes);
160
+ const [nodes, edges, onNodesChange, onEdgesChange, onConnect] = useFlowStore(
161
+ useShallow((s) => [
162
+ s.workflow.nodes,
163
+ s.workflow.edges,
164
+ s.actions.nodes.onNodesChange,
165
+ s.actions.edges.onEdgesChange,
166
+ s.actions.edges.onConnect
167
+ ])
168
+ );
169
+ const [workflowName, setWorkflowName] = useState(
170
+ workflow?.name || "Untitled Workflow"
171
+ );
172
+ const [selectedNodeId, setSelectedNodeId] = useState(null);
173
+ const reactFlowWrapper = useRef(null);
174
+ useEffect(() => {
175
+ resetWorkflow();
176
+ if (workflow) {
177
+ setWorkflow(workflow);
178
+ setWorkflowName(workflow.name || "Untitled Workflow");
179
+ }
180
+ }, [workflow, resetWorkflow, setWorkflow]);
181
+ const handleNameChange = (e) => {
182
+ setWorkflowName(e.target.value);
183
+ setWorkflow({ name: e.target.value });
184
+ };
185
+ const handleSave = () => {
186
+ const savedWorkflow = {
187
+ id: workflow?.id || "",
188
+ workflowKey: workflow?.workflowKey || "",
189
+ name: workflowName,
190
+ version: workflow?.version || "1",
191
+ alias: workflow?.alias,
192
+ nodes,
193
+ edges,
194
+ sidebar: {
195
+ active: "none",
196
+ panels: {
197
+ nodeProperties: {
198
+ selectedNode: null
199
+ }
200
+ }
201
+ }
202
+ };
203
+ onSave?.(savedWorkflow);
204
+ };
205
+ const handleExecute = () => {
206
+ const runId = `run-${Date.now()}`;
207
+ onExecute?.(runId);
208
+ };
209
+ const handleNodeClick = useCallback(
210
+ (_event, node) => {
211
+ setSelectedNodeId(node.id);
212
+ onNodeClick?.(node);
213
+ },
214
+ [onNodeClick]
215
+ );
216
+ const handlePaneClick = useCallback(() => {
217
+ setSelectedNodeId(null);
218
+ }, []);
219
+ const handleDragOver = useCallback((event) => {
220
+ event.preventDefault();
221
+ event.dataTransfer.dropEffect = "copy";
222
+ }, []);
223
+ const handleDrop = useCallback(
224
+ (event) => {
225
+ event.preventDefault();
226
+ const raw = event.dataTransfer.getData("application/json");
227
+ if (!raw) return;
228
+ let payload;
229
+ try {
230
+ payload = JSON.parse(raw);
231
+ } catch {
232
+ return;
233
+ }
234
+ const nodeType = payload.type || payload.id || "default";
235
+ const label = payload.label || nodeType;
236
+ const bounds = reactFlowWrapper.current?.getBoundingClientRect();
237
+ if (!bounds) return;
238
+ const position = reactFlowInstance.screenToFlowPosition({
239
+ x: event.clientX - bounds.left,
240
+ y: event.clientY - bounds.top
241
+ });
242
+ nodeIdCounter += 1;
243
+ const newNodeId = `${nodeType}-${Date.now()}-${nodeIdCounter}`;
244
+ const newNode = {
245
+ id: newNodeId,
246
+ type: nodeType,
247
+ position,
248
+ data: { label }
249
+ };
250
+ const currentNodes = useFlowStore.getState().workflow.nodes;
251
+ setNodes([...currentNodes, newNode]);
252
+ },
253
+ [reactFlowInstance, setNodes]
254
+ );
255
+ const selectedNode = selectedNodeId ? nodes.find((n) => n.id === selectedNodeId) : null;
256
+ const handleSelectedNodeLabelChange = useCallback(
257
+ (newLabel) => {
258
+ if (!selectedNodeId) return;
259
+ const currentNodes = useFlowStore.getState().workflow.nodes;
260
+ const updated = currentNodes.map(
261
+ (n) => n.id === selectedNodeId ? { ...n, data: { ...n.data, label: newLabel } } : n
262
+ );
263
+ setNodes(updated);
264
+ },
265
+ [selectedNodeId, setNodes]
266
+ );
267
+ const handleDeleteSelectedNode = useCallback(() => {
268
+ if (!selectedNode) return;
269
+ if (selectedNode.deletable === false) return;
270
+ deleteNode(selectedNode);
271
+ setSelectedNodeId(null);
272
+ }, [selectedNode, deleteNode]);
273
+ return /* @__PURE__ */ jsxs(
274
+ "div",
275
+ {
276
+ className: cn("flex flex-col flex-1 h-full w-full min-h-0", className),
277
+ children: [
278
+ !hideHeader && /* @__PURE__ */ jsxs(Card, { className: "h-14 shrink-0 border-0 rounded-none bg-gradient-to-r from-primary/20 to-transparent p-2 flex items-center justify-between border-b", children: [
279
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
280
+ onBack && /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", onClick: onBack, children: /* @__PURE__ */ jsx(ArrowLeft, { className: "size-5" }) }),
281
+ /* @__PURE__ */ jsx(
282
+ Input,
283
+ {
284
+ className: "font-semibold max-w-[300px]",
285
+ value: workflowName,
286
+ onChange: handleNameChange,
287
+ placeholder: tr(
288
+ "fluidgrids.components.workflowBuilderCore.workflowNamePlaceholder",
289
+ "Workflow Name"
290
+ ),
291
+ disabled: readonly
292
+ }
293
+ )
294
+ ] }),
295
+ !readonly && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
296
+ /* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: handleSave, children: [
297
+ /* @__PURE__ */ jsx(Save, { className: "size-4 mr-1" }),
298
+ tr("fluidgrids.components.workflowBuilderCore.save", "Save")
299
+ ] }),
300
+ /* @__PURE__ */ jsxs(Button, { size: "sm", onClick: handleExecute, children: [
301
+ /* @__PURE__ */ jsx(Play, { className: "size-4 mr-1" }),
302
+ tr("fluidgrids.components.workflowBuilderCore.run", "Run")
303
+ ] })
304
+ ] })
305
+ ] }),
306
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 min-h-0 overflow-hidden", children: [
307
+ /* @__PURE__ */ jsx("div", { className: "flex-1 h-full relative", ref: reactFlowWrapper, children: /* @__PURE__ */ jsxs(
308
+ ReactFlow,
309
+ {
310
+ nodes,
311
+ edges,
312
+ onNodesChange: readonly ? void 0 : onNodesChange,
313
+ onEdgesChange: readonly ? void 0 : onEdgesChange,
314
+ onConnect: readonly ? void 0 : onConnect,
315
+ onNodeClick: readonly ? void 0 : handleNodeClick,
316
+ onPaneClick: handlePaneClick,
317
+ onDragOver: readonly ? void 0 : handleDragOver,
318
+ onDrop: readonly ? void 0 : handleDrop,
319
+ nodeTypes: NODE_TYPES,
320
+ defaultEdgeOptions,
321
+ fitView: true,
322
+ snapToGrid: true,
323
+ snapGrid: [16, 16],
324
+ proOptions: { hideAttribution: true },
325
+ deleteKeyCode: readonly ? null : "Backspace",
326
+ children: [
327
+ /* @__PURE__ */ jsx(Background, { gap: 24 }),
328
+ /* @__PURE__ */ jsx(Controls, {}),
329
+ /* @__PURE__ */ jsx(MiniMap, {})
330
+ ]
331
+ }
332
+ ) }),
333
+ !hideSidebar && !readonly && /* @__PURE__ */ jsxs("div", { className: "w-60 shrink-0 border-l bg-card overflow-y-auto", children: [
334
+ /* @__PURE__ */ jsx("div", { className: "p-4 border-b", children: /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold", children: tr(
335
+ "fluidgrids.components.workflowBuilderCore.nodePropertiesHeading",
336
+ "Node Properties"
337
+ ) }) }),
338
+ selectedNode ? /* @__PURE__ */ jsxs("div", { className: "p-4 space-y-4", children: [
339
+ /* @__PURE__ */ jsxs("div", { children: [
340
+ /* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-muted-foreground mb-1", children: tr(
341
+ "fluidgrids.components.workflowBuilderCore.nodeIdLabel",
342
+ "Node ID"
343
+ ) }),
344
+ /* @__PURE__ */ jsx("code", { className: "block text-xs bg-muted px-2 py-1 rounded font-mono break-all", children: selectedNode.id })
345
+ ] }),
346
+ /* @__PURE__ */ jsxs("div", { children: [
347
+ /* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-muted-foreground mb-1", children: tr(
348
+ "fluidgrids.components.workflowBuilderCore.nodeTypeLabel",
349
+ "Type"
350
+ ) }),
351
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
352
+ /* @__PURE__ */ jsx(
353
+ "span",
354
+ {
355
+ className: "inline-block w-3 h-3 rounded-full shrink-0",
356
+ style: {
357
+ background: getNodeColor(
358
+ selectedNode.type || "default"
359
+ )
360
+ }
361
+ }
362
+ ),
363
+ /* @__PURE__ */ jsx("code", { className: "text-xs font-mono", children: selectedNode.type })
364
+ ] })
365
+ ] }),
366
+ /* @__PURE__ */ jsxs("div", { children: [
367
+ /* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-muted-foreground mb-1", children: tr(
368
+ "fluidgrids.components.workflowBuilderCore.nodeLabelLabel",
369
+ "Label"
370
+ ) }),
371
+ /* @__PURE__ */ jsx(
372
+ Input,
373
+ {
374
+ value: selectedNode.data?.label ?? "",
375
+ onChange: (e) => handleSelectedNodeLabelChange(e.target.value),
376
+ className: "text-sm",
377
+ placeholder: tr(
378
+ "fluidgrids.components.workflowBuilderCore.nodeLabelPlaceholder",
379
+ "Node label"
380
+ )
381
+ }
382
+ )
383
+ ] }),
384
+ /* @__PURE__ */ jsxs("div", { children: [
385
+ /* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-muted-foreground mb-1", children: tr(
386
+ "fluidgrids.components.workflowBuilderCore.positionLabel",
387
+ "Position"
388
+ ) }),
389
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2 text-xs text-muted-foreground", children: [
390
+ /* @__PURE__ */ jsxs("div", { children: [
391
+ "X:",
392
+ " ",
393
+ /* @__PURE__ */ jsx("span", { className: "font-mono", children: Math.round(selectedNode.position.x) })
394
+ ] }),
395
+ /* @__PURE__ */ jsxs("div", { children: [
396
+ "Y:",
397
+ " ",
398
+ /* @__PURE__ */ jsx("span", { className: "font-mono", children: Math.round(selectedNode.position.y) })
399
+ ] })
400
+ ] })
401
+ ] }),
402
+ /* @__PURE__ */ jsxs("div", { children: [
403
+ /* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-muted-foreground mb-1", children: tr(
404
+ "fluidgrids.components.workflowBuilderCore.connectionsLabel",
405
+ "Connections"
406
+ ) }),
407
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: (() => {
408
+ const inbound = edges.filter(
409
+ (e) => e.target === selectedNode.id
410
+ );
411
+ const outbound = edges.filter(
412
+ (e) => e.source === selectedNode.id
413
+ );
414
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("div", { children: [
415
+ inbound.length,
416
+ " inbound, ",
417
+ outbound.length,
418
+ " outbound"
419
+ ] }) });
420
+ })() })
421
+ ] }),
422
+ selectedNode.deletable !== false && /* @__PURE__ */ jsx("div", { className: "pt-2 border-t", children: /* @__PURE__ */ jsxs(
423
+ Button,
424
+ {
425
+ variant: "destructive",
426
+ size: "sm",
427
+ className: "w-full",
428
+ onClick: handleDeleteSelectedNode,
429
+ children: [
430
+ /* @__PURE__ */ jsx(Trash2, { className: "size-4 mr-1" }),
431
+ tr(
432
+ "fluidgrids.components.workflowBuilderCore.deleteNode",
433
+ "Delete Node"
434
+ )
435
+ ]
436
+ }
437
+ ) })
438
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "p-4", children: [
439
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: tr(
440
+ "fluidgrids.components.workflowBuilderCore.noSelectionHint",
441
+ "Click a node on the canvas to view and edit its properties."
442
+ ) }),
443
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-2", children: tr(
444
+ "fluidgrids.components.workflowBuilderCore.dragPaletteHint",
445
+ "Drag nodes from the palette on the left to add them to the workflow."
446
+ ) })
447
+ ] })
448
+ ] })
449
+ ] }),
450
+ !hideLogsPanel && /* @__PURE__ */ jsxs("div", { className: "h-32 border-t bg-card p-2", children: [
451
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-medium mb-2", children: tr(
452
+ "fluidgrids.components.workflowBuilderCore.executionLogsHeading",
453
+ "Execution Logs"
454
+ ) }),
455
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: tr(
456
+ "fluidgrids.components.workflowBuilderCore.executionLogsEmpty",
457
+ "Execution logs will appear here when you run the workflow"
458
+ ) })
459
+ ] })
460
+ ]
461
+ }
462
+ );
463
+ }
464
+ function WorkflowBuilderCore(props) {
465
+ return /* @__PURE__ */ jsxs(ReactFlowProvider, { children: [
466
+ /* @__PURE__ */ jsx(FlowBuilderInner, { ...props }),
467
+ /* @__PURE__ */ jsx(Toaster, { richColors: true, position: "bottom-center", duration: 2e3 })
468
+ ] });
469
+ }
470
+ function WorkflowBuilder({
471
+ workflowId,
472
+ workflowVersion,
473
+ initialWorkflow,
474
+ apiGatewayUrl,
475
+ globalApiUrl,
476
+ authToken,
477
+ workspaceId,
478
+ tenantId,
479
+ organizationId,
480
+ workspaceClient,
481
+ globalClient,
482
+ ...coreProps
483
+ }) {
484
+ const workflow = initialWorkflow || createDefaultWorkflow(workflowId, workflowVersion);
485
+ return /* @__PURE__ */ jsx(
486
+ FluidGridsProvider,
487
+ {
488
+ apiGatewayUrl,
489
+ globalApiUrl,
490
+ authToken,
491
+ workspaceId,
492
+ tenantId,
493
+ organizationId,
494
+ workspaceClient,
495
+ globalClient,
496
+ children: /* @__PURE__ */ jsx(WorkflowBuilderCore, { workflow, ...coreProps })
497
+ }
498
+ );
499
+ }
500
+ function createDefaultWorkflow(id, version) {
501
+ return {
502
+ id: id || `workflow-${Date.now()}`,
503
+ workflowKey: id || `workflow-${Date.now()}`,
504
+ name: "Untitled Workflow",
505
+ version: version || "1",
506
+ nodes: [],
507
+ edges: [],
508
+ sidebar: {
509
+ active: "store-browse",
510
+ panels: {
511
+ nodeProperties: {
512
+ selectedNode: null
513
+ }
514
+ }
515
+ }
516
+ };
517
+ }
518
+ function WorkflowSearchRedirect() {
519
+ const { id } = useParams();
520
+ const { workflow, loading, error } = useWorkflowDefinition(void 0, id);
521
+ if (loading) {
522
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-[40vh] items-center justify-center gap-2 text-sm text-muted-foreground", children: [
523
+ /* @__PURE__ */ jsx(Icon, { icon: "svg-spinners:ring-resize", className: "size-4" }),
524
+ "Opening workflow\u2026"
525
+ ] });
526
+ }
527
+ if (error || !workflow) {
528
+ return /* @__PURE__ */ jsx(Navigate, { to: "../list", replace: true });
529
+ }
530
+ return /* @__PURE__ */ jsx(
531
+ Navigate,
532
+ {
533
+ to: `../workflow/${workflow.workflowKey}/${workflow.version}`,
534
+ replace: true
535
+ }
536
+ );
537
+ }
538
+
539
+ export { WorkflowBuilder, WorkflowBuilderCore, WorkflowSearchRedirect };
540
+ //# sourceMappingURL=chunk-TVZ5UUGI.js.map
541
+ //# sourceMappingURL=chunk-TVZ5UUGI.js.map