@uipath/apollo-react 4.14.1-pr556.aa710a0 → 4.15.0-pr605.2728a1c

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 (50) hide show
  1. package/dist/canvas/components/AddNodePanel/AddNodeManager.cjs +106 -10
  2. package/dist/canvas/components/AddNodePanel/AddNodeManager.d.ts.map +1 -1
  3. package/dist/canvas/components/AddNodePanel/AddNodeManager.js +106 -10
  4. package/dist/canvas/components/AddNodePanel/createAddNodePreview.cjs +29 -1
  5. package/dist/canvas/components/AddNodePanel/createAddNodePreview.d.ts +5 -1
  6. package/dist/canvas/components/AddNodePanel/createAddNodePreview.d.ts.map +1 -1
  7. package/dist/canvas/components/AddNodePanel/createAddNodePreview.js +29 -1
  8. package/dist/canvas/components/Edges/SequenceEdge.cjs +10 -8
  9. package/dist/canvas/components/Edges/SequenceEdge.d.ts.map +1 -1
  10. package/dist/canvas/components/Edges/SequenceEdge.js +10 -8
  11. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.cjs +9 -2
  12. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.d.ts.map +1 -1
  13. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.js +10 -3
  14. package/dist/canvas/components/LoopNode/LoopNode.constants.cjs +17 -5
  15. package/dist/canvas/components/LoopNode/LoopNode.constants.d.ts +3 -0
  16. package/dist/canvas/components/LoopNode/LoopNode.constants.d.ts.map +1 -1
  17. package/dist/canvas/components/LoopNode/LoopNode.constants.js +4 -1
  18. package/dist/canvas/components/LoopNode/LoopNode.helpers.cjs +65 -24
  19. package/dist/canvas/components/LoopNode/LoopNode.helpers.d.ts +29 -0
  20. package/dist/canvas/components/LoopNode/LoopNode.helpers.d.ts.map +1 -1
  21. package/dist/canvas/components/LoopNode/LoopNode.helpers.js +48 -22
  22. package/dist/canvas/components/LoopNode/LoopNode.sequence.cjs +433 -0
  23. package/dist/canvas/components/LoopNode/LoopNode.sequence.d.ts +57 -0
  24. package/dist/canvas/components/LoopNode/LoopNode.sequence.d.ts.map +1 -0
  25. package/dist/canvas/components/LoopNode/LoopNode.sequence.js +387 -0
  26. package/dist/canvas/components/LoopNode/LoopNodePreview.cjs +12 -13
  27. package/dist/canvas/components/LoopNode/LoopNodePreview.d.ts +1 -1
  28. package/dist/canvas/components/LoopNode/LoopNodePreview.d.ts.map +1 -1
  29. package/dist/canvas/components/LoopNode/LoopNodePreview.js +12 -13
  30. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.cjs +17 -2
  31. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.d.ts.map +1 -1
  32. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.js +17 -2
  33. package/dist/canvas/utils/NodeUtils.cjs +25 -9
  34. package/dist/canvas/utils/NodeUtils.d.ts +7 -0
  35. package/dist/canvas/utils/NodeUtils.d.ts.map +1 -1
  36. package/dist/canvas/utils/NodeUtils.js +13 -6
  37. package/dist/canvas/utils/container-sizing.cjs +169 -0
  38. package/dist/canvas/utils/container-sizing.d.ts +23 -0
  39. package/dist/canvas/utils/container-sizing.d.ts.map +1 -0
  40. package/dist/canvas/utils/container-sizing.js +132 -0
  41. package/dist/canvas/utils/createPreviewGraph.d.ts +1 -0
  42. package/dist/canvas/utils/createPreviewGraph.d.ts.map +1 -1
  43. package/dist/canvas/utils/createPreviewNode.cjs +29 -1
  44. package/dist/canvas/utils/createPreviewNode.d.ts.map +1 -1
  45. package/dist/canvas/utils/createPreviewNode.js +29 -1
  46. package/dist/canvas/utils/index.cjs +29 -22
  47. package/dist/canvas/utils/index.d.ts +1 -0
  48. package/dist/canvas/utils/index.d.ts.map +1 -1
  49. package/dist/canvas/utils/index.js +1 -0
  50. package/package.json +1 -1
@@ -33,8 +33,86 @@ const external_constants_cjs_namespaceObject = require("../../constants.cjs");
33
33
  const index_cjs_namespaceObject = require("../../core/index.cjs");
34
34
  const usePreviewNode_cjs_namespaceObject = require("../../hooks/usePreviewNode.cjs");
35
35
  const external_utils_index_cjs_namespaceObject = require("../../utils/index.cjs");
36
+ const collapse_cjs_namespaceObject = require("../../utils/collapse.cjs");
37
+ const container_sizing_cjs_namespaceObject = require("../../utils/container-sizing.cjs");
38
+ const manifest_resolver_cjs_namespaceObject = require("../../utils/manifest-resolver.cjs");
36
39
  const external_FloatingCanvasPanel_index_cjs_namespaceObject = require("../FloatingCanvasPanel/index.cjs");
40
+ const LoopNode_helpers_cjs_namespaceObject = require("../LoopNode/LoopNode.helpers.cjs");
41
+ const LoopNode_sequence_cjs_namespaceObject = require("../LoopNode/LoopNode.sequence.cjs");
37
42
  const external_AddNodePanel_cjs_namespaceObject = require("./AddNodePanel.cjs");
43
+ function getManifestForNode(registry, node) {
44
+ return node.type ? registry?.getManifest(node.type, (0, manifest_resolver_cjs_namespaceObject.getNodeTypeVersion)(node.data)) : void 0;
45
+ }
46
+ function getManifestAwareNodeDimensions(registry, node) {
47
+ const manifest = getManifestForNode(registry, node);
48
+ const fallbackDimensions = (0, collapse_cjs_namespaceObject.getExpandedSize)(manifest?.display.shape, manifest);
49
+ return (0, container_sizing_cjs_namespaceObject.getNodeDimensions)(node, fallbackDimensions);
50
+ }
51
+ function getContainerFitGeometry(registry, node) {
52
+ const manifest = getManifestForNode(registry, node);
53
+ return (0, LoopNode_helpers_cjs_namespaceObject.isLoopContainerManifest)(manifest) ? (0, LoopNode_helpers_cjs_namespaceObject.getLoopContainerFitGeometry)() : null;
54
+ }
55
+ function centerNodeOnPreview(previewNode, nodeDimensions) {
56
+ const previewDimensions = (0, container_sizing_cjs_namespaceObject.getNodeDimensions)(previewNode);
57
+ return {
58
+ x: previewNode.position.x + (previewDimensions.width - nodeDimensions.width) / 2,
59
+ y: previewNode.position.y + (previewDimensions.height - nodeDimensions.height) / 2
60
+ };
61
+ }
62
+ function centerNodeVerticallyOnPreview(previewNode, nodeDimensions) {
63
+ const previewDimensions = (0, container_sizing_cjs_namespaceObject.getNodeDimensions)(previewNode);
64
+ return {
65
+ x: previewNode.position.x,
66
+ y: previewNode.position.y + (previewDimensions.height - nodeDimensions.height) / 2
67
+ };
68
+ }
69
+ function resolveSiblingCollisions(nodes, insertedNode, options) {
70
+ const siblingNodes = nodes.filter((node)=>node.parentId === insertedNode.parentId);
71
+ const resolvedSiblings = (0, external_utils_index_cjs_namespaceObject.resolveCollisions)(siblingNodes, options);
72
+ const resolvedSiblingsById = new Map(resolvedSiblings.map((node)=>[
73
+ node.id,
74
+ node
75
+ ]));
76
+ return nodes.map((node)=>resolvedSiblingsById.get(node.id) ?? node);
77
+ }
78
+ function resolveNodePlacement(nodes, insertedNode, registry, ignoredNodeTypes, edges, loopSequencePlacement) {
79
+ const getNodeSize = (node)=>getManifestAwareNodeDimensions(registry, node);
80
+ if (!insertedNode.parentId) {
81
+ const resolvedNodes = (0, external_utils_index_cjs_namespaceObject.resolveCollisions)(nodes, {
82
+ ignoredNodeTypes,
83
+ getNodeSize
84
+ });
85
+ return {
86
+ nodes: resolvedNodes,
87
+ insertedNode: resolvedNodes.find((node)=>node.id === insertedNode.id) ?? insertedNode
88
+ };
89
+ }
90
+ const loopSequenceNodes = loopSequencePlacement ? (0, LoopNode_sequence_cjs_namespaceObject.resolveLoopSequenceMaterializedNodes)({
91
+ nodes,
92
+ edges,
93
+ insertedNode,
94
+ placement: loopSequencePlacement,
95
+ getNodeSize
96
+ }) : null;
97
+ let resolvedNodes = loopSequenceNodes;
98
+ if (!resolvedNodes) resolvedNodes = resolveSiblingCollisions(nodes, insertedNode, {
99
+ ignoredNodeTypes,
100
+ getNodeSize
101
+ });
102
+ const fittedNodes = (0, container_sizing_cjs_namespaceObject.ensureContainersFitChildren)(resolvedNodes, {
103
+ containerIds: [
104
+ insertedNode.parentId
105
+ ],
106
+ getContainerFitGeometry: (node)=>getContainerFitGeometry(registry, node),
107
+ getNodeDimensions: getNodeSize,
108
+ ignoredNodeTypes,
109
+ includeAncestors: true
110
+ });
111
+ return {
112
+ nodes: fittedNodes,
113
+ insertedNode: fittedNodes.find((node)=>node.id === insertedNode.id) ?? insertedNode
114
+ };
115
+ }
38
116
  const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData, onBeforeNodeAdded, onNodeAdded, ignoredNodeTypes })=>{
39
117
  const reactFlowInstance = (0, react_cjs_namespaceObject.useReactFlow)();
40
118
  const registry = (0, index_cjs_namespaceObject.useOptionalNodeTypeRegistry)();
@@ -70,28 +148,45 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
70
148
  const handleNodeSelect = (0, external_react_namespaceObject.useCallback)((nodeItem)=>{
71
149
  const currentPreviewNode = reactFlowInstance.getNode(external_constants_cjs_namespaceObject.PREVIEW_NODE_ID);
72
150
  if (!currentPreviewNode || !previewNodeConnectionInfo || 0 === previewNodeConnectionInfo.length) return;
151
+ const loopSequenceResolverOptions = (0, LoopNode_sequence_cjs_namespaceObject.createLoopSequenceResolverOptions)(registry);
152
+ const loopSequencePlacement = (0, LoopNode_sequence_cjs_namespaceObject.getLoopSequencePlacementFromPreviewGraph)(currentPreviewNode, previewNodeConnectionInfo, {
153
+ isLoopContainerId: (containerId)=>{
154
+ const containerNode = reactFlowInstance.getNode(containerId);
155
+ return containerNode ? loopSequenceResolverOptions.isLoopContainerNode?.(containerNode) ?? false : false;
156
+ }
157
+ });
73
158
  const newNodeId = `${nodeItem.data.type}-${Date.now()}`;
74
159
  const baseNodeData = createNodeData ? createNodeData(nodeItem) : {
75
160
  label: nodeItem.name,
76
161
  subLabel: nodeItem.description
77
162
  };
78
- const nodeData = currentPreviewNode.data?.useSmartHandles ? {
163
+ const nodeData = {
79
164
  ...baseNodeData,
80
- useSmartHandles: true
81
- } : baseNodeData;
165
+ ...nodeItem.data.version ? {
166
+ typeVersion: nodeItem.data.version
167
+ } : {},
168
+ ...currentPreviewNode.data?.useSmartHandles ? {
169
+ useSmartHandles: true
170
+ } : {}
171
+ };
82
172
  const newNode = {
83
173
  id: newNodeId,
84
174
  type: nodeItem.data.type,
85
175
  position: currentPreviewNode.position,
176
+ parentId: currentPreviewNode.parentId,
177
+ extent: currentPreviewNode.extent,
86
178
  selected: true,
87
179
  data: nodeData
88
180
  };
89
- const newNodeManifest = registry?.getManifest(nodeItem.data.type);
181
+ const newNodeManifest = registry?.getManifest(nodeItem.data.type, nodeItem.data.version);
182
+ const newNodeDimensions = getManifestAwareNodeDimensions(registry, newNode);
183
+ if (currentPreviewNode.parentId) newNode.position = centerNodeOnPreview(currentPreviewNode, newNodeDimensions);
184
+ else if ((0, LoopNode_helpers_cjs_namespaceObject.isLoopContainerManifest)(newNodeManifest)) newNode.position = centerNodeVerticallyOnPreview(currentPreviewNode, newNodeDimensions);
90
185
  const newEdges = [];
91
186
  const previewEdgeIds = [];
92
187
  for (const connectionInfoItem of previewNodeConnectionInfo){
93
188
  const newNodeHandleType = connectionInfoItem.addNewNodeAsSource ? 'source' : 'target';
94
- const newNodeDefaultHandle = newNodeManifest ? registry?.getDefaultHandle(newNodeManifest.nodeType, newNodeHandleType) : void 0;
189
+ const newNodeDefaultHandle = newNodeManifest ? registry?.getDefaultHandle(newNodeManifest.nodeType, newNodeHandleType, nodeItem.data.version) : void 0;
95
190
  const newNodeHandleId = newNodeDefaultHandle?.id;
96
191
  const edgeSourceTargetData = connectionInfoItem.addNewNodeAsSource ? {
97
192
  source: newNode.id,
@@ -116,6 +211,7 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
116
211
  newNode,
117
212
  newEdges
118
213
  };
214
+ let resolvedFinalNode = finalNode;
119
215
  reactFlowInstance.setNodes((nodes)=>{
120
216
  const newNodes = [
121
217
  ...nodes.filter((n)=>n.id !== external_constants_cjs_namespaceObject.PREVIEW_NODE_ID).map((n)=>({
@@ -124,9 +220,9 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
124
220
  })),
125
221
  finalNode
126
222
  ];
127
- return (0, external_utils_index_cjs_namespaceObject.resolveCollisions)(newNodes, {
128
- ignoredNodeTypes
129
- });
223
+ const placement = resolveNodePlacement(newNodes, finalNode, registry, ignoredNodeTypes, reactFlowInstance.getEdges(), loopSequencePlacement);
224
+ resolvedFinalNode = placement.insertedNode;
225
+ return placement.nodes;
130
226
  });
131
227
  reactFlowInstance.setEdges((edges)=>[
132
228
  ...edges.filter((e)=>!previewEdgeIds.includes(e.id)),
@@ -134,7 +230,7 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
134
230
  ]);
135
231
  const [firstConnection] = previewNodeConnectionInfo;
136
232
  if (firstConnection) {
137
- const firstEdgeSourceHandle = firstConnection.addNewNodeAsSource ? newNodeManifest && registry?.getDefaultHandle(newNodeManifest.nodeType, 'source')?.id : firstConnection.existingHandleId;
233
+ const firstEdgeSourceHandle = firstConnection.addNewNodeAsSource ? newNodeManifest && registry?.getDefaultHandle(newNodeManifest.nodeType, 'source', nodeItem.data.version)?.id : firstConnection.existingHandleId;
138
234
  const firstEdgeData = firstConnection.addNewNodeAsSource ? {
139
235
  source: finalNode.id,
140
236
  sourceHandle: firstEdgeSourceHandle ?? 'output'
@@ -142,7 +238,7 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
142
238
  source: firstConnection.existingNodeId,
143
239
  sourceHandle: firstConnection.existingHandleId
144
240
  };
145
- onNodeAdded?.(firstEdgeData.source, firstEdgeData.sourceHandle, finalNode);
241
+ onNodeAdded?.(firstEdgeData.source, firstEdgeData.sourceHandle, resolvedFinalNode);
146
242
  }
147
243
  restoreEdgesRef.current = null;
148
244
  handleClose();
@@ -1 +1 @@
1
- {"version":3,"file":"AddNodeManager.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/AddNodePanel/AddNodeManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,0CAA0C,CAAC;AAE3E,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAKlC,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC;IAI7E,YAAY,CAAC,EAAE,OAAO,CAAC;IAIvB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAK7F,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,YAAY,CAAC;IAOtE,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,IAAI,EAAE,CAAA;KAAE,CAAC;IAK7F,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC;IAMpF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AASD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAqMxD,CAAC"}
1
+ {"version":3,"file":"AddNodeManager.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/AddNodePanel/AddNodeManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,0CAA0C,CAAC;AAE3E,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAKlC,WAAW,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC;IAI7E,YAAY,CAAC,EAAE,OAAO,CAAC;IAIvB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAK7F,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,YAAY,CAAC;IAOtE,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,IAAI,EAAE,CAAA;KAAE,CAAC;IAK7F,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC;IAMpF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAsHD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA0OxD,CAAC"}
@@ -5,8 +5,86 @@ import { FLOATING_CANVAS_PANEL_OFFSET, PREVIEW_NODE_ID } from "../../constants.j
5
5
  import { useOptionalNodeTypeRegistry } from "../../core/index.js";
6
6
  import { usePreviewNode } from "../../hooks/usePreviewNode.js";
7
7
  import { resolveCollisions } from "../../utils/index.js";
8
+ import { getExpandedSize } from "../../utils/collapse.js";
9
+ import { ensureContainersFitChildren, getNodeDimensions } from "../../utils/container-sizing.js";
10
+ import { getNodeTypeVersion } from "../../utils/manifest-resolver.js";
8
11
  import { FloatingCanvasPanel } from "../FloatingCanvasPanel/index.js";
12
+ import { getLoopContainerFitGeometry, isLoopContainerManifest } from "../LoopNode/LoopNode.helpers.js";
13
+ import { createLoopSequenceResolverOptions, getLoopSequencePlacementFromPreviewGraph, resolveLoopSequenceMaterializedNodes } from "../LoopNode/LoopNode.sequence.js";
9
14
  import { AddNodePanel } from "./AddNodePanel.js";
15
+ function getManifestForNode(registry, node) {
16
+ return node.type ? registry?.getManifest(node.type, getNodeTypeVersion(node.data)) : void 0;
17
+ }
18
+ function getManifestAwareNodeDimensions(registry, node) {
19
+ const manifest = getManifestForNode(registry, node);
20
+ const fallbackDimensions = getExpandedSize(manifest?.display.shape, manifest);
21
+ return getNodeDimensions(node, fallbackDimensions);
22
+ }
23
+ function getContainerFitGeometry(registry, node) {
24
+ const manifest = getManifestForNode(registry, node);
25
+ return isLoopContainerManifest(manifest) ? getLoopContainerFitGeometry() : null;
26
+ }
27
+ function centerNodeOnPreview(previewNode, nodeDimensions) {
28
+ const previewDimensions = getNodeDimensions(previewNode);
29
+ return {
30
+ x: previewNode.position.x + (previewDimensions.width - nodeDimensions.width) / 2,
31
+ y: previewNode.position.y + (previewDimensions.height - nodeDimensions.height) / 2
32
+ };
33
+ }
34
+ function centerNodeVerticallyOnPreview(previewNode, nodeDimensions) {
35
+ const previewDimensions = getNodeDimensions(previewNode);
36
+ return {
37
+ x: previewNode.position.x,
38
+ y: previewNode.position.y + (previewDimensions.height - nodeDimensions.height) / 2
39
+ };
40
+ }
41
+ function resolveSiblingCollisions(nodes, insertedNode, options) {
42
+ const siblingNodes = nodes.filter((node)=>node.parentId === insertedNode.parentId);
43
+ const resolvedSiblings = resolveCollisions(siblingNodes, options);
44
+ const resolvedSiblingsById = new Map(resolvedSiblings.map((node)=>[
45
+ node.id,
46
+ node
47
+ ]));
48
+ return nodes.map((node)=>resolvedSiblingsById.get(node.id) ?? node);
49
+ }
50
+ function resolveNodePlacement(nodes, insertedNode, registry, ignoredNodeTypes, edges, loopSequencePlacement) {
51
+ const getNodeSize = (node)=>getManifestAwareNodeDimensions(registry, node);
52
+ if (!insertedNode.parentId) {
53
+ const resolvedNodes = resolveCollisions(nodes, {
54
+ ignoredNodeTypes,
55
+ getNodeSize
56
+ });
57
+ return {
58
+ nodes: resolvedNodes,
59
+ insertedNode: resolvedNodes.find((node)=>node.id === insertedNode.id) ?? insertedNode
60
+ };
61
+ }
62
+ const loopSequenceNodes = loopSequencePlacement ? resolveLoopSequenceMaterializedNodes({
63
+ nodes,
64
+ edges,
65
+ insertedNode,
66
+ placement: loopSequencePlacement,
67
+ getNodeSize
68
+ }) : null;
69
+ let resolvedNodes = loopSequenceNodes;
70
+ if (!resolvedNodes) resolvedNodes = resolveSiblingCollisions(nodes, insertedNode, {
71
+ ignoredNodeTypes,
72
+ getNodeSize
73
+ });
74
+ const fittedNodes = ensureContainersFitChildren(resolvedNodes, {
75
+ containerIds: [
76
+ insertedNode.parentId
77
+ ],
78
+ getContainerFitGeometry: (node)=>getContainerFitGeometry(registry, node),
79
+ getNodeDimensions: getNodeSize,
80
+ ignoredNodeTypes,
81
+ includeAncestors: true
82
+ });
83
+ return {
84
+ nodes: fittedNodes,
85
+ insertedNode: fittedNodes.find((node)=>node.id === insertedNode.id) ?? insertedNode
86
+ };
87
+ }
10
88
  const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData, onBeforeNodeAdded, onNodeAdded, ignoredNodeTypes })=>{
11
89
  const reactFlowInstance = useReactFlow();
12
90
  const registry = useOptionalNodeTypeRegistry();
@@ -42,28 +120,45 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
42
120
  const handleNodeSelect = useCallback((nodeItem)=>{
43
121
  const currentPreviewNode = reactFlowInstance.getNode(PREVIEW_NODE_ID);
44
122
  if (!currentPreviewNode || !previewNodeConnectionInfo || 0 === previewNodeConnectionInfo.length) return;
123
+ const loopSequenceResolverOptions = createLoopSequenceResolverOptions(registry);
124
+ const loopSequencePlacement = getLoopSequencePlacementFromPreviewGraph(currentPreviewNode, previewNodeConnectionInfo, {
125
+ isLoopContainerId: (containerId)=>{
126
+ const containerNode = reactFlowInstance.getNode(containerId);
127
+ return containerNode ? loopSequenceResolverOptions.isLoopContainerNode?.(containerNode) ?? false : false;
128
+ }
129
+ });
45
130
  const newNodeId = `${nodeItem.data.type}-${Date.now()}`;
46
131
  const baseNodeData = createNodeData ? createNodeData(nodeItem) : {
47
132
  label: nodeItem.name,
48
133
  subLabel: nodeItem.description
49
134
  };
50
- const nodeData = currentPreviewNode.data?.useSmartHandles ? {
135
+ const nodeData = {
51
136
  ...baseNodeData,
52
- useSmartHandles: true
53
- } : baseNodeData;
137
+ ...nodeItem.data.version ? {
138
+ typeVersion: nodeItem.data.version
139
+ } : {},
140
+ ...currentPreviewNode.data?.useSmartHandles ? {
141
+ useSmartHandles: true
142
+ } : {}
143
+ };
54
144
  const newNode = {
55
145
  id: newNodeId,
56
146
  type: nodeItem.data.type,
57
147
  position: currentPreviewNode.position,
148
+ parentId: currentPreviewNode.parentId,
149
+ extent: currentPreviewNode.extent,
58
150
  selected: true,
59
151
  data: nodeData
60
152
  };
61
- const newNodeManifest = registry?.getManifest(nodeItem.data.type);
153
+ const newNodeManifest = registry?.getManifest(nodeItem.data.type, nodeItem.data.version);
154
+ const newNodeDimensions = getManifestAwareNodeDimensions(registry, newNode);
155
+ if (currentPreviewNode.parentId) newNode.position = centerNodeOnPreview(currentPreviewNode, newNodeDimensions);
156
+ else if (isLoopContainerManifest(newNodeManifest)) newNode.position = centerNodeVerticallyOnPreview(currentPreviewNode, newNodeDimensions);
62
157
  const newEdges = [];
63
158
  const previewEdgeIds = [];
64
159
  for (const connectionInfoItem of previewNodeConnectionInfo){
65
160
  const newNodeHandleType = connectionInfoItem.addNewNodeAsSource ? 'source' : 'target';
66
- const newNodeDefaultHandle = newNodeManifest ? registry?.getDefaultHandle(newNodeManifest.nodeType, newNodeHandleType) : void 0;
161
+ const newNodeDefaultHandle = newNodeManifest ? registry?.getDefaultHandle(newNodeManifest.nodeType, newNodeHandleType, nodeItem.data.version) : void 0;
67
162
  const newNodeHandleId = newNodeDefaultHandle?.id;
68
163
  const edgeSourceTargetData = connectionInfoItem.addNewNodeAsSource ? {
69
164
  source: newNode.id,
@@ -88,6 +183,7 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
88
183
  newNode,
89
184
  newEdges
90
185
  };
186
+ let resolvedFinalNode = finalNode;
91
187
  reactFlowInstance.setNodes((nodes)=>{
92
188
  const newNodes = [
93
189
  ...nodes.filter((n)=>n.id !== PREVIEW_NODE_ID).map((n)=>({
@@ -96,9 +192,9 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
96
192
  })),
97
193
  finalNode
98
194
  ];
99
- return resolveCollisions(newNodes, {
100
- ignoredNodeTypes
101
- });
195
+ const placement = resolveNodePlacement(newNodes, finalNode, registry, ignoredNodeTypes, reactFlowInstance.getEdges(), loopSequencePlacement);
196
+ resolvedFinalNode = placement.insertedNode;
197
+ return placement.nodes;
102
198
  });
103
199
  reactFlowInstance.setEdges((edges)=>[
104
200
  ...edges.filter((e)=>!previewEdgeIds.includes(e.id)),
@@ -106,7 +202,7 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
106
202
  ]);
107
203
  const [firstConnection] = previewNodeConnectionInfo;
108
204
  if (firstConnection) {
109
- const firstEdgeSourceHandle = firstConnection.addNewNodeAsSource ? newNodeManifest && registry?.getDefaultHandle(newNodeManifest.nodeType, 'source')?.id : firstConnection.existingHandleId;
205
+ const firstEdgeSourceHandle = firstConnection.addNewNodeAsSource ? newNodeManifest && registry?.getDefaultHandle(newNodeManifest.nodeType, 'source', nodeItem.data.version)?.id : firstConnection.existingHandleId;
110
206
  const firstEdgeData = firstConnection.addNewNodeAsSource ? {
111
207
  source: finalNode.id,
112
208
  sourceHandle: firstEdgeSourceHandle ?? 'output'
@@ -114,7 +210,7 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
114
210
  source: firstConnection.existingNodeId,
115
211
  sourceHandle: firstConnection.existingHandleId
116
212
  };
117
- onNodeAdded?.(firstEdgeData.source, firstEdgeData.sourceHandle, finalNode);
213
+ onNodeAdded?.(firstEdgeData.source, firstEdgeData.sourceHandle, resolvedFinalNode);
118
214
  }
119
215
  restoreEdgesRef.current = null;
120
216
  handleClose();
@@ -28,7 +28,35 @@ __webpack_require__.d(__webpack_exports__, {
28
28
  });
29
29
  const react_cjs_namespaceObject = require("../../xyflow/react.cjs");
30
30
  const createPreviewGraph_cjs_namespaceObject = require("../../utils/createPreviewGraph.cjs");
31
- function createAddNodePreview(sourceNodeId, sourceHandleId, reactFlowInstance, handlePosition = react_cjs_namespaceObject.Position.Right, sourceHandleType = 'source', ignoredNodeTypes = []) {
31
+ const LoopNode_sequence_cjs_namespaceObject = require("../LoopNode/LoopNode.sequence.cjs");
32
+ function normalizeOptions(options) {
33
+ return Array.isArray(options) ? {
34
+ ignoredNodeTypes: options
35
+ } : options;
36
+ }
37
+ function createAddNodePreview(sourceNodeId, sourceHandleId, reactFlowInstance, handlePosition = react_cjs_namespaceObject.Position.Right, sourceHandleType = 'source', options = []) {
38
+ const { ignoredNodeTypes = [], ...providedResolverOptions } = normalizeOptions(options);
39
+ const resolverOptions = {
40
+ ...(0, LoopNode_sequence_cjs_namespaceObject.createLoopSequenceResolverOptions)(null),
41
+ ...providedResolverOptions
42
+ };
43
+ if ('source' === sourceHandleType) {
44
+ const loopPreview = (0, LoopNode_sequence_cjs_namespaceObject.resolveLoopAddNodePreview)({
45
+ sourceNodeId,
46
+ sourceHandleId,
47
+ reactFlowInstance,
48
+ resolverOptions
49
+ });
50
+ if ('create-preview' === loopPreview.action) return void (0, createPreviewGraph_cjs_namespaceObject.showPreviewGraph)({
51
+ sourceNodeId,
52
+ sourceHandleId,
53
+ reactFlowInstance,
54
+ sourceHandleType,
55
+ handlePosition,
56
+ ignoredNodeTypes,
57
+ ...loopPreview.previewGraphOptions
58
+ });
59
+ }
32
60
  (0, createPreviewGraph_cjs_namespaceObject.showPreviewGraph)({
33
61
  sourceNodeId,
34
62
  sourceHandleId,
@@ -1,3 +1,7 @@
1
1
  import { Position, type ReactFlowInstance } from '../../xyflow/react.ts';
2
- export declare function createAddNodePreview(sourceNodeId: string, sourceHandleId: string, reactFlowInstance: ReactFlowInstance, handlePosition?: Position, sourceHandleType?: 'source' | 'target', ignoredNodeTypes?: string[]): void;
2
+ import { type LoopSequenceResolverOptions } from '../LoopNode/LoopNode.sequence';
3
+ export interface CreateAddNodePreviewOptions extends LoopSequenceResolverOptions {
4
+ ignoredNodeTypes?: string[];
5
+ }
6
+ export declare function createAddNodePreview(sourceNodeId: string, sourceHandleId: string, reactFlowInstance: ReactFlowInstance, handlePosition?: Position, sourceHandleType?: 'source' | 'target', options?: string[] | CreateAddNodePreviewOptions): void;
3
7
  //# sourceMappingURL=createAddNodePreview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createAddNodePreview.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/AddNodePanel/createAddNodePreview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAa5F,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,GAAE,QAAyB,EACzC,gBAAgB,GAAE,QAAQ,GAAG,QAAmB,EAChD,gBAAgB,GAAE,MAAM,EAAO,GAC9B,IAAI,CASN"}
1
+ {"version":3,"file":"createAddNodePreview.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/AddNodePanel/createAddNodePreview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE5F,OAAO,EAEL,KAAK,2BAA2B,EAEjC,MAAM,+BAA+B,CAAC;AAEvC,MAAM,WAAW,2BAA4B,SAAQ,2BAA2B;IAC9E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAkBD,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,GAAE,QAAyB,EACzC,gBAAgB,GAAE,QAAQ,GAAG,QAAmB,EAChD,OAAO,GAAE,MAAM,EAAE,GAAG,2BAAgC,GACnD,IAAI,CAqCN"}
@@ -1,6 +1,34 @@
1
1
  import { Position } from "../../xyflow/react.js";
2
2
  import { showPreviewGraph } from "../../utils/createPreviewGraph.js";
3
- function createAddNodePreview(sourceNodeId, sourceHandleId, reactFlowInstance, handlePosition = Position.Right, sourceHandleType = 'source', ignoredNodeTypes = []) {
3
+ import { createLoopSequenceResolverOptions, resolveLoopAddNodePreview } from "../LoopNode/LoopNode.sequence.js";
4
+ function normalizeOptions(options) {
5
+ return Array.isArray(options) ? {
6
+ ignoredNodeTypes: options
7
+ } : options;
8
+ }
9
+ function createAddNodePreview(sourceNodeId, sourceHandleId, reactFlowInstance, handlePosition = Position.Right, sourceHandleType = 'source', options = []) {
10
+ const { ignoredNodeTypes = [], ...providedResolverOptions } = normalizeOptions(options);
11
+ const resolverOptions = {
12
+ ...createLoopSequenceResolverOptions(null),
13
+ ...providedResolverOptions
14
+ };
15
+ if ('source' === sourceHandleType) {
16
+ const loopPreview = resolveLoopAddNodePreview({
17
+ sourceNodeId,
18
+ sourceHandleId,
19
+ reactFlowInstance,
20
+ resolverOptions
21
+ });
22
+ if ('create-preview' === loopPreview.action) return void showPreviewGraph({
23
+ sourceNodeId,
24
+ sourceHandleId,
25
+ reactFlowInstance,
26
+ sourceHandleType,
27
+ handlePosition,
28
+ ignoredNodeTypes,
29
+ ...loopPreview.previewGraphOptions
30
+ });
31
+ }
4
32
  showPreviewGraph({
5
33
  sourceNodeId,
6
34
  sourceHandleId,
@@ -92,6 +92,8 @@ const SequenceEdge_SequenceEdge = /*#__PURE__*/ (0, external_react_namespaceObje
92
92
  const status = executionStatus ? executionStatus?.status ?? executionStatus : validationStatus;
93
93
  const isDiffAdded = data?.isDiffAdded === true;
94
94
  const isDiffRemoved = data?.isDiffRemoved === true;
95
+ const hideArrowHead = data?.hideArrowHead === true;
96
+ const hideToolbar = data?.hideToolbar === true;
95
97
  const angle = ANGLE_MAP[targetPosition];
96
98
  const { x: offsetX, y: offsetY } = ARROW_OFFSETS[targetPosition];
97
99
  const { edgePath, labelX, labelY } = (0, index_cjs_namespaceObject.useEdgePath)({
@@ -102,8 +104,8 @@ const SequenceEdge_SequenceEdge = /*#__PURE__*/ (0, external_react_namespaceObje
102
104
  sourceX,
103
105
  sourceY,
104
106
  sourcePosition,
105
- targetX,
106
- targetY,
107
+ targetX: hideArrowHead ? targetX + offsetX : targetX,
108
+ targetY: hideArrowHead ? targetY + offsetY : targetY,
107
109
  targetPosition
108
110
  });
109
111
  const { showToolbar, toolbarPositioning, config: toolbarConfig, handleMouseMoveOnPath } = (0, external_Toolbar_index_cjs_namespaceObject.useEdgeToolbarState)({
@@ -170,12 +172,12 @@ const SequenceEdge_SequenceEdge = /*#__PURE__*/ (0, external_react_namespaceObje
170
172
  },
171
173
  ref: pathElementRef
172
174
  }),
173
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("polygon", {
175
+ !hideArrowHead && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("polygon", {
174
176
  points: `
175
- ${targetX},${targetY}
176
- ${targetX - ARROW_SIZE * Math.cos(angle - Math.PI / 6)},${targetY - ARROW_SIZE * Math.sin(angle - Math.PI / 6)}
177
- ${targetX - ARROW_SIZE * Math.cos(angle + Math.PI / 6)},${targetY - ARROW_SIZE * Math.sin(angle + Math.PI / 6)}
178
- `,
177
+ ${targetX},${targetY}
178
+ ${targetX - ARROW_SIZE * Math.cos(angle - Math.PI / 6)},${targetY - ARROW_SIZE * Math.sin(angle - Math.PI / 6)}
179
+ ${targetX - ARROW_SIZE * Math.cos(angle + Math.PI / 6)},${targetY - ARROW_SIZE * Math.sin(angle + Math.PI / 6)}
180
+ `,
179
181
  fill: edgeColor,
180
182
  style: {
181
183
  pointerEvents: 'none',
@@ -215,7 +217,7 @@ const SequenceEdge_SequenceEdge = /*#__PURE__*/ (0, external_react_namespaceObje
215
217
  })
216
218
  ]
217
219
  }),
218
- showToolbar && toolbarPositioning && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbar_index_cjs_namespaceObject.EdgeToolbar, {
220
+ !hideToolbar && showToolbar && toolbarPositioning && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbar_index_cjs_namespaceObject.EdgeToolbar, {
219
221
  edgeId: id,
220
222
  visible: showToolbar,
221
223
  positioning: toolbarPositioning,
@@ -1 +1 @@
1
- {"version":3,"file":"SequenceEdge.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/Edges/SequenceEdge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,0CAA0C,CAAC;AAoDpF,eAAO,MAAM,YAAY,iDAuMJ,CAAC"}
1
+ {"version":3,"file":"SequenceEdge.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/Edges/SequenceEdge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,0CAA0C,CAAC;AAoDpF,eAAO,MAAM,YAAY,iDA+MJ,CAAC"}
@@ -64,6 +64,8 @@ const SequenceEdge_SequenceEdge = /*#__PURE__*/ memo(function({ id, selected, so
64
64
  const status = executionStatus ? executionStatus?.status ?? executionStatus : validationStatus;
65
65
  const isDiffAdded = data?.isDiffAdded === true;
66
66
  const isDiffRemoved = data?.isDiffRemoved === true;
67
+ const hideArrowHead = data?.hideArrowHead === true;
68
+ const hideToolbar = data?.hideToolbar === true;
67
69
  const angle = ANGLE_MAP[targetPosition];
68
70
  const { x: offsetX, y: offsetY } = ARROW_OFFSETS[targetPosition];
69
71
  const { edgePath, labelX, labelY } = useEdgePath({
@@ -74,8 +76,8 @@ const SequenceEdge_SequenceEdge = /*#__PURE__*/ memo(function({ id, selected, so
74
76
  sourceX,
75
77
  sourceY,
76
78
  sourcePosition,
77
- targetX,
78
- targetY,
79
+ targetX: hideArrowHead ? targetX + offsetX : targetX,
80
+ targetY: hideArrowHead ? targetY + offsetY : targetY,
79
81
  targetPosition
80
82
  });
81
83
  const { showToolbar, toolbarPositioning, config: toolbarConfig, handleMouseMoveOnPath } = useEdgeToolbarState({
@@ -142,12 +144,12 @@ const SequenceEdge_SequenceEdge = /*#__PURE__*/ memo(function({ id, selected, so
142
144
  },
143
145
  ref: pathElementRef
144
146
  }),
145
- /*#__PURE__*/ jsx("polygon", {
147
+ !hideArrowHead && /*#__PURE__*/ jsx("polygon", {
146
148
  points: `
147
- ${targetX},${targetY}
148
- ${targetX - ARROW_SIZE * Math.cos(angle - Math.PI / 6)},${targetY - ARROW_SIZE * Math.sin(angle - Math.PI / 6)}
149
- ${targetX - ARROW_SIZE * Math.cos(angle + Math.PI / 6)},${targetY - ARROW_SIZE * Math.sin(angle + Math.PI / 6)}
150
- `,
149
+ ${targetX},${targetY}
150
+ ${targetX - ARROW_SIZE * Math.cos(angle - Math.PI / 6)},${targetY - ARROW_SIZE * Math.sin(angle - Math.PI / 6)}
151
+ ${targetX - ARROW_SIZE * Math.cos(angle + Math.PI / 6)},${targetY - ARROW_SIZE * Math.sin(angle + Math.PI / 6)}
152
+ `,
151
153
  fill: edgeColor,
152
154
  style: {
153
155
  pointerEvents: 'none',
@@ -187,7 +189,7 @@ const SequenceEdge_SequenceEdge = /*#__PURE__*/ memo(function({ id, selected, so
187
189
  })
188
190
  ]
189
191
  }),
190
- showToolbar && toolbarPositioning && /*#__PURE__*/ jsx(EdgeToolbar, {
192
+ !hideToolbar && showToolbar && toolbarPositioning && /*#__PURE__*/ jsx(EdgeToolbar, {
191
193
  edgeId: id,
192
194
  visible: showToolbar,
193
195
  positioning: toolbarPositioning,
@@ -35,6 +35,7 @@ const canvasStore_cjs_namespaceObject = require("../../stores/canvasStore.cjs");
35
35
  const CanvasEventBus_cjs_namespaceObject = require("../../utils/CanvasEventBus.cjs");
36
36
  const icon_registry_cjs_namespaceObject = require("../../utils/icon-registry.cjs");
37
37
  const createAddNodePreview_cjs_namespaceObject = require("../AddNodePanel/createAddNodePreview.cjs");
38
+ const LoopNode_sequence_cjs_namespaceObject = require("../LoopNode/LoopNode.sequence.cjs");
38
39
  const external_HierarchicalCanvas_cjs_namespaceObject = require("./HierarchicalCanvas.cjs");
39
40
  const createDemoCanvases = ()=>{
40
41
  const rootCanvas = {
@@ -325,6 +326,7 @@ const workflowManifest = {
325
326
  };
326
327
  const CanvasWithControlsContent = ({ initialCanvases, initialPath, onCanvasesChange, onPathChange })=>{
327
328
  const reactFlowInstance = (0, react_cjs_namespaceObject.useReactFlow)();
329
+ const registry = (0, index_cjs_namespaceObject.useOptionalNodeTypeRegistry)();
328
330
  const currentCanvas = (0, canvasStore_cjs_namespaceObject.useCanvasStore)(canvasStore_cjs_namespaceObject.selectCurrentCanvas);
329
331
  const currentPathLength = (0, canvasStore_cjs_namespaceObject.useCanvasStore)(canvasStore_cjs_namespaceObject.selectCurrentPathLength);
330
332
  const addNode = (0, canvasStore_cjs_namespaceObject.useCanvasStore)(canvasStore_cjs_namespaceObject.selectAddNode);
@@ -332,15 +334,20 @@ const CanvasWithControlsContent = ({ initialCanvases, initialPath, onCanvasesCha
332
334
  const removeEdge = (0, canvasStore_cjs_namespaceObject.useCanvasStore)(canvasStore_cjs_namespaceObject.selectRemoveEdge);
333
335
  const updateNodes = (0, canvasStore_cjs_namespaceObject.useCanvasStore)(canvasStore_cjs_namespaceObject.selectUpdateNodes);
334
336
  (0, external_react_namespaceObject.useEffect)(()=>{
337
+ const resolverOptions = (0, LoopNode_sequence_cjs_namespaceObject.createLoopSequenceResolverOptions)(registry);
335
338
  const handleAction = (event)=>{
336
- if (reactFlowInstance) (0, createAddNodePreview_cjs_namespaceObject.createAddNodePreview)(event.nodeId, event.handleId, reactFlowInstance);
339
+ if (reactFlowInstance) {
340
+ const sourceHandleType = 'input' === event.handleType ? 'target' : 'source';
341
+ (0, createAddNodePreview_cjs_namespaceObject.createAddNodePreview)(event.nodeId, event.handleId, reactFlowInstance, event.position, sourceHandleType, resolverOptions);
342
+ }
337
343
  };
338
344
  CanvasEventBus_cjs_namespaceObject.canvasEventBus.on('handle:action', handleAction);
339
345
  return ()=>{
340
346
  CanvasEventBus_cjs_namespaceObject.canvasEventBus.off('handle:action', handleAction);
341
347
  };
342
348
  }, [
343
- reactFlowInstance
349
+ reactFlowInstance,
350
+ registry
344
351
  ]);
345
352
  const handleAddNode = (0, external_react_namespaceObject.useCallback)((nodeType)=>{
346
353
  const existingNodes = currentCanvas?.nodes.filter((n)=>'blank-canvas-node' !== n.id).length || 0;
@@ -1 +1 @@
1
- {"version":3,"file":"HierarchicalCanvasWithControls.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA6d/B,eAAO,MAAM,8BAA8B,EAAE,KAAK,CAAC,EA8BlD,CAAC"}
1
+ {"version":3,"file":"HierarchicalCanvasWithControls.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAye/B,eAAO,MAAM,8BAA8B,EAAE,KAAK,CAAC,EA8BlD,CAAC"}
@@ -2,11 +2,12 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { Panel, ReactFlowProvider, useReactFlow } from "../../xyflow/react.js";
3
3
  import { Button } from "@uipath/apollo-wind";
4
4
  import { useCallback, useEffect, useState } from "react";
5
- import { NodeRegistryProvider } from "../../core/index.js";
5
+ import { NodeRegistryProvider, useOptionalNodeTypeRegistry } from "../../core/index.js";
6
6
  import { selectAddNode, selectCurrentCanvas, selectCurrentPathLength, selectRemoveEdge, selectRemoveNode, selectUpdateNodes, useCanvasStore } from "../../stores/canvasStore.js";
7
7
  import { canvasEventBus } from "../../utils/CanvasEventBus.js";
8
8
  import { CanvasIcon } from "../../utils/icon-registry.js";
9
9
  import { createAddNodePreview } from "../AddNodePanel/createAddNodePreview.js";
10
+ import { createLoopSequenceResolverOptions } from "../LoopNode/LoopNode.sequence.js";
10
11
  import { HierarchicalCanvas } from "./HierarchicalCanvas.js";
11
12
  const createDemoCanvases = ()=>{
12
13
  const rootCanvas = {
@@ -297,6 +298,7 @@ const workflowManifest = {
297
298
  };
298
299
  const CanvasWithControlsContent = ({ initialCanvases, initialPath, onCanvasesChange, onPathChange })=>{
299
300
  const reactFlowInstance = useReactFlow();
301
+ const registry = useOptionalNodeTypeRegistry();
300
302
  const currentCanvas = useCanvasStore(selectCurrentCanvas);
301
303
  const currentPathLength = useCanvasStore(selectCurrentPathLength);
302
304
  const addNode = useCanvasStore(selectAddNode);
@@ -304,15 +306,20 @@ const CanvasWithControlsContent = ({ initialCanvases, initialPath, onCanvasesCha
304
306
  const removeEdge = useCanvasStore(selectRemoveEdge);
305
307
  const updateNodes = useCanvasStore(selectUpdateNodes);
306
308
  useEffect(()=>{
309
+ const resolverOptions = createLoopSequenceResolverOptions(registry);
307
310
  const handleAction = (event)=>{
308
- if (reactFlowInstance) createAddNodePreview(event.nodeId, event.handleId, reactFlowInstance);
311
+ if (reactFlowInstance) {
312
+ const sourceHandleType = 'input' === event.handleType ? 'target' : 'source';
313
+ createAddNodePreview(event.nodeId, event.handleId, reactFlowInstance, event.position, sourceHandleType, resolverOptions);
314
+ }
309
315
  };
310
316
  canvasEventBus.on('handle:action', handleAction);
311
317
  return ()=>{
312
318
  canvasEventBus.off('handle:action', handleAction);
313
319
  };
314
320
  }, [
315
- reactFlowInstance
321
+ reactFlowInstance,
322
+ registry
316
323
  ]);
317
324
  const handleAddNode = useCallback((nodeType)=>{
318
325
  const existingNodes = currentCanvas?.nodes.filter((n)=>'blank-canvas-node' !== n.id).length || 0;