@uipath/apollo-react 4.12.0 → 4.12.1-pr556.9394355
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas/components/AddNodePanel/AddNodeManager.cjs +26 -7
- package/dist/canvas/components/AddNodePanel/AddNodeManager.d.ts.map +1 -1
- package/dist/canvas/components/AddNodePanel/AddNodeManager.js +26 -7
- package/dist/canvas/components/AddNodePanel/createAddNodePreview.cjs +2 -2
- package/dist/canvas/components/AddNodePanel/createAddNodePreview.d.ts +8 -1
- package/dist/canvas/components/AddNodePanel/createAddNodePreview.d.ts.map +1 -1
- package/dist/canvas/components/AddNodePanel/createAddNodePreview.js +2 -2
- package/dist/canvas/components/AgentCanvas/agent-flow.manifest.d.ts +1 -0
- package/dist/canvas/components/AgentCanvas/agent-flow.manifest.d.ts.map +1 -1
- package/dist/canvas/components/BaseNode/BaseNode.cjs +8 -3
- package/dist/canvas/components/BaseNode/BaseNode.d.ts +2 -1
- package/dist/canvas/components/BaseNode/BaseNode.d.ts.map +1 -1
- package/dist/canvas/components/BaseNode/BaseNode.js +5 -3
- package/dist/canvas/components/ButtonHandle/ButtonHandle.cjs +115 -34
- package/dist/canvas/components/ButtonHandle/ButtonHandle.d.ts +4 -2
- package/dist/canvas/components/ButtonHandle/ButtonHandle.d.ts.map +1 -1
- package/dist/canvas/components/ButtonHandle/ButtonHandle.js +117 -36
- package/dist/canvas/components/ButtonHandle/ButtonHandleStyleUtils.cjs +48 -1
- package/dist/canvas/components/ButtonHandle/ButtonHandleStyleUtils.d.ts +4 -0
- package/dist/canvas/components/ButtonHandle/ButtonHandleStyleUtils.d.ts.map +1 -1
- package/dist/canvas/components/ButtonHandle/ButtonHandleStyleUtils.js +36 -1
- package/dist/canvas/components/ButtonHandle/SmartHandle.cjs +1 -1
- package/dist/canvas/components/ButtonHandle/SmartHandle.js +1 -1
- package/dist/canvas/components/Edges/SequenceEdge.cjs +3 -2
- package/dist/canvas/components/Edges/SequenceEdge.d.ts +11 -2
- package/dist/canvas/components/Edges/SequenceEdge.d.ts.map +1 -1
- package/dist/canvas/components/Edges/SequenceEdge.js +4 -3
- package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.cjs +20 -10
- package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts +2 -0
- package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts.map +1 -1
- package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.js +21 -11
- package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.cjs +5 -8
- package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.d.ts.map +1 -1
- package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.js +5 -8
- package/dist/canvas/components/LoopNode/LoopCanvasNode.cjs +80 -0
- package/dist/canvas/components/LoopNode/LoopCanvasNode.d.ts +6 -0
- package/dist/canvas/components/LoopNode/LoopCanvasNode.d.ts.map +1 -0
- package/dist/canvas/components/LoopNode/LoopCanvasNode.js +46 -0
- package/dist/canvas/components/LoopNode/LoopNode.cjs +440 -0
- package/dist/canvas/components/LoopNode/LoopNode.constants.cjs +77 -0
- package/dist/canvas/components/LoopNode/LoopNode.constants.d.ts +12 -0
- package/dist/canvas/components/LoopNode/LoopNode.constants.d.ts.map +1 -0
- package/dist/canvas/components/LoopNode/LoopNode.constants.js +13 -0
- package/dist/canvas/components/LoopNode/LoopNode.d.ts +5 -0
- package/dist/canvas/components/LoopNode/LoopNode.d.ts.map +1 -0
- package/dist/canvas/components/LoopNode/LoopNode.helpers.cjs +110 -0
- package/dist/canvas/components/LoopNode/LoopNode.helpers.d.ts +19 -0
- package/dist/canvas/components/LoopNode/LoopNode.helpers.d.ts.map +1 -0
- package/dist/canvas/components/LoopNode/LoopNode.helpers.js +70 -0
- package/dist/canvas/components/LoopNode/LoopNode.js +406 -0
- package/dist/canvas/components/LoopNode/LoopNode.types.cjs +18 -0
- package/dist/canvas/components/LoopNode/LoopNode.types.d.ts +16 -0
- package/dist/canvas/components/LoopNode/LoopNode.types.d.ts.map +1 -0
- package/dist/canvas/components/LoopNode/LoopNode.types.js +0 -0
- package/dist/canvas/components/LoopNode/LoopNodePreview.cjs +81 -0
- package/dist/canvas/components/LoopNode/LoopNodePreview.d.ts +8 -0
- package/dist/canvas/components/LoopNode/LoopNodePreview.d.ts.map +1 -0
- package/dist/canvas/components/LoopNode/LoopNodePreview.js +44 -0
- package/dist/canvas/components/LoopNode/index.cjs +72 -0
- package/dist/canvas/components/LoopNode/index.d.ts +4 -0
- package/dist/canvas/components/LoopNode/index.d.ts.map +1 -0
- package/dist/canvas/components/LoopNode/index.js +3 -0
- package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.cjs +20 -18
- package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.d.ts +2 -1
- package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.d.ts.map +1 -1
- package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.js +21 -19
- package/dist/canvas/components/Toolbox/ListView.cjs +3 -2
- package/dist/canvas/components/Toolbox/ListView.d.ts +1 -0
- package/dist/canvas/components/Toolbox/ListView.d.ts.map +1 -1
- package/dist/canvas/components/Toolbox/ListView.js +3 -2
- package/dist/canvas/components/Toolbox/Toolbox.cjs +38 -9
- package/dist/canvas/components/Toolbox/Toolbox.d.ts.map +1 -1
- package/dist/canvas/components/Toolbox/Toolbox.js +38 -9
- package/dist/canvas/components/index.cjs +27 -20
- package/dist/canvas/components/index.d.ts +1 -0
- package/dist/canvas/components/index.d.ts.map +1 -1
- package/dist/canvas/components/index.js +1 -0
- package/dist/canvas/core/NodeTypeRegistry.cjs +41 -23
- package/dist/canvas/core/NodeTypeRegistry.d.ts +8 -4
- package/dist/canvas/core/NodeTypeRegistry.d.ts.map +1 -1
- package/dist/canvas/core/NodeTypeRegistry.js +41 -23
- package/dist/canvas/core/useNodeTypeRegistry.cjs +4 -3
- package/dist/canvas/core/useNodeTypeRegistry.d.ts +1 -1
- package/dist/canvas/core/useNodeTypeRegistry.d.ts.map +1 -1
- package/dist/canvas/core/useNodeTypeRegistry.js +4 -3
- package/dist/canvas/hooks/useAddNodeOnConnectEnd.cjs +4 -3
- package/dist/canvas/hooks/useAddNodeOnConnectEnd.d.ts.map +1 -1
- package/dist/canvas/hooks/useAddNodeOnConnectEnd.js +4 -3
- package/dist/canvas/hooks/usePreviewNode.cjs +4 -2
- package/dist/canvas/hooks/usePreviewNode.d.ts.map +1 -1
- package/dist/canvas/hooks/usePreviewNode.js +4 -2
- package/dist/canvas/schema/node-definition/handle.cjs +10 -2
- package/dist/canvas/schema/node-definition/handle.d.ts +9 -0
- package/dist/canvas/schema/node-definition/handle.d.ts.map +1 -1
- package/dist/canvas/schema/node-definition/handle.js +6 -1
- package/dist/canvas/schema/node-definition/index.cjs +4 -1
- package/dist/canvas/schema/node-definition/index.d.ts +3 -3
- package/dist/canvas/schema/node-definition/index.d.ts.map +1 -1
- package/dist/canvas/schema/node-definition/index.js +2 -2
- package/dist/canvas/schema/node-definition/node-manifest.d.ts +4 -0
- package/dist/canvas/schema/node-definition/node-manifest.d.ts.map +1 -1
- package/dist/canvas/storybook-utils/manifests/index.d.ts +1 -0
- package/dist/canvas/storybook-utils/manifests/index.d.ts.map +1 -1
- package/dist/canvas/storybook-utils/manifests/node-definitions.d.ts.map +1 -1
- package/dist/canvas/styles/tailwind.canvas.css +1 -1
- package/dist/canvas/utils/createPreviewGraph.cjs +94 -0
- package/dist/canvas/utils/createPreviewGraph.d.ts +24 -0
- package/dist/canvas/utils/createPreviewGraph.d.ts.map +1 -0
- package/dist/canvas/utils/createPreviewGraph.js +51 -0
- package/dist/canvas/utils/createPreviewNode.cjs +29 -13
- package/dist/canvas/utils/createPreviewNode.d.ts +5 -1
- package/dist/canvas/utils/createPreviewNode.d.ts.map +1 -1
- package/dist/canvas/utils/createPreviewNode.js +23 -13
- package/dist/canvas/utils/index.cjs +33 -26
- package/dist/canvas/utils/index.d.ts +2 -1
- package/dist/canvas/utils/index.d.ts.map +1 -1
- package/dist/canvas/utils/index.js +2 -1
- package/package.json +1 -1
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { NodeResizeControl, useStore, useUpdateNodeInternals } from "../../xyflow/react.js";
|
|
3
|
+
import { cn } from "@uipath/apollo-wind";
|
|
4
|
+
import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
|
+
import { useOptionalNodeTypeRegistry } from "../../core/index.js";
|
|
6
|
+
import { useElementValidationStatus, useNodeExecutionState } from "../../hooks/index.js";
|
|
7
|
+
import { resolveAdornments } from "../../utils/adornment-resolver.js";
|
|
8
|
+
import { getOppositePosition } from "../../utils/createPreviewNode.js";
|
|
9
|
+
import { CanvasIcon } from "../../utils/icon-registry.js";
|
|
10
|
+
import { resolveDisplay, resolveHandles } from "../../utils/manifest-resolver.js";
|
|
11
|
+
import { resolveToolbar } from "../../utils/toolbar-resolver.js";
|
|
12
|
+
import { useBaseCanvasMode } from "../BaseCanvas/BaseCanvasModeProvider.js";
|
|
13
|
+
import { useConnectedHandles } from "../BaseCanvas/ConnectedHandlesContext.js";
|
|
14
|
+
import { useSelectionState } from "../BaseCanvas/SelectionStateContext.js";
|
|
15
|
+
import { selectIsConnecting } from "../BaseNode/BaseNode.js";
|
|
16
|
+
import { BaseBadgeSlot } from "../BaseNode/BaseNodeBadgeSlot.js";
|
|
17
|
+
import { getStatusBorder } from "../BaseNode/BaseNodeContainer.js";
|
|
18
|
+
import { MissingManifestNode } from "../BaseNode/BaseNodeMissingManifest.js";
|
|
19
|
+
import { ButtonHandles } from "../ButtonHandle/index.js";
|
|
20
|
+
import { NodeToolbar } from "../Toolbar/index.js";
|
|
21
|
+
import { DEFAULT_LOOP_FRAME_BACKGROUND, DEFAULT_LOOP_FRAME_BORDER, DEFAULT_LOOP_HEADER_HEIGHT_PX, DEFAULT_LOOP_ICON, DEFAULT_LOOP_MIN_HEIGHT, DEFAULT_LOOP_MIN_WIDTH, DEFAULT_LOOP_NODE_TYPE, DEFAULT_LOOP_SHELL_BACKGROUND, DEFAULT_LOOP_TITLE, LOOP_FRAME_INSET_PX, LOOP_SHELL_RADIUS_PX } from "./LoopNode.constants.js";
|
|
22
|
+
import { getLoopBodyCenter, partitionLoopHandleGroups } from "./LoopNode.helpers.js";
|
|
23
|
+
const EMPTY_DATA = {};
|
|
24
|
+
const ENABLE_LOOP_HANDLE_ACTION_BUTTON = (_event)=>{};
|
|
25
|
+
const RESIZE_CONTROLS = [
|
|
26
|
+
{
|
|
27
|
+
position: 'top-left',
|
|
28
|
+
cursor: 'nwse-resize',
|
|
29
|
+
indicatorClassName: 'top-[-5px] left-[-5px]'
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
position: 'top-right',
|
|
33
|
+
cursor: 'nesw-resize',
|
|
34
|
+
indicatorClassName: 'top-[-5px] right-[-5px]'
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
position: 'bottom-left',
|
|
38
|
+
cursor: 'nesw-resize',
|
|
39
|
+
indicatorClassName: 'bottom-[-5px] left-[-5px]'
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
position: 'bottom-right',
|
|
43
|
+
cursor: 'nwse-resize',
|
|
44
|
+
indicatorClassName: 'bottom-[-5px] right-[-5px]'
|
|
45
|
+
}
|
|
46
|
+
];
|
|
47
|
+
const RESIZE_CONTROL_STYLE = {
|
|
48
|
+
background: 'transparent',
|
|
49
|
+
border: 'none',
|
|
50
|
+
zIndex: 100
|
|
51
|
+
};
|
|
52
|
+
const ADORNMENT_SLOT_POSITIONS = [
|
|
53
|
+
'topLeft',
|
|
54
|
+
'topRight',
|
|
55
|
+
'bottomLeft',
|
|
56
|
+
'bottomRight'
|
|
57
|
+
];
|
|
58
|
+
const ADORNMENT_SLOT_SHAPES = {
|
|
59
|
+
topLeft: 'top-left',
|
|
60
|
+
topRight: 'top-right',
|
|
61
|
+
bottomLeft: 'bottom-left',
|
|
62
|
+
bottomRight: 'bottom-right'
|
|
63
|
+
};
|
|
64
|
+
function resolveInteractionState(dragging, selected, isHovered) {
|
|
65
|
+
if (dragging) return 'drag';
|
|
66
|
+
if (selected) return 'selected';
|
|
67
|
+
if (isHovered) return 'hover';
|
|
68
|
+
return 'default';
|
|
69
|
+
}
|
|
70
|
+
function LoopNodeComponent(props) {
|
|
71
|
+
const { id, type = DEFAULT_LOOP_NODE_TYPE, data, selected = false, dragging = false, width = 0, height = 0, onAddChild, onResize: onResizeCallback } = props;
|
|
72
|
+
const updateNodeInternals = useUpdateNodeInternals();
|
|
73
|
+
const nodeTypeRegistry = useOptionalNodeTypeRegistry();
|
|
74
|
+
const headerRef = useRef(null);
|
|
75
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
76
|
+
const resolvedData = data ?? EMPTY_DATA;
|
|
77
|
+
const nodeVersion = 'string' == typeof resolvedData.version ? resolvedData.version : void 0;
|
|
78
|
+
const suggestionType = resolvedData.suggestionType;
|
|
79
|
+
const manifest = useMemo(()=>nodeTypeRegistry?.getManifest(type, nodeVersion), [
|
|
80
|
+
nodeTypeRegistry,
|
|
81
|
+
type,
|
|
82
|
+
nodeVersion
|
|
83
|
+
]);
|
|
84
|
+
const { mode } = useBaseCanvasMode();
|
|
85
|
+
const connectedHandleIds = useConnectedHandles(id);
|
|
86
|
+
const { multipleNodesSelected } = useSelectionState();
|
|
87
|
+
const isConnecting = useStore(selectIsConnecting);
|
|
88
|
+
const needsChildCheck = 'design' === mode && !!onAddChild;
|
|
89
|
+
const hasChildNodes = useStore(useCallback((state)=>!needsChildCheck || state.nodes.some((node)=>node.parentId === id), [
|
|
90
|
+
id,
|
|
91
|
+
needsChildCheck
|
|
92
|
+
]));
|
|
93
|
+
const executionState = useNodeExecutionState(id);
|
|
94
|
+
const validationState = useElementValidationStatus(id);
|
|
95
|
+
const statusContext = useMemo(()=>({
|
|
96
|
+
nodeId: id,
|
|
97
|
+
executionState,
|
|
98
|
+
validationState,
|
|
99
|
+
isConnecting,
|
|
100
|
+
isSelected: selected,
|
|
101
|
+
isDragging: dragging,
|
|
102
|
+
mode
|
|
103
|
+
}), [
|
|
104
|
+
dragging,
|
|
105
|
+
executionState,
|
|
106
|
+
id,
|
|
107
|
+
isConnecting,
|
|
108
|
+
mode,
|
|
109
|
+
selected,
|
|
110
|
+
validationState
|
|
111
|
+
]);
|
|
112
|
+
const executionStatus = 'string' == typeof executionState ? executionState : executionState?.status;
|
|
113
|
+
const display = useMemo(()=>resolveDisplay(manifest?.display, {
|
|
114
|
+
...resolvedData,
|
|
115
|
+
nodeId: id
|
|
116
|
+
}), [
|
|
117
|
+
manifest?.display,
|
|
118
|
+
id,
|
|
119
|
+
resolvedData
|
|
120
|
+
]);
|
|
121
|
+
const displayTitle = display.label ?? DEFAULT_LOOP_TITLE;
|
|
122
|
+
const minWidth = DEFAULT_LOOP_MIN_WIDTH;
|
|
123
|
+
const minHeight = DEFAULT_LOOP_MIN_HEIGHT;
|
|
124
|
+
const headerIcon = useMemo(()=>/*#__PURE__*/ jsx(CanvasIcon, {
|
|
125
|
+
icon: display.icon ?? DEFAULT_LOOP_ICON,
|
|
126
|
+
size: 16
|
|
127
|
+
}), [
|
|
128
|
+
display.icon
|
|
129
|
+
]);
|
|
130
|
+
const toolbarConfig = useMemo(()=>manifest ? resolveToolbar(manifest, statusContext, data) : void 0, [
|
|
131
|
+
data,
|
|
132
|
+
manifest,
|
|
133
|
+
statusContext
|
|
134
|
+
]);
|
|
135
|
+
const adornments = useMemo(()=>resolveAdornments(statusContext), [
|
|
136
|
+
statusContext
|
|
137
|
+
]);
|
|
138
|
+
const resolvedHandleGroups = useMemo(()=>manifest ? resolveHandles(manifest.handleConfiguration, resolvedData) : [], [
|
|
139
|
+
manifest,
|
|
140
|
+
resolvedData
|
|
141
|
+
]);
|
|
142
|
+
const { outer: outerHandleGroups, inner: innerHandleGroups } = useMemo(()=>partitionLoopHandleGroups(resolvedHandleGroups), [
|
|
143
|
+
resolvedHandleGroups
|
|
144
|
+
]);
|
|
145
|
+
useEffect(()=>{
|
|
146
|
+
const frameId = requestAnimationFrame(()=>{
|
|
147
|
+
updateNodeInternals(id);
|
|
148
|
+
});
|
|
149
|
+
return ()=>{
|
|
150
|
+
cancelAnimationFrame(frameId);
|
|
151
|
+
};
|
|
152
|
+
}, [
|
|
153
|
+
id,
|
|
154
|
+
innerHandleGroups,
|
|
155
|
+
outerHandleGroups,
|
|
156
|
+
updateNodeInternals,
|
|
157
|
+
width,
|
|
158
|
+
height
|
|
159
|
+
]);
|
|
160
|
+
const handleResize = useCallback((_event, params)=>{
|
|
161
|
+
onResizeCallback?.({
|
|
162
|
+
width: params.width,
|
|
163
|
+
height: params.height
|
|
164
|
+
});
|
|
165
|
+
}, [
|
|
166
|
+
onResizeCallback
|
|
167
|
+
]);
|
|
168
|
+
const handleEmptyClick = useCallback(()=>{
|
|
169
|
+
const measuredHeaderHeight = headerRef.current?.getBoundingClientRect().height ?? 0;
|
|
170
|
+
const headerHeight = Math.max(measuredHeaderHeight, DEFAULT_LOOP_HEADER_HEIGHT_PX);
|
|
171
|
+
onAddChild?.({
|
|
172
|
+
position: getLoopBodyCenter({
|
|
173
|
+
width,
|
|
174
|
+
height,
|
|
175
|
+
headerHeight
|
|
176
|
+
}),
|
|
177
|
+
near: 'mid'
|
|
178
|
+
});
|
|
179
|
+
}, [
|
|
180
|
+
height,
|
|
181
|
+
onAddChild,
|
|
182
|
+
width
|
|
183
|
+
]);
|
|
184
|
+
const handleMouseEnter = useCallback(()=>setIsHovered(true), []);
|
|
185
|
+
const handleMouseLeave = useCallback(()=>setIsHovered(false), []);
|
|
186
|
+
const shouldShowHandles = isConnecting || selected || isHovered;
|
|
187
|
+
const showHandleAddButtons = 'design' === mode && !multipleNodesSelected && !isConnecting;
|
|
188
|
+
const showResizeControls = selected && !dragging && 'design' === mode;
|
|
189
|
+
const showEmptyStateButton = 'design' === mode && !hasChildNodes && !!onAddChild;
|
|
190
|
+
const interactionState = resolveInteractionState(dragging, selected, isHovered);
|
|
191
|
+
if (!manifest) return /*#__PURE__*/ jsx("div", {
|
|
192
|
+
className: "relative",
|
|
193
|
+
style: {
|
|
194
|
+
width,
|
|
195
|
+
height,
|
|
196
|
+
minWidth,
|
|
197
|
+
minHeight
|
|
198
|
+
},
|
|
199
|
+
onMouseEnter: handleMouseEnter,
|
|
200
|
+
onMouseLeave: handleMouseLeave,
|
|
201
|
+
children: /*#__PURE__*/ jsx(MissingManifestNode, {
|
|
202
|
+
type: type,
|
|
203
|
+
isSelected: selected,
|
|
204
|
+
isHovered: isHovered,
|
|
205
|
+
interactionState: interactionState
|
|
206
|
+
})
|
|
207
|
+
});
|
|
208
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
209
|
+
"data-loop-container": true,
|
|
210
|
+
"data-selected": selected ? 'true' : 'false',
|
|
211
|
+
"data-execution-status": executionStatus,
|
|
212
|
+
"data-interaction-state": interactionState,
|
|
213
|
+
"data-suggestion-type": suggestionType,
|
|
214
|
+
"data-validation-status": validationState?.validationStatus,
|
|
215
|
+
"aria-busy": resolvedData.loading || void 0,
|
|
216
|
+
className: cn('group/loop-shell relative flex h-full w-full flex-col overflow-visible border bg-surface-overlay', 'transition-[border-color,box-shadow,opacity] shadow-(--canvas-node-shadow-rest)', 'border-border-subtle', getStatusBorder(suggestionType ?? validationState?.validationStatus ?? executionStatus), isHovered && 'shadow-(--canvas-node-shadow-hover) border-border-hover', selected && 'outline outline-foreground-accent-muted', 'drag' === interactionState && 'cursor-grabbing shadow-(--canvas-node-shadow-lifted)'),
|
|
217
|
+
style: {
|
|
218
|
+
width,
|
|
219
|
+
height,
|
|
220
|
+
minWidth,
|
|
221
|
+
minHeight,
|
|
222
|
+
borderRadius: LOOP_SHELL_RADIUS_PX,
|
|
223
|
+
background: display.background ?? DEFAULT_LOOP_SHELL_BACKGROUND
|
|
224
|
+
},
|
|
225
|
+
onMouseEnter: handleMouseEnter,
|
|
226
|
+
onMouseLeave: handleMouseLeave,
|
|
227
|
+
children: [
|
|
228
|
+
ADORNMENT_SLOT_POSITIONS.map((slot)=>adornments?.[slot] ? /*#__PURE__*/ jsx(BaseBadgeSlot, {
|
|
229
|
+
position: ADORNMENT_SLOT_SHAPES[slot],
|
|
230
|
+
shape: "rectangle",
|
|
231
|
+
children: adornments[slot]
|
|
232
|
+
}, slot) : null),
|
|
233
|
+
/*#__PURE__*/ jsx(ResizeCornerIndicators, {
|
|
234
|
+
selected: showResizeControls
|
|
235
|
+
}),
|
|
236
|
+
showResizeControls ? RESIZE_CONTROLS.map(({ position, cursor })=>/*#__PURE__*/ jsx(NodeResizeControl, {
|
|
237
|
+
style: RESIZE_CONTROL_STYLE,
|
|
238
|
+
position: position,
|
|
239
|
+
minWidth: minWidth,
|
|
240
|
+
minHeight: minHeight,
|
|
241
|
+
onResize: handleResize,
|
|
242
|
+
children: /*#__PURE__*/ jsx("div", {
|
|
243
|
+
className: "absolute bottom-0 right-0 h-5 w-5 pointer-events-auto",
|
|
244
|
+
style: {
|
|
245
|
+
cursor
|
|
246
|
+
}
|
|
247
|
+
})
|
|
248
|
+
}, position)) : null,
|
|
249
|
+
/*#__PURE__*/ jsx(Header, {
|
|
250
|
+
headerRef: headerRef,
|
|
251
|
+
title: displayTitle,
|
|
252
|
+
icon: headerIcon,
|
|
253
|
+
loading: !!resolvedData.loading
|
|
254
|
+
}),
|
|
255
|
+
/*#__PURE__*/ jsx(BodyFrame, {
|
|
256
|
+
isEmpty: showEmptyStateButton,
|
|
257
|
+
isLoading: !!resolvedData.loading,
|
|
258
|
+
onAddChild: handleEmptyClick
|
|
259
|
+
}),
|
|
260
|
+
toolbarConfig && /*#__PURE__*/ jsx(NodeToolbar, {
|
|
261
|
+
nodeId: id,
|
|
262
|
+
config: toolbarConfig,
|
|
263
|
+
expanded: selected,
|
|
264
|
+
hidden: dragging || multipleNodesSelected
|
|
265
|
+
}),
|
|
266
|
+
[
|
|
267
|
+
[
|
|
268
|
+
'outer',
|
|
269
|
+
outerHandleGroups
|
|
270
|
+
],
|
|
271
|
+
[
|
|
272
|
+
'inner',
|
|
273
|
+
innerHandleGroups
|
|
274
|
+
]
|
|
275
|
+
].map(([variant, groups])=>/*#__PURE__*/ jsx(HandleGroups, {
|
|
276
|
+
nodeId: id,
|
|
277
|
+
groups: groups,
|
|
278
|
+
variant: variant,
|
|
279
|
+
selected: selected,
|
|
280
|
+
hovered: isHovered,
|
|
281
|
+
shouldShowHandles: shouldShowHandles,
|
|
282
|
+
showAddButton: showHandleAddButtons,
|
|
283
|
+
showNotches: shouldShowHandles,
|
|
284
|
+
nodeWidth: width,
|
|
285
|
+
nodeHeight: height,
|
|
286
|
+
connectedHandleIds: connectedHandleIds
|
|
287
|
+
}, variant))
|
|
288
|
+
]
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
const LoopNode = /*#__PURE__*/ memo(LoopNodeComponent);
|
|
292
|
+
function Header({ headerRef, title, icon, loading }) {
|
|
293
|
+
const titleContent = loading ? /*#__PURE__*/ jsx("div", {
|
|
294
|
+
className: "h-5 w-28 animate-pulse rounded bg-(--canvas-background-overlay)"
|
|
295
|
+
}) : /*#__PURE__*/ jsx("span", {
|
|
296
|
+
className: "truncate text-[14px] font-semibold tracking-[-0.15px]",
|
|
297
|
+
children: title
|
|
298
|
+
});
|
|
299
|
+
let iconContent = null;
|
|
300
|
+
if (loading) iconContent = /*#__PURE__*/ jsx("div", {
|
|
301
|
+
className: "h-4 w-4 shrink-0 animate-pulse rounded bg-(--canvas-background-overlay)"
|
|
302
|
+
});
|
|
303
|
+
else if (icon) iconContent = /*#__PURE__*/ jsx("span", {
|
|
304
|
+
className: "shrink-0 text-foreground",
|
|
305
|
+
"aria-hidden": true,
|
|
306
|
+
children: icon
|
|
307
|
+
});
|
|
308
|
+
return /*#__PURE__*/ jsx("div", {
|
|
309
|
+
ref: headerRef,
|
|
310
|
+
className: "flex shrink-0 items-center justify-between gap-2.5 pl-4.5 pr-5 pt-3.5 text-foreground cursor-grab active:cursor-grabbing",
|
|
311
|
+
"data-testid": "loop-node-header",
|
|
312
|
+
children: /*#__PURE__*/ jsxs("div", {
|
|
313
|
+
className: "flex min-w-0 items-center gap-2",
|
|
314
|
+
children: [
|
|
315
|
+
iconContent,
|
|
316
|
+
titleContent
|
|
317
|
+
]
|
|
318
|
+
})
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
function EmptyState({ onAddChild }) {
|
|
322
|
+
return /*#__PURE__*/ jsx("button", {
|
|
323
|
+
type: "button",
|
|
324
|
+
onClick: onAddChild,
|
|
325
|
+
"aria-label": "Add node to loop",
|
|
326
|
+
className: cn('nodrag nopan', 'pointer-events-auto flex h-8 w-8 items-center justify-center rounded-xl', 'border border-border bg-surface-overlay text-foreground', 'shadow-[0_4px_24px_rgba(0,0,0,0.25)]', 'transition-colors', 'hover:bg-surface-hover hover:border-brand'),
|
|
327
|
+
children: /*#__PURE__*/ jsx(CanvasIcon, {
|
|
328
|
+
icon: "plus",
|
|
329
|
+
size: 14
|
|
330
|
+
})
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
function BodyFrame({ isEmpty, isLoading, onAddChild }) {
|
|
334
|
+
return /*#__PURE__*/ jsxs("div", {
|
|
335
|
+
"data-testid": "loop-body-frame",
|
|
336
|
+
"data-empty": isEmpty ? 'true' : 'false',
|
|
337
|
+
className: cn('relative flex flex-1 rounded-[26px] border border-dashed', 'pointer-events-none', isEmpty && 'items-center justify-center'),
|
|
338
|
+
style: {
|
|
339
|
+
margin: LOOP_FRAME_INSET_PX,
|
|
340
|
+
background: DEFAULT_LOOP_FRAME_BACKGROUND,
|
|
341
|
+
borderColor: DEFAULT_LOOP_FRAME_BORDER
|
|
342
|
+
},
|
|
343
|
+
children: [
|
|
344
|
+
isLoading ? /*#__PURE__*/ jsx("div", {
|
|
345
|
+
className: "m-6 h-14 w-full animate-pulse rounded-[18px] bg-(--canvas-background-overlay)"
|
|
346
|
+
}) : null,
|
|
347
|
+
isEmpty ? /*#__PURE__*/ jsx(EmptyState, {
|
|
348
|
+
onAddChild: onAddChild
|
|
349
|
+
}) : null
|
|
350
|
+
]
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
function ResizeCornerIndicators({ selected }) {
|
|
354
|
+
return /*#__PURE__*/ jsx(Fragment, {
|
|
355
|
+
children: RESIZE_CONTROLS.map(({ position, indicatorClassName })=>/*#__PURE__*/ jsx("div", {
|
|
356
|
+
"aria-hidden": true,
|
|
357
|
+
className: cn('pointer-events-none absolute h-1.5 w-1.5 rounded-[1px] border border-brand bg-background transition-opacity', indicatorClassName, selected ? 'opacity-100' : 'opacity-0')
|
|
358
|
+
}, position))
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
function HandleGroups({ nodeId, variant, groups, selected, hovered, shouldShowHandles, showAddButton, showNotches, nodeWidth, nodeHeight, connectedHandleIds }) {
|
|
362
|
+
if (0 === groups.length) return null;
|
|
363
|
+
return /*#__PURE__*/ jsx(Fragment, {
|
|
364
|
+
children: groups.map((group, groupIndex)=>/*#__PURE__*/ jsx(HandleGroup, {
|
|
365
|
+
nodeId: nodeId,
|
|
366
|
+
variant: variant,
|
|
367
|
+
group: group,
|
|
368
|
+
selected: selected,
|
|
369
|
+
hovered: hovered,
|
|
370
|
+
shouldShowHandles: shouldShowHandles,
|
|
371
|
+
showAddButton: showAddButton,
|
|
372
|
+
showNotches: showNotches,
|
|
373
|
+
nodeWidth: nodeWidth,
|
|
374
|
+
nodeHeight: nodeHeight,
|
|
375
|
+
connectedHandleIds: connectedHandleIds
|
|
376
|
+
}, `${variant}:${group.position}:${groupIndex}`))
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
function HandleGroup({ nodeId, variant, group, selected, hovered, shouldShowHandles, showAddButton, showNotches, nodeWidth, nodeHeight, connectedHandleIds }) {
|
|
380
|
+
const groupVisible = shouldShowHandles && (group.visible ?? true);
|
|
381
|
+
const enhancedHandles = useMemo(()=>group.handles.map((handle)=>({
|
|
382
|
+
...handle,
|
|
383
|
+
showHandle: connectedHandleIds.has(handle.id) || groupVisible,
|
|
384
|
+
showButton: 'inner' === variant && 'source' === handle.type ? false : handle.showButton,
|
|
385
|
+
onAction: handle.onAction ?? ('inner' !== variant && 'source' === handle.type && handle.showButton ? ENABLE_LOOP_HANDLE_ACTION_BUTTON : void 0)
|
|
386
|
+
})), [
|
|
387
|
+
group.handles,
|
|
388
|
+
connectedHandleIds,
|
|
389
|
+
groupVisible,
|
|
390
|
+
variant
|
|
391
|
+
]);
|
|
392
|
+
return /*#__PURE__*/ jsx(ButtonHandles, {
|
|
393
|
+
nodeId: nodeId,
|
|
394
|
+
handles: enhancedHandles,
|
|
395
|
+
position: group.position,
|
|
396
|
+
connectionPosition: 'inner' === variant ? getOppositePosition(group.position) : group.position,
|
|
397
|
+
selected: selected,
|
|
398
|
+
hovered: hovered,
|
|
399
|
+
showAddButton: showAddButton,
|
|
400
|
+
showNotches: showNotches,
|
|
401
|
+
customPositionAndOffsets: group.customPositionAndOffsets,
|
|
402
|
+
nodeWidth: nodeWidth,
|
|
403
|
+
nodeHeight: nodeHeight
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
export { LoopNode };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.r = (exports1)=>{
|
|
5
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
6
|
+
value: 'Module'
|
|
7
|
+
});
|
|
8
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
9
|
+
value: true
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
})();
|
|
13
|
+
var __webpack_exports__ = {};
|
|
14
|
+
__webpack_require__.r(__webpack_exports__);
|
|
15
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
16
|
+
Object.defineProperty(exports, '__esModule', {
|
|
17
|
+
value: true
|
|
18
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Node, NodeProps } from '../../xyflow/react.ts';
|
|
2
|
+
import type { XYPosition } from '../../xyflow/system.ts';
|
|
3
|
+
import type { BaseNodeData } from '../BaseNode';
|
|
4
|
+
export interface LoopNodeAddChildContext {
|
|
5
|
+
position: XYPosition;
|
|
6
|
+
near: 'start' | 'end' | 'mid';
|
|
7
|
+
}
|
|
8
|
+
export type LoopNodeData = BaseNodeData;
|
|
9
|
+
export interface LoopNodeProps extends NodeProps<Node<LoopNodeData>> {
|
|
10
|
+
onAddChild?: (ctx: LoopNodeAddChildContext) => void;
|
|
11
|
+
onResize?: (size: {
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
}) => void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=LoopNode.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoopNode.types.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,UAAU,CAAC;IACrB,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC;CAC/B;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC;AAExC,MAAM,WAAW,aAAc,SAAQ,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC9D"}
|
|
File without changes
|
|
@@ -0,0 +1,81 @@
|
|
|
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
|
+
applyHandleActionAddPreview: ()=>applyHandleActionAddPreview,
|
|
28
|
+
createCenteredLoopPreview: ()=>createCenteredLoopPreview
|
|
29
|
+
});
|
|
30
|
+
const react_cjs_namespaceObject = require("../../xyflow/react.cjs");
|
|
31
|
+
const external_constants_cjs_namespaceObject = require("../../constants.cjs");
|
|
32
|
+
const createPreviewGraph_cjs_namespaceObject = require("../../utils/createPreviewGraph.cjs");
|
|
33
|
+
const createPreviewNode_cjs_namespaceObject = require("../../utils/createPreviewNode.cjs");
|
|
34
|
+
const NodeUtils_cjs_namespaceObject = require("../../utils/NodeUtils.cjs");
|
|
35
|
+
const createAddNodePreview_cjs_namespaceObject = require("../AddNodePanel/createAddNodePreview.cjs");
|
|
36
|
+
const external_LoopNode_constants_cjs_namespaceObject = require("./LoopNode.constants.cjs");
|
|
37
|
+
const external_LoopNode_helpers_cjs_namespaceObject = require("./LoopNode.helpers.cjs");
|
|
38
|
+
const LOOP_START_HANDLE_ID = 'start';
|
|
39
|
+
const LOOP_CONTINUE_HANDLE_ID = 'continue';
|
|
40
|
+
function createCenteredLoopPreview(loopId, reactFlowInstance, centerPosition) {
|
|
41
|
+
const loopNode = reactFlowInstance.getNode(loopId);
|
|
42
|
+
if (!isLoopNode(loopNode)) return null;
|
|
43
|
+
const allNodes = reactFlowInstance.getNodes();
|
|
44
|
+
const loopAbsolutePosition = (0, NodeUtils_cjs_namespaceObject.getAbsolutePosition)(loopNode, allNodes);
|
|
45
|
+
const relativeCenter = centerPosition ?? (0, external_LoopNode_helpers_cjs_namespaceObject.getLoopRelativeBodyCenter)(loopNode);
|
|
46
|
+
const snappedCenter = {
|
|
47
|
+
x: (0, NodeUtils_cjs_namespaceObject.snapToGrid)(loopAbsolutePosition.x + relativeCenter.x),
|
|
48
|
+
y: (0, NodeUtils_cjs_namespaceObject.snapToGrid)(loopAbsolutePosition.y + relativeCenter.y)
|
|
49
|
+
};
|
|
50
|
+
const preview = (0, createPreviewNode_cjs_namespaceObject.createPreviewNode)(loopId, LOOP_START_HANDLE_ID, reactFlowInstance, snappedCenter, void 0, 'source', void 0, react_cjs_namespaceObject.Position.Right, [], 'center');
|
|
51
|
+
if (!preview) return null;
|
|
52
|
+
return (0, createPreviewGraph_cjs_namespaceObject.createPreviewGraph)({
|
|
53
|
+
preview,
|
|
54
|
+
target: loopId,
|
|
55
|
+
targetHandleId: LOOP_CONTINUE_HANDLE_ID,
|
|
56
|
+
reactFlowInstance,
|
|
57
|
+
containerId: loopId,
|
|
58
|
+
trailingEdgeId: `${external_constants_cjs_namespaceObject.PREVIEW_NODE_ID}-${loopId}-${LOOP_CONTINUE_HANDLE_ID}`,
|
|
59
|
+
trailingEdgeStyle: createPreviewGraph_cjs_namespaceObject.PREVIEW_EDGE_STYLE
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function applyHandleActionAddPreview(event, reactFlowInstance, ignoredNodeTypes = []) {
|
|
63
|
+
if (event.handleId === LOOP_START_HANDLE_ID && isLoopNode(reactFlowInstance.getNode(event.nodeId))) {
|
|
64
|
+
const preview = createCenteredLoopPreview(event.nodeId, reactFlowInstance);
|
|
65
|
+
if (preview) (0, createPreviewNode_cjs_namespaceObject.applyPreviewGraphToReactFlow)(preview, reactFlowInstance);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
(0, createAddNodePreview_cjs_namespaceObject.createAddNodePreview)(event.nodeId, event.handleId, reactFlowInstance, event.position, 'input' === event.handleType ? 'target' : 'source', ignoredNodeTypes);
|
|
69
|
+
}
|
|
70
|
+
function isLoopNode(node) {
|
|
71
|
+
return node?.type === external_LoopNode_constants_cjs_namespaceObject.DEFAULT_LOOP_NODE_TYPE;
|
|
72
|
+
}
|
|
73
|
+
exports.applyHandleActionAddPreview = __webpack_exports__.applyHandleActionAddPreview;
|
|
74
|
+
exports.createCenteredLoopPreview = __webpack_exports__.createCenteredLoopPreview;
|
|
75
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
76
|
+
"applyHandleActionAddPreview",
|
|
77
|
+
"createCenteredLoopPreview"
|
|
78
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
79
|
+
Object.defineProperty(exports, '__esModule', {
|
|
80
|
+
value: true
|
|
81
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ReactFlowInstance } from '../../xyflow/react.ts';
|
|
2
|
+
import type { CanvasHandleActionEvent } from '../../utils/CanvasEventBus';
|
|
3
|
+
export declare function createCenteredLoopPreview(loopId: string, reactFlowInstance: ReactFlowInstance, centerPosition?: {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
}): import("../..").PreviewGraph | null;
|
|
7
|
+
export declare function applyHandleActionAddPreview(event: CanvasHandleActionEvent, reactFlowInstance: ReactFlowInstance, ignoredNodeTypes?: string[]): void;
|
|
8
|
+
//# sourceMappingURL=LoopNodePreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoopNodePreview.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNodePreview.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAW1E,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,CAAC,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,uCAoC1C;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,uBAAuB,EAC9B,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,GAAE,MAAM,EAAO,QAqBhC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Position } from "../../xyflow/react.js";
|
|
2
|
+
import { PREVIEW_NODE_ID } from "../../constants.js";
|
|
3
|
+
import { PREVIEW_EDGE_STYLE, createPreviewGraph } from "../../utils/createPreviewGraph.js";
|
|
4
|
+
import { applyPreviewGraphToReactFlow, createPreviewNode } from "../../utils/createPreviewNode.js";
|
|
5
|
+
import { getAbsolutePosition, snapToGrid } from "../../utils/NodeUtils.js";
|
|
6
|
+
import { createAddNodePreview } from "../AddNodePanel/createAddNodePreview.js";
|
|
7
|
+
import { DEFAULT_LOOP_NODE_TYPE } from "./LoopNode.constants.js";
|
|
8
|
+
import { getLoopRelativeBodyCenter } from "./LoopNode.helpers.js";
|
|
9
|
+
const LOOP_START_HANDLE_ID = 'start';
|
|
10
|
+
const LOOP_CONTINUE_HANDLE_ID = 'continue';
|
|
11
|
+
function createCenteredLoopPreview(loopId, reactFlowInstance, centerPosition) {
|
|
12
|
+
const loopNode = reactFlowInstance.getNode(loopId);
|
|
13
|
+
if (!isLoopNode(loopNode)) return null;
|
|
14
|
+
const allNodes = reactFlowInstance.getNodes();
|
|
15
|
+
const loopAbsolutePosition = getAbsolutePosition(loopNode, allNodes);
|
|
16
|
+
const relativeCenter = centerPosition ?? getLoopRelativeBodyCenter(loopNode);
|
|
17
|
+
const snappedCenter = {
|
|
18
|
+
x: snapToGrid(loopAbsolutePosition.x + relativeCenter.x),
|
|
19
|
+
y: snapToGrid(loopAbsolutePosition.y + relativeCenter.y)
|
|
20
|
+
};
|
|
21
|
+
const preview = createPreviewNode(loopId, LOOP_START_HANDLE_ID, reactFlowInstance, snappedCenter, void 0, 'source', void 0, Position.Right, [], 'center');
|
|
22
|
+
if (!preview) return null;
|
|
23
|
+
return createPreviewGraph({
|
|
24
|
+
preview,
|
|
25
|
+
target: loopId,
|
|
26
|
+
targetHandleId: LOOP_CONTINUE_HANDLE_ID,
|
|
27
|
+
reactFlowInstance,
|
|
28
|
+
containerId: loopId,
|
|
29
|
+
trailingEdgeId: `${PREVIEW_NODE_ID}-${loopId}-${LOOP_CONTINUE_HANDLE_ID}`,
|
|
30
|
+
trailingEdgeStyle: PREVIEW_EDGE_STYLE
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function applyHandleActionAddPreview(event, reactFlowInstance, ignoredNodeTypes = []) {
|
|
34
|
+
if (event.handleId === LOOP_START_HANDLE_ID && isLoopNode(reactFlowInstance.getNode(event.nodeId))) {
|
|
35
|
+
const preview = createCenteredLoopPreview(event.nodeId, reactFlowInstance);
|
|
36
|
+
if (preview) applyPreviewGraphToReactFlow(preview, reactFlowInstance);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
createAddNodePreview(event.nodeId, event.handleId, reactFlowInstance, event.position, 'input' === event.handleType ? 'target' : 'source', ignoredNodeTypes);
|
|
40
|
+
}
|
|
41
|
+
function isLoopNode(node) {
|
|
42
|
+
return node?.type === DEFAULT_LOOP_NODE_TYPE;
|
|
43
|
+
}
|
|
44
|
+
export { applyHandleActionAddPreview, createCenteredLoopPreview };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_modules__ = {
|
|
3
|
+
"./LoopCanvasNode" (module) {
|
|
4
|
+
module.exports = require("./LoopCanvasNode.cjs");
|
|
5
|
+
},
|
|
6
|
+
"./LoopNode?d3ac" (module) {
|
|
7
|
+
module.exports = require("./LoopNode.cjs");
|
|
8
|
+
},
|
|
9
|
+
"./LoopNode.types" (module) {
|
|
10
|
+
module.exports = require("./LoopNode.types.cjs");
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var __webpack_module_cache__ = {};
|
|
14
|
+
function __webpack_require__(moduleId) {
|
|
15
|
+
var cachedModule = __webpack_module_cache__[moduleId];
|
|
16
|
+
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
17
|
+
var module = __webpack_module_cache__[moduleId] = {
|
|
18
|
+
exports: {}
|
|
19
|
+
};
|
|
20
|
+
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
21
|
+
return module.exports;
|
|
22
|
+
}
|
|
23
|
+
(()=>{
|
|
24
|
+
__webpack_require__.n = (module)=>{
|
|
25
|
+
var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
|
|
26
|
+
__webpack_require__.d(getter, {
|
|
27
|
+
a: getter
|
|
28
|
+
});
|
|
29
|
+
return getter;
|
|
30
|
+
};
|
|
31
|
+
})();
|
|
32
|
+
(()=>{
|
|
33
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
34
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get: definition[key]
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
(()=>{
|
|
41
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
42
|
+
})();
|
|
43
|
+
(()=>{
|
|
44
|
+
__webpack_require__.r = (exports1)=>{
|
|
45
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
46
|
+
value: 'Module'
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
49
|
+
value: true
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
var __webpack_exports__ = {};
|
|
54
|
+
(()=>{
|
|
55
|
+
__webpack_require__.r(__webpack_exports__);
|
|
56
|
+
var _LoopCanvasNode__rspack_import_0 = __webpack_require__("./LoopCanvasNode");
|
|
57
|
+
var __rspack_reexport = {};
|
|
58
|
+
for(const __rspack_import_key in _LoopCanvasNode__rspack_import_0)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_LoopCanvasNode__rspack_import_0[__rspack_import_key];
|
|
59
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
60
|
+
var _LoopNode__rspack_import_1 = __webpack_require__("./LoopNode?d3ac");
|
|
61
|
+
var __rspack_reexport = {};
|
|
62
|
+
for(const __rspack_import_key in _LoopNode__rspack_import_1)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_LoopNode__rspack_import_1[__rspack_import_key];
|
|
63
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
64
|
+
var _LoopNode_types__rspack_import_2 = __webpack_require__("./LoopNode.types");
|
|
65
|
+
var __rspack_reexport = {};
|
|
66
|
+
for(const __rspack_import_key in _LoopNode_types__rspack_import_2)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_LoopNode_types__rspack_import_2[__rspack_import_key];
|
|
67
|
+
__webpack_require__.d(__webpack_exports__, __rspack_reexport);
|
|
68
|
+
})();
|
|
69
|
+
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
70
|
+
Object.defineProperty(exports, '__esModule', {
|
|
71
|
+
value: true
|
|
72
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC"}
|