@burdenoff/fluidgrids-fe-sdk 2026.829.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.
- package/dist/{MissingNodesInstallModal-PZYTCNCV.js → MissingNodesInstallModal-QAXLWW35.js} +41 -5
- package/dist/MissingNodesInstallModal-QAXLWW35.js.map +1 -0
- package/dist/{WorkflowBuilder-426LYWCE.js → WorkflowBuilder-S2PXF5RZ.js} +4 -4
- package/dist/{WorkflowBuilder-426LYWCE.js.map → WorkflowBuilder-S2PXF5RZ.js.map} +1 -1
- package/dist/{chunk-PYD2V4U6.js → chunk-TVZ5UUGI.js} +3 -3
- package/dist/{chunk-PYD2V4U6.js.map → chunk-TVZ5UUGI.js.map} +1 -1
- package/dist/{chunk-NZ67MDME.js → chunk-UVBJY5FB.js} +19 -8
- package/dist/chunk-UVBJY5FB.js.map +1 -0
- package/dist/{chunk-NHPGJMJX.js → chunk-UVG4SYBS.js} +15 -5
- package/dist/chunk-UVG4SYBS.js.map +1 -0
- package/dist/{chunk-VJ2NTNDZ.js → chunk-ZWQBPYWX.js} +3 -3
- package/dist/{chunk-VJ2NTNDZ.js.map → chunk-ZWQBPYWX.js.map} +1 -1
- package/dist/index.js +7 -7
- package/dist/templates.js +2 -2
- package/dist/workflow-builder.js +3 -3
- package/package.json +1 -1
- package/dist/MissingNodesInstallModal-PZYTCNCV.js.map +0 -1
- package/dist/chunk-NHPGJMJX.js.map +0 -1
- package/dist/chunk-NZ67MDME.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Di
|
|
|
2
2
|
import { Badge, Button } from './chunk-DBOMRIP5.js';
|
|
3
3
|
import './chunk-3ZYUGTIT.js';
|
|
4
4
|
import './chunk-7YWBH2A5.js';
|
|
5
|
-
import { Puzzle, Download, CheckCircle2,
|
|
5
|
+
import { Puzzle, Download, CheckCircle2, AlertTriangle, ShoppingCart, ExternalLink, Loader2 } from 'lucide-react';
|
|
6
6
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
7
7
|
|
|
8
8
|
function MissingNodesInstallModal({
|
|
@@ -13,10 +13,13 @@ function MissingNodesInstallModal({
|
|
|
13
13
|
onConfirm,
|
|
14
14
|
onSkip,
|
|
15
15
|
installing = false,
|
|
16
|
-
installProgress
|
|
16
|
+
installProgress,
|
|
17
|
+
installErrors = []
|
|
17
18
|
}) {
|
|
18
19
|
const hasMissingFreeNodes = (nodeCheckResult?.missing.length ?? 0) > 0;
|
|
19
20
|
const hasPaidBlockers = (nodeCheckResult?.missingPaid.length ?? 0) > 0;
|
|
21
|
+
const unavailableNodes = nodeCheckResult?.unavailable ?? [];
|
|
22
|
+
const hasUnavailableNodes = unavailableNodes.length > 0;
|
|
20
23
|
const isInstalling = installing && !!installProgress;
|
|
21
24
|
const buttonLabel = hasPaidBlockers ? "Purchase Required Nodes First" : isInstalling ? `Installing nodes (${installProgress.current}/${installProgress.total})...` : hasMissingFreeNodes ? "Install Missing Nodes" : "Open in Builder";
|
|
22
25
|
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(
|
|
@@ -30,7 +33,7 @@ function MissingNodesInstallModal({
|
|
|
30
33
|
/* @__PURE__ */ jsx(Puzzle, { className: "size-5 text-primary" }),
|
|
31
34
|
/* @__PURE__ */ jsx(DialogTitle, { className: "text-xl", children: workflowName ? `Missing nodes for "${workflowName}"` : "Missing workflow nodes" })
|
|
32
35
|
] }),
|
|
33
|
-
/* @__PURE__ */ jsx(DialogDescription, { children: "This workflow uses nodes that are not installed in your workspace. Install them now, or open the workflow and install them later." })
|
|
36
|
+
/* @__PURE__ */ jsx(DialogDescription, { children: hasMissingFreeNodes || hasPaidBlockers ? "This workflow uses nodes that are not installed in your workspace. Install them now, or open the workflow and install them later." : "This workflow uses nodes that are not available in your workspace. You can still open the workflow \u2014 the affected steps will need attention before it can run." })
|
|
34
37
|
] }),
|
|
35
38
|
/* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto px-6 py-5 space-y-6", children: [
|
|
36
39
|
nodeCheckResult && /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
@@ -78,6 +81,22 @@ function MissingNodesInstallModal({
|
|
|
78
81
|
},
|
|
79
82
|
node.nodeType
|
|
80
83
|
)),
|
|
84
|
+
unavailableNodes.map((node) => /* @__PURE__ */ jsxs(
|
|
85
|
+
"div",
|
|
86
|
+
{
|
|
87
|
+
className: "flex items-center gap-2 text-sm",
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ jsx(AlertTriangle, { className: "size-4 text-muted-foreground shrink-0" }),
|
|
90
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
91
|
+
node.displayName || node.nodeType,
|
|
92
|
+
" v",
|
|
93
|
+
node.nodeVersion
|
|
94
|
+
] }),
|
|
95
|
+
/* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-xs ml-auto", children: "Not available in store" })
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
node.nodeType
|
|
99
|
+
)),
|
|
81
100
|
nodeCheckResult.missingPaid.map((node) => /* @__PURE__ */ jsxs(
|
|
82
101
|
"div",
|
|
83
102
|
{
|
|
@@ -103,6 +122,23 @@ function MissingNodesInstallModal({
|
|
|
103
122
|
))
|
|
104
123
|
] })
|
|
105
124
|
] }),
|
|
125
|
+
installErrors.length > 0 && /* @__PURE__ */ jsxs("div", { className: "rounded-lg bg-destructive/10 border border-destructive/30 p-3 text-sm text-destructive flex items-start gap-2", children: [
|
|
126
|
+
/* @__PURE__ */ jsx(AlertTriangle, { className: "size-4 mt-0.5 shrink-0" }),
|
|
127
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
128
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium", children: "Some nodes could not be installed" }),
|
|
129
|
+
/* @__PURE__ */ jsxs("p", { className: "mt-1 text-xs", children: [
|
|
130
|
+
installErrors.join(", "),
|
|
131
|
+
". Try again, or open the workflow without installing."
|
|
132
|
+
] })
|
|
133
|
+
] })
|
|
134
|
+
] }),
|
|
135
|
+
hasUnavailableNodes && !hasMissingFreeNodes && !hasPaidBlockers && /* @__PURE__ */ jsxs("div", { className: "rounded-lg bg-muted/50 border border-border p-3 text-sm text-muted-foreground flex items-start gap-2", children: [
|
|
136
|
+
/* @__PURE__ */ jsx(AlertTriangle, { className: "size-4 mt-0.5 shrink-0" }),
|
|
137
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
138
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium text-foreground", children: "Nothing to install" }),
|
|
139
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-xs", children: "These nodes are not published to the store, so they cannot be installed from here. Open the workflow to review the steps that use them." })
|
|
140
|
+
] })
|
|
141
|
+
] }),
|
|
106
142
|
hasPaidBlockers && /* @__PURE__ */ jsxs("div", { className: "rounded-lg bg-amber-500/10 border border-amber-500/30 p-3 text-sm text-amber-700 dark:text-amber-400 flex items-start gap-2", children: [
|
|
107
143
|
/* @__PURE__ */ jsx(AlertTriangle, { className: "size-4 mt-0.5 shrink-0" }),
|
|
108
144
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
@@ -181,5 +217,5 @@ function MissingNodesInstallModal({
|
|
|
181
217
|
}
|
|
182
218
|
|
|
183
219
|
export { MissingNodesInstallModal };
|
|
184
|
-
//# sourceMappingURL=MissingNodesInstallModal-
|
|
185
|
-
//# sourceMappingURL=MissingNodesInstallModal-
|
|
220
|
+
//# sourceMappingURL=MissingNodesInstallModal-QAXLWW35.js.map
|
|
221
|
+
//# sourceMappingURL=MissingNodesInstallModal-QAXLWW35.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builder/components/flow-builder/components/templates/MissingNodesInstallModal.tsx"],"names":[],"mappings":"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","file":"MissingNodesInstallModal-QAXLWW35.js","sourcesContent":["import {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from \"../../../../../ui/dialog\";\nimport { Button } from \"../../../../../ui/button\";\nimport { Badge } from \"../../../../../ui/badge\";\nimport type { TemplateNodeCheckResult } from \"../../../../../types/workflow-template-content\";\nimport {\n Loader2,\n CheckCircle2,\n Download,\n ShoppingCart,\n AlertTriangle,\n ExternalLink,\n Puzzle,\n} from \"lucide-react\";\n\nexport interface MissingNodesInstallModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n workflowName?: string;\n nodeCheckResult: TemplateNodeCheckResult | null;\n onConfirm: () => void;\n onSkip?: () => void;\n installing?: boolean;\n installProgress?: {\n current: number;\n total: number;\n nodeName: string;\n } | null;\n /**\n * Display names of nodes whose install failed on the last attempt. Shown in\n * the dialog so a failed install is never mistaken for a successful one\n * (BOFF-7267 — failures used to be swallowed and the dialog just closed).\n */\n installErrors?: string[];\n}\n\nexport function MissingNodesInstallModal({\n open,\n onOpenChange,\n workflowName,\n nodeCheckResult,\n onConfirm,\n onSkip,\n installing = false,\n installProgress,\n installErrors = [],\n}: MissingNodesInstallModalProps) {\n const hasMissingFreeNodes = (nodeCheckResult?.missing.length ?? 0) > 0;\n const hasPaidBlockers = (nodeCheckResult?.missingPaid.length ?? 0) > 0;\n const unavailableNodes = nodeCheckResult?.unavailable ?? [];\n const hasUnavailableNodes = unavailableNodes.length > 0;\n\n const isInstalling = installing && !!installProgress;\n\n // Only nodes the store can actually install justify an \"Install\" label; a\n // dialog listing nothing but unavailable nodes would promise an action that\n // cannot run (BOFF-7267).\n const buttonLabel = hasPaidBlockers\n ? \"Purchase Required Nodes First\"\n : isInstalling\n ? `Installing nodes (${installProgress.current}/${installProgress.total})...`\n : hasMissingFreeNodes\n ? \"Install Missing Nodes\"\n : \"Open in Builder\";\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n size=\"lg\"\n className=\"!flex !flex-col !max-h-[85vh] overflow-hidden p-0 gap-0\"\n >\n <DialogHeader className=\"px-6 pt-6 pb-4 border-b shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Puzzle className=\"size-5 text-primary\" />\n <DialogTitle className=\"text-xl\">\n {workflowName\n ? `Missing nodes for \"${workflowName}\"`\n : \"Missing workflow nodes\"}\n </DialogTitle>\n </div>\n <DialogDescription>\n {hasMissingFreeNodes || hasPaidBlockers\n ? \"This workflow uses nodes that are not installed in your workspace. Install them now, or open the workflow and install them later.\"\n : \"This workflow uses nodes that are not available in your workspace. You can still open the workflow — the affected steps will need attention before it can run.\"}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex-1 overflow-y-auto px-6 py-5 space-y-6\">\n {nodeCheckResult && (\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-semibold text-foreground flex items-center gap-2\">\n <Download className=\"size-4\" />\n Node Dependencies\n </h4>\n <div className=\"space-y-2\">\n {nodeCheckResult.installed.map((node) => (\n <div\n key={node.nodeType}\n className=\"flex items-center gap-2 text-sm\"\n >\n <CheckCircle2 className=\"size-4 text-green-500 shrink-0\" />\n <span>\n {node.displayName || node.nodeType} v{node.nodeVersion}\n </span>\n <Badge variant=\"secondary\" className=\"text-xs ml-auto\">\n Installed\n </Badge>\n </div>\n ))}\n\n {nodeCheckResult.missing.map((node) => (\n <div\n key={node.nodeType}\n className=\"flex items-center gap-2 text-sm\"\n >\n <Download className=\"size-4 text-blue-500 shrink-0\" />\n <span>\n {node.displayName || node.nodeType} v{node.nodeVersion}\n </span>\n <Badge\n variant=\"outline\"\n className=\"text-xs ml-auto border-blue-500/30 text-blue-500\"\n >\n Not installed\n </Badge>\n </div>\n ))}\n\n {unavailableNodes.map((node) => (\n <div\n key={node.nodeType}\n className=\"flex items-center gap-2 text-sm\"\n >\n <AlertTriangle className=\"size-4 text-muted-foreground shrink-0\" />\n <span>\n {node.displayName || node.nodeType} v{node.nodeVersion}\n </span>\n <Badge variant=\"outline\" className=\"text-xs ml-auto\">\n Not available in store\n </Badge>\n </div>\n ))}\n\n {nodeCheckResult.missingPaid.map((node) => (\n <div\n key={node.nodeType}\n className=\"flex items-center gap-2 text-sm\"\n >\n <ShoppingCart className=\"size-4 text-amber-500 shrink-0\" />\n <span>\n {node.displayName || node.nodeType} v{node.nodeVersion}\n </span>\n <Badge\n variant=\"outline\"\n className=\"text-xs ml-auto border-amber-500/30 text-amber-500\"\n >\n Purchase required\n </Badge>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {installErrors.length > 0 && (\n <div className=\"rounded-lg bg-destructive/10 border border-destructive/30 p-3 text-sm text-destructive flex items-start gap-2\">\n <AlertTriangle className=\"size-4 mt-0.5 shrink-0\" />\n <div>\n <p className=\"font-medium\">Some nodes could not be installed</p>\n <p className=\"mt-1 text-xs\">\n {installErrors.join(\", \")}. Try again, or open the workflow\n without installing.\n </p>\n </div>\n </div>\n )}\n\n {hasUnavailableNodes && !hasMissingFreeNodes && !hasPaidBlockers && (\n <div className=\"rounded-lg bg-muted/50 border border-border p-3 text-sm text-muted-foreground flex items-start gap-2\">\n <AlertTriangle className=\"size-4 mt-0.5 shrink-0\" />\n <div>\n <p className=\"font-medium text-foreground\">\n Nothing to install\n </p>\n <p className=\"mt-1 text-xs\">\n These nodes are not published to the store, so they cannot be\n installed from here. Open the workflow to review the steps\n that use them.\n </p>\n </div>\n </div>\n )}\n\n {hasPaidBlockers && (\n <div className=\"rounded-lg bg-amber-500/10 border border-amber-500/30 p-3 text-sm text-amber-700 dark:text-amber-400 flex items-start gap-2\">\n <AlertTriangle className=\"size-4 mt-0.5 shrink-0\" />\n <div>\n <p className=\"font-medium\">\n Purchase required before installing\n </p>\n <p className=\"mt-1 text-xs\">\n The nodes marked \"Purchase required\" must be purchased from\n the store before this workflow can use them.\n </p>\n <Button\n variant=\"link\"\n size=\"sm\"\n className=\"mt-1 h-auto p-0 text-xs text-amber-700 dark:text-amber-400 underline\"\n onClick={() => window.open(\"/store\", \"_blank\")}\n >\n <ExternalLink className=\"size-3 mr-1\" />\n Go to Store\n </Button>\n </div>\n </div>\n )}\n </div>\n\n <DialogFooter className=\"px-6 py-4 border-t shrink-0 flex-col gap-2\">\n {installProgress && (\n <div className=\"w-full space-y-1.5\">\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1.5\">\n <Loader2 className=\"size-3 animate-spin\" />\n Installing: {installProgress.nodeName}\n </span>\n <span>\n {installProgress.current} / {installProgress.total}\n </span>\n </div>\n <div className=\"h-1.5 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{\n width: `${(installProgress.current / installProgress.total) * 100}%`,\n }}\n />\n </div>\n </div>\n )}\n\n <div className=\"flex w-full justify-end gap-2\">\n {onSkip && (\n <Button variant=\"outline\" onClick={onSkip} disabled={installing}>\n Open Without Installing\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={installing}\n >\n Cancel\n </Button>\n <Button\n onClick={onConfirm}\n disabled={installing || hasPaidBlockers}\n >\n {installing ? (\n <>\n <Loader2 className=\"size-4 mr-2 animate-spin\" />\n {buttonLabel}\n </>\n ) : (\n <>\n <Download className=\"size-4 mr-2\" />\n {buttonLabel}\n </>\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { WorkflowBuilder } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { WorkflowBuilder } from './chunk-UVG4SYBS.js';
|
|
2
|
+
import './chunk-UVBJY5FB.js';
|
|
3
3
|
import './chunk-P5PKRQAO.js';
|
|
4
4
|
import './chunk-NH5YCY37.js';
|
|
5
5
|
import './chunk-DBOMRIP5.js';
|
|
@@ -15,5 +15,5 @@ import './chunk-WWU2O2SR.js';
|
|
|
15
15
|
import './chunk-WO3AHQVD.js';
|
|
16
16
|
import './chunk-5BDQNSP3.js';
|
|
17
17
|
import './chunk-7YWBH2A5.js';
|
|
18
|
-
//# sourceMappingURL=WorkflowBuilder-
|
|
19
|
-
//# sourceMappingURL=WorkflowBuilder-
|
|
18
|
+
//# sourceMappingURL=WorkflowBuilder-S2PXF5RZ.js.map
|
|
19
|
+
//# sourceMappingURL=WorkflowBuilder-S2PXF5RZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-S2PXF5RZ.js"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FluidGridsProvider, Card } from './chunk-
|
|
1
|
+
import { FluidGridsProvider, Card } from './chunk-UVBJY5FB.js';
|
|
2
2
|
import { Input } from './chunk-P5PKRQAO.js';
|
|
3
3
|
import { Button } from './chunk-DBOMRIP5.js';
|
|
4
4
|
import { useFlowStore } from './chunk-KT72XMAB.js';
|
|
@@ -537,5 +537,5 @@ function WorkflowSearchRedirect() {
|
|
|
537
537
|
}
|
|
538
538
|
|
|
539
539
|
export { WorkflowBuilder, WorkflowBuilderCore, WorkflowSearchRedirect };
|
|
540
|
-
//# sourceMappingURL=chunk-
|
|
541
|
-
//# sourceMappingURL=chunk-
|
|
540
|
+
//# sourceMappingURL=chunk-TVZ5UUGI.js.map
|
|
541
|
+
//# sourceMappingURL=chunk-TVZ5UUGI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/builder/components/ui/sonner.tsx","../src/components/WorkflowBuilderCore.tsx","../src/components/WorkflowBuilder.tsx","../src/pages/WorkflowSearchRedirect.tsx"],"names":["Sonner","jsx","jsxs"],"mappings":"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","file":"chunk-PYD2V4U6.js","sourcesContent":["import { useTheme } from \"@burdenoff/fe-libs/shared/hooks/shell\";\nimport { Toaster as Sonner } from \"sonner\";\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>;\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { resolvedTheme = \"light\" } = useTheme();\n\n return (\n <Sonner\n theme={resolvedTheme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","import { useCallback, useEffect, useState, useRef } from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n MiniMap,\n Handle,\n Position,\n type NodeTypes,\n MarkerType,\n type NodeProps,\n useReactFlow,\n ReactFlowProvider,\n} from \"@xyflow/react\";\nimport { useShallow } from \"zustand/shallow\";\nimport \"@xyflow/react/dist/style.css\";\n\nimport { useFlowStore } from \"../builder/stores/flow-store\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Card } from \"../ui/card\";\nimport { cn } from \"../utils/cn\";\nimport type { WorkflowData, FlowNode } from \"../types\";\nimport { ArrowLeft, Play, Save, Trash2 } from \"lucide-react\";\nimport { Toaster } from \"../builder/components/ui/sonner\";\nimport { useTr } from \"../hooks/useTr\";\n\nexport interface WorkflowBuilderCoreProps {\n /** Initial workflow data to render */\n workflow?: WorkflowData;\n /** Readonly mode - disables editing */\n readonly?: boolean;\n /** Hide the header toolbar */\n hideHeader?: boolean;\n /** Hide the sidebar */\n hideSidebar?: boolean;\n /** Hide the logs panel */\n hideLogsPanel?: boolean;\n /** Callback when workflow is saved */\n onSave?: (workflow: WorkflowData) => void;\n /** Callback when workflow execution starts */\n onExecute?: (runId: string) => void;\n /** Callback when a node is clicked */\n onNodeClick?: (node: FlowNode) => void;\n /** Callback when back button is clicked */\n onBack?: () => void;\n /** Custom className */\n className?: string;\n}\n\n// Default edge options\nconst defaultEdgeOptions = {\n type: \"smoothstep\",\n markerEnd: {\n type: MarkerType.ArrowClosed,\n width: 21,\n height: 21,\n },\n style: {\n stroke: \"#888\",\n },\n};\n\n// Handle styles\nconst handleStyle: React.CSSProperties = {\n width: 10,\n height: 10,\n background: \"#3b82f6\", // blue-500\n border: \"2px solid white\",\n};\n\n// Base node styles\nconst baseNodeStyle: React.CSSProperties = {\n padding: \"8px 16px\",\n borderRadius: \"8px\",\n fontWeight: 500,\n boxShadow:\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n position: \"relative\",\n color: \"white\",\n};\n\n// Node type → colour mapping\nconst NODE_COLORS: Record<string, string> = {\n \"trigger:api\": \"#22c55e\",\n end: \"#ef4444\",\n \"internal:if\": \"#8b5cf6\",\n \"internal:switch\": \"#8b5cf6\",\n \"internal:loop\": \"#f59e0b\",\n \"internal:merge\": \"#6366f1\",\n \"internal:set\": \"#3b82f6\",\n \"internal:filter\": \"#06b6d4\",\n \"internal:aggregate\": \"#0891b2\",\n \"internal:wait\": \"#64748b\",\n \"internal:noop\": \"#94a3b8\",\n \"internal:http\": \"#f97316\",\n default: \"#3b82f6\",\n};\n\nfunction getNodeColor(type: string): string {\n return NODE_COLORS[type] ?? NODE_COLORS.default;\n}\n\n// Trigger Node component - has only source handle (bottom)\nfunction TriggerNode({ data }: NodeProps) {\n const tr = useTr();\n const label = (data as { label?: string }).label;\n return (\n <div style={{ ...baseNodeStyle, background: getNodeColor(\"trigger:api\") }}>\n {label ||\n tr(\n \"fluidgrids.components.workflowBuilderCore.triggerNodeLabel\",\n \"API Trigger\",\n )}\n <Handle type=\"source\" position={Position.Bottom} style={handleStyle} />\n </div>\n );\n}\n\n// End Node component - has only target handle (top)\nfunction EndNode({ data }: NodeProps) {\n const tr = useTr();\n const label = (data as { label?: string }).label;\n return (\n <div style={{ ...baseNodeStyle, background: getNodeColor(\"end\") }}>\n <Handle type=\"target\" position={Position.Top} style={handleStyle} />\n {label ||\n tr(\"fluidgrids.components.workflowBuilderCore.endNodeLabel\", \"End\")}\n </div>\n );\n}\n\n// Action Node component - has both source (bottom) and target (top) handles\nfunction ActionNode({ data, type }: NodeProps) {\n const tr = useTr();\n const label = (data as { label?: string }).label;\n const color = getNodeColor(type || \"default\");\n return (\n <div\n style={{\n ...baseNodeStyle,\n background: color,\n minWidth: 120,\n textAlign: \"center\",\n }}\n >\n <Handle type=\"target\" position={Position.Top} style={handleStyle} />\n {label ||\n tr(\n \"fluidgrids.components.workflowBuilderCore.actionNodeLabel\",\n \"Action\",\n )}\n <Handle type=\"source\" position={Position.Bottom} style={handleStyle} />\n </div>\n );\n}\n\n// Define node types\nconst NODE_TYPES: NodeTypes = {\n \"trigger:api\": TriggerNode,\n end: EndNode,\n \"internal:if\": ActionNode,\n \"internal:switch\": ActionNode,\n \"internal:loop\": ActionNode,\n \"internal:merge\": ActionNode,\n \"internal:set\": ActionNode,\n \"internal:filter\": ActionNode,\n \"internal:aggregate\": ActionNode,\n \"internal:wait\": ActionNode,\n \"internal:noop\": ActionNode,\n \"internal:http\": ActionNode,\n \"internal:subworkflow\": ActionNode,\n default: ActionNode,\n};\n\n// Counter for unique node ids\nlet nodeIdCounter = 0;\n\nfunction FlowBuilderInner({\n workflow,\n readonly = false,\n hideHeader = false,\n hideSidebar = false,\n hideLogsPanel = false,\n onSave,\n onExecute,\n onNodeClick,\n onBack,\n className,\n}: WorkflowBuilderCoreProps) {\n const reactFlowInstance = useReactFlow();\n const tr = useTr();\n\n const setWorkflow = useFlowStore((s) => s.actions.setWorkflow);\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const deleteNode = useFlowStore((s) => s.actions.nodes.deleteNode);\n const setNodes = useFlowStore((s) => s.actions.nodes.setNodes);\n\n const [nodes, edges, onNodesChange, onEdgesChange, onConnect] = useFlowStore(\n useShallow((s) => [\n s.workflow.nodes,\n s.workflow.edges,\n s.actions.nodes.onNodesChange,\n s.actions.edges.onEdgesChange,\n s.actions.edges.onConnect,\n ]),\n );\n\n const [workflowName, setWorkflowName] = useState(\n workflow?.name || \"Untitled Workflow\",\n );\n\n // Selected node for properties panel\n const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null);\n\n // Ref for the ReactFlow wrapper (needed for drop position calculation)\n const reactFlowWrapper = useRef<HTMLDivElement>(null);\n\n // Initialize workflow on mount\n useEffect(() => {\n resetWorkflow();\n if (workflow) {\n setWorkflow(workflow);\n setWorkflowName(workflow.name || \"Untitled Workflow\");\n }\n }, [workflow, resetWorkflow, setWorkflow]);\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setWorkflowName(e.target.value);\n setWorkflow({ name: e.target.value });\n };\n\n const handleSave = () => {\n const savedWorkflow: WorkflowData = {\n id: workflow?.id || \"\",\n workflowKey: workflow?.workflowKey || \"\",\n name: workflowName,\n version: workflow?.version || \"1\",\n alias: workflow?.alias,\n nodes: nodes as FlowNode[],\n edges,\n sidebar: {\n active: \"none\",\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n };\n onSave?.(savedWorkflow);\n };\n\n const handleExecute = () => {\n // Generate a run ID and trigger execution\n const runId = `run-${Date.now()}`;\n onExecute?.(runId);\n };\n\n // ---- Node click → select in sidebar ----\n const handleNodeClick = useCallback(\n (\n _event: React.MouseEvent,\n node: { id: string; [key: string]: unknown },\n ) => {\n setSelectedNodeId(node.id);\n onNodeClick?.(node as unknown as FlowNode);\n },\n [onNodeClick],\n );\n\n // Deselect when clicking the pane\n const handlePaneClick = useCallback(() => {\n setSelectedNodeId(null);\n }, []);\n\n // ---- Drag-and-drop from external palette ----\n const handleDragOver = useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n }, []);\n\n const handleDrop = useCallback(\n (event: React.DragEvent) => {\n event.preventDefault();\n\n const raw = event.dataTransfer.getData(\"application/json\");\n if (!raw) return;\n\n let payload: { id?: string; type?: string; label?: string };\n try {\n payload = JSON.parse(raw);\n } catch {\n return;\n }\n\n const nodeType = payload.type || payload.id || \"default\";\n const label = payload.label || nodeType;\n\n // Calculate drop position in flow coordinates\n const bounds = reactFlowWrapper.current?.getBoundingClientRect();\n if (!bounds) return;\n\n const position = reactFlowInstance.screenToFlowPosition({\n x: event.clientX - bounds.left,\n y: event.clientY - bounds.top,\n });\n\n nodeIdCounter += 1;\n const newNodeId = `${nodeType}-${Date.now()}-${nodeIdCounter}`;\n const newNode: FlowNode = {\n id: newNodeId,\n type: nodeType,\n position,\n data: { label },\n };\n\n // Append to the existing nodes via the store\n const currentNodes = useFlowStore.getState().workflow.nodes;\n setNodes([...currentNodes, newNode]);\n },\n [reactFlowInstance, setNodes],\n );\n\n // ---- Selected node helpers ----\n const selectedNode = selectedNodeId\n ? (nodes.find((n) => n.id === selectedNodeId) as FlowNode | undefined)\n : null;\n\n const handleSelectedNodeLabelChange = useCallback(\n (newLabel: string) => {\n if (!selectedNodeId) return;\n const currentNodes = useFlowStore.getState().workflow.nodes;\n const updated = currentNodes.map((n) =>\n n.id === selectedNodeId\n ? { ...n, data: { ...n.data, label: newLabel } }\n : n,\n );\n setNodes(updated);\n },\n [selectedNodeId, setNodes],\n );\n\n const handleDeleteSelectedNode = useCallback(() => {\n if (!selectedNode) return;\n if (selectedNode.deletable === false) return; // can't delete trigger/end\n deleteNode(selectedNode);\n setSelectedNodeId(null);\n }, [selectedNode, deleteNode]);\n\n return (\n <div\n className={cn(\"flex flex-col flex-1 h-full w-full min-h-0\", className)}\n >\n {/* Header */}\n {!hideHeader && (\n <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\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"size-5\" />\n </Button>\n )}\n <Input\n className=\"font-semibold max-w-[300px]\"\n value={workflowName}\n onChange={handleNameChange}\n placeholder={tr(\n \"fluidgrids.components.workflowBuilderCore.workflowNamePlaceholder\",\n \"Workflow Name\",\n )}\n disabled={readonly}\n />\n </div>\n\n {!readonly && (\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleSave}>\n <Save className=\"size-4 mr-1\" />\n {tr(\"fluidgrids.components.workflowBuilderCore.save\", \"Save\")}\n </Button>\n <Button size=\"sm\" onClick={handleExecute}>\n <Play className=\"size-4 mr-1\" />\n {tr(\"fluidgrids.components.workflowBuilderCore.run\", \"Run\")}\n </Button>\n </div>\n )}\n </Card>\n )}\n\n {/* Main content */}\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Canvas */}\n <div className=\"flex-1 h-full relative\" ref={reactFlowWrapper}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={readonly ? undefined : onNodesChange}\n onEdgesChange={readonly ? undefined : onEdgesChange}\n onConnect={readonly ? undefined : onConnect}\n onNodeClick={readonly ? undefined : handleNodeClick}\n onPaneClick={handlePaneClick}\n onDragOver={readonly ? undefined : handleDragOver}\n onDrop={readonly ? undefined : handleDrop}\n nodeTypes={NODE_TYPES}\n defaultEdgeOptions={defaultEdgeOptions}\n fitView\n snapToGrid\n snapGrid={[16, 16]}\n proOptions={{ hideAttribution: true }}\n deleteKeyCode={readonly ? null : \"Backspace\"}\n >\n <Background gap={24} />\n <Controls />\n <MiniMap />\n </ReactFlow>\n </div>\n\n {/* Sidebar — Node Properties */}\n {!hideSidebar && !readonly && (\n <div className=\"w-60 shrink-0 border-l bg-card overflow-y-auto\">\n <div className=\"p-4 border-b\">\n <div className=\"text-sm font-semibold\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.nodePropertiesHeading\",\n \"Node Properties\",\n )}\n </div>\n </div>\n\n {selectedNode ? (\n <div className=\"p-4 space-y-4\">\n {/* Node ID */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.nodeIdLabel\",\n \"Node ID\",\n )}\n </label>\n <code className=\"block text-xs bg-muted px-2 py-1 rounded font-mono break-all\">\n {selectedNode.id}\n </code>\n </div>\n\n {/* Node Type */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.nodeTypeLabel\",\n \"Type\",\n )}\n </label>\n <div className=\"flex items-center gap-2\">\n <span\n className=\"inline-block w-3 h-3 rounded-full shrink-0\"\n style={{\n background: getNodeColor(\n selectedNode.type || \"default\",\n ),\n }}\n />\n <code className=\"text-xs font-mono\">\n {selectedNode.type}\n </code>\n </div>\n </div>\n\n {/* Label */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.nodeLabelLabel\",\n \"Label\",\n )}\n </label>\n <Input\n value={\n (selectedNode.data as { label?: string })?.label ?? \"\"\n }\n onChange={(e) =>\n handleSelectedNodeLabelChange(e.target.value)\n }\n className=\"text-sm\"\n placeholder={tr(\n \"fluidgrids.components.workflowBuilderCore.nodeLabelPlaceholder\",\n \"Node label\",\n )}\n />\n </div>\n\n {/* Position */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.positionLabel\",\n \"Position\",\n )}\n </label>\n <div className=\"grid grid-cols-2 gap-2 text-xs text-muted-foreground\">\n <div>\n X:{\" \"}\n <span className=\"font-mono\">\n {Math.round(selectedNode.position.x)}\n </span>\n </div>\n <div>\n Y:{\" \"}\n <span className=\"font-mono\">\n {Math.round(selectedNode.position.y)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Connected edges */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.connectionsLabel\",\n \"Connections\",\n )}\n </label>\n <div className=\"text-xs text-muted-foreground\">\n {(() => {\n const inbound = edges.filter(\n (e) => e.target === selectedNode.id,\n );\n const outbound = edges.filter(\n (e) => e.source === selectedNode.id,\n );\n return (\n <>\n <div>\n {inbound.length} inbound, {outbound.length} outbound\n </div>\n </>\n );\n })()}\n </div>\n </div>\n\n {/* Delete */}\n {selectedNode.deletable !== false && (\n <div className=\"pt-2 border-t\">\n <Button\n variant=\"destructive\"\n size=\"sm\"\n className=\"w-full\"\n onClick={handleDeleteSelectedNode}\n >\n <Trash2 className=\"size-4 mr-1\" />\n {tr(\n \"fluidgrids.components.workflowBuilderCore.deleteNode\",\n \"Delete Node\",\n )}\n </Button>\n </div>\n )}\n </div>\n ) : (\n <div className=\"p-4\">\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.noSelectionHint\",\n \"Click a node on the canvas to view and edit its properties.\",\n )}\n </p>\n <p className=\"text-xs text-muted-foreground mt-2\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.dragPaletteHint\",\n \"Drag nodes from the palette on the left to add them to the workflow.\",\n )}\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Logs panel placeholder */}\n {!hideLogsPanel && (\n <div className=\"h-32 border-t bg-card p-2\">\n <div className=\"text-sm font-medium mb-2\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.executionLogsHeading\",\n \"Execution Logs\",\n )}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.executionLogsEmpty\",\n \"Execution logs will appear here when you run the workflow\",\n )}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nexport function WorkflowBuilderCore(props: WorkflowBuilderCoreProps) {\n return (\n <ReactFlowProvider>\n <FlowBuilderInner {...props} />\n <Toaster richColors position=\"bottom-center\" duration={2000} />\n </ReactFlowProvider>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { FluidGridsProvider } from \"./FluidGridsProvider\";\nimport {\n WorkflowBuilderCore,\n type WorkflowBuilderCoreProps,\n} from \"./WorkflowBuilderCore\";\nimport type { WorkflowData } from \"../types\";\n\nexport interface WorkflowBuilderProps extends Omit<\n WorkflowBuilderCoreProps,\n \"workflow\"\n> {\n /** Workflow ID to load */\n workflowId?: string;\n /** Workflow version to load */\n workflowVersion?: string;\n /** Initial workflow data (bypasses API fetch) */\n initialWorkflow?: WorkflowData;\n /** Workspace API Gateway URL */\n apiGatewayUrl?: string;\n /** Global API Gateway URL (for store operations) */\n globalApiUrl?: string;\n /** Authentication token */\n authToken?: string;\n /** Current workspace ID */\n workspaceId: string;\n /** Current tenant ID */\n tenantId?: string;\n /** Organization ID */\n organizationId?: string;\n /** Optional: Provide your own workspace Apollo client */\n workspaceClient?: ApolloClient;\n /** Optional: Provide your own global Apollo client */\n globalClient?: ApolloClient;\n}\n\n/**\n * WorkflowBuilder - Standalone workflow builder component with Apollo client support\n *\n * Use this component when you want to embed the workflow builder in any React app.\n * You can either:\n * 1. Provide pre-configured Apollo clients (workspaceClient + globalClient) - Recommended\n * 2. Provide URLs and let the component create clients internally\n *\n * @example Dual Client Injection (Recommended)\n * ```tsx\n * import { createFluidGridsClients } from '@fluidgrids/fe-sdk';\n *\n * const { workspaceClient, globalClient } = createFluidGridsClients({\n * workspaceApiUrl: 'http://localhost:4000/workspaces/graphql',\n * globalApiUrl: 'http://localhost:4000/global/graphql',\n * authToken: token,\n * workspaceId: 'ws-123',\n * });\n *\n * <WorkflowBuilder\n * workspaceClient={workspaceClient}\n * globalClient={globalClient}\n * workspaceId=\"ws-123\"\n * onSave={(workflow) => console.log(workflow)}\n * />\n * ```\n *\n * @example URL-based (Simpler, less flexible)\n * ```tsx\n * <WorkflowBuilder\n * apiGatewayUrl=\"http://localhost:4000/workspaces/graphql\"\n * globalApiUrl=\"http://localhost:4000/global/graphql\"\n * authToken={token}\n * workspaceId=\"ws-123\"\n * onSave={(workflow) => console.log(workflow)}\n * />\n * ```\n */\nexport function WorkflowBuilder({\n workflowId,\n workflowVersion,\n initialWorkflow,\n apiGatewayUrl,\n globalApiUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n workspaceClient,\n globalClient,\n ...coreProps\n}: WorkflowBuilderProps) {\n // If initialWorkflow is provided, use it directly\n // Otherwise, the workflow will need to be loaded from the API\n const workflow =\n initialWorkflow || createDefaultWorkflow(workflowId, workflowVersion);\n\n return (\n <FluidGridsProvider\n apiGatewayUrl={apiGatewayUrl}\n globalApiUrl={globalApiUrl}\n authToken={authToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n workspaceClient={workspaceClient}\n globalClient={globalClient}\n >\n <WorkflowBuilderCore workflow={workflow} {...coreProps} />\n </FluidGridsProvider>\n );\n}\n\nfunction createDefaultWorkflow(id?: string, version?: string): WorkflowData {\n return {\n id: id || `workflow-${Date.now()}`,\n workflowKey: id || `workflow-${Date.now()}`,\n name: \"Untitled Workflow\",\n version: version || \"1\",\n nodes: [],\n edges: [],\n sidebar: {\n active: \"store-browse\",\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n };\n}\n","import { Navigate, useParams } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { useWorkflowDefinition } from \"../hooks/useWorkflows\";\n\n/**\n * Global search indexes WorkflowDefinition by its database id, but the\n * builder route (`workflow/:workflowKey/:version`) is keyed by workflowKey +\n * version. This page bridges the two: it resolves the id to its current\n * workflowKey/version and redirects there.\n */\nexport function WorkflowSearchRedirect() {\n const { id } = useParams<{ id: string }>();\n const { workflow, loading, error } = useWorkflowDefinition(undefined, id);\n\n if (loading) {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center gap-2 text-sm text-muted-foreground\">\n <Icon icon=\"svg-spinners:ring-resize\" className=\"size-4\" />\n Opening workflow…\n </div>\n );\n }\n\n if (error || !workflow) {\n return <Navigate to=\"../list\" replace />;\n }\n\n return (\n <Navigate\n to={`../workflow/${workflow.workflowKey}/${workflow.version}`}\n replace\n />\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/builder/components/ui/sonner.tsx","../src/components/WorkflowBuilderCore.tsx","../src/components/WorkflowBuilder.tsx","../src/pages/WorkflowSearchRedirect.tsx"],"names":["Sonner","jsx","jsxs"],"mappings":"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","file":"chunk-TVZ5UUGI.js","sourcesContent":["import { useTheme } from \"@burdenoff/fe-libs/shared/hooks/shell\";\nimport { Toaster as Sonner } from \"sonner\";\n\ntype ToasterProps = React.ComponentProps<typeof Sonner>;\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { resolvedTheme = \"light\" } = useTheme();\n\n return (\n <Sonner\n theme={resolvedTheme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg\",\n description: \"group-[.toast]:text-muted-foreground\",\n actionButton:\n \"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground\",\n cancelButton:\n \"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground\",\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","import { useCallback, useEffect, useState, useRef } from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n MiniMap,\n Handle,\n Position,\n type NodeTypes,\n MarkerType,\n type NodeProps,\n useReactFlow,\n ReactFlowProvider,\n} from \"@xyflow/react\";\nimport { useShallow } from \"zustand/shallow\";\nimport \"@xyflow/react/dist/style.css\";\n\nimport { useFlowStore } from \"../builder/stores/flow-store\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Card } from \"../ui/card\";\nimport { cn } from \"../utils/cn\";\nimport type { WorkflowData, FlowNode } from \"../types\";\nimport { ArrowLeft, Play, Save, Trash2 } from \"lucide-react\";\nimport { Toaster } from \"../builder/components/ui/sonner\";\nimport { useTr } from \"../hooks/useTr\";\n\nexport interface WorkflowBuilderCoreProps {\n /** Initial workflow data to render */\n workflow?: WorkflowData;\n /** Readonly mode - disables editing */\n readonly?: boolean;\n /** Hide the header toolbar */\n hideHeader?: boolean;\n /** Hide the sidebar */\n hideSidebar?: boolean;\n /** Hide the logs panel */\n hideLogsPanel?: boolean;\n /** Callback when workflow is saved */\n onSave?: (workflow: WorkflowData) => void;\n /** Callback when workflow execution starts */\n onExecute?: (runId: string) => void;\n /** Callback when a node is clicked */\n onNodeClick?: (node: FlowNode) => void;\n /** Callback when back button is clicked */\n onBack?: () => void;\n /** Custom className */\n className?: string;\n}\n\n// Default edge options\nconst defaultEdgeOptions = {\n type: \"smoothstep\",\n markerEnd: {\n type: MarkerType.ArrowClosed,\n width: 21,\n height: 21,\n },\n style: {\n stroke: \"#888\",\n },\n};\n\n// Handle styles\nconst handleStyle: React.CSSProperties = {\n width: 10,\n height: 10,\n background: \"#3b82f6\", // blue-500\n border: \"2px solid white\",\n};\n\n// Base node styles\nconst baseNodeStyle: React.CSSProperties = {\n padding: \"8px 16px\",\n borderRadius: \"8px\",\n fontWeight: 500,\n boxShadow:\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n position: \"relative\",\n color: \"white\",\n};\n\n// Node type → colour mapping\nconst NODE_COLORS: Record<string, string> = {\n \"trigger:api\": \"#22c55e\",\n end: \"#ef4444\",\n \"internal:if\": \"#8b5cf6\",\n \"internal:switch\": \"#8b5cf6\",\n \"internal:loop\": \"#f59e0b\",\n \"internal:merge\": \"#6366f1\",\n \"internal:set\": \"#3b82f6\",\n \"internal:filter\": \"#06b6d4\",\n \"internal:aggregate\": \"#0891b2\",\n \"internal:wait\": \"#64748b\",\n \"internal:noop\": \"#94a3b8\",\n \"internal:http\": \"#f97316\",\n default: \"#3b82f6\",\n};\n\nfunction getNodeColor(type: string): string {\n return NODE_COLORS[type] ?? NODE_COLORS.default;\n}\n\n// Trigger Node component - has only source handle (bottom)\nfunction TriggerNode({ data }: NodeProps) {\n const tr = useTr();\n const label = (data as { label?: string }).label;\n return (\n <div style={{ ...baseNodeStyle, background: getNodeColor(\"trigger:api\") }}>\n {label ||\n tr(\n \"fluidgrids.components.workflowBuilderCore.triggerNodeLabel\",\n \"API Trigger\",\n )}\n <Handle type=\"source\" position={Position.Bottom} style={handleStyle} />\n </div>\n );\n}\n\n// End Node component - has only target handle (top)\nfunction EndNode({ data }: NodeProps) {\n const tr = useTr();\n const label = (data as { label?: string }).label;\n return (\n <div style={{ ...baseNodeStyle, background: getNodeColor(\"end\") }}>\n <Handle type=\"target\" position={Position.Top} style={handleStyle} />\n {label ||\n tr(\"fluidgrids.components.workflowBuilderCore.endNodeLabel\", \"End\")}\n </div>\n );\n}\n\n// Action Node component - has both source (bottom) and target (top) handles\nfunction ActionNode({ data, type }: NodeProps) {\n const tr = useTr();\n const label = (data as { label?: string }).label;\n const color = getNodeColor(type || \"default\");\n return (\n <div\n style={{\n ...baseNodeStyle,\n background: color,\n minWidth: 120,\n textAlign: \"center\",\n }}\n >\n <Handle type=\"target\" position={Position.Top} style={handleStyle} />\n {label ||\n tr(\n \"fluidgrids.components.workflowBuilderCore.actionNodeLabel\",\n \"Action\",\n )}\n <Handle type=\"source\" position={Position.Bottom} style={handleStyle} />\n </div>\n );\n}\n\n// Define node types\nconst NODE_TYPES: NodeTypes = {\n \"trigger:api\": TriggerNode,\n end: EndNode,\n \"internal:if\": ActionNode,\n \"internal:switch\": ActionNode,\n \"internal:loop\": ActionNode,\n \"internal:merge\": ActionNode,\n \"internal:set\": ActionNode,\n \"internal:filter\": ActionNode,\n \"internal:aggregate\": ActionNode,\n \"internal:wait\": ActionNode,\n \"internal:noop\": ActionNode,\n \"internal:http\": ActionNode,\n \"internal:subworkflow\": ActionNode,\n default: ActionNode,\n};\n\n// Counter for unique node ids\nlet nodeIdCounter = 0;\n\nfunction FlowBuilderInner({\n workflow,\n readonly = false,\n hideHeader = false,\n hideSidebar = false,\n hideLogsPanel = false,\n onSave,\n onExecute,\n onNodeClick,\n onBack,\n className,\n}: WorkflowBuilderCoreProps) {\n const reactFlowInstance = useReactFlow();\n const tr = useTr();\n\n const setWorkflow = useFlowStore((s) => s.actions.setWorkflow);\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const deleteNode = useFlowStore((s) => s.actions.nodes.deleteNode);\n const setNodes = useFlowStore((s) => s.actions.nodes.setNodes);\n\n const [nodes, edges, onNodesChange, onEdgesChange, onConnect] = useFlowStore(\n useShallow((s) => [\n s.workflow.nodes,\n s.workflow.edges,\n s.actions.nodes.onNodesChange,\n s.actions.edges.onEdgesChange,\n s.actions.edges.onConnect,\n ]),\n );\n\n const [workflowName, setWorkflowName] = useState(\n workflow?.name || \"Untitled Workflow\",\n );\n\n // Selected node for properties panel\n const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null);\n\n // Ref for the ReactFlow wrapper (needed for drop position calculation)\n const reactFlowWrapper = useRef<HTMLDivElement>(null);\n\n // Initialize workflow on mount\n useEffect(() => {\n resetWorkflow();\n if (workflow) {\n setWorkflow(workflow);\n setWorkflowName(workflow.name || \"Untitled Workflow\");\n }\n }, [workflow, resetWorkflow, setWorkflow]);\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setWorkflowName(e.target.value);\n setWorkflow({ name: e.target.value });\n };\n\n const handleSave = () => {\n const savedWorkflow: WorkflowData = {\n id: workflow?.id || \"\",\n workflowKey: workflow?.workflowKey || \"\",\n name: workflowName,\n version: workflow?.version || \"1\",\n alias: workflow?.alias,\n nodes: nodes as FlowNode[],\n edges,\n sidebar: {\n active: \"none\",\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n };\n onSave?.(savedWorkflow);\n };\n\n const handleExecute = () => {\n // Generate a run ID and trigger execution\n const runId = `run-${Date.now()}`;\n onExecute?.(runId);\n };\n\n // ---- Node click → select in sidebar ----\n const handleNodeClick = useCallback(\n (\n _event: React.MouseEvent,\n node: { id: string; [key: string]: unknown },\n ) => {\n setSelectedNodeId(node.id);\n onNodeClick?.(node as unknown as FlowNode);\n },\n [onNodeClick],\n );\n\n // Deselect when clicking the pane\n const handlePaneClick = useCallback(() => {\n setSelectedNodeId(null);\n }, []);\n\n // ---- Drag-and-drop from external palette ----\n const handleDragOver = useCallback((event: React.DragEvent) => {\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n }, []);\n\n const handleDrop = useCallback(\n (event: React.DragEvent) => {\n event.preventDefault();\n\n const raw = event.dataTransfer.getData(\"application/json\");\n if (!raw) return;\n\n let payload: { id?: string; type?: string; label?: string };\n try {\n payload = JSON.parse(raw);\n } catch {\n return;\n }\n\n const nodeType = payload.type || payload.id || \"default\";\n const label = payload.label || nodeType;\n\n // Calculate drop position in flow coordinates\n const bounds = reactFlowWrapper.current?.getBoundingClientRect();\n if (!bounds) return;\n\n const position = reactFlowInstance.screenToFlowPosition({\n x: event.clientX - bounds.left,\n y: event.clientY - bounds.top,\n });\n\n nodeIdCounter += 1;\n const newNodeId = `${nodeType}-${Date.now()}-${nodeIdCounter}`;\n const newNode: FlowNode = {\n id: newNodeId,\n type: nodeType,\n position,\n data: { label },\n };\n\n // Append to the existing nodes via the store\n const currentNodes = useFlowStore.getState().workflow.nodes;\n setNodes([...currentNodes, newNode]);\n },\n [reactFlowInstance, setNodes],\n );\n\n // ---- Selected node helpers ----\n const selectedNode = selectedNodeId\n ? (nodes.find((n) => n.id === selectedNodeId) as FlowNode | undefined)\n : null;\n\n const handleSelectedNodeLabelChange = useCallback(\n (newLabel: string) => {\n if (!selectedNodeId) return;\n const currentNodes = useFlowStore.getState().workflow.nodes;\n const updated = currentNodes.map((n) =>\n n.id === selectedNodeId\n ? { ...n, data: { ...n.data, label: newLabel } }\n : n,\n );\n setNodes(updated);\n },\n [selectedNodeId, setNodes],\n );\n\n const handleDeleteSelectedNode = useCallback(() => {\n if (!selectedNode) return;\n if (selectedNode.deletable === false) return; // can't delete trigger/end\n deleteNode(selectedNode);\n setSelectedNodeId(null);\n }, [selectedNode, deleteNode]);\n\n return (\n <div\n className={cn(\"flex flex-col flex-1 h-full w-full min-h-0\", className)}\n >\n {/* Header */}\n {!hideHeader && (\n <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\">\n <div className=\"flex items-center gap-2\">\n {onBack && (\n <Button variant=\"ghost\" size=\"icon\" onClick={onBack}>\n <ArrowLeft className=\"size-5\" />\n </Button>\n )}\n <Input\n className=\"font-semibold max-w-[300px]\"\n value={workflowName}\n onChange={handleNameChange}\n placeholder={tr(\n \"fluidgrids.components.workflowBuilderCore.workflowNamePlaceholder\",\n \"Workflow Name\",\n )}\n disabled={readonly}\n />\n </div>\n\n {!readonly && (\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleSave}>\n <Save className=\"size-4 mr-1\" />\n {tr(\"fluidgrids.components.workflowBuilderCore.save\", \"Save\")}\n </Button>\n <Button size=\"sm\" onClick={handleExecute}>\n <Play className=\"size-4 mr-1\" />\n {tr(\"fluidgrids.components.workflowBuilderCore.run\", \"Run\")}\n </Button>\n </div>\n )}\n </Card>\n )}\n\n {/* Main content */}\n <div className=\"flex flex-1 min-h-0 overflow-hidden\">\n {/* Canvas */}\n <div className=\"flex-1 h-full relative\" ref={reactFlowWrapper}>\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={readonly ? undefined : onNodesChange}\n onEdgesChange={readonly ? undefined : onEdgesChange}\n onConnect={readonly ? undefined : onConnect}\n onNodeClick={readonly ? undefined : handleNodeClick}\n onPaneClick={handlePaneClick}\n onDragOver={readonly ? undefined : handleDragOver}\n onDrop={readonly ? undefined : handleDrop}\n nodeTypes={NODE_TYPES}\n defaultEdgeOptions={defaultEdgeOptions}\n fitView\n snapToGrid\n snapGrid={[16, 16]}\n proOptions={{ hideAttribution: true }}\n deleteKeyCode={readonly ? null : \"Backspace\"}\n >\n <Background gap={24} />\n <Controls />\n <MiniMap />\n </ReactFlow>\n </div>\n\n {/* Sidebar — Node Properties */}\n {!hideSidebar && !readonly && (\n <div className=\"w-60 shrink-0 border-l bg-card overflow-y-auto\">\n <div className=\"p-4 border-b\">\n <div className=\"text-sm font-semibold\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.nodePropertiesHeading\",\n \"Node Properties\",\n )}\n </div>\n </div>\n\n {selectedNode ? (\n <div className=\"p-4 space-y-4\">\n {/* Node ID */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.nodeIdLabel\",\n \"Node ID\",\n )}\n </label>\n <code className=\"block text-xs bg-muted px-2 py-1 rounded font-mono break-all\">\n {selectedNode.id}\n </code>\n </div>\n\n {/* Node Type */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.nodeTypeLabel\",\n \"Type\",\n )}\n </label>\n <div className=\"flex items-center gap-2\">\n <span\n className=\"inline-block w-3 h-3 rounded-full shrink-0\"\n style={{\n background: getNodeColor(\n selectedNode.type || \"default\",\n ),\n }}\n />\n <code className=\"text-xs font-mono\">\n {selectedNode.type}\n </code>\n </div>\n </div>\n\n {/* Label */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.nodeLabelLabel\",\n \"Label\",\n )}\n </label>\n <Input\n value={\n (selectedNode.data as { label?: string })?.label ?? \"\"\n }\n onChange={(e) =>\n handleSelectedNodeLabelChange(e.target.value)\n }\n className=\"text-sm\"\n placeholder={tr(\n \"fluidgrids.components.workflowBuilderCore.nodeLabelPlaceholder\",\n \"Node label\",\n )}\n />\n </div>\n\n {/* Position */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.positionLabel\",\n \"Position\",\n )}\n </label>\n <div className=\"grid grid-cols-2 gap-2 text-xs text-muted-foreground\">\n <div>\n X:{\" \"}\n <span className=\"font-mono\">\n {Math.round(selectedNode.position.x)}\n </span>\n </div>\n <div>\n Y:{\" \"}\n <span className=\"font-mono\">\n {Math.round(selectedNode.position.y)}\n </span>\n </div>\n </div>\n </div>\n\n {/* Connected edges */}\n <div>\n <label className=\"block text-xs font-medium text-muted-foreground mb-1\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.connectionsLabel\",\n \"Connections\",\n )}\n </label>\n <div className=\"text-xs text-muted-foreground\">\n {(() => {\n const inbound = edges.filter(\n (e) => e.target === selectedNode.id,\n );\n const outbound = edges.filter(\n (e) => e.source === selectedNode.id,\n );\n return (\n <>\n <div>\n {inbound.length} inbound, {outbound.length} outbound\n </div>\n </>\n );\n })()}\n </div>\n </div>\n\n {/* Delete */}\n {selectedNode.deletable !== false && (\n <div className=\"pt-2 border-t\">\n <Button\n variant=\"destructive\"\n size=\"sm\"\n className=\"w-full\"\n onClick={handleDeleteSelectedNode}\n >\n <Trash2 className=\"size-4 mr-1\" />\n {tr(\n \"fluidgrids.components.workflowBuilderCore.deleteNode\",\n \"Delete Node\",\n )}\n </Button>\n </div>\n )}\n </div>\n ) : (\n <div className=\"p-4\">\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.noSelectionHint\",\n \"Click a node on the canvas to view and edit its properties.\",\n )}\n </p>\n <p className=\"text-xs text-muted-foreground mt-2\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.dragPaletteHint\",\n \"Drag nodes from the palette on the left to add them to the workflow.\",\n )}\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Logs panel placeholder */}\n {!hideLogsPanel && (\n <div className=\"h-32 border-t bg-card p-2\">\n <div className=\"text-sm font-medium mb-2\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.executionLogsHeading\",\n \"Execution Logs\",\n )}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n \"fluidgrids.components.workflowBuilderCore.executionLogsEmpty\",\n \"Execution logs will appear here when you run the workflow\",\n )}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nexport function WorkflowBuilderCore(props: WorkflowBuilderCoreProps) {\n return (\n <ReactFlowProvider>\n <FlowBuilderInner {...props} />\n <Toaster richColors position=\"bottom-center\" duration={2000} />\n </ReactFlowProvider>\n );\n}\n","import { type ApolloClient } from \"@apollo/client/core\";\nimport { FluidGridsProvider } from \"./FluidGridsProvider\";\nimport {\n WorkflowBuilderCore,\n type WorkflowBuilderCoreProps,\n} from \"./WorkflowBuilderCore\";\nimport type { WorkflowData } from \"../types\";\n\nexport interface WorkflowBuilderProps extends Omit<\n WorkflowBuilderCoreProps,\n \"workflow\"\n> {\n /** Workflow ID to load */\n workflowId?: string;\n /** Workflow version to load */\n workflowVersion?: string;\n /** Initial workflow data (bypasses API fetch) */\n initialWorkflow?: WorkflowData;\n /** Workspace API Gateway URL */\n apiGatewayUrl?: string;\n /** Global API Gateway URL (for store operations) */\n globalApiUrl?: string;\n /** Authentication token */\n authToken?: string;\n /** Current workspace ID */\n workspaceId: string;\n /** Current tenant ID */\n tenantId?: string;\n /** Organization ID */\n organizationId?: string;\n /** Optional: Provide your own workspace Apollo client */\n workspaceClient?: ApolloClient;\n /** Optional: Provide your own global Apollo client */\n globalClient?: ApolloClient;\n}\n\n/**\n * WorkflowBuilder - Standalone workflow builder component with Apollo client support\n *\n * Use this component when you want to embed the workflow builder in any React app.\n * You can either:\n * 1. Provide pre-configured Apollo clients (workspaceClient + globalClient) - Recommended\n * 2. Provide URLs and let the component create clients internally\n *\n * @example Dual Client Injection (Recommended)\n * ```tsx\n * import { createFluidGridsClients } from '@fluidgrids/fe-sdk';\n *\n * const { workspaceClient, globalClient } = createFluidGridsClients({\n * workspaceApiUrl: 'http://localhost:4000/workspaces/graphql',\n * globalApiUrl: 'http://localhost:4000/global/graphql',\n * authToken: token,\n * workspaceId: 'ws-123',\n * });\n *\n * <WorkflowBuilder\n * workspaceClient={workspaceClient}\n * globalClient={globalClient}\n * workspaceId=\"ws-123\"\n * onSave={(workflow) => console.log(workflow)}\n * />\n * ```\n *\n * @example URL-based (Simpler, less flexible)\n * ```tsx\n * <WorkflowBuilder\n * apiGatewayUrl=\"http://localhost:4000/workspaces/graphql\"\n * globalApiUrl=\"http://localhost:4000/global/graphql\"\n * authToken={token}\n * workspaceId=\"ws-123\"\n * onSave={(workflow) => console.log(workflow)}\n * />\n * ```\n */\nexport function WorkflowBuilder({\n workflowId,\n workflowVersion,\n initialWorkflow,\n apiGatewayUrl,\n globalApiUrl,\n authToken,\n workspaceId,\n tenantId,\n organizationId,\n workspaceClient,\n globalClient,\n ...coreProps\n}: WorkflowBuilderProps) {\n // If initialWorkflow is provided, use it directly\n // Otherwise, the workflow will need to be loaded from the API\n const workflow =\n initialWorkflow || createDefaultWorkflow(workflowId, workflowVersion);\n\n return (\n <FluidGridsProvider\n apiGatewayUrl={apiGatewayUrl}\n globalApiUrl={globalApiUrl}\n authToken={authToken}\n workspaceId={workspaceId}\n tenantId={tenantId}\n organizationId={organizationId}\n workspaceClient={workspaceClient}\n globalClient={globalClient}\n >\n <WorkflowBuilderCore workflow={workflow} {...coreProps} />\n </FluidGridsProvider>\n );\n}\n\nfunction createDefaultWorkflow(id?: string, version?: string): WorkflowData {\n return {\n id: id || `workflow-${Date.now()}`,\n workflowKey: id || `workflow-${Date.now()}`,\n name: \"Untitled Workflow\",\n version: version || \"1\",\n nodes: [],\n edges: [],\n sidebar: {\n active: \"store-browse\",\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n };\n}\n","import { Navigate, useParams } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { useWorkflowDefinition } from \"../hooks/useWorkflows\";\n\n/**\n * Global search indexes WorkflowDefinition by its database id, but the\n * builder route (`workflow/:workflowKey/:version`) is keyed by workflowKey +\n * version. This page bridges the two: it resolves the id to its current\n * workflowKey/version and redirects there.\n */\nexport function WorkflowSearchRedirect() {\n const { id } = useParams<{ id: string }>();\n const { workflow, loading, error } = useWorkflowDefinition(undefined, id);\n\n if (loading) {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center gap-2 text-sm text-muted-foreground\">\n <Icon icon=\"svg-spinners:ring-resize\" className=\"size-4\" />\n Opening workflow…\n </div>\n );\n }\n\n if (error || !workflow) {\n return <Navigate to=\"../list\" replace />;\n }\n\n return (\n <Navigate\n to={`../workflow/${workflow.workflowKey}/${workflow.version}`}\n replace\n />\n );\n}\n"]}
|
|
@@ -8080,9 +8080,14 @@ function TemplateCard({
|
|
|
8080
8080
|
}
|
|
8081
8081
|
|
|
8082
8082
|
// src/utils/workflow-node-check.ts
|
|
8083
|
+
var CANVAS_ONLY_NODE_TYPES = /* @__PURE__ */ new Set([
|
|
8084
|
+
"sticky-note"
|
|
8085
|
+
]);
|
|
8083
8086
|
function getWorkflowNodeTypes(nodes) {
|
|
8084
8087
|
return [
|
|
8085
|
-
...new Set(
|
|
8088
|
+
...new Set(
|
|
8089
|
+
nodes.map((n) => n.type).filter((t) => Boolean(t)).filter((t) => !CANVAS_ONLY_NODE_TYPES.has(t))
|
|
8090
|
+
)
|
|
8086
8091
|
];
|
|
8087
8092
|
}
|
|
8088
8093
|
async function fetchStoreNodeTypeMap() {
|
|
@@ -8155,12 +8160,15 @@ function buildNodeCheck(requiredNodeTypes, installedAppIds) {
|
|
|
8155
8160
|
const notInstalled = requiredNodeTypes.filter(
|
|
8156
8161
|
(n) => n.publishType !== "BUILTIN" && (!n.storeProductId || !installedAppIds.has(n.storeProductId))
|
|
8157
8162
|
);
|
|
8158
|
-
const
|
|
8159
|
-
const
|
|
8163
|
+
const unavailable = notInstalled.filter((n) => !n.storeProductId);
|
|
8164
|
+
const installable = notInstalled.filter((n) => !!n.storeProductId);
|
|
8165
|
+
const missing = installable.filter((n) => !n.requiresPurchase);
|
|
8166
|
+
const missingPaid = installable.filter((n) => !!n.requiresPurchase);
|
|
8160
8167
|
return {
|
|
8161
8168
|
installed,
|
|
8162
8169
|
missing,
|
|
8163
8170
|
missingPaid,
|
|
8171
|
+
unavailable,
|
|
8164
8172
|
canImport: missingPaid.length === 0
|
|
8165
8173
|
};
|
|
8166
8174
|
}
|
|
@@ -11179,12 +11187,15 @@ function DesktopSidebarFragment({
|
|
|
11179
11187
|
const notInstalled = allNodes.filter(
|
|
11180
11188
|
(n) => n.publishType !== "BUILTIN" && (!n.storeProductId || !installedAppIds.has(n.storeProductId))
|
|
11181
11189
|
);
|
|
11182
|
-
const
|
|
11183
|
-
const
|
|
11190
|
+
const unavailable = notInstalled.filter((n) => !n.storeProductId);
|
|
11191
|
+
const installable = notInstalled.filter((n) => !!n.storeProductId);
|
|
11192
|
+
const missing = installable.filter((n) => !n.requiresPurchase);
|
|
11193
|
+
const missingPaid = installable.filter((n) => !!n.requiresPurchase);
|
|
11184
11194
|
return {
|
|
11185
11195
|
installed,
|
|
11186
11196
|
missing,
|
|
11187
11197
|
missingPaid,
|
|
11198
|
+
unavailable,
|
|
11188
11199
|
canImport: missingPaid.length === 0
|
|
11189
11200
|
};
|
|
11190
11201
|
},
|
|
@@ -11514,7 +11525,7 @@ function DesktopSidebarFragment({
|
|
|
11514
11525
|
}
|
|
11515
11526
|
}
|
|
11516
11527
|
const nodeCheck = buildNodeCheck2(content);
|
|
11517
|
-
const needsConfig = content.requiredInputs && content.requiredInputs.length > 0 || nodeCheck.missing.length > 0 || nodeCheck.missingPaid.length > 0 || content.requiredCredentialTypes && content.requiredCredentialTypes.length > 0;
|
|
11528
|
+
const needsConfig = content.requiredInputs && content.requiredInputs.length > 0 || nodeCheck.missing.length > 0 || nodeCheck.missingPaid.length > 0 || (nodeCheck.unavailable?.length ?? 0) > 0 || content.requiredCredentialTypes && content.requiredCredentialTypes.length > 0;
|
|
11518
11529
|
if (needsConfig) {
|
|
11519
11530
|
setConfigTemplate(fullTemplate);
|
|
11520
11531
|
setConfigContent(content);
|
|
@@ -23305,5 +23316,5 @@ var FlowBuilderPage = ({
|
|
|
23305
23316
|
};
|
|
23306
23317
|
|
|
23307
23318
|
export { Card2 as Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ConnectionFormDialog, ConnectionSelector, EntityTagPicker, FLUIDGRIDS_ENTITY_TYPES, FlowBuilderPage, FluidGridsProvider, ProviderPicker, SchemaConnectionForm, ScopePicker, TemplateCard, buildNodeCheck, buildRequiredNodeTypes, listCustomBlocks, mergeStickyNotes, refetchStoreNodes, registerCustomBlock, resolveUiSpec, stripSubmitActions, tagLabel, useAvailableTags, useConnection, useConnectionDialog, useConnections, useConnectionsByProvider, useCreateConnection, useCreateTag, useDraftEntityTags, useEntityTags, useFluidGridsContext, useImportWorkflowTemplate, useInitiateOAuth, useInstalledNodes, useNodeExecution, useProviderByKey, useProviderCatalog, useProviders, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity, useWorkflowTemplates };
|
|
23308
|
-
//# sourceMappingURL=chunk-
|
|
23309
|
-
//# sourceMappingURL=chunk-
|
|
23319
|
+
//# sourceMappingURL=chunk-UVBJY5FB.js.map
|
|
23320
|
+
//# sourceMappingURL=chunk-UVBJY5FB.js.map
|