@uipath/apollo-react 4.15.0-pr605.6ea14a7 → 4.15.0-pr605.6f11404

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 (35) hide show
  1. package/dist/canvas/components/AddNodePanel/AddNodeManager.cjs +21 -7
  2. package/dist/canvas/components/AddNodePanel/AddNodeManager.d.ts.map +1 -1
  3. package/dist/canvas/components/AddNodePanel/AddNodeManager.js +24 -10
  4. package/dist/canvas/components/AddNodePanel/createAddNodePreview.cjs +3 -3
  5. package/dist/canvas/components/AddNodePanel/createAddNodePreview.d.ts +2 -1
  6. package/dist/canvas/components/AddNodePanel/createAddNodePreview.d.ts.map +1 -1
  7. package/dist/canvas/components/AddNodePanel/createAddNodePreview.js +4 -4
  8. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.cjs +6 -2
  9. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.d.ts.map +1 -1
  10. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.js +7 -3
  11. package/dist/canvas/components/LoopNode/LoopNode.sequence.cjs +80 -33
  12. package/dist/canvas/components/LoopNode/LoopNode.sequence.d.ts +15 -5
  13. package/dist/canvas/components/LoopNode/LoopNode.sequence.d.ts.map +1 -1
  14. package/dist/canvas/components/LoopNode/LoopNode.sequence.js +79 -35
  15. package/dist/canvas/components/LoopNode/LoopNodePreview.cjs +4 -1
  16. package/dist/canvas/components/LoopNode/LoopNodePreview.d.ts.map +1 -1
  17. package/dist/canvas/components/LoopNode/LoopNodePreview.js +4 -1
  18. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.cjs +9 -2
  19. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.d.ts.map +1 -1
  20. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.js +10 -3
  21. package/dist/canvas/core/NodeTypeRegistry.cjs +6 -1
  22. package/dist/canvas/core/NodeTypeRegistry.d.ts.map +1 -1
  23. package/dist/canvas/core/NodeTypeRegistry.js +7 -2
  24. package/dist/canvas/utils/container-sizing.cjs +5 -4
  25. package/dist/canvas/utils/container-sizing.d.ts.map +1 -1
  26. package/dist/canvas/utils/container-sizing.js +5 -4
  27. package/dist/canvas/utils/index.cjs +15 -8
  28. package/dist/canvas/utils/index.d.ts +1 -0
  29. package/dist/canvas/utils/index.d.ts.map +1 -1
  30. package/dist/canvas/utils/index.js +1 -0
  31. package/dist/canvas/utils/preview-connection-handles.cjs +55 -0
  32. package/dist/canvas/utils/preview-connection-handles.d.ts +14 -0
  33. package/dist/canvas/utils/preview-connection-handles.d.ts.map +1 -0
  34. package/dist/canvas/utils/preview-connection-handles.js +15 -0
  35. package/package.json +1 -1
@@ -45,8 +45,7 @@ function getManifestForNode(registry, node) {
45
45
  }
46
46
  function getManifestAwareNodeDimensions(registry, node) {
47
47
  const manifest = getManifestForNode(registry, node);
48
- const expandedShape = (0, collapse_cjs_namespaceObject.getExpandedShape)(manifest?.display.shape);
49
- const fallbackDimensions = (0, collapse_cjs_namespaceObject.getExpandedSize)(expandedShape, manifest);
48
+ const fallbackDimensions = (0, collapse_cjs_namespaceObject.getExpandedSize)(manifest?.display.shape, manifest);
50
49
  return (0, container_sizing_cjs_namespaceObject.getNodeDimensions)(node, fallbackDimensions);
51
50
  }
52
51
  function getContainerFitGeometry(registry, node) {
@@ -79,7 +78,7 @@ function resolveSiblingCollisions(nodes, insertedNode, options) {
79
78
  function resolveNodePlacement(nodes, insertedNode, registry, ignoredNodeTypes, edges, loopSequencePlacement) {
80
79
  const getNodeSize = (node)=>getManifestAwareNodeDimensions(registry, node);
81
80
  if (!insertedNode.parentId) {
82
- const resolvedNodes = (0, external_utils_index_cjs_namespaceObject.resolveCollisions)(nodes, {
81
+ const resolvedNodes = resolveSiblingCollisions(nodes, insertedNode, {
83
82
  ignoredNodeTypes,
84
83
  getNodeSize
85
84
  });
@@ -149,7 +148,13 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
149
148
  const handleNodeSelect = (0, external_react_namespaceObject.useCallback)((nodeItem)=>{
150
149
  const currentPreviewNode = reactFlowInstance.getNode(external_constants_cjs_namespaceObject.PREVIEW_NODE_ID);
151
150
  if (!currentPreviewNode || !previewNodeConnectionInfo || 0 === previewNodeConnectionInfo.length) return;
152
- const loopSequencePlacement = (0, LoopNode_sequence_cjs_namespaceObject.getLoopSequencePlacementFromPreviewGraph)(currentPreviewNode, previewNodeConnectionInfo);
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
+ });
153
158
  const newNodeId = `${nodeItem.data.type}-${Date.now()}`;
154
159
  const baseNodeData = createNodeData ? createNodeData(nodeItem) : {
155
160
  label: nodeItem.name,
@@ -180,8 +185,12 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
180
185
  const newEdges = [];
181
186
  const previewEdgeIds = [];
182
187
  for (const connectionInfoItem of previewNodeConnectionInfo){
183
- const newNodeHandleType = connectionInfoItem.addNewNodeAsSource ? 'source' : 'target';
184
- const newNodeDefaultHandle = newNodeManifest ? registry?.getDefaultHandle(newNodeManifest.nodeType, newNodeHandleType, nodeItem.data.version) : void 0;
188
+ const newNodeDefaultHandle = newNodeManifest ? (0, external_utils_index_cjs_namespaceObject.getNodeHandleForPreviewConnection)({
189
+ manifest: newNodeManifest,
190
+ connection: connectionInfoItem,
191
+ connections: previewNodeConnectionInfo,
192
+ getDefaultHandle: (handleType)=>registry?.getDefaultHandle(newNodeManifest.nodeType, handleType, nodeItem.data.version)
193
+ }) : void 0;
185
194
  const newNodeHandleId = newNodeDefaultHandle?.id;
186
195
  const edgeSourceTargetData = connectionInfoItem.addNewNodeAsSource ? {
187
196
  source: newNode.id,
@@ -225,7 +234,12 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
225
234
  ]);
226
235
  const [firstConnection] = previewNodeConnectionInfo;
227
236
  if (firstConnection) {
228
- const firstEdgeSourceHandle = firstConnection.addNewNodeAsSource ? newNodeManifest && registry?.getDefaultHandle(newNodeManifest.nodeType, 'source', nodeItem.data.version)?.id : firstConnection.existingHandleId;
237
+ const firstEdgeSourceHandle = firstConnection.addNewNodeAsSource ? newNodeManifest && (0, external_utils_index_cjs_namespaceObject.getNodeHandleForPreviewConnection)({
238
+ manifest: newNodeManifest,
239
+ connection: firstConnection,
240
+ connections: previewNodeConnectionInfo,
241
+ getDefaultHandle: (handleType)=>registry?.getDefaultHandle(newNodeManifest.nodeType, handleType, nodeItem.data.version)
242
+ })?.id : firstConnection.existingHandleId;
229
243
  const firstEdgeData = firstConnection.addNewNodeAsSource ? {
230
244
  source: finalNode.id,
231
245
  sourceHandle: firstEdgeSourceHandle ?? 'output'
@@ -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;AAS/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,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;AAuHD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAiOxD,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,CAwPxD,CAAC"}
@@ -4,21 +4,20 @@ import { useCallback, useEffect, useRef } from "react";
4
4
  import { FLOATING_CANVAS_PANEL_OFFSET, PREVIEW_NODE_ID } from "../../constants.js";
5
5
  import { useOptionalNodeTypeRegistry } from "../../core/index.js";
6
6
  import { usePreviewNode } from "../../hooks/usePreviewNode.js";
7
- import { resolveCollisions } from "../../utils/index.js";
8
- import { getExpandedShape, getExpandedSize } from "../../utils/collapse.js";
7
+ import { getNodeHandleForPreviewConnection, resolveCollisions } from "../../utils/index.js";
8
+ import { getExpandedSize } from "../../utils/collapse.js";
9
9
  import { ensureContainersFitChildren, getNodeDimensions } from "../../utils/container-sizing.js";
10
10
  import { getNodeTypeVersion } from "../../utils/manifest-resolver.js";
11
11
  import { FloatingCanvasPanel } from "../FloatingCanvasPanel/index.js";
12
12
  import { getLoopContainerFitGeometry, isLoopContainerManifest } from "../LoopNode/LoopNode.helpers.js";
13
- import { getLoopSequencePlacementFromPreviewGraph, resolveLoopSequenceMaterializedNodes } from "../LoopNode/LoopNode.sequence.js";
13
+ import { createLoopSequenceResolverOptions, getLoopSequencePlacementFromPreviewGraph, resolveLoopSequenceMaterializedNodes } from "../LoopNode/LoopNode.sequence.js";
14
14
  import { AddNodePanel } from "./AddNodePanel.js";
15
15
  function getManifestForNode(registry, node) {
16
16
  return node.type ? registry?.getManifest(node.type, getNodeTypeVersion(node.data)) : void 0;
17
17
  }
18
18
  function getManifestAwareNodeDimensions(registry, node) {
19
19
  const manifest = getManifestForNode(registry, node);
20
- const expandedShape = getExpandedShape(manifest?.display.shape);
21
- const fallbackDimensions = getExpandedSize(expandedShape, manifest);
20
+ const fallbackDimensions = getExpandedSize(manifest?.display.shape, manifest);
22
21
  return getNodeDimensions(node, fallbackDimensions);
23
22
  }
24
23
  function getContainerFitGeometry(registry, node) {
@@ -51,7 +50,7 @@ function resolveSiblingCollisions(nodes, insertedNode, options) {
51
50
  function resolveNodePlacement(nodes, insertedNode, registry, ignoredNodeTypes, edges, loopSequencePlacement) {
52
51
  const getNodeSize = (node)=>getManifestAwareNodeDimensions(registry, node);
53
52
  if (!insertedNode.parentId) {
54
- const resolvedNodes = resolveCollisions(nodes, {
53
+ const resolvedNodes = resolveSiblingCollisions(nodes, insertedNode, {
55
54
  ignoredNodeTypes,
56
55
  getNodeSize
57
56
  });
@@ -121,7 +120,13 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
121
120
  const handleNodeSelect = useCallback((nodeItem)=>{
122
121
  const currentPreviewNode = reactFlowInstance.getNode(PREVIEW_NODE_ID);
123
122
  if (!currentPreviewNode || !previewNodeConnectionInfo || 0 === previewNodeConnectionInfo.length) return;
124
- const loopSequencePlacement = getLoopSequencePlacementFromPreviewGraph(currentPreviewNode, previewNodeConnectionInfo);
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
+ });
125
130
  const newNodeId = `${nodeItem.data.type}-${Date.now()}`;
126
131
  const baseNodeData = createNodeData ? createNodeData(nodeItem) : {
127
132
  label: nodeItem.name,
@@ -152,8 +157,12 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
152
157
  const newEdges = [];
153
158
  const previewEdgeIds = [];
154
159
  for (const connectionInfoItem of previewNodeConnectionInfo){
155
- const newNodeHandleType = connectionInfoItem.addNewNodeAsSource ? 'source' : 'target';
156
- const newNodeDefaultHandle = newNodeManifest ? registry?.getDefaultHandle(newNodeManifest.nodeType, newNodeHandleType, nodeItem.data.version) : void 0;
160
+ const newNodeDefaultHandle = newNodeManifest ? getNodeHandleForPreviewConnection({
161
+ manifest: newNodeManifest,
162
+ connection: connectionInfoItem,
163
+ connections: previewNodeConnectionInfo,
164
+ getDefaultHandle: (handleType)=>registry?.getDefaultHandle(newNodeManifest.nodeType, handleType, nodeItem.data.version)
165
+ }) : void 0;
157
166
  const newNodeHandleId = newNodeDefaultHandle?.id;
158
167
  const edgeSourceTargetData = connectionInfoItem.addNewNodeAsSource ? {
159
168
  source: newNode.id,
@@ -197,7 +206,12 @@ const AddNodeManager = ({ initializing, customPanel: CustomPanel, createNodeData
197
206
  ]);
198
207
  const [firstConnection] = previewNodeConnectionInfo;
199
208
  if (firstConnection) {
200
- const firstEdgeSourceHandle = firstConnection.addNewNodeAsSource ? newNodeManifest && registry?.getDefaultHandle(newNodeManifest.nodeType, 'source', nodeItem.data.version)?.id : firstConnection.existingHandleId;
209
+ const firstEdgeSourceHandle = firstConnection.addNewNodeAsSource ? newNodeManifest && getNodeHandleForPreviewConnection({
210
+ manifest: newNodeManifest,
211
+ connection: firstConnection,
212
+ connections: previewNodeConnectionInfo,
213
+ getDefaultHandle: (handleType)=>registry?.getDefaultHandle(newNodeManifest.nodeType, handleType, nodeItem.data.version)
214
+ })?.id : firstConnection.existingHandleId;
201
215
  const firstEdgeData = firstConnection.addNewNodeAsSource ? {
202
216
  source: finalNode.id,
203
217
  sourceHandle: firstEdgeSourceHandle ?? 'output'
@@ -29,14 +29,14 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  const react_cjs_namespaceObject = require("../../xyflow/react.cjs");
30
30
  const createPreviewGraph_cjs_namespaceObject = require("../../utils/createPreviewGraph.cjs");
31
31
  const LoopNode_sequence_cjs_namespaceObject = require("../LoopNode/LoopNode.sequence.cjs");
32
- function createAddNodePreview(sourceNodeId, sourceHandleId, reactFlowInstance, handlePosition = react_cjs_namespaceObject.Position.Right, sourceHandleType = 'source', ignoredNodeTypes = []) {
32
+ function createAddNodePreview(sourceNodeId, sourceHandleId, reactFlowInstance, handlePosition = react_cjs_namespaceObject.Position.Right, sourceHandleType = 'source', ignoredNodeTypes = [], resolverOptions = (0, LoopNode_sequence_cjs_namespaceObject.createLoopSequenceResolverOptions)(null)) {
33
33
  if ('source' === sourceHandleType) {
34
34
  const loopPreview = (0, LoopNode_sequence_cjs_namespaceObject.resolveLoopAddNodePreview)({
35
35
  sourceNodeId,
36
36
  sourceHandleId,
37
- reactFlowInstance
37
+ reactFlowInstance,
38
+ resolverOptions
38
39
  });
39
- if ('skip' === loopPreview.action) return;
40
40
  if ('create-preview' === loopPreview.action) return void (0, createPreviewGraph_cjs_namespaceObject.showPreviewGraph)({
41
41
  sourceNodeId,
42
42
  sourceHandleId,
@@ -1,3 +1,4 @@
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 declare function createAddNodePreview(sourceNodeId: string, sourceHandleId: string, reactFlowInstance: ReactFlowInstance, handlePosition?: Position, sourceHandleType?: 'source' | 'target', ignoredNodeTypes?: string[], resolverOptions?: LoopSequenceResolverOptions): void;
3
4
  //# 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;AAc5F,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,CAkCN"}
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;AAcvC,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,EAC/B,eAAe,GAAE,2BAAqE,GACrF,IAAI,CA+BN"}
@@ -1,14 +1,14 @@
1
1
  import { Position } from "../../xyflow/react.js";
2
2
  import { showPreviewGraph } from "../../utils/createPreviewGraph.js";
3
- import { resolveLoopAddNodePreview } from "../LoopNode/LoopNode.sequence.js";
4
- function createAddNodePreview(sourceNodeId, sourceHandleId, reactFlowInstance, handlePosition = Position.Right, sourceHandleType = 'source', ignoredNodeTypes = []) {
3
+ import { createLoopSequenceResolverOptions, resolveLoopAddNodePreview } from "../LoopNode/LoopNode.sequence.js";
4
+ function createAddNodePreview(sourceNodeId, sourceHandleId, reactFlowInstance, handlePosition = Position.Right, sourceHandleType = 'source', ignoredNodeTypes = [], resolverOptions = createLoopSequenceResolverOptions(null)) {
5
5
  if ('source' === sourceHandleType) {
6
6
  const loopPreview = resolveLoopAddNodePreview({
7
7
  sourceNodeId,
8
8
  sourceHandleId,
9
- reactFlowInstance
9
+ reactFlowInstance,
10
+ resolverOptions
10
11
  });
11
- if ('skip' === loopPreview.action) return;
12
12
  if ('create-preview' === loopPreview.action) return void showPreviewGraph({
13
13
  sourceNodeId,
14
14
  sourceHandleId,
@@ -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,10 +334,11 @@ 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
339
  if (reactFlowInstance) {
337
340
  const sourceHandleType = 'input' === event.handleType ? 'target' : 'source';
338
- (0, createAddNodePreview_cjs_namespaceObject.createAddNodePreview)(event.nodeId, event.handleId, reactFlowInstance, event.position, sourceHandleType);
341
+ (0, createAddNodePreview_cjs_namespaceObject.createAddNodePreview)(event.nodeId, event.handleId, reactFlowInstance, event.position, sourceHandleType, [], resolverOptions);
339
342
  }
340
343
  };
341
344
  CanvasEventBus_cjs_namespaceObject.canvasEventBus.on('handle:action', handleAction);
@@ -343,7 +346,8 @@ const CanvasWithControlsContent = ({ initialCanvases, initialPath, onCanvasesCha
343
346
  CanvasEventBus_cjs_namespaceObject.canvasEventBus.off('handle:action', handleAction);
344
347
  };
345
348
  }, [
346
- reactFlowInstance
349
+ reactFlowInstance,
350
+ registry
347
351
  ]);
348
352
  const handleAddNode = (0, external_react_namespaceObject.useCallback)((nodeType)=>{
349
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":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAqe/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;AA0e/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,10 +306,11 @@ 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
311
  if (reactFlowInstance) {
309
312
  const sourceHandleType = 'input' === event.handleType ? 'target' : 'source';
310
- createAddNodePreview(event.nodeId, event.handleId, reactFlowInstance, event.position, sourceHandleType);
313
+ createAddNodePreview(event.nodeId, event.handleId, reactFlowInstance, event.position, sourceHandleType, [], resolverOptions);
311
314
  }
312
315
  };
313
316
  canvasEventBus.on('handle:action', handleAction);
@@ -315,7 +318,8 @@ const CanvasWithControlsContent = ({ initialCanvases, initialPath, onCanvasesCha
315
318
  canvasEventBus.off('handle:action', handleAction);
316
319
  };
317
320
  }, [
318
- reactFlowInstance
321
+ reactFlowInstance,
322
+ registry
319
323
  ]);
320
324
  const handleAddNode = useCallback((nodeType)=>{
321
325
  const existingNodes = currentCanvas?.nodes.filter((n)=>'blank-canvas-node' !== n.id).length || 0;
@@ -27,14 +27,46 @@ __webpack_require__.d(__webpack_exports__, {
27
27
  resolveLoopAddNodePreview: ()=>resolveLoopAddNodePreview,
28
28
  getLoopSequencePlacementFromPreviewGraph: ()=>getLoopSequencePlacementFromPreviewGraph,
29
29
  createLoopSequencePreviewPlacement: ()=>createLoopSequencePreviewPlacement,
30
+ createLoopSequenceResolverOptions: ()=>createLoopSequenceResolverOptions,
30
31
  resolveLoopSequenceMaterializedNodes: ()=>resolveLoopSequenceMaterializedNodes
31
32
  });
32
33
  const external_constants_cjs_namespaceObject = require("../../constants.cjs");
33
34
  const container_sizing_cjs_namespaceObject = require("../../utils/container-sizing.cjs");
34
35
  const createPreviewNode_cjs_namespaceObject = require("../../utils/createPreviewNode.cjs");
36
+ const manifest_resolver_cjs_namespaceObject = require("../../utils/manifest-resolver.cjs");
35
37
  const NodeUtils_cjs_namespaceObject = require("../../utils/NodeUtils.cjs");
36
38
  const external_LoopNode_helpers_cjs_namespaceObject = require("./LoopNode.helpers.cjs");
37
39
  const LOOP_SEQUENCE_GAP_PX = 3 * external_constants_cjs_namespaceObject.GRID_SPACING;
40
+ function getManifestForNode(registry, node) {
41
+ return node.type ? registry?.getManifest(node.type, (0, manifest_resolver_cjs_namespaceObject.getNodeTypeVersion)(node.data)) : void 0;
42
+ }
43
+ function getDataHandleConfigurations(node) {
44
+ const data = node.data;
45
+ return Array.isArray(data?.handleConfigurations) ? data.handleConfigurations : null;
46
+ }
47
+ function createLoopSequenceResolverOptions(registry) {
48
+ return {
49
+ isLoopContainerNode: (node)=>{
50
+ const manifest = getManifestForNode(registry, node);
51
+ if (manifest) return (0, external_LoopNode_helpers_cjs_namespaceObject.isLoopContainerManifest)(manifest);
52
+ return getDataHandleConfigurations(node)?.some((group)=>'inner' === group.boundary) ?? false;
53
+ },
54
+ getLoopContinuationTargetHandle: (node)=>{
55
+ const manifest = getManifestForNode(registry, node);
56
+ if (!manifest || !(0, external_LoopNode_helpers_cjs_namespaceObject.isLoopContainerManifest)(manifest)) return null;
57
+ const previewHandles = (0, external_LoopNode_helpers_cjs_namespaceObject.resolveLoopPreviewConnectionHandles)(manifest, {
58
+ ...node.data ?? {},
59
+ nodeId: node.id
60
+ });
61
+ return previewHandles ? {
62
+ targetHandleId: previewHandles.targetHandleId
63
+ } : null;
64
+ }
65
+ };
66
+ }
67
+ function isResolvedLoopContainer(node, options) {
68
+ return !!node && (options?.isLoopContainerNode?.(node) ?? false);
69
+ }
38
70
  function LoopNode_sequence_getNodeSize(node, fallback) {
39
71
  return node ? (0, container_sizing_cjs_namespaceObject.getNodeDimensions)(node, fallback) : fallback;
40
72
  }
@@ -61,23 +93,20 @@ function getContainerNode({ sourceNode, targetNode }) {
61
93
  function matchesSourceHandle(edge, sourceNodeId, sourceHandleId) {
62
94
  return edge.source === sourceNodeId && (edge.sourceHandle ?? external_constants_cjs_namespaceObject.DEFAULT_SOURCE_HANDLE_ID) === sourceHandleId;
63
95
  }
64
- function isLoopLocalTarget(sourceNode, targetNode) {
65
- if (!targetNode) return false;
66
- if (sourceNode.parentId) return targetNode.parentId === sourceNode.parentId || targetNode.id === sourceNode.parentId;
67
- return targetNode.parentId === sourceNode.id;
68
- }
69
- function resolvePreferredLoopContinuationTargetHandle(containerId, reactFlowInstance) {
96
+ function resolvePreferredLoopContinuationTargetHandle(containerId, reactFlowInstance, options) {
70
97
  const nodesById = new Map(reactFlowInstance.getNodes().map((node)=>[
71
98
  node.id,
72
99
  node
73
100
  ]));
74
101
  const containerNode = nodesById.get(containerId);
75
102
  if (!containerNode) return null;
76
- const handleConfiguration = containerNode.data?.handleConfigurations;
77
- const configuredHandleId = Array.isArray(handleConfiguration) ? (0, external_LoopNode_helpers_cjs_namespaceObject.pickPreferredInnerHandle)((0, external_LoopNode_helpers_cjs_namespaceObject.getVisibleInnerHandleGroups)(handleConfiguration, {
78
- ...containerNode.data ?? {},
79
- nodeId: containerNode.id
80
- }), 'target')?.handle.id : null;
103
+ const configuredHandleId = options?.getLoopContinuationTargetHandle?.(containerNode)?.targetHandleId ?? (()=>{
104
+ const handleConfiguration = getDataHandleConfigurations(containerNode);
105
+ return handleConfiguration ? (0, external_LoopNode_helpers_cjs_namespaceObject.pickPreferredInnerHandle)((0, external_LoopNode_helpers_cjs_namespaceObject.getVisibleInnerHandleGroups)(handleConfiguration, {
106
+ ...containerNode.data ?? {},
107
+ nodeId: containerNode.id
108
+ }), 'target')?.handle.id : null;
109
+ })();
81
110
  const returningEdges = reactFlowInstance.getEdges().filter((edge)=>!(0, createPreviewNode_cjs_namespaceObject.isPreviewEdge)(edge) && edge.target === containerId).filter((edge)=>nodesById.get(edge.source)?.parentId === containerId);
82
111
  if (configuredHandleId && (0 === returningEdges.length || returningEdges.some((edge)=>edge.targetHandle === configuredHandleId))) return {
83
112
  targetHandleId: configuredHandleId
@@ -89,11 +118,25 @@ function resolvePreferredLoopContinuationTargetHandle(containerId, reactFlowInst
89
118
  targetHandleId
90
119
  } : null;
91
120
  }
92
- function resolveLoopContinuationTarget({ sourceNodeId, sourceHandleId, reactFlowInstance }) {
121
+ function isLoopLocalTarget(sourceNode, targetNode, nodesById, options) {
122
+ if (!targetNode) return false;
123
+ const container = getContainerNode({
124
+ sourceNode,
125
+ targetNode
126
+ });
127
+ if (!container) return false;
128
+ return isResolvedLoopContainer(nodesById.get(container.containerId), options);
129
+ }
130
+ function resolveLoopContinuationTarget({ sourceNodeId, sourceHandleId, reactFlowInstance, resolverOptions }) {
93
131
  const sourceNode = reactFlowInstance.getNode(sourceNodeId);
94
132
  if (!sourceNode) return null;
133
+ const nodes = reactFlowInstance.getNodes();
134
+ const nodesById = new Map(nodes.map((node)=>[
135
+ node.id,
136
+ node
137
+ ]));
95
138
  const outgoingEdges = reactFlowInstance.getEdges().filter((edge)=>!(0, createPreviewNode_cjs_namespaceObject.isPreviewEdge)(edge) && matchesSourceHandle(edge, sourceNodeId, sourceHandleId));
96
- const loopLocalOutgoingEdges = outgoingEdges.filter((edge)=>isLoopLocalTarget(sourceNode, reactFlowInstance.getNode(edge.target)));
139
+ const loopLocalOutgoingEdges = outgoingEdges.filter((edge)=>isLoopLocalTarget(sourceNode, nodesById.get(edge.target), nodesById, resolverOptions));
97
140
  if (1 === outgoingEdges.length && 1 === loopLocalOutgoingEdges.length) {
98
141
  const edge = loopLocalOutgoingEdges[0];
99
142
  return {
@@ -107,7 +150,8 @@ function resolveLoopContinuationTarget({ sourceNodeId, sourceHandleId, reactFlow
107
150
  type: 'ambiguous'
108
151
  };
109
152
  if (!sourceNode.parentId || outgoingEdges.length > 0) return null;
110
- const targetHandle = resolvePreferredLoopContinuationTargetHandle(sourceNode.parentId, reactFlowInstance);
153
+ if (!isResolvedLoopContainer(nodesById.get(sourceNode.parentId), resolverOptions)) return null;
154
+ const targetHandle = resolvePreferredLoopContinuationTargetHandle(sourceNode.parentId, reactFlowInstance, resolverOptions);
111
155
  if (!targetHandle) return {
112
156
  type: 'ambiguous'
113
157
  };
@@ -195,7 +239,7 @@ function getSequencePreviewTopLeft({ containerNode, sourceNode, targetNode, node
195
239
  function createLoopSequencePreviewPlacement({ sourceNodeId, targetNodeId, reactFlowInstance, previewNodeSize = {
196
240
  width: external_constants_cjs_namespaceObject.DEFAULT_NODE_SIZE,
197
241
  height: external_constants_cjs_namespaceObject.DEFAULT_NODE_SIZE
198
- }, avoidSiblings = false }) {
242
+ }, avoidSiblings = false, resolverOptions }) {
199
243
  const sourceNode = reactFlowInstance.getNode(sourceNodeId);
200
244
  const targetNode = targetNodeId ? reactFlowInstance.getNode(targetNodeId) : void 0;
201
245
  if (!sourceNode) return null;
@@ -205,7 +249,7 @@ function createLoopSequencePreviewPlacement({ sourceNodeId, targetNodeId, reactF
205
249
  });
206
250
  if (!container) return null;
207
251
  const containerNode = reactFlowInstance.getNode(container.containerId);
208
- if (!containerNode) return null;
252
+ if (!isResolvedLoopContainer(containerNode, resolverOptions)) return null;
209
253
  const containerAbsolutePosition = (0, NodeUtils_cjs_namespaceObject.getAbsolutePosition)(containerNode, reactFlowInstance.getNodes());
210
254
  const nodes = reactFlowInstance.getNodes();
211
255
  const topLeft = getSequencePreviewTopLeft({
@@ -225,9 +269,10 @@ function createLoopSequencePreviewPlacement({ sourceNodeId, targetNodeId, reactF
225
269
  }
226
270
  };
227
271
  }
228
- function getLoopSequencePlacementFromPreviewGraph(previewNode, connections) {
272
+ function getLoopSequencePlacementFromPreviewGraph(previewNode, connections, options = {}) {
229
273
  const containerId = previewNode.parentId;
230
274
  if (!containerId) return null;
275
+ if (!(options.isLoopContainerId?.(containerId) ?? false)) return null;
231
276
  const sourceConnections = connections.filter((connection)=>!connection.addNewNodeAsSource);
232
277
  const targetConnections = connections.filter((connection)=>connection.addNewNodeAsSource);
233
278
  if (1 !== sourceConnections.length || 1 !== targetConnections.length) return null;
@@ -240,36 +285,36 @@ function getLoopSequencePlacementFromPreviewGraph(previewNode, connections) {
240
285
  mode: sourceNodeId === containerId && targetNodeId === containerId ? 'first-child' : 'sequence'
241
286
  };
242
287
  }
243
- function resolveLoopAddNodePreview({ sourceNodeId, sourceHandleId, reactFlowInstance }) {
288
+ function resolveLoopAddNodePreview({ sourceNodeId, sourceHandleId, reactFlowInstance, resolverOptions }) {
244
289
  const loopContinuation = resolveLoopContinuationTarget({
245
290
  sourceNodeId,
246
291
  sourceHandleId,
247
- reactFlowInstance
292
+ reactFlowInstance,
293
+ resolverOptions
248
294
  });
249
- if (loopContinuation?.type === 'ambiguous') return {
250
- action: 'skip'
251
- };
252
- if (loopContinuation?.type !== 'target') return {
295
+ if (loopContinuation?.type === 'ambiguous' || loopContinuation?.type !== 'target') return {
253
296
  action: 'continue'
254
297
  };
255
298
  const loopSequencePlacement = createLoopSequencePreviewPlacement({
256
299
  sourceNodeId,
257
300
  targetNodeId: loopContinuation.targetNodeId,
258
301
  reactFlowInstance,
259
- avoidSiblings: !loopContinuation.removedEdge
302
+ avoidSiblings: !loopContinuation.removedEdge,
303
+ resolverOptions
260
304
  });
305
+ if (!loopSequencePlacement) return {
306
+ action: 'continue'
307
+ };
261
308
  return {
262
309
  action: 'create-preview',
263
310
  previewGraphOptions: {
264
- ...loopSequencePlacement ? {
265
- position: loopSequencePlacement.centerPosition,
266
- positionMode: 'center',
267
- containerId: loopSequencePlacement.containerId,
268
- ...loopContinuation.removedEdge ? {
269
- data: {
270
- originalEdge: loopContinuation.removedEdge
271
- }
272
- } : {}
311
+ position: loopSequencePlacement.centerPosition,
312
+ positionMode: 'center',
313
+ containerId: loopSequencePlacement.containerId,
314
+ ...loopContinuation.removedEdge ? {
315
+ data: {
316
+ originalEdge: loopContinuation.removedEdge
317
+ }
273
318
  } : {},
274
319
  targetNodeId: loopContinuation.targetNodeId,
275
320
  targetHandleId: loopContinuation.targetHandleId,
@@ -372,11 +417,13 @@ function resolveLoopSequenceMaterializedNodes({ nodes, edges, insertedNode, plac
372
417
  });
373
418
  }
374
419
  exports.createLoopSequencePreviewPlacement = __webpack_exports__.createLoopSequencePreviewPlacement;
420
+ exports.createLoopSequenceResolverOptions = __webpack_exports__.createLoopSequenceResolverOptions;
375
421
  exports.getLoopSequencePlacementFromPreviewGraph = __webpack_exports__.getLoopSequencePlacementFromPreviewGraph;
376
422
  exports.resolveLoopAddNodePreview = __webpack_exports__.resolveLoopAddNodePreview;
377
423
  exports.resolveLoopSequenceMaterializedNodes = __webpack_exports__.resolveLoopSequenceMaterializedNodes;
378
424
  for(var __rspack_i in __webpack_exports__)if (-1 === [
379
425
  "createLoopSequencePreviewPlacement",
426
+ "createLoopSequenceResolverOptions",
380
427
  "getLoopSequencePlacementFromPreviewGraph",
381
428
  "resolveLoopAddNodePreview",
382
429
  "resolveLoopSequenceMaterializedNodes"
@@ -1,4 +1,5 @@
1
1
  import type { Edge, Node, ReactFlowInstance } from '../../xyflow/react.ts';
2
+ import type { NodeTypeRegistry } from '../../core';
2
3
  import type { PreviewNodeConnectionInfo } from '../../hooks';
3
4
  import type { NodeDimensions } from '../../utils/container-sizing';
4
5
  import type { PreviewGraphOverrides } from '../../utils/createPreviewGraph';
@@ -21,21 +22,30 @@ export type LoopAddNodePreviewDecision = {
21
22
  } | {
22
23
  action: 'create-preview';
23
24
  previewGraphOptions: LoopAddNodePreviewOptions;
24
- } | {
25
- action: 'skip';
26
25
  };
27
- export declare function createLoopSequencePreviewPlacement({ sourceNodeId, targetNodeId, reactFlowInstance, previewNodeSize, avoidSiblings, }: {
26
+ export interface LoopSequenceResolverOptions {
27
+ isLoopContainerNode?: (node: Node) => boolean;
28
+ getLoopContinuationTargetHandle?: (containerNode: Node) => {
29
+ targetHandleId?: string | null;
30
+ } | null;
31
+ }
32
+ export declare function createLoopSequenceResolverOptions(registry: NodeTypeRegistry | null | undefined): LoopSequenceResolverOptions;
33
+ export declare function createLoopSequencePreviewPlacement({ sourceNodeId, targetNodeId, reactFlowInstance, previewNodeSize, avoidSiblings, resolverOptions, }: {
28
34
  sourceNodeId: string;
29
35
  targetNodeId?: string;
30
36
  reactFlowInstance: ReactFlowInstance;
31
37
  previewNodeSize?: NodeDimensions;
32
38
  avoidSiblings?: boolean;
39
+ resolverOptions?: LoopSequenceResolverOptions;
33
40
  }): LoopSequencePreviewPlacement | null;
34
- export declare function getLoopSequencePlacementFromPreviewGraph(previewNode: Pick<Node, 'parentId'>, connections: PreviewNodeConnectionInfo[]): LoopSequencePlacementData | null;
35
- export declare function resolveLoopAddNodePreview({ sourceNodeId, sourceHandleId, reactFlowInstance, }: {
41
+ export declare function getLoopSequencePlacementFromPreviewGraph(previewNode: Pick<Node, 'parentId'>, connections: PreviewNodeConnectionInfo[], options?: {
42
+ isLoopContainerId?: (containerId: string) => boolean;
43
+ }): LoopSequencePlacementData | null;
44
+ export declare function resolveLoopAddNodePreview({ sourceNodeId, sourceHandleId, reactFlowInstance, resolverOptions, }: {
36
45
  sourceNodeId: string;
37
46
  sourceHandleId: string;
38
47
  reactFlowInstance: ReactFlowInstance;
48
+ resolverOptions?: LoopSequenceResolverOptions;
39
49
  }): LoopAddNodePreviewDecision;
40
50
  export declare function resolveLoopSequenceMaterializedNodes({ nodes, edges, insertedNode, placement, getNodeSize, }: {
41
51
  nodes: Node[];
@@ -1 +1 @@
1
- {"version":3,"file":"LoopNode.sequence.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.sequence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE9F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAgB5E,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,aAAa,GAAG,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAS9D,MAAM,MAAM,0BAA0B,GAClC;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,mBAAmB,EAAE,yBAAyB,CAAA;CAAE,GAC5E;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAmTvB,wBAAgB,kCAAkC,CAAC,EACjD,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,eAAyE,EACzE,aAAqB,GACtB,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,4BAA4B,GAAG,IAAI,CAiCtC;AAMD,wBAAgB,wCAAwC,CACtD,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EACnC,WAAW,EAAE,yBAAyB,EAAE,GACvC,yBAAyB,GAAG,IAAI,CAoBlC;AASD,wBAAgB,yBAAyB,CAAC,EACxC,YAAY,EACZ,cAAc,EACd,iBAAiB,GAClB,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,GAAG,0BAA0B,CA4C7B;AA2ED,wBAAgB,oCAAoC,CAAC,EACnD,KAAK,EACL,KAAK,EACL,YAAY,EACZ,SAAS,EACT,WAA+B,GAChC,EAAE;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,yBAAyB,CAAC;IACrC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,cAAc,CAAC;CAC9C,GAAG,IAAI,EAAE,GAAG,IAAI,CAqFhB"}
1
+ {"version":3,"file":"LoopNode.sequence.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.sequence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAmB5E,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,aAAa,GAAG,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAQ9D,MAAM,MAAM,0BAA0B,GAClC;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,mBAAmB,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAEjF,MAAM,WAAW,2BAA2B;IAC1C,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IAC9C,+BAA+B,CAAC,EAAE,CAChC,aAAa,EAAE,IAAI,KAChB;QAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CAChD;AAuBD,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAC5C,2BAA2B,CAsB7B;AAiUD,wBAAgB,kCAAkC,CAAC,EACjD,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,eAAyE,EACzE,aAAqB,EACrB,eAAe,GAChB,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,2BAA2B,CAAC;CAC/C,GAAG,4BAA4B,GAAG,IAAI,CAiCtC;AAMD,wBAAgB,wCAAwC,CACtD,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EACnC,WAAW,EAAE,yBAAyB,EAAE,EACxC,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAA;CAAO,GACrE,yBAAyB,GAAG,IAAI,CAqBlC;AASD,wBAAgB,yBAAyB,CAAC,EACxC,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,eAAe,GAChB,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,CAAC,EAAE,2BAA2B,CAAC;CAC/C,GAAG,0BAA0B,CA0C7B;AA2ED,wBAAgB,oCAAoC,CAAC,EACnD,KAAK,EACL,KAAK,EACL,YAAY,EACZ,SAAS,EACT,WAA+B,GAChC,EAAE;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,yBAAyB,CAAC;IACrC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,cAAc,CAAC;CAC9C,GAAG,IAAI,EAAE,GAAG,IAAI,CAqFhB"}
@@ -1,9 +1,40 @@
1
1
  import { DEFAULT_NODE_SIZE, DEFAULT_SOURCE_HANDLE_ID, GRID_SPACING } from "../../constants.js";
2
2
  import { getNodeDimensions } from "../../utils/container-sizing.js";
3
3
  import { isPreviewEdge } from "../../utils/createPreviewNode.js";
4
+ import { getNodeTypeVersion } from "../../utils/manifest-resolver.js";
4
5
  import { clamp, getAbsolutePosition, snapToGrid, snapUpToGrid } from "../../utils/NodeUtils.js";
5
- import { getLoopChildSafeArea, getVisibleInnerHandleGroups, pickPreferredInnerHandle } from "./LoopNode.helpers.js";
6
+ import { getLoopChildSafeArea, getVisibleInnerHandleGroups, isLoopContainerManifest, pickPreferredInnerHandle, resolveLoopPreviewConnectionHandles } from "./LoopNode.helpers.js";
6
7
  const LOOP_SEQUENCE_GAP_PX = 3 * GRID_SPACING;
8
+ function getManifestForNode(registry, node) {
9
+ return node.type ? registry?.getManifest(node.type, getNodeTypeVersion(node.data)) : void 0;
10
+ }
11
+ function getDataHandleConfigurations(node) {
12
+ const data = node.data;
13
+ return Array.isArray(data?.handleConfigurations) ? data.handleConfigurations : null;
14
+ }
15
+ function createLoopSequenceResolverOptions(registry) {
16
+ return {
17
+ isLoopContainerNode: (node)=>{
18
+ const manifest = getManifestForNode(registry, node);
19
+ if (manifest) return isLoopContainerManifest(manifest);
20
+ return getDataHandleConfigurations(node)?.some((group)=>'inner' === group.boundary) ?? false;
21
+ },
22
+ getLoopContinuationTargetHandle: (node)=>{
23
+ const manifest = getManifestForNode(registry, node);
24
+ if (!manifest || !isLoopContainerManifest(manifest)) return null;
25
+ const previewHandles = resolveLoopPreviewConnectionHandles(manifest, {
26
+ ...node.data ?? {},
27
+ nodeId: node.id
28
+ });
29
+ return previewHandles ? {
30
+ targetHandleId: previewHandles.targetHandleId
31
+ } : null;
32
+ }
33
+ };
34
+ }
35
+ function isResolvedLoopContainer(node, options) {
36
+ return !!node && (options?.isLoopContainerNode?.(node) ?? false);
37
+ }
7
38
  function LoopNode_sequence_getNodeSize(node, fallback) {
8
39
  return node ? getNodeDimensions(node, fallback) : fallback;
9
40
  }
@@ -30,23 +61,20 @@ function getContainerNode({ sourceNode, targetNode }) {
30
61
  function matchesSourceHandle(edge, sourceNodeId, sourceHandleId) {
31
62
  return edge.source === sourceNodeId && (edge.sourceHandle ?? DEFAULT_SOURCE_HANDLE_ID) === sourceHandleId;
32
63
  }
33
- function isLoopLocalTarget(sourceNode, targetNode) {
34
- if (!targetNode) return false;
35
- if (sourceNode.parentId) return targetNode.parentId === sourceNode.parentId || targetNode.id === sourceNode.parentId;
36
- return targetNode.parentId === sourceNode.id;
37
- }
38
- function resolvePreferredLoopContinuationTargetHandle(containerId, reactFlowInstance) {
64
+ function resolvePreferredLoopContinuationTargetHandle(containerId, reactFlowInstance, options) {
39
65
  const nodesById = new Map(reactFlowInstance.getNodes().map((node)=>[
40
66
  node.id,
41
67
  node
42
68
  ]));
43
69
  const containerNode = nodesById.get(containerId);
44
70
  if (!containerNode) return null;
45
- const handleConfiguration = containerNode.data?.handleConfigurations;
46
- const configuredHandleId = Array.isArray(handleConfiguration) ? pickPreferredInnerHandle(getVisibleInnerHandleGroups(handleConfiguration, {
47
- ...containerNode.data ?? {},
48
- nodeId: containerNode.id
49
- }), 'target')?.handle.id : null;
71
+ const configuredHandleId = options?.getLoopContinuationTargetHandle?.(containerNode)?.targetHandleId ?? (()=>{
72
+ const handleConfiguration = getDataHandleConfigurations(containerNode);
73
+ return handleConfiguration ? pickPreferredInnerHandle(getVisibleInnerHandleGroups(handleConfiguration, {
74
+ ...containerNode.data ?? {},
75
+ nodeId: containerNode.id
76
+ }), 'target')?.handle.id : null;
77
+ })();
50
78
  const returningEdges = reactFlowInstance.getEdges().filter((edge)=>!isPreviewEdge(edge) && edge.target === containerId).filter((edge)=>nodesById.get(edge.source)?.parentId === containerId);
51
79
  if (configuredHandleId && (0 === returningEdges.length || returningEdges.some((edge)=>edge.targetHandle === configuredHandleId))) return {
52
80
  targetHandleId: configuredHandleId
@@ -58,11 +86,25 @@ function resolvePreferredLoopContinuationTargetHandle(containerId, reactFlowInst
58
86
  targetHandleId
59
87
  } : null;
60
88
  }
61
- function resolveLoopContinuationTarget({ sourceNodeId, sourceHandleId, reactFlowInstance }) {
89
+ function isLoopLocalTarget(sourceNode, targetNode, nodesById, options) {
90
+ if (!targetNode) return false;
91
+ const container = getContainerNode({
92
+ sourceNode,
93
+ targetNode
94
+ });
95
+ if (!container) return false;
96
+ return isResolvedLoopContainer(nodesById.get(container.containerId), options);
97
+ }
98
+ function resolveLoopContinuationTarget({ sourceNodeId, sourceHandleId, reactFlowInstance, resolverOptions }) {
62
99
  const sourceNode = reactFlowInstance.getNode(sourceNodeId);
63
100
  if (!sourceNode) return null;
101
+ const nodes = reactFlowInstance.getNodes();
102
+ const nodesById = new Map(nodes.map((node)=>[
103
+ node.id,
104
+ node
105
+ ]));
64
106
  const outgoingEdges = reactFlowInstance.getEdges().filter((edge)=>!isPreviewEdge(edge) && matchesSourceHandle(edge, sourceNodeId, sourceHandleId));
65
- const loopLocalOutgoingEdges = outgoingEdges.filter((edge)=>isLoopLocalTarget(sourceNode, reactFlowInstance.getNode(edge.target)));
107
+ const loopLocalOutgoingEdges = outgoingEdges.filter((edge)=>isLoopLocalTarget(sourceNode, nodesById.get(edge.target), nodesById, resolverOptions));
66
108
  if (1 === outgoingEdges.length && 1 === loopLocalOutgoingEdges.length) {
67
109
  const edge = loopLocalOutgoingEdges[0];
68
110
  return {
@@ -76,7 +118,8 @@ function resolveLoopContinuationTarget({ sourceNodeId, sourceHandleId, reactFlow
76
118
  type: 'ambiguous'
77
119
  };
78
120
  if (!sourceNode.parentId || outgoingEdges.length > 0) return null;
79
- const targetHandle = resolvePreferredLoopContinuationTargetHandle(sourceNode.parentId, reactFlowInstance);
121
+ if (!isResolvedLoopContainer(nodesById.get(sourceNode.parentId), resolverOptions)) return null;
122
+ const targetHandle = resolvePreferredLoopContinuationTargetHandle(sourceNode.parentId, reactFlowInstance, resolverOptions);
80
123
  if (!targetHandle) return {
81
124
  type: 'ambiguous'
82
125
  };
@@ -164,7 +207,7 @@ function getSequencePreviewTopLeft({ containerNode, sourceNode, targetNode, node
164
207
  function createLoopSequencePreviewPlacement({ sourceNodeId, targetNodeId, reactFlowInstance, previewNodeSize = {
165
208
  width: DEFAULT_NODE_SIZE,
166
209
  height: DEFAULT_NODE_SIZE
167
- }, avoidSiblings = false }) {
210
+ }, avoidSiblings = false, resolverOptions }) {
168
211
  const sourceNode = reactFlowInstance.getNode(sourceNodeId);
169
212
  const targetNode = targetNodeId ? reactFlowInstance.getNode(targetNodeId) : void 0;
170
213
  if (!sourceNode) return null;
@@ -174,7 +217,7 @@ function createLoopSequencePreviewPlacement({ sourceNodeId, targetNodeId, reactF
174
217
  });
175
218
  if (!container) return null;
176
219
  const containerNode = reactFlowInstance.getNode(container.containerId);
177
- if (!containerNode) return null;
220
+ if (!isResolvedLoopContainer(containerNode, resolverOptions)) return null;
178
221
  const containerAbsolutePosition = getAbsolutePosition(containerNode, reactFlowInstance.getNodes());
179
222
  const nodes = reactFlowInstance.getNodes();
180
223
  const topLeft = getSequencePreviewTopLeft({
@@ -194,9 +237,10 @@ function createLoopSequencePreviewPlacement({ sourceNodeId, targetNodeId, reactF
194
237
  }
195
238
  };
196
239
  }
197
- function getLoopSequencePlacementFromPreviewGraph(previewNode, connections) {
240
+ function getLoopSequencePlacementFromPreviewGraph(previewNode, connections, options = {}) {
198
241
  const containerId = previewNode.parentId;
199
242
  if (!containerId) return null;
243
+ if (!(options.isLoopContainerId?.(containerId) ?? false)) return null;
200
244
  const sourceConnections = connections.filter((connection)=>!connection.addNewNodeAsSource);
201
245
  const targetConnections = connections.filter((connection)=>connection.addNewNodeAsSource);
202
246
  if (1 !== sourceConnections.length || 1 !== targetConnections.length) return null;
@@ -209,36 +253,36 @@ function getLoopSequencePlacementFromPreviewGraph(previewNode, connections) {
209
253
  mode: sourceNodeId === containerId && targetNodeId === containerId ? 'first-child' : 'sequence'
210
254
  };
211
255
  }
212
- function resolveLoopAddNodePreview({ sourceNodeId, sourceHandleId, reactFlowInstance }) {
256
+ function resolveLoopAddNodePreview({ sourceNodeId, sourceHandleId, reactFlowInstance, resolverOptions }) {
213
257
  const loopContinuation = resolveLoopContinuationTarget({
214
258
  sourceNodeId,
215
259
  sourceHandleId,
216
- reactFlowInstance
260
+ reactFlowInstance,
261
+ resolverOptions
217
262
  });
218
- if (loopContinuation?.type === 'ambiguous') return {
219
- action: 'skip'
220
- };
221
- if (loopContinuation?.type !== 'target') return {
263
+ if (loopContinuation?.type === 'ambiguous' || loopContinuation?.type !== 'target') return {
222
264
  action: 'continue'
223
265
  };
224
266
  const loopSequencePlacement = createLoopSequencePreviewPlacement({
225
267
  sourceNodeId,
226
268
  targetNodeId: loopContinuation.targetNodeId,
227
269
  reactFlowInstance,
228
- avoidSiblings: !loopContinuation.removedEdge
270
+ avoidSiblings: !loopContinuation.removedEdge,
271
+ resolverOptions
229
272
  });
273
+ if (!loopSequencePlacement) return {
274
+ action: 'continue'
275
+ };
230
276
  return {
231
277
  action: 'create-preview',
232
278
  previewGraphOptions: {
233
- ...loopSequencePlacement ? {
234
- position: loopSequencePlacement.centerPosition,
235
- positionMode: 'center',
236
- containerId: loopSequencePlacement.containerId,
237
- ...loopContinuation.removedEdge ? {
238
- data: {
239
- originalEdge: loopContinuation.removedEdge
240
- }
241
- } : {}
279
+ position: loopSequencePlacement.centerPosition,
280
+ positionMode: 'center',
281
+ containerId: loopSequencePlacement.containerId,
282
+ ...loopContinuation.removedEdge ? {
283
+ data: {
284
+ originalEdge: loopContinuation.removedEdge
285
+ }
242
286
  } : {},
243
287
  targetNodeId: loopContinuation.targetNodeId,
244
288
  targetHandleId: loopContinuation.targetHandleId,
@@ -340,4 +384,4 @@ function resolveLoopSequenceMaterializedNodes({ nodes, edges, insertedNode, plac
340
384
  return node;
341
385
  });
342
386
  }
343
- export { createLoopSequencePreviewPlacement, getLoopSequencePlacementFromPreviewGraph, resolveLoopAddNodePreview, resolveLoopSequenceMaterializedNodes };
387
+ export { createLoopSequencePreviewPlacement, createLoopSequenceResolverOptions, getLoopSequencePlacementFromPreviewGraph, resolveLoopAddNodePreview, resolveLoopSequenceMaterializedNodes };
@@ -32,7 +32,10 @@ function showCenteredContainerPreview({ containerId, reactFlowInstance, previewH
32
32
  const placement = (0, external_LoopNode_sequence_cjs_namespaceObject.createLoopSequencePreviewPlacement)({
33
33
  sourceNodeId: containerId,
34
34
  targetNodeId: containerId,
35
- reactFlowInstance
35
+ reactFlowInstance,
36
+ resolverOptions: {
37
+ isLoopContainerNode: (node)=>node.id === containerId
38
+ }
36
39
  });
37
40
  if (!placement) return;
38
41
  (0, createPreviewGraph_cjs_namespaceObject.showPreviewGraph)({
@@ -1 +1 @@
1
- {"version":3,"file":"LoopNodePreview.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNodePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAElF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAGvE,wBAAgB,4BAA4B,CAAC,EAC3C,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,4BAA4B,CAAC;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,QAoBA"}
1
+ {"version":3,"file":"LoopNodePreview.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNodePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAElF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAGvE,wBAAgB,4BAA4B,CAAC,EAC3C,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,4BAA4B,CAAC;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,QAuBA"}
@@ -4,7 +4,10 @@ function showCenteredContainerPreview({ containerId, reactFlowInstance, previewH
4
4
  const placement = createLoopSequencePreviewPlacement({
5
5
  sourceNodeId: containerId,
6
6
  targetNodeId: containerId,
7
- reactFlowInstance
7
+ reactFlowInstance,
8
+ resolverOptions: {
9
+ isLoopContainerNode: (node)=>node.id === containerId
10
+ }
8
11
  });
9
12
  if (!placement) return;
10
13
  showPreviewGraph({
@@ -29,6 +29,7 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  const react_cjs_namespaceObject = require("../../../xyflow/react.cjs");
30
30
  const external_react_namespaceObject = require("react");
31
31
  const external_constants_cjs_namespaceObject = require("../../../constants.cjs");
32
+ const index_cjs_namespaceObject = require("../../../core/index.cjs");
32
33
  const createPreviewGraph_cjs_namespaceObject = require("../../../utils/createPreviewGraph.cjs");
33
34
  const createPreviewNode_cjs_namespaceObject = require("../../../utils/createPreviewNode.cjs");
34
35
  const BaseCanvasModeProvider_cjs_namespaceObject = require("../../BaseCanvas/BaseCanvasModeProvider.cjs");
@@ -36,8 +37,12 @@ const LoopNode_sequence_cjs_namespaceObject = require("../../LoopNode/LoopNode.s
36
37
  const external_useEdgeToolbarPositioning_cjs_namespaceObject = require("./useEdgeToolbarPositioning.cjs");
37
38
  function useEdgeToolbarState({ edgeId, pathElementRef, isHovered, source, target, sourceHandleId, targetHandleId, sourcePosition, targetPosition, ignoredNodeTypes }) {
38
39
  const reactFlow = (0, react_cjs_namespaceObject.useReactFlow)();
40
+ const registry = (0, index_cjs_namespaceObject.useOptionalNodeTypeRegistry)();
39
41
  const { mode } = (0, BaseCanvasModeProvider_cjs_namespaceObject.useBaseCanvasMode)();
40
42
  const isDesignMode = 'design' === mode;
43
+ const resolverOptions = (0, external_react_namespaceObject.useMemo)(()=>(0, LoopNode_sequence_cjs_namespaceObject.createLoopSequenceResolverOptions)(registry), [
44
+ registry
45
+ ]);
41
46
  const previewEdge = (0, createPreviewNode_cjs_namespaceObject.isPreviewEdge)({
42
47
  id: edgeId,
43
48
  source,
@@ -60,7 +65,8 @@ function useEdgeToolbarState({ edgeId, pathElementRef, isHovered, source, target
60
65
  const loopSequencePlacement = (0, LoopNode_sequence_cjs_namespaceObject.createLoopSequencePreviewPlacement)({
61
66
  sourceNodeId: source,
62
67
  targetNodeId: target,
63
- reactFlowInstance: reactFlow
68
+ reactFlowInstance: reactFlow,
69
+ resolverOptions
64
70
  });
65
71
  (0, createPreviewGraph_cjs_namespaceObject.showPreviewGraph)({
66
72
  sourceNodeId: source,
@@ -89,7 +95,8 @@ function useEdgeToolbarState({ edgeId, pathElementRef, isHovered, source, target
89
95
  target,
90
96
  targetHandleId,
91
97
  edgeId,
92
- ignoredNodeTypes
98
+ ignoredNodeTypes,
99
+ resolverOptions
93
100
  ]);
94
101
  const config = (0, external_react_namespaceObject.useMemo)(()=>({
95
102
  actions: [
@@ -1 +1 @@
1
- {"version":3,"file":"useEdgeToolbarState.d.ts","sourceRoot":"","sources":["../../../../../src/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAgB,MAAM,0CAA0C,CAAC;AAOlG,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAGtF,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC9D,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,QAAQ,CAAC;IACzB,cAAc,EAAE,QAAQ,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACnD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CAC3D;AAED,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,cAAc,EACd,SAAS,EACT,MAAM,EACN,MAAM,EACN,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,gBAAgB,GACjB,EAAE,wBAAwB,GAAG,gBAAgB,CAuF7C"}
1
+ {"version":3,"file":"useEdgeToolbarState.d.ts","sourceRoot":"","sources":["../../../../../src/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,QAAQ,EAAgB,MAAM,0CAA0C,CAAC;AAWlG,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAGtF,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC9D,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,QAAQ,CAAC;IACzB,cAAc,EAAE,QAAQ,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACnD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CAC3D;AAED,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,cAAc,EACd,SAAS,EACT,MAAM,EACN,MAAM,EACN,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,gBAAgB,GACjB,EAAE,wBAAwB,GAAG,gBAAgB,CA2F7C"}
@@ -1,15 +1,20 @@
1
1
  import { useReactFlow } from "../../../xyflow/react.js";
2
2
  import { useCallback, useMemo } from "react";
3
3
  import { DEFAULT_SOURCE_HANDLE_ID } from "../../../constants.js";
4
+ import { useOptionalNodeTypeRegistry } from "../../../core/index.js";
4
5
  import { showPreviewGraph } from "../../../utils/createPreviewGraph.js";
5
6
  import { isPreviewEdge } from "../../../utils/createPreviewNode.js";
6
7
  import { useBaseCanvasMode } from "../../BaseCanvas/BaseCanvasModeProvider.js";
7
- import { createLoopSequencePreviewPlacement } from "../../LoopNode/LoopNode.sequence.js";
8
+ import { createLoopSequencePreviewPlacement, createLoopSequenceResolverOptions } from "../../LoopNode/LoopNode.sequence.js";
8
9
  import { useEdgeToolbarPositioning } from "./useEdgeToolbarPositioning.js";
9
10
  function useEdgeToolbarState({ edgeId, pathElementRef, isHovered, source, target, sourceHandleId, targetHandleId, sourcePosition, targetPosition, ignoredNodeTypes }) {
10
11
  const reactFlow = useReactFlow();
12
+ const registry = useOptionalNodeTypeRegistry();
11
13
  const { mode } = useBaseCanvasMode();
12
14
  const isDesignMode = 'design' === mode;
15
+ const resolverOptions = useMemo(()=>createLoopSequenceResolverOptions(registry), [
16
+ registry
17
+ ]);
13
18
  const previewEdge = isPreviewEdge({
14
19
  id: edgeId,
15
20
  source,
@@ -32,7 +37,8 @@ function useEdgeToolbarState({ edgeId, pathElementRef, isHovered, source, target
32
37
  const loopSequencePlacement = createLoopSequencePreviewPlacement({
33
38
  sourceNodeId: source,
34
39
  targetNodeId: target,
35
- reactFlowInstance: reactFlow
40
+ reactFlowInstance: reactFlow,
41
+ resolverOptions
36
42
  });
37
43
  showPreviewGraph({
38
44
  sourceNodeId: source,
@@ -61,7 +67,8 @@ function useEdgeToolbarState({ edgeId, pathElementRef, isHovered, source, target
61
67
  target,
62
68
  targetHandleId,
63
69
  edgeId,
64
- ignoredNodeTypes
70
+ ignoredNodeTypes,
71
+ resolverOptions
65
72
  ]);
66
73
  const config = useMemo(()=>({
67
74
  actions: [
@@ -225,7 +225,12 @@ class NodeTypeRegistry {
225
225
  type: nodeItemManifest.nodeType,
226
226
  category: nodeItemManifest.category
227
227
  };
228
- const defaultNodeItemHandle = this.getDefaultHandle(nodeType, connection.addNewNodeAsSource ? 'source' : 'target');
228
+ const defaultNodeItemHandle = (0, index_cjs_namespaceObject.getNodeHandleForPreviewConnection)({
229
+ manifest: nodeItemManifest,
230
+ connection,
231
+ connections: previewNodeConnectionInfo,
232
+ getDefaultHandle: (handleType)=>this.getDefaultHandle(nodeType, handleType)
233
+ });
229
234
  if (!defaultNodeItemHandle) return false;
230
235
  const connectionValidationData = connection.addNewNodeAsSource ? {
231
236
  sourceNode: nodeToValidateData,
@@ -1 +1 @@
1
- {"version":3,"file":"NodeTypeRegistry.d.ts","sourceRoot":"","sources":["../../../src/canvas/core/NodeTypeRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAMhG,OAAO,EAAE,YAAY,EAA4B,MAAM,gBAAgB,CAAC;AAGxE,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,wBAAwB,CAAkC;IAClE,OAAO,CAAC,kBAAkB,CAAqD;IAC/E,OAAO,CAAC,eAAe,CAAiD;IACxE,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,YAAY,CAA6B;IAEjD,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,iBAAiB;IAYzB,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE;IA8B3C,gBAAgB,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,gBAAgB,EAAE;IAyErF,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAWzE,eAAe,IAAI,YAAY,EAAE;IAQjC,mBAAmB,IAAI,YAAY,EAAE;IAQrC,gBAAgB,IAAI,MAAM,EAAE;IAQ5B,eAAe,IAAI,MAAM,EAAE;IAO3B,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW;IAQrE,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,QAAQ,GAAG,QAAQ,EAC/B,OAAO,CAAC,EAAE,MAAM,GACf,cAAc,GAAG,SAAS;IAW7B,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY;IAqCvF,eAAe,IAAI,YAAY,GAAG,IAAI;IAOtC,KAAK,IAAI,IAAI;IAyBb,4BAA4B,CAC1B,UAAU,EAAE,MAAM,EAClB,yBAAyB,EAAE,yBAAyB,EAAE,GAAG,IAAI,GAAG,SAAS,GACxE,OAAO;IA6CV,wBAAwB,CACtB,QAAQ,EAAE,MAAM,EAChB,yBAAyB,EAAE,yBAAyB,EAAE,GAAG,IAAI,GAAG,SAAS;IAgE3E,OAAO,CAAC,yBAAyB;IAqCjC,cAAc,CAAC,OAAO,EAAE;QACtB,WAAW,CAAC,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC;QACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,GAAG,QAAQ,EAAE;CAyCf"}
1
+ {"version":3,"file":"NodeTypeRegistry.d.ts","sourceRoot":"","sources":["../../../src/canvas/core/NodeTypeRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAOhG,OAAO,EAAE,YAAY,EAA4B,MAAM,gBAAgB,CAAC;AAGxE,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,wBAAwB,CAAkC;IAClE,OAAO,CAAC,kBAAkB,CAAqD;IAC/E,OAAO,CAAC,eAAe,CAAiD;IACxE,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,YAAY,CAA6B;IAEjD,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,iBAAiB;IAYzB,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE;IA8B3C,gBAAgB,CAAC,aAAa,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,gBAAgB,EAAE;IAyErF,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAWzE,eAAe,IAAI,YAAY,EAAE;IAQjC,mBAAmB,IAAI,YAAY,EAAE;IAQrC,gBAAgB,IAAI,MAAM,EAAE;IAQ5B,eAAe,IAAI,MAAM,EAAE;IAO3B,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW;IAQrE,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,QAAQ,GAAG,QAAQ,EAC/B,OAAO,CAAC,EAAE,MAAM,GACf,cAAc,GAAG,SAAS;IAW7B,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY;IAqCvF,eAAe,IAAI,YAAY,GAAG,IAAI;IAOtC,KAAK,IAAI,IAAI;IAyBb,4BAA4B,CAC1B,UAAU,EAAE,MAAM,EAClB,yBAAyB,EAAE,yBAAyB,EAAE,GAAG,IAAI,GAAG,SAAS,GACxE,OAAO;IA6CV,wBAAwB,CACtB,QAAQ,EAAE,MAAM,EAChB,yBAAyB,EAAE,yBAAyB,EAAE,GAAG,IAAI,GAAG,SAAS;IAkE3E,OAAO,CAAC,yBAAyB;IAqCjC,cAAc,CAAC,OAAO,EAAE;QACtB,WAAW,CAAC,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC;QACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,GAAG,QAAQ,EAAE;CAyCf"}
@@ -1,4 +1,4 @@
1
- import { checkCategoryConstraint, validateConnection } from "../utils/index.js";
1
+ import { checkCategoryConstraint, getNodeHandleForPreviewConnection, validateConnection } from "../utils/index.js";
2
2
  import { CategoryTree } from "./CategoryTree.js";
3
3
  import { CategoryTreeAdapter } from "./CategoryTreeAdapter.js";
4
4
  class NodeTypeRegistry {
@@ -197,7 +197,12 @@ class NodeTypeRegistry {
197
197
  type: nodeItemManifest.nodeType,
198
198
  category: nodeItemManifest.category
199
199
  };
200
- const defaultNodeItemHandle = this.getDefaultHandle(nodeType, connection.addNewNodeAsSource ? 'source' : 'target');
200
+ const defaultNodeItemHandle = getNodeHandleForPreviewConnection({
201
+ manifest: nodeItemManifest,
202
+ connection,
203
+ connections: previewNodeConnectionInfo,
204
+ getDefaultHandle: (handleType)=>this.getDefaultHandle(nodeType, handleType)
205
+ });
201
206
  if (!defaultNodeItemHandle) return false;
202
207
  const connectionValidationData = connection.addNewNodeAsSource ? {
203
208
  sourceNode: nodeToValidateData,
@@ -139,10 +139,11 @@ function ensureContainersFitChildren(nodes, { containerIds, getContainerFitGeome
139
139
  right: 0,
140
140
  bottom: 0
141
141
  });
142
- const currentDimensions = getNodeDimensions(containerNode, {
143
- width: geometry.minWidth,
144
- height: geometry.minHeight
145
- });
142
+ const resolvedContainerDimensions = resolveNodeDimensions(containerNode);
143
+ const currentDimensions = {
144
+ width: Math.max(geometry.minWidth, resolvedContainerDimensions.width),
145
+ height: Math.max(geometry.minHeight, resolvedContainerDimensions.height)
146
+ };
146
147
  const requiredWidth = (0, external_NodeUtils_cjs_namespaceObject.snapUpToGrid)(Math.max(geometry.minWidth, requiredBounds.right + geometry.padding.right));
147
148
  const requiredHeight = (0, external_NodeUtils_cjs_namespaceObject.snapUpToGrid)(Math.max(geometry.minHeight, requiredBounds.bottom + geometry.padding.bottom));
148
149
  const nextDimensions = {};
@@ -1 +1 @@
1
- {"version":3,"file":"container-sizing.d.ts","sourceRoot":"","sources":["../../../src/canvas/utils/container-sizing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0CAA0C,CAAC;AAIrE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,kCAAkC;IACjD,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IACnD,uBAAuB,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,KAAK,oBAAoB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3F,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,cAAc,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAkBD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,EAC3D,QAAQ,GAAE,cAAwE,GACjF,cAAc,CAQhB;AAkFD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,IAAI,EAAE,EACb,EACE,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,EAAE,qBAAyC,EAC5D,gBAAqB,EACrB,gBAAwB,GACzB,GAAE,kCAAuC,GACzC,IAAI,EAAE,CAqER"}
1
+ {"version":3,"file":"container-sizing.d.ts","sourceRoot":"","sources":["../../../src/canvas/utils/container-sizing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0CAA0C,CAAC;AAIrE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,kCAAkC;IACjD,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IACnD,uBAAuB,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,KAAK,oBAAoB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3F,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,cAAc,CAAC;IACnD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAkBD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,EAC3D,QAAQ,GAAE,cAAwE,GACjF,cAAc,CAQhB;AAkFD,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,IAAI,EAAE,EACb,EACE,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,EAAE,qBAAyC,EAC5D,gBAAqB,EACrB,gBAAwB,GACzB,GAAE,kCAAuC,GACzC,IAAI,EAAE,CAsER"}
@@ -110,10 +110,11 @@ function ensureContainersFitChildren(nodes, { containerIds, getContainerFitGeome
110
110
  right: 0,
111
111
  bottom: 0
112
112
  });
113
- const currentDimensions = getNodeDimensions(containerNode, {
114
- width: geometry.minWidth,
115
- height: geometry.minHeight
116
- });
113
+ const resolvedContainerDimensions = resolveNodeDimensions(containerNode);
114
+ const currentDimensions = {
115
+ width: Math.max(geometry.minWidth, resolvedContainerDimensions.width),
116
+ height: Math.max(geometry.minHeight, resolvedContainerDimensions.height)
117
+ };
117
118
  const requiredWidth = snapUpToGrid(Math.max(geometry.minWidth, requiredBounds.right + geometry.padding.right));
118
119
  const requiredHeight = snapUpToGrid(Math.max(geometry.minHeight, requiredBounds.bottom + geometry.padding.bottom));
119
120
  const nextDimensions = {};
@@ -54,6 +54,9 @@ var __webpack_modules__ = {
54
54
  "./manifest-resolver" (module) {
55
55
  module.exports = require("./manifest-resolver.cjs");
56
56
  },
57
+ "./preview-connection-handles" (module) {
58
+ module.exports = require("./preview-connection-handles.cjs");
59
+ },
57
60
  "./props-helpers" (module) {
58
61
  module.exports = require("./props-helpers.cjs");
59
62
  },
@@ -168,21 +171,25 @@ var __webpack_exports__ = {};
168
171
  var __rspack_reexport = {};
169
172
  for(const __rspack_import_key in _NodeUtils__rspack_import_15)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_NodeUtils__rspack_import_15[__rspack_import_key];
170
173
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
171
- var _props_helpers__rspack_import_16 = __webpack_require__("./props-helpers");
174
+ var _preview_connection_handles__rspack_import_16 = __webpack_require__("./preview-connection-handles");
175
+ var __rspack_reexport = {};
176
+ for(const __rspack_import_key in _preview_connection_handles__rspack_import_16)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_preview_connection_handles__rspack_import_16[__rspack_import_key];
177
+ __webpack_require__.d(__webpack_exports__, __rspack_reexport);
178
+ var _props_helpers__rspack_import_17 = __webpack_require__("./props-helpers");
172
179
  var __rspack_reexport = {};
173
- for(const __rspack_import_key in _props_helpers__rspack_import_16)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_props_helpers__rspack_import_16[__rspack_import_key];
180
+ for(const __rspack_import_key in _props_helpers__rspack_import_17)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_props_helpers__rspack_import_17[__rspack_import_key];
174
181
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
175
- var _resource_operations__rspack_import_17 = __webpack_require__("./resource-operations");
182
+ var _resource_operations__rspack_import_18 = __webpack_require__("./resource-operations");
176
183
  var __rspack_reexport = {};
177
- for(const __rspack_import_key in _resource_operations__rspack_import_17)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_resource_operations__rspack_import_17[__rspack_import_key];
184
+ for(const __rspack_import_key in _resource_operations__rspack_import_18)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_resource_operations__rspack_import_18[__rspack_import_key];
178
185
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
179
- var _Storage__rspack_import_18 = __webpack_require__("./Storage");
186
+ var _Storage__rspack_import_19 = __webpack_require__("./Storage");
180
187
  var __rspack_reexport = {};
181
- for(const __rspack_import_key in _Storage__rspack_import_18)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_Storage__rspack_import_18[__rspack_import_key];
188
+ for(const __rspack_import_key in _Storage__rspack_import_19)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_Storage__rspack_import_19[__rspack_import_key];
182
189
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
183
- var _StyleUtil__rspack_import_19 = __webpack_require__("./StyleUtil");
190
+ var _StyleUtil__rspack_import_20 = __webpack_require__("./StyleUtil");
184
191
  var __rspack_reexport = {};
185
- for(const __rspack_import_key in _StyleUtil__rspack_import_19)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_StyleUtil__rspack_import_19[__rspack_import_key];
192
+ for(const __rspack_import_key in _StyleUtil__rspack_import_20)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_StyleUtil__rspack_import_20[__rspack_import_key];
186
193
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
187
194
  })();
188
195
  for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
@@ -14,6 +14,7 @@ export * from './GroupModificationUtils';
14
14
  export * from './icon-registry';
15
15
  export * from './manifest-resolver';
16
16
  export * from './NodeUtils';
17
+ export * from './preview-connection-handles';
17
18
  export * from './props-helpers';
18
19
  export * from './resource-operations';
19
20
  export * from './Storage';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/canvas/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/canvas/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
@@ -14,6 +14,7 @@ export * from "./GroupModificationUtils.js";
14
14
  export * from "./icon-registry.js";
15
15
  export * from "./manifest-resolver.js";
16
16
  export * from "./NodeUtils.js";
17
+ export * from "./preview-connection-handles.js";
17
18
  export * from "./props-helpers.js";
18
19
  export * from "./resource-operations.js";
19
20
  export * from "./Storage.js";
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ getFirstOutputHandle: ()=>getFirstOutputHandle,
28
+ getNodeHandleForPreviewConnection: ()=>getNodeHandleForPreviewConnection,
29
+ shouldUseFirstOutputHandleForContinuation: ()=>shouldUseFirstOutputHandleForContinuation
30
+ });
31
+ function getFirstOutputHandle(manifest) {
32
+ for (const group of manifest.handleConfiguration){
33
+ const handle = group.handles.find((candidate)=>'source' === candidate.type && 'output' === candidate.handleType);
34
+ if (handle) return handle;
35
+ }
36
+ }
37
+ function shouldUseFirstOutputHandleForContinuation(connection, connections) {
38
+ return connection.addNewNodeAsSource && connections.some((item)=>!item.addNewNodeAsSource) && connection.existingHandleManifest?.handleType !== 'artifact';
39
+ }
40
+ function getNodeHandleForPreviewConnection({ manifest, connection, connections, getDefaultHandle }) {
41
+ const handleType = connection.addNewNodeAsSource ? 'source' : 'target';
42
+ if (shouldUseFirstOutputHandleForContinuation(connection, connections)) return getFirstOutputHandle(manifest) ?? getDefaultHandle(handleType);
43
+ return getDefaultHandle(handleType);
44
+ }
45
+ exports.getFirstOutputHandle = __webpack_exports__.getFirstOutputHandle;
46
+ exports.getNodeHandleForPreviewConnection = __webpack_exports__.getNodeHandleForPreviewConnection;
47
+ exports.shouldUseFirstOutputHandleForContinuation = __webpack_exports__.shouldUseFirstOutputHandleForContinuation;
48
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
49
+ "getFirstOutputHandle",
50
+ "getNodeHandleForPreviewConnection",
51
+ "shouldUseFirstOutputHandleForContinuation"
52
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
53
+ Object.defineProperty(exports, '__esModule', {
54
+ value: true
55
+ });
@@ -0,0 +1,14 @@
1
+ import type { PreviewNodeConnectionInfo } from '../hooks';
2
+ import type { HandleManifest, NodeManifest } from '../schema/node-definition';
3
+ type PreviewConnectionDirection = Pick<PreviewNodeConnectionInfo, 'addNewNodeAsSource'>;
4
+ type PreviewConnectionHandle = Pick<PreviewNodeConnectionInfo, 'addNewNodeAsSource' | 'existingHandleManifest'>;
5
+ export declare function getFirstOutputHandle(manifest: Pick<NodeManifest, 'handleConfiguration'>): HandleManifest | undefined;
6
+ export declare function shouldUseFirstOutputHandleForContinuation(connection: PreviewConnectionHandle, connections: PreviewConnectionDirection[]): boolean;
7
+ export declare function getNodeHandleForPreviewConnection({ manifest, connection, connections, getDefaultHandle, }: {
8
+ manifest: Pick<NodeManifest, 'handleConfiguration'>;
9
+ connection: PreviewConnectionHandle;
10
+ connections: PreviewConnectionDirection[];
11
+ getDefaultHandle: (handleType: 'source' | 'target') => HandleManifest | undefined;
12
+ }): HandleManifest | undefined;
13
+ export {};
14
+ //# sourceMappingURL=preview-connection-handles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-connection-handles.d.ts","sourceRoot":"","sources":["../../../src/canvas/utils/preview-connection-handles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9E,KAAK,0BAA0B,GAAG,IAAI,CAAC,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;AACxF,KAAK,uBAAuB,GAAG,IAAI,CACjC,yBAAyB,EACzB,oBAAoB,GAAG,wBAAwB,CAChD,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,GAClD,cAAc,GAAG,SAAS,CAS5B;AAED,wBAAgB,yCAAyC,CACvD,UAAU,EAAE,uBAAuB,EACnC,WAAW,EAAE,0BAA0B,EAAE,WAO1C;AAED,wBAAgB,iCAAiC,CAAC,EAChD,QAAQ,EACR,UAAU,EACV,WAAW,EACX,gBAAgB,GACjB,EAAE;IACD,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IACpD,UAAU,EAAE,uBAAuB,CAAC;IACpC,WAAW,EAAE,0BAA0B,EAAE,CAAC;IAC1C,gBAAgB,EAAE,CAAC,UAAU,EAAE,QAAQ,GAAG,QAAQ,KAAK,cAAc,GAAG,SAAS,CAAC;CACnF,GAAG,cAAc,GAAG,SAAS,CAQ7B"}
@@ -0,0 +1,15 @@
1
+ function getFirstOutputHandle(manifest) {
2
+ for (const group of manifest.handleConfiguration){
3
+ const handle = group.handles.find((candidate)=>'source' === candidate.type && 'output' === candidate.handleType);
4
+ if (handle) return handle;
5
+ }
6
+ }
7
+ function shouldUseFirstOutputHandleForContinuation(connection, connections) {
8
+ return connection.addNewNodeAsSource && connections.some((item)=>!item.addNewNodeAsSource) && connection.existingHandleManifest?.handleType !== 'artifact';
9
+ }
10
+ function getNodeHandleForPreviewConnection({ manifest, connection, connections, getDefaultHandle }) {
11
+ const handleType = connection.addNewNodeAsSource ? 'source' : 'target';
12
+ if (shouldUseFirstOutputHandleForContinuation(connection, connections)) return getFirstOutputHandle(manifest) ?? getDefaultHandle(handleType);
13
+ return getDefaultHandle(handleType);
14
+ }
15
+ export { getFirstOutputHandle, getNodeHandleForPreviewConnection, shouldUseFirstOutputHandleForContinuation };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uipath/apollo-react",
3
- "version": "4.15.0-pr605.6ea14a7",
3
+ "version": "4.15.0-pr605.6f11404",
4
4
  "description": "Apollo Design System - React component library with Material UI theming",
5
5
  "repository": {
6
6
  "type": "git",