@tduniec/plugin-template-designer 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/DesignerFlow/DesignerFlow.esm.js +97 -54
- package/dist/components/DesignerFlow/DesignerFlow.esm.js.map +1 -1
- package/dist/components/DesignerFlow/handlers.esm.js +14 -3
- package/dist/components/DesignerFlow/handlers.esm.js.map +1 -1
- package/dist/components/Nodes/ActionNode.esm.js +3 -2
- package/dist/components/Nodes/ActionNode.esm.js.map +1 -1
- package/dist/components/Nodes/OutputNode.esm.js +3 -1
- package/dist/components/Nodes/OutputNode.esm.js.map +1 -1
- package/dist/components/Nodes/ParametersNode.esm.js +3 -1
- package/dist/components/Nodes/ParametersNode.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/TemplateDesigner.esm.js +70 -46
- package/dist/components/TemplateDesigner/TemplateDesigner.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js +42 -19
- package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js +30 -3
- package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/useFieldEditor.esm.js +31 -32
- package/dist/components/TemplateDesigner/useFieldEditor.esm.js.map +1 -1
- package/dist/components/TemplateDesigner/useTemplateState.esm.js +253 -53
- package/dist/components/TemplateDesigner/useTemplateState.esm.js.map +1 -1
- package/dist/package.json.esm.js +1 -1
- package/package.json +1 -1
|
@@ -82,6 +82,10 @@ function App({
|
|
|
82
82
|
const lastCacheFingerprintRef = useRef(null);
|
|
83
83
|
const nodeHeightsRef = useRef({});
|
|
84
84
|
const shouldAutoFitViewRef = useRef(true);
|
|
85
|
+
const emitDebounceRef = useRef(null);
|
|
86
|
+
const isDraggingRef = useRef(false);
|
|
87
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
88
|
+
const emitAfterDragRef = useRef(false);
|
|
85
89
|
useEffect(() => {
|
|
86
90
|
const isCacheChanged = cacheFingerprint !== lastCacheFingerprintRef.current;
|
|
87
91
|
const shouldSkip = modelHash === skipNextModelHashRef.current && !isCacheChanged;
|
|
@@ -178,7 +182,21 @@ function App({
|
|
|
178
182
|
[nodes, parameterReferences]
|
|
179
183
|
);
|
|
180
184
|
const onNodesChange = useCallback(
|
|
181
|
-
(changes) => setNodes((ns) =>
|
|
185
|
+
(changes) => setNodes((ns) => {
|
|
186
|
+
if (changes.some(
|
|
187
|
+
(change) => change.type === "position" && change.dragging
|
|
188
|
+
)) {
|
|
189
|
+
isDraggingRef.current = true;
|
|
190
|
+
setIsDragging(true);
|
|
191
|
+
} else if (changes.some(
|
|
192
|
+
(change) => change.type === "position" && change.dragging === false
|
|
193
|
+
)) {
|
|
194
|
+
const stillDragging = ns.some((node) => node.dragging);
|
|
195
|
+
isDraggingRef.current = stillDragging;
|
|
196
|
+
setIsDragging(stillDragging);
|
|
197
|
+
}
|
|
198
|
+
return applyNodeChanges(changes, ns);
|
|
199
|
+
}),
|
|
182
200
|
[setNodes]
|
|
183
201
|
);
|
|
184
202
|
const onEdgesChange = useCallback(
|
|
@@ -198,6 +216,8 @@ function App({
|
|
|
198
216
|
);
|
|
199
217
|
const onNodeDragStop = useCallback(
|
|
200
218
|
(_, node) => {
|
|
219
|
+
isDraggingRef.current = false;
|
|
220
|
+
setIsDragging(false);
|
|
201
221
|
reorderAndAlignNodes(node);
|
|
202
222
|
},
|
|
203
223
|
[reorderAndAlignNodes]
|
|
@@ -248,59 +268,55 @@ function App({
|
|
|
248
268
|
}),
|
|
249
269
|
[setNodes, setEdges]
|
|
250
270
|
);
|
|
251
|
-
const nodesWithHandlers = useMemo(
|
|
252
|
-
(
|
|
271
|
+
const nodesWithHandlers = useMemo(() => {
|
|
272
|
+
if (!nodes.length) {
|
|
273
|
+
return nodes;
|
|
274
|
+
}
|
|
275
|
+
return nodes.map((node) => {
|
|
253
276
|
const stepOutputReferences = stepOutputReferencesByNode[node.id] ?? [];
|
|
254
277
|
if (node.type === "parametersNode") {
|
|
255
278
|
const data2 = node.data;
|
|
256
|
-
|
|
257
|
-
...
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
onUpdateSections,
|
|
262
|
-
stepOutputReferences
|
|
263
|
-
}
|
|
279
|
+
const nextData2 = data2.onAddNode === handleAddNode && data2.onUpdateSections === onUpdateSections && data2.stepOutputReferences === stepOutputReferences ? data2 : {
|
|
280
|
+
...data2,
|
|
281
|
+
onAddNode: handleAddNode,
|
|
282
|
+
onUpdateSections,
|
|
283
|
+
stepOutputReferences
|
|
264
284
|
};
|
|
285
|
+
return data2 === nextData2 ? node : { ...node, data: nextData2 };
|
|
265
286
|
}
|
|
266
287
|
if (node.type === "outputNode") {
|
|
267
288
|
const data2 = node.data;
|
|
268
|
-
|
|
269
|
-
...
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
onUpdateOutput,
|
|
274
|
-
stepOutputReferences
|
|
275
|
-
}
|
|
289
|
+
const nextData2 = data2.onAddNode === handleAddNode && data2.onUpdateOutput === onUpdateOutput && data2.stepOutputReferences === stepOutputReferences ? data2 : {
|
|
290
|
+
...data2,
|
|
291
|
+
onAddNode: handleAddNode,
|
|
292
|
+
onUpdateOutput,
|
|
293
|
+
stepOutputReferences
|
|
276
294
|
};
|
|
295
|
+
return data2 === nextData2 ? node : { ...node, data: nextData2 };
|
|
277
296
|
}
|
|
278
297
|
const data = node.data;
|
|
279
|
-
|
|
280
|
-
...
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
onRemoveInputKey,
|
|
288
|
-
stepOutputReferences
|
|
289
|
-
}
|
|
298
|
+
const nextData = data.onAddNode === handleAddNode && data.onRemoveNode === handleRemoveNode && data.onUpdateField === onUpdateField && data.onUpdateInput === onUpdateInput && data.onRemoveInputKey === onRemoveInputKey && data.stepOutputReferences === stepOutputReferences ? data : {
|
|
299
|
+
...data,
|
|
300
|
+
onAddNode: handleAddNode,
|
|
301
|
+
onRemoveNode: handleRemoveNode,
|
|
302
|
+
onUpdateField,
|
|
303
|
+
onUpdateInput,
|
|
304
|
+
onRemoveInputKey,
|
|
305
|
+
stepOutputReferences
|
|
290
306
|
};
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
);
|
|
307
|
+
return data === nextData ? node : { ...node, data: nextData };
|
|
308
|
+
});
|
|
309
|
+
}, [
|
|
310
|
+
nodes,
|
|
311
|
+
handleAddNode,
|
|
312
|
+
handleRemoveNode,
|
|
313
|
+
onUpdateField,
|
|
314
|
+
onUpdateInput,
|
|
315
|
+
onRemoveInputKey,
|
|
316
|
+
onUpdateOutput,
|
|
317
|
+
onUpdateSections,
|
|
318
|
+
stepOutputReferencesByNode
|
|
319
|
+
]);
|
|
304
320
|
const stepsFromNodes = useMemo(() => extractStepsFromNodes(nodes), [nodes]);
|
|
305
321
|
const parametersFromNodes = useMemo(
|
|
306
322
|
() => extractParametersFromNodes(nodes),
|
|
@@ -312,6 +328,10 @@ function App({
|
|
|
312
328
|
if (!onStepsChange && !onParametersChange && !onOutputChange) {
|
|
313
329
|
return;
|
|
314
330
|
}
|
|
331
|
+
if (isDragging) {
|
|
332
|
+
emitAfterDragRef.current = true;
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
315
335
|
const serialized = stableStringify({
|
|
316
336
|
steps: stepsFromNodes,
|
|
317
337
|
parameters: parametersFromNodes ?? null,
|
|
@@ -320,17 +340,22 @@ function App({
|
|
|
320
340
|
if (serialized === lastEmittedModelHashRef.current) {
|
|
321
341
|
return;
|
|
322
342
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
if (onStepsChange) {
|
|
326
|
-
onStepsChange(stepsFromNodes);
|
|
327
|
-
}
|
|
328
|
-
if (onParametersChange) {
|
|
329
|
-
onParametersChange(parametersFromNodes ?? void 0);
|
|
330
|
-
}
|
|
331
|
-
if (onOutputChange) {
|
|
332
|
-
onOutputChange(outputFromNodes);
|
|
343
|
+
if (emitDebounceRef.current) {
|
|
344
|
+
clearTimeout(emitDebounceRef.current);
|
|
333
345
|
}
|
|
346
|
+
emitDebounceRef.current = setTimeout(() => {
|
|
347
|
+
lastEmittedModelHashRef.current = serialized;
|
|
348
|
+
skipNextModelHashRef.current = serialized;
|
|
349
|
+
if (onStepsChange) {
|
|
350
|
+
onStepsChange(stepsFromNodes);
|
|
351
|
+
}
|
|
352
|
+
if (onParametersChange) {
|
|
353
|
+
onParametersChange(parametersFromNodes ?? void 0);
|
|
354
|
+
}
|
|
355
|
+
if (onOutputChange) {
|
|
356
|
+
onOutputChange(outputFromNodes);
|
|
357
|
+
}
|
|
358
|
+
}, 120);
|
|
334
359
|
}, [
|
|
335
360
|
stepsFromNodes,
|
|
336
361
|
parametersFromNodes,
|
|
@@ -338,8 +363,17 @@ function App({
|
|
|
338
363
|
outputFromNodes,
|
|
339
364
|
onStepsChange,
|
|
340
365
|
onParametersChange,
|
|
341
|
-
onOutputChange
|
|
366
|
+
onOutputChange,
|
|
367
|
+
isDragging
|
|
342
368
|
]);
|
|
369
|
+
useEffect(
|
|
370
|
+
() => () => {
|
|
371
|
+
if (emitDebounceRef.current) {
|
|
372
|
+
clearTimeout(emitDebounceRef.current);
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
[]
|
|
376
|
+
);
|
|
343
377
|
const fitViewOptions = useMemo(() => ({ padding: 0.2, duration: 300 }), []);
|
|
344
378
|
const [reactFlowInstance, setReactFlowInstance] = useState(null);
|
|
345
379
|
const fitFlowToView = useCallback(() => {
|
|
@@ -367,6 +401,15 @@ function App({
|
|
|
367
401
|
window.removeEventListener("resize", fitFlowToView);
|
|
368
402
|
};
|
|
369
403
|
}, [fitFlowToView, reactFlowInstance]);
|
|
404
|
+
useEffect(() => {
|
|
405
|
+
if (!isDragging) {
|
|
406
|
+
if (emitAfterDragRef.current) {
|
|
407
|
+
emitAfterDragRef.current = false;
|
|
408
|
+
lastEmittedModelHashRef.current = null;
|
|
409
|
+
}
|
|
410
|
+
lastEmittedModelHashRef.current = null;
|
|
411
|
+
}
|
|
412
|
+
}, [isDragging]);
|
|
370
413
|
return /* @__PURE__ */ jsx("div", { style: { width: "100%", height: "100%", minHeight: "70vh" }, children: /* @__PURE__ */ jsx(
|
|
371
414
|
ReactFlow,
|
|
372
415
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DesignerFlow.esm.js","sources":["../../../src/components/DesignerFlow/DesignerFlow.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { MouseEvent as ReactMouseEvent } from \"react\";\nimport {\n ReactFlow,\n applyNodeChanges,\n applyEdgeChanges,\n addEdge,\n Node,\n Edge,\n NodeChange,\n EdgeChange,\n useNodesState,\n ReactFlowInstance,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport type {\n ScaffolderTaskOutput,\n TaskStep,\n} from \"@backstage/plugin-scaffolder-common\";\nimport type {\n ActionNodeData,\n OutputNodeData,\n ParametersNodeData,\n TemplateParametersValue,\n} from \"../Nodes/types\";\nimport { createSequentialEdges } from \"../../utils/createSequentialEdges\";\nimport {\n collectStepOutputReferences,\n createHandleAddNode,\n createHandleRemoveNode,\n createHandleRemoveInputKey,\n createHandleReorderAndAlignNodes,\n createHandleUpdateField,\n createHandleUpdateInput,\n createHandleUpdateOutput,\n createHandleUpdateSections,\n} from \"./handlers\";\nimport {\n buildNodesFromModel,\n collectParameterReferences,\n stableStringify,\n resolveNodeHeightForTracking,\n extractStepsFromNodes,\n extractParametersFromNodes,\n extractOutputFromNodes,\n} from \"./model\";\nimport { alignNodes } from \"./nodeLayout\";\nimport { FLOW_LAYOUT, nodeDefaults, nodeTypes } from \"./flowConfig\";\nimport { useScaffolderActions } from \"../../api/scaffolderActions\";\n\n// Main orchestration component that renders and synchronizes the Designer flow.\n\nconst FIXED_X_POSITION = FLOW_LAYOUT.fixedXPosition;\nconst VERTICAL_SPACING = FLOW_LAYOUT.verticalSpacing;\n\ntype DesignerFlowProps = {\n steps?: TaskStep[];\n parameters?: TemplateParametersValue;\n output?: ScaffolderTaskOutput | null;\n onStepsChange?: (steps: TaskStep[]) => void;\n onParametersChange?: (parameters: TemplateParametersValue) => void;\n onOutputChange?: (output: ScaffolderTaskOutput | undefined) => void;\n};\n\nexport default function App({\n steps = [],\n parameters,\n output,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n}: DesignerFlowProps) {\n const scaffolderActionsCache = useScaffolderActions();\n\n const {\n ids: scaffolderActionIds,\n inputsById: scaffolderActionInputsById,\n outputsById: scaffolderActionOutputsById,\n inputRequiredById: scaffolderActionInputRequiredById,\n } = scaffolderActionsCache;\n\n const normalizedParametersProp = parameters ?? undefined;\n const normalizedOutputProp = output ?? null;\n\n const initialNodes = useMemo(\n () =>\n buildNodesFromModel(\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n }\n ),\n [\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n ]\n );\n\n const [nodes, setNodes] = useNodesState(initialNodes);\n const [edges, setEdges] = useState<Edge[]>(() =>\n createSequentialEdges(initialNodes)\n );\n\n const modelHash = useMemo(\n () =>\n stableStringify({\n steps,\n parameters: normalizedParametersProp,\n output: normalizedOutputProp,\n }),\n [steps, normalizedParametersProp, normalizedOutputProp]\n );\n\n const cacheFingerprint = useMemo(\n () =>\n stableStringify({\n ids: scaffolderActionIds,\n inputs: scaffolderActionInputsById,\n outputs: scaffolderActionOutputsById,\n inputRequired: scaffolderActionInputRequiredById,\n }),\n [\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n ]\n );\n\n const lastAppliedModelHashRef = useRef<string | null>(null);\n const lastEmittedModelHashRef = useRef<string | null>(null);\n const skipNextModelHashRef = useRef<string | null>(null);\n const lastCacheFingerprintRef = useRef<string | null>(null);\n const nodeHeightsRef = useRef<Record<string, number>>({});\n const shouldAutoFitViewRef = useRef(true);\n\n useEffect(() => {\n const isCacheChanged = cacheFingerprint !== lastCacheFingerprintRef.current;\n const shouldSkip =\n modelHash === skipNextModelHashRef.current && !isCacheChanged;\n\n if (shouldSkip) {\n skipNextModelHashRef.current = null;\n lastAppliedModelHashRef.current = modelHash;\n lastCacheFingerprintRef.current = cacheFingerprint;\n return;\n }\n\n if (modelHash === lastAppliedModelHashRef.current && !isCacheChanged) {\n return;\n }\n\n const nextNodes = buildNodesFromModel(\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n }\n );\n\n lastAppliedModelHashRef.current = modelHash;\n lastCacheFingerprintRef.current = cacheFingerprint;\n lastEmittedModelHashRef.current = modelHash;\n\n setNodes(nextNodes);\n setEdges(createSequentialEdges(nextNodes));\n shouldAutoFitViewRef.current = true;\n }, [\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n modelHash,\n cacheFingerprint,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n setNodes,\n setEdges,\n ]);\n\n useEffect(() => {\n if (!nodes.length) {\n return;\n }\n\n if (nodes.some((node) => node.dragging)) {\n return;\n }\n\n const activeNodeIds = new Set<string>();\n let hasMeasuredChange = false;\n\n nodes.forEach((node) => {\n activeNodeIds.add(node.id);\n const measuredHeight = resolveNodeHeightForTracking(node);\n if (typeof measuredHeight !== \"number\") {\n return;\n }\n const previousHeight = nodeHeightsRef.current[node.id];\n if (previousHeight !== measuredHeight) {\n nodeHeightsRef.current[node.id] = measuredHeight;\n hasMeasuredChange = true;\n }\n });\n\n Object.keys(nodeHeightsRef.current).forEach((id) => {\n if (!activeNodeIds.has(id)) {\n delete nodeHeightsRef.current[id];\n }\n });\n\n if (!hasMeasuredChange) {\n return;\n }\n\n setNodes((currentNodes) => {\n const alignedNodes = alignNodes(\n currentNodes,\n FIXED_X_POSITION,\n VERTICAL_SPACING\n );\n const positionsChanged = alignedNodes.some((node, index) => {\n const previousNode = currentNodes[index];\n if (!previousNode) {\n return true;\n }\n return (\n node.position.x !== previousNode.position.x ||\n node.position.y !== previousNode.position.y\n );\n });\n\n return positionsChanged ? alignedNodes : currentNodes;\n });\n }, [nodes, setNodes]);\n\n const parameterReferences = useMemo(\n () => collectParameterReferences(normalizedParametersProp),\n [normalizedParametersProp]\n );\n\n const stepOutputReferencesByNode = useMemo(\n () => collectStepOutputReferences(nodes, parameterReferences),\n [nodes, parameterReferences]\n );\n\n const onNodesChange = useCallback(\n (changes: NodeChange<Node>[]) =>\n setNodes((ns) => applyNodeChanges(changes, ns)),\n [setNodes]\n );\n\n const onEdgesChange = useCallback(\n (changes: EdgeChange<Edge>[]) =>\n setEdges((es) => applyEdgeChanges(changes, es)),\n [setEdges]\n );\n\n const onConnect = useCallback(\n (params: any) => setEdges((es) => addEdge(params, es)),\n [setEdges]\n );\n\n const reorderAndAlignNodes = useMemo(\n () =>\n createHandleReorderAndAlignNodes(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n }),\n [setNodes, setEdges]\n );\n\n const onNodeDragStop = useCallback(\n (_: ReactMouseEvent, node: Node) => {\n reorderAndAlignNodes(node);\n },\n [reorderAndAlignNodes]\n );\n\n const onUpdateField = useMemo(\n () => createHandleUpdateField(setNodes),\n [setNodes]\n );\n\n const onUpdateInput = useMemo(\n () => createHandleUpdateInput(setNodes),\n [setNodes]\n );\n\n const onRemoveInputKey = useMemo(\n () => createHandleRemoveInputKey(setNodes),\n [setNodes]\n );\n\n const onUpdateOutput = useMemo(\n () => createHandleUpdateOutput(setNodes),\n [setNodes]\n );\n\n const onUpdateSections = useMemo(\n () => createHandleUpdateSections(setNodes),\n [setNodes]\n );\n\n const handleAddNode = useMemo(\n () =>\n createHandleAddNode(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n nodeDefaults,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n }),\n [\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n setNodes,\n setEdges,\n ]\n );\n\n const handleRemoveNode = useMemo(\n () =>\n createHandleRemoveNode(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n }),\n [setNodes, setEdges]\n );\n\n const nodesWithHandlers = useMemo(\n () =>\n nodes.map((node) => {\n const stepOutputReferences = stepOutputReferencesByNode[node.id] ?? [];\n if (node.type === \"parametersNode\") {\n const data = node.data as ParametersNodeData;\n return {\n ...node,\n data: {\n ...data,\n onAddNode: handleAddNode,\n onUpdateSections,\n stepOutputReferences,\n },\n };\n }\n if (node.type === \"outputNode\") {\n const data = node.data as OutputNodeData;\n return {\n ...node,\n data: {\n ...data,\n onAddNode: handleAddNode,\n onUpdateOutput,\n stepOutputReferences,\n },\n };\n }\n\n const data = node.data as ActionNodeData;\n return {\n ...node,\n data: {\n ...data,\n onAddNode: handleAddNode,\n onRemoveNode: handleRemoveNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n stepOutputReferences,\n },\n };\n }),\n [\n nodes,\n handleAddNode,\n handleRemoveNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n onUpdateOutput,\n onUpdateSections,\n stepOutputReferencesByNode,\n ]\n );\n\n const stepsFromNodes = useMemo(() => extractStepsFromNodes(nodes), [nodes]);\n\n const parametersFromNodes = useMemo(\n () => extractParametersFromNodes(nodes),\n [nodes]\n );\n\n const outputFromNodes = useMemo(() => extractOutputFromNodes(nodes), [nodes]);\n\n const normalizedOutputFromNodes = outputFromNodes ?? null;\n\n useEffect(() => {\n if (!onStepsChange && !onParametersChange && !onOutputChange) {\n return;\n }\n const serialized = stableStringify({\n steps: stepsFromNodes,\n parameters: parametersFromNodes ?? null,\n output: normalizedOutputFromNodes,\n });\n if (serialized === lastEmittedModelHashRef.current) {\n return;\n }\n lastEmittedModelHashRef.current = serialized;\n skipNextModelHashRef.current = serialized;\n if (onStepsChange) {\n onStepsChange(stepsFromNodes);\n }\n if (onParametersChange) {\n onParametersChange(parametersFromNodes ?? undefined);\n }\n if (onOutputChange) {\n onOutputChange(outputFromNodes);\n }\n }, [\n stepsFromNodes,\n parametersFromNodes,\n normalizedOutputFromNodes,\n outputFromNodes,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n ]);\n\n const fitViewOptions = useMemo(() => ({ padding: 0.2, duration: 300 }), []);\n const [reactFlowInstance, setReactFlowInstance] =\n useState<ReactFlowInstance | null>(null);\n\n const fitFlowToView = useCallback(() => {\n if (!reactFlowInstance) {\n return;\n }\n reactFlowInstance.fitView(fitViewOptions);\n }, [fitViewOptions, reactFlowInstance]);\n\n useEffect(() => {\n if (!reactFlowInstance) {\n return;\n }\n if (!shouldAutoFitViewRef.current) {\n return;\n }\n shouldAutoFitViewRef.current = false;\n fitFlowToView();\n }, [fitFlowToView, nodes, edges, reactFlowInstance]);\n\n useEffect(() => {\n if (!reactFlowInstance) {\n return undefined;\n }\n window.addEventListener(\"resize\", fitFlowToView);\n return () => {\n window.removeEventListener(\"resize\", fitFlowToView);\n };\n }, [fitFlowToView, reactFlowInstance]);\n\n return (\n <div style={{ width: \"100%\", height: \"100%\", minHeight: \"70vh\" }}>\n <ReactFlow\n nodes={nodesWithHandlers}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeDragStop={onNodeDragStop}\n onConnect={onConnect}\n fitView\n onInit={setReactFlowInstance}\n fitViewOptions={fitViewOptions}\n />\n </div>\n );\n}\n"],"names":["data"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DesignerFlow.esm.js","sources":["../../../src/components/DesignerFlow/DesignerFlow.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { MouseEvent as ReactMouseEvent } from \"react\";\nimport {\n ReactFlow,\n applyNodeChanges,\n applyEdgeChanges,\n addEdge,\n Node,\n Edge,\n NodeChange,\n EdgeChange,\n useNodesState,\n ReactFlowInstance,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport type {\n ScaffolderTaskOutput,\n TaskStep,\n} from \"@backstage/plugin-scaffolder-common\";\nimport type {\n ActionNodeData,\n OutputNodeData,\n ParametersNodeData,\n TemplateParametersValue,\n} from \"../Nodes/types\";\nimport { createSequentialEdges } from \"../../utils/createSequentialEdges\";\nimport {\n collectStepOutputReferences,\n createHandleAddNode,\n createHandleRemoveNode,\n createHandleRemoveInputKey,\n createHandleReorderAndAlignNodes,\n createHandleUpdateField,\n createHandleUpdateInput,\n createHandleUpdateOutput,\n createHandleUpdateSections,\n} from \"./handlers\";\nimport {\n buildNodesFromModel,\n collectParameterReferences,\n stableStringify,\n resolveNodeHeightForTracking,\n extractStepsFromNodes,\n extractParametersFromNodes,\n extractOutputFromNodes,\n} from \"./model\";\nimport { alignNodes } from \"./nodeLayout\";\nimport { FLOW_LAYOUT, nodeDefaults, nodeTypes } from \"./flowConfig\";\nimport { useScaffolderActions } from \"../../api/scaffolderActions\";\n\n// Main orchestration component that renders and synchronizes the Designer flow.\n\nconst FIXED_X_POSITION = FLOW_LAYOUT.fixedXPosition;\nconst VERTICAL_SPACING = FLOW_LAYOUT.verticalSpacing;\n\ntype DesignerFlowProps = {\n steps?: TaskStep[];\n parameters?: TemplateParametersValue;\n output?: ScaffolderTaskOutput | null;\n onStepsChange?: (steps: TaskStep[]) => void;\n onParametersChange?: (parameters: TemplateParametersValue) => void;\n onOutputChange?: (output: ScaffolderTaskOutput | undefined) => void;\n};\n\nexport default function App({\n steps = [],\n parameters,\n output,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n}: DesignerFlowProps) {\n const scaffolderActionsCache = useScaffolderActions();\n\n const {\n ids: scaffolderActionIds,\n inputsById: scaffolderActionInputsById,\n outputsById: scaffolderActionOutputsById,\n inputRequiredById: scaffolderActionInputRequiredById,\n } = scaffolderActionsCache;\n\n const normalizedParametersProp = parameters ?? undefined;\n const normalizedOutputProp = output ?? null;\n\n const initialNodes = useMemo(\n () =>\n buildNodesFromModel(\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n }\n ),\n [\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n ]\n );\n\n const [nodes, setNodes] = useNodesState(initialNodes);\n const [edges, setEdges] = useState<Edge[]>(() =>\n createSequentialEdges(initialNodes)\n );\n\n const modelHash = useMemo(\n () =>\n stableStringify({\n steps,\n parameters: normalizedParametersProp,\n output: normalizedOutputProp,\n }),\n [steps, normalizedParametersProp, normalizedOutputProp]\n );\n\n const cacheFingerprint = useMemo(\n () =>\n stableStringify({\n ids: scaffolderActionIds,\n inputs: scaffolderActionInputsById,\n outputs: scaffolderActionOutputsById,\n inputRequired: scaffolderActionInputRequiredById,\n }),\n [\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n ]\n );\n\n const lastAppliedModelHashRef = useRef<string | null>(null);\n const lastEmittedModelHashRef = useRef<string | null>(null);\n const skipNextModelHashRef = useRef<string | null>(null);\n const lastCacheFingerprintRef = useRef<string | null>(null);\n const nodeHeightsRef = useRef<Record<string, number>>({});\n const shouldAutoFitViewRef = useRef(true);\n const emitDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isDraggingRef = useRef(false);\n const [isDragging, setIsDragging] = useState(false);\n const emitAfterDragRef = useRef(false);\n\n useEffect(() => {\n const isCacheChanged = cacheFingerprint !== lastCacheFingerprintRef.current;\n const shouldSkip =\n modelHash === skipNextModelHashRef.current && !isCacheChanged;\n\n if (shouldSkip) {\n skipNextModelHashRef.current = null;\n lastAppliedModelHashRef.current = modelHash;\n lastCacheFingerprintRef.current = cacheFingerprint;\n return;\n }\n\n if (modelHash === lastAppliedModelHashRef.current && !isCacheChanged) {\n return;\n }\n\n const nextNodes = buildNodesFromModel(\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n }\n );\n\n lastAppliedModelHashRef.current = modelHash;\n lastCacheFingerprintRef.current = cacheFingerprint;\n lastEmittedModelHashRef.current = modelHash;\n\n setNodes(nextNodes);\n setEdges(createSequentialEdges(nextNodes));\n shouldAutoFitViewRef.current = true;\n }, [\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n modelHash,\n cacheFingerprint,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n setNodes,\n setEdges,\n ]);\n\n useEffect(() => {\n if (!nodes.length) {\n return;\n }\n\n if (nodes.some((node) => node.dragging)) {\n return;\n }\n\n const activeNodeIds = new Set<string>();\n let hasMeasuredChange = false;\n\n nodes.forEach((node) => {\n activeNodeIds.add(node.id);\n const measuredHeight = resolveNodeHeightForTracking(node);\n if (typeof measuredHeight !== \"number\") {\n return;\n }\n const previousHeight = nodeHeightsRef.current[node.id];\n if (previousHeight !== measuredHeight) {\n nodeHeightsRef.current[node.id] = measuredHeight;\n hasMeasuredChange = true;\n }\n });\n\n Object.keys(nodeHeightsRef.current).forEach((id) => {\n if (!activeNodeIds.has(id)) {\n delete nodeHeightsRef.current[id];\n }\n });\n\n if (!hasMeasuredChange) {\n return;\n }\n\n setNodes((currentNodes) => {\n const alignedNodes = alignNodes(\n currentNodes,\n FIXED_X_POSITION,\n VERTICAL_SPACING\n );\n const positionsChanged = alignedNodes.some((node, index) => {\n const previousNode = currentNodes[index];\n if (!previousNode) {\n return true;\n }\n return (\n node.position.x !== previousNode.position.x ||\n node.position.y !== previousNode.position.y\n );\n });\n\n return positionsChanged ? alignedNodes : currentNodes;\n });\n }, [nodes, setNodes]);\n\n const parameterReferences = useMemo(\n () => collectParameterReferences(normalizedParametersProp),\n [normalizedParametersProp]\n );\n\n const stepOutputReferencesByNode = useMemo(\n () => collectStepOutputReferences(nodes, parameterReferences),\n [nodes, parameterReferences]\n );\n\n const onNodesChange = useCallback(\n (changes: NodeChange<Node>[]) =>\n setNodes((ns) => {\n if (\n changes.some(\n (change) => change.type === \"position\" && change.dragging\n )\n ) {\n isDraggingRef.current = true;\n setIsDragging(true);\n } else if (\n changes.some(\n (change) => change.type === \"position\" && change.dragging === false\n )\n ) {\n const stillDragging = ns.some((node) => node.dragging);\n isDraggingRef.current = stillDragging;\n setIsDragging(stillDragging);\n }\n return applyNodeChanges(changes, ns);\n }),\n [setNodes]\n );\n\n const onEdgesChange = useCallback(\n (changes: EdgeChange<Edge>[]) =>\n setEdges((es) => applyEdgeChanges(changes, es)),\n [setEdges]\n );\n\n const onConnect = useCallback(\n (params: any) => setEdges((es) => addEdge(params, es)),\n [setEdges]\n );\n\n const reorderAndAlignNodes = useMemo(\n () =>\n createHandleReorderAndAlignNodes(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n }),\n [setNodes, setEdges]\n );\n\n const onNodeDragStop = useCallback(\n (_: ReactMouseEvent, node: Node) => {\n isDraggingRef.current = false;\n setIsDragging(false);\n reorderAndAlignNodes(node);\n },\n [reorderAndAlignNodes]\n );\n\n const onUpdateField = useMemo(\n () => createHandleUpdateField(setNodes),\n [setNodes]\n );\n\n const onUpdateInput = useMemo(\n () => createHandleUpdateInput(setNodes),\n [setNodes]\n );\n\n const onRemoveInputKey = useMemo(\n () => createHandleRemoveInputKey(setNodes),\n [setNodes]\n );\n\n const onUpdateOutput = useMemo(\n () => createHandleUpdateOutput(setNodes),\n [setNodes]\n );\n\n const onUpdateSections = useMemo(\n () => createHandleUpdateSections(setNodes),\n [setNodes]\n );\n\n const handleAddNode = useMemo(\n () =>\n createHandleAddNode(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n nodeDefaults,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n }),\n [\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n setNodes,\n setEdges,\n ]\n );\n\n const handleRemoveNode = useMemo(\n () =>\n createHandleRemoveNode(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n }),\n [setNodes, setEdges]\n );\n\n const nodesWithHandlers = useMemo(() => {\n if (!nodes.length) {\n return nodes;\n }\n return nodes.map((node) => {\n const stepOutputReferences = stepOutputReferencesByNode[node.id] ?? [];\n if (node.type === \"parametersNode\") {\n const data = node.data as ParametersNodeData;\n const nextData =\n data.onAddNode === handleAddNode &&\n data.onUpdateSections === onUpdateSections &&\n data.stepOutputReferences === stepOutputReferences\n ? data\n : {\n ...data,\n onAddNode: handleAddNode,\n onUpdateSections,\n stepOutputReferences,\n };\n return data === nextData ? node : { ...node, data: nextData };\n }\n if (node.type === \"outputNode\") {\n const data = node.data as OutputNodeData;\n const nextData =\n data.onAddNode === handleAddNode &&\n data.onUpdateOutput === onUpdateOutput &&\n data.stepOutputReferences === stepOutputReferences\n ? data\n : {\n ...data,\n onAddNode: handleAddNode,\n onUpdateOutput,\n stepOutputReferences,\n };\n return data === nextData ? node : { ...node, data: nextData };\n }\n\n const data = node.data as ActionNodeData;\n const nextData =\n data.onAddNode === handleAddNode &&\n data.onRemoveNode === handleRemoveNode &&\n data.onUpdateField === onUpdateField &&\n data.onUpdateInput === onUpdateInput &&\n data.onRemoveInputKey === onRemoveInputKey &&\n data.stepOutputReferences === stepOutputReferences\n ? data\n : {\n ...data,\n onAddNode: handleAddNode,\n onRemoveNode: handleRemoveNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n stepOutputReferences,\n };\n return data === nextData ? node : { ...node, data: nextData };\n });\n }, [\n nodes,\n handleAddNode,\n handleRemoveNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n onUpdateOutput,\n onUpdateSections,\n stepOutputReferencesByNode,\n ]);\n\n const stepsFromNodes = useMemo(() => extractStepsFromNodes(nodes), [nodes]);\n\n const parametersFromNodes = useMemo(\n () => extractParametersFromNodes(nodes),\n [nodes]\n );\n\n const outputFromNodes = useMemo(() => extractOutputFromNodes(nodes), [nodes]);\n\n const normalizedOutputFromNodes = outputFromNodes ?? null;\n\n useEffect(() => {\n if (!onStepsChange && !onParametersChange && !onOutputChange) {\n return;\n }\n if (isDragging) {\n emitAfterDragRef.current = true;\n return;\n }\n const serialized = stableStringify({\n steps: stepsFromNodes,\n parameters: parametersFromNodes ?? null,\n output: normalizedOutputFromNodes,\n });\n if (serialized === lastEmittedModelHashRef.current) {\n return;\n }\n if (emitDebounceRef.current) {\n clearTimeout(emitDebounceRef.current);\n }\n emitDebounceRef.current = setTimeout(() => {\n lastEmittedModelHashRef.current = serialized;\n skipNextModelHashRef.current = serialized;\n if (onStepsChange) {\n onStepsChange(stepsFromNodes);\n }\n if (onParametersChange) {\n onParametersChange(parametersFromNodes ?? undefined);\n }\n if (onOutputChange) {\n onOutputChange(outputFromNodes);\n }\n }, 120);\n }, [\n stepsFromNodes,\n parametersFromNodes,\n normalizedOutputFromNodes,\n outputFromNodes,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n isDragging,\n ]);\n\n useEffect(\n () => () => {\n if (emitDebounceRef.current) {\n clearTimeout(emitDebounceRef.current);\n }\n },\n []\n );\n\n const fitViewOptions = useMemo(() => ({ padding: 0.2, duration: 300 }), []);\n const [reactFlowInstance, setReactFlowInstance] =\n useState<ReactFlowInstance | null>(null);\n\n const fitFlowToView = useCallback(() => {\n if (!reactFlowInstance) {\n return;\n }\n reactFlowInstance.fitView(fitViewOptions);\n }, [fitViewOptions, reactFlowInstance]);\n\n useEffect(() => {\n if (!reactFlowInstance) {\n return;\n }\n if (!shouldAutoFitViewRef.current) {\n return;\n }\n shouldAutoFitViewRef.current = false;\n fitFlowToView();\n }, [fitFlowToView, nodes, edges, reactFlowInstance]);\n\n useEffect(() => {\n if (!reactFlowInstance) {\n return undefined;\n }\n window.addEventListener(\"resize\", fitFlowToView);\n return () => {\n window.removeEventListener(\"resize\", fitFlowToView);\n };\n }, [fitFlowToView, reactFlowInstance]);\n\n useEffect(() => {\n if (!isDragging) {\n if (emitAfterDragRef.current) {\n emitAfterDragRef.current = false;\n lastEmittedModelHashRef.current = null;\n }\n // Trigger emit cycle after drag ends so external state is up to date.\n lastEmittedModelHashRef.current = null;\n }\n }, [isDragging]);\n\n return (\n <div style={{ width: \"100%\", height: \"100%\", minHeight: \"70vh\" }}>\n <ReactFlow\n nodes={nodesWithHandlers}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeDragStop={onNodeDragStop}\n onConnect={onConnect}\n fitView\n onInit={setReactFlowInstance}\n fitViewOptions={fitViewOptions}\n />\n </div>\n );\n}\n"],"names":["data","nextData"],"mappings":";;;;;;;;;;;AAoDA,MAAM,mBAAmB,WAAA,CAAY,cAAA;AACrC,MAAM,mBAAmB,WAAA,CAAY,eAAA;AAWrC,SAAwB,GAAA,CAAI;AAAA,EAC1B,QAAQ,EAAC;AAAA,EACT,UAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,yBAAyB,oBAAA,EAAqB;AAEpD,EAAA,MAAM;AAAA,IACJ,GAAA,EAAK,mBAAA;AAAA,IACL,UAAA,EAAY,0BAAA;AAAA,IACZ,WAAA,EAAa,2BAAA;AAAA,IACb,iBAAA,EAAmB;AAAA,GACrB,GAAI,sBAAA;AAEJ,EAAA,MAAM,2BAA2B,UAAA,IAAc,MAAA;AAC/C,EAAA,MAAM,uBAAuB,MAAA,IAAU,IAAA;AAEvC,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,MACE,mBAAA;AAAA,MACE,KAAA;AAAA,MACA,wBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,QACE,mBAAA;AAAA,QACA,0BAAA;AAAA,QACA,2BAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,IACF;AAAA,MACE,KAAA;AAAA,MACA,wBAAA;AAAA,MACA,oBAAA;AAAA,MACA,mBAAA;AAAA,MACA,0BAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,cAAc,YAAY,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA;AAAA,IAAiB,MACzC,sBAAsB,YAAY;AAAA,GACpC;AAEA,EAAA,MAAM,SAAA,GAAY,OAAA;AAAA,IAChB,MACE,eAAA,CAAgB;AAAA,MACd,KAAA;AAAA,MACA,UAAA,EAAY,wBAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,IACH,CAAC,KAAA,EAAO,wBAAA,EAA0B,oBAAoB;AAAA,GACxD;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MACE,eAAA,CAAgB;AAAA,MACd,GAAA,EAAK,mBAAA;AAAA,MACL,MAAA,EAAQ,0BAAA;AAAA,MACR,OAAA,EAAS,2BAAA;AAAA,MACT,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,IACH;AAAA,MACE,mBAAA;AAAA,MACA,0BAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,uBAAA,GAA0B,OAAsB,IAAI,CAAA;AAC1D,EAAA,MAAM,uBAAA,GAA0B,OAAsB,IAAI,CAAA;AAC1D,EAAA,MAAM,oBAAA,GAAuB,OAAsB,IAAI,CAAA;AACvD,EAAA,MAAM,uBAAA,GAA0B,OAAsB,IAAI,CAAA;AAC1D,EAAA,MAAM,cAAA,GAAiB,MAAA,CAA+B,EAAE,CAAA;AACxD,EAAA,MAAM,oBAAA,GAAuB,OAAO,IAAI,CAAA;AACxC,EAAA,MAAM,eAAA,GAAkB,OAA6C,IAAI,CAAA;AACzE,EAAA,MAAM,aAAA,GAAgB,OAAO,KAAK,CAAA;AAClC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,gBAAA,GAAmB,OAAO,KAAK,CAAA;AAErC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,cAAA,GAAiB,qBAAqB,uBAAA,CAAwB,OAAA;AACpE,IAAA,MAAM,UAAA,GACJ,SAAA,KAAc,oBAAA,CAAqB,OAAA,IAAW,CAAC,cAAA;AAEjD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAC/B,MAAA,uBAAA,CAAwB,OAAA,GAAU,SAAA;AAClC,MAAA,uBAAA,CAAwB,OAAA,GAAU,gBAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,KAAc,uBAAA,CAAwB,OAAA,IAAW,CAAC,cAAA,EAAgB;AACpE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,mBAAA;AAAA,MAChB,KAAA;AAAA,MACA,wBAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,QACE,mBAAA;AAAA,QACA,0BAAA;AAAA,QACA,2BAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,uBAAA,CAAwB,OAAA,GAAU,SAAA;AAClC,IAAA,uBAAA,CAAwB,OAAA,GAAU,gBAAA;AAClC,IAAA,uBAAA,CAAwB,OAAA,GAAU,SAAA;AAElC,IAAA,QAAA,CAAS,SAAS,CAAA;AAClB,IAAA,QAAA,CAAS,qBAAA,CAAsB,SAAS,CAAC,CAAA;AACzC,IAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAAA,EACjC,CAAA,EAAG;AAAA,IACD,KAAA;AAAA,IACA,wBAAA;AAAA,IACA,oBAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,0BAAA;AAAA,IACA,2BAAA;AAAA,IACA,iCAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,IAAA,IAAI,iBAAA,GAAoB,KAAA;AAExB,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,aAAA,CAAc,GAAA,CAAI,KAAK,EAAE,CAAA;AACzB,MAAA,MAAM,cAAA,GAAiB,6BAA6B,IAAI,CAAA;AACxD,MAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AACtC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AACrD,MAAA,IAAI,mBAAmB,cAAA,EAAgB;AACrC,QAAA,cAAA,CAAe,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,GAAI,cAAA;AAClC,QAAA,iBAAA,GAAoB,IAAA;AAAA,MACtB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,KAAK,cAAA,CAAe,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAO;AAClD,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA,EAAG;AAC1B,QAAA,OAAO,cAAA,CAAe,QAAQ,EAAE,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,CAAC,YAAA,KAAiB;AACzB,MAAA,MAAM,YAAA,GAAe,UAAA;AAAA,QACnB,YAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,IAAA,CAAK,CAAC,MAAM,KAAA,KAAU;AAC1D,QAAA,MAAM,YAAA,GAAe,aAAa,KAAK,CAAA;AACvC,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,OACE,IAAA,CAAK,QAAA,CAAS,CAAA,KAAM,YAAA,CAAa,QAAA,CAAS,KAC1C,IAAA,CAAK,QAAA,CAAS,CAAA,KAAM,YAAA,CAAa,QAAA,CAAS,CAAA;AAAA,MAE9C,CAAC,CAAA;AAED,MAAA,OAAO,mBAAmB,YAAA,GAAe,YAAA;AAAA,IAC3C,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,MAAM,mBAAA,GAAsB,OAAA;AAAA,IAC1B,MAAM,2BAA2B,wBAAwB,CAAA;AAAA,IACzD,CAAC,wBAAwB;AAAA,GAC3B;AAEA,EAAA,MAAM,0BAAA,GAA6B,OAAA;AAAA,IACjC,MAAM,2BAAA,CAA4B,KAAA,EAAO,mBAAmB,CAAA;AAAA,IAC5D,CAAC,OAAO,mBAAmB;AAAA,GAC7B;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,OAAA,KACC,QAAA,CAAS,CAAC,EAAA,KAAO;AACf,MAAA,IACE,OAAA,CAAQ,IAAA;AAAA,QACN,CAAC,MAAA,KAAW,MAAA,CAAO,IAAA,KAAS,cAAc,MAAA,CAAO;AAAA,OACnD,EACA;AACA,QAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,WACE,OAAA,CAAQ,IAAA;AAAA,QACN,CAAC,MAAA,KAAW,MAAA,CAAO,IAAA,KAAS,UAAA,IAAc,OAAO,QAAA,KAAa;AAAA,OAChE,EACA;AACA,QAAA,MAAM,gBAAgB,EAAA,CAAG,IAAA,CAAK,CAAC,IAAA,KAAS,KAAK,QAAQ,CAAA;AACrD,QAAA,aAAA,CAAc,OAAA,GAAU,aAAA;AACxB,QAAA,aAAA,CAAc,aAAa,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,gBAAA,CAAiB,SAAS,EAAE,CAAA;AAAA,IACrC,CAAC,CAAA;AAAA,IACH,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,YACC,QAAA,CAAS,CAAC,OAAO,gBAAA,CAAiB,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,IAChD,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,WAAgB,QAAA,CAAS,CAAC,OAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA;AAAA,IACrD,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,oBAAA,GAAuB,OAAA;AAAA,IAC3B,MACE,gCAAA,CAAiC,QAAA,EAAU,QAAA,EAAU;AAAA,MACnD,cAAA,EAAgB,gBAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,KAClB,CAAA;AAAA,IACH,CAAC,UAAU,QAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,cAAA,GAAiB,WAAA;AAAA,IACrB,CAAC,GAAoB,IAAA,KAAe;AAClC,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,IAC3B,CAAA;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MAAM,wBAAwB,QAAQ,CAAA;AAAA,IACtC,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MAAM,wBAAwB,QAAQ,CAAA;AAAA,IACtC,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MAAM,2BAA2B,QAAQ,CAAA;AAAA,IACzC,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAA;AAAA,IACrB,MAAM,yBAAyB,QAAQ,CAAA;AAAA,IACvC,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MAAM,2BAA2B,QAAQ,CAAA;AAAA,IACzC,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MACE,mBAAA,CAAoB,QAAA,EAAU,QAAA,EAAU;AAAA,MACtC,cAAA,EAAgB,gBAAA;AAAA,MAChB,eAAA,EAAiB,gBAAA;AAAA,MACjB,YAAA;AAAA,MACA,mBAAA;AAAA,MACA,0BAAA;AAAA,MACA,iCAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,MACE,mBAAA;AAAA,MACA,0BAAA;AAAA,MACA,2BAAA;AAAA,MACA,iCAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAAA,IACvB,MACE,sBAAA,CAAuB,QAAA,EAAU,QAAA,EAAU;AAAA,MACzC,cAAA,EAAgB,gBAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,KAClB,CAAA;AAAA,IACH,CAAC,UAAU,QAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,iBAAA,GAAoB,QAAQ,MAAM;AACtC,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,MAAA,MAAM,oBAAA,GAAuB,0BAAA,CAA2B,IAAA,CAAK,EAAE,KAAK,EAAC;AACrE,MAAA,IAAI,IAAA,CAAK,SAAS,gBAAA,EAAkB;AAClC,QAAA,MAAMA,QAAO,IAAA,CAAK,IAAA;AAClB,QAAA,MAAMC,SAAAA,GACJD,KAAAA,CAAK,SAAA,KAAc,aAAA,IACnBA,KAAAA,CAAK,qBAAqB,gBAAA,IAC1BA,KAAAA,CAAK,oBAAA,KAAyB,oBAAA,GAC1BA,KAAAA,GACA;AAAA,UACE,GAAGA,KAAAA;AAAA,UACH,SAAA,EAAW,aAAA;AAAA,UACX,gBAAA;AAAA,UACA;AAAA,SACF;AACN,QAAA,OAAOA,UAASC,SAAAA,GAAW,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,MAAMA,SAAAA,EAAS;AAAA,MAC9D;AACA,MAAA,IAAI,IAAA,CAAK,SAAS,YAAA,EAAc;AAC9B,QAAA,MAAMD,QAAO,IAAA,CAAK,IAAA;AAClB,QAAA,MAAMC,SAAAA,GACJD,KAAAA,CAAK,SAAA,KAAc,aAAA,IACnBA,KAAAA,CAAK,mBAAmB,cAAA,IACxBA,KAAAA,CAAK,oBAAA,KAAyB,oBAAA,GAC1BA,KAAAA,GACA;AAAA,UACE,GAAGA,KAAAA;AAAA,UACH,SAAA,EAAW,aAAA;AAAA,UACX,cAAA;AAAA,UACA;AAAA,SACF;AACN,QAAA,OAAOA,UAASC,SAAAA,GAAW,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,MAAMA,SAAAA,EAAS;AAAA,MAC9D;AAEA,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,MAAM,WACJ,IAAA,CAAK,SAAA,KAAc,iBACnB,IAAA,CAAK,YAAA,KAAiB,oBACtB,IAAA,CAAK,aAAA,KAAkB,iBACvB,IAAA,CAAK,aAAA,KAAkB,iBACvB,IAAA,CAAK,gBAAA,KAAqB,oBAC1B,IAAA,CAAK,oBAAA,KAAyB,uBAC1B,IAAA,GACA;AAAA,QACE,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,aAAA;AAAA,QACX,YAAA,EAAc,gBAAA;AAAA,QACd,aAAA;AAAA,QACA,aAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OACF;AACN,MAAA,OAAO,SAAS,QAAA,GAAW,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,MAAM,QAAA,EAAS;AAAA,IAC9D,CAAC,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,KAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAM,qBAAA,CAAsB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAE1E,EAAA,MAAM,mBAAA,GAAsB,OAAA;AAAA,IAC1B,MAAM,2BAA2B,KAAK,CAAA;AAAA,IACtC,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAM,sBAAA,CAAuB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAE5E,EAAA,MAAM,4BAA4B,eAAA,IAAmB,IAAA;AAErD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,kBAAA,IAAsB,CAAC,cAAA,EAAgB;AAC5D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,aAAa,eAAA,CAAgB;AAAA,MACjC,KAAA,EAAO,cAAA;AAAA,MACP,YAAY,mBAAA,IAAuB,IAAA;AAAA,MACnC,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,IAAI,UAAA,KAAe,wBAAwB,OAAA,EAAS;AAClD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,MAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAAA,IACtC;AACA,IAAA,eAAA,CAAgB,OAAA,GAAU,WAAW,MAAM;AACzC,MAAA,uBAAA,CAAwB,OAAA,GAAU,UAAA;AAClC,MAAA,oBAAA,CAAqB,OAAA,GAAU,UAAA;AAC/B,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,aAAA,CAAc,cAAc,CAAA;AAAA,MAC9B;AACA,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,kBAAA,CAAmB,uBAAuB,MAAS,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,cAAA,CAAe,eAAe,CAAA;AAAA,MAChC;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAA,EAAG;AAAA,IACD,cAAA;AAAA,IACA,mBAAA;AAAA,IACA,yBAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,SAAA;AAAA,IACE,MAAM,MAAM;AACV,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,QAAA,YAAA,CAAa,gBAAgB,OAAO,CAAA;AAAA,MACtC;AAAA,IACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,OAAO,EAAE,OAAA,EAAS,KAAK,QAAA,EAAU,GAAA,EAAI,CAAA,EAAI,EAAE,CAAA;AAC1E,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAC5C,SAAmC,IAAI,CAAA;AAEzC,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA;AAAA,IACF;AACA,IAAA,iBAAA,CAAkB,QAAQ,cAAc,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,cAAA,EAAgB,iBAAiB,CAAC,CAAA;AAEtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,qBAAqB,OAAA,EAAS;AACjC,MAAA;AAAA,IACF;AACA,IAAA,oBAAA,CAAqB,OAAA,GAAU,KAAA;AAC/B,IAAA,aAAA,EAAc;AAAA,EAChB,GAAG,CAAC,aAAA,EAAe,KAAA,EAAO,KAAA,EAAO,iBAAiB,CAAC,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,aAAa,CAAA;AAC/C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,aAAa,CAAA;AAAA,IACpD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,iBAAiB,CAAC,CAAA;AAErC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,QAAA,uBAAA,CAAwB,OAAA,GAAU,IAAA;AAAA,MACpC;AAEA,MAAA,uBAAA,CAAwB,OAAA,GAAU,IAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAO,EAC7D,QAAA,kBAAA,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,iBAAA;AAAA,MACP,KAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,oBAAA;AAAA,MACR;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -3,6 +3,17 @@ import { normalizeParametersToSections, sanitizeSections, sectionsToParametersVa
|
|
|
3
3
|
import { alignNodes } from './nodeLayout.esm.js';
|
|
4
4
|
|
|
5
5
|
const orderNodes = (parameterNodes, actionNodes, outputNodes) => [...parameterNodes, ...actionNodes, ...outputNodes];
|
|
6
|
+
const setSequentialEdgesIfChanged = (setEdges, alignedNodes) => {
|
|
7
|
+
setEdges((prevEdges) => {
|
|
8
|
+
const nextEdges = createSequentialEdges(alignedNodes);
|
|
9
|
+
if (prevEdges.length === nextEdges.length && prevEdges.every(
|
|
10
|
+
(edge, index) => edge.source === nextEdges[index]?.source && edge.target === nextEdges[index]?.target
|
|
11
|
+
)) {
|
|
12
|
+
return prevEdges;
|
|
13
|
+
}
|
|
14
|
+
return nextEdges;
|
|
15
|
+
});
|
|
16
|
+
};
|
|
6
17
|
const createHandleAddNode = (setNodes, setEdges, options) => {
|
|
7
18
|
const {
|
|
8
19
|
fixedXPosition,
|
|
@@ -29,7 +40,7 @@ const createHandleAddNode = (setNodes, setEdges, options) => {
|
|
|
29
40
|
const composeAndAlign = (nextParameters, nextActions, nextOutputs) => {
|
|
30
41
|
const ordered = orderNodes(nextParameters, nextActions, nextOutputs);
|
|
31
42
|
const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);
|
|
32
|
-
setEdges
|
|
43
|
+
setSequentialEdgesIfChanged(setEdges, aligned);
|
|
33
44
|
return aligned;
|
|
34
45
|
};
|
|
35
46
|
if (nodeType === "parametersNode") {
|
|
@@ -143,7 +154,7 @@ const createHandleRemoveNode = (setNodes, setEdges, options) => {
|
|
|
143
154
|
fixedXPosition,
|
|
144
155
|
verticalSpacing
|
|
145
156
|
);
|
|
146
|
-
setEdges
|
|
157
|
+
setSequentialEdgesIfChanged(setEdges, alignedNodes);
|
|
147
158
|
return alignedNodes;
|
|
148
159
|
});
|
|
149
160
|
};
|
|
@@ -179,7 +190,7 @@ const createHandleReorderAndAlignNodes = (setNodes, setEdges, options) => {
|
|
|
179
190
|
const outputNodes = updatedNodes.filter((node) => node.type === "outputNode").sort((a, b) => a.position.y - b.position.y);
|
|
180
191
|
const ordered = orderNodes(parameterNodes, actionNodes, outputNodes);
|
|
181
192
|
const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);
|
|
182
|
-
setEdges
|
|
193
|
+
setSequentialEdgesIfChanged(setEdges, aligned);
|
|
183
194
|
return aligned;
|
|
184
195
|
});
|
|
185
196
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.esm.js","sources":["../../../src/components/DesignerFlow/handlers.ts"],"sourcesContent":["import type { Dispatch, SetStateAction } from \"react\";\nimport type { Edge, Node } from \"@xyflow/react\";\nimport type { TaskStep } from \"@backstage/plugin-scaffolder-common\";\n\n// Stateful handlers that mutate nodes/edges in response to user interactions.\nimport type {\n ActionNodeData,\n AddNodeConfig,\n DesignerNodeType,\n OutputNodeData,\n ParametersNodeData,\n ParameterSectionDisplay,\n TemplateParametersValue,\n} from \"../Nodes/types\";\nimport { createSequentialEdges } from \"../../utils/createSequentialEdges\";\nimport {\n normalizeParametersToSections,\n sanitizeSections,\n sectionsToParametersValue,\n} from \"./parameterTransforms\";\nimport { alignNodes } from \"./nodeLayout\";\n\ntype SetNodes = Dispatch<SetStateAction<Node[]>>;\ntype SetEdges = Dispatch<SetStateAction<Edge[]>>;\n\ninterface CreateHandleAddNodeOptions {\n fixedXPosition: number;\n verticalSpacing: number;\n nodeDefaults: Partial<Node>;\n scaffolderActionIds: string[];\n scaffolderActionInputsById: Record<string, Record<string, unknown>>;\n scaffolderActionInputRequiredById: Record<string, string[]>;\n scaffolderActionOutputsById: Record<string, Record<string, unknown>>;\n}\n\ninterface CreateHandleRemoveNodeOptions {\n fixedXPosition: number;\n verticalSpacing: number;\n}\n\nconst orderNodes = (\n parameterNodes: Node[],\n actionNodes: Node[],\n outputNodes: Node[]\n) => [...parameterNodes, ...actionNodes, ...outputNodes];\n\nexport const createHandleAddNode = (\n setNodes: SetNodes,\n setEdges: SetEdges,\n options: CreateHandleAddNodeOptions\n) => {\n const {\n fixedXPosition,\n verticalSpacing,\n nodeDefaults,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } = options;\n\n return (config: AddNodeConfig) => {\n const {\n afterRfId,\n type = \"actionNode\",\n stepTemplate,\n outputTemplate,\n parametersTemplate,\n } = config;\n const nodeType: DesignerNodeType = type;\n\n setNodes((nodes) => {\n const parameterNodes = nodes.filter((n) => n.type === \"parametersNode\");\n const actionNodes = nodes.filter((n) => n.type === \"actionNode\");\n const outputNodes = nodes.filter((n) => n.type === \"outputNode\");\n\n const composeAndAlign = (\n nextParameters: Node[],\n nextActions: Node[],\n nextOutputs: Node[]\n ) => {\n const ordered = orderNodes(nextParameters, nextActions, nextOutputs);\n const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);\n setEdges(createSequentialEdges(aligned));\n return aligned;\n };\n\n if (nodeType === \"parametersNode\") {\n if (parameterNodes.length > 0) {\n return composeAndAlign(parameterNodes, actionNodes, outputNodes);\n }\n\n const rfParametersId = \"rf-parameters\";\n const initialParameters =\n parametersTemplate !== undefined\n ? (JSON.parse(\n JSON.stringify(parametersTemplate)\n ) as TemplateParametersValue)\n : undefined;\n\n const parameterNode: Node = {\n id: rfParametersId,\n type: \"parametersNode\",\n position: { x: fixedXPosition, y: 0 },\n data: {\n rfId: rfParametersId,\n parameters: initialParameters,\n sections: [],\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } satisfies ParametersNodeData,\n ...nodeDefaults,\n };\n\n return composeAndAlign([parameterNode], actionNodes, outputNodes);\n }\n\n if (nodeType === \"outputNode\") {\n if (outputNodes.length > 0) {\n return composeAndAlign(parameterNodes, actionNodes, outputNodes);\n }\n\n const rfOutputId = \"rf-output\";\n const initialOutput =\n outputTemplate !== undefined && outputTemplate !== null\n ? (JSON.parse(JSON.stringify(outputTemplate)) as Record<\n string,\n unknown\n >)\n : {};\n\n const outputNode: Node = {\n id: rfOutputId,\n type: \"outputNode\",\n position: { x: fixedXPosition, y: 0 },\n data: {\n rfId: rfOutputId,\n output: initialOutput,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n };\n\n return composeAndAlign(parameterNodes, actionNodes, [\n ...outputNodes,\n outputNode,\n ]);\n }\n\n const parametersPlaceholder = nodes.find(\n (n) => n.type === \"parametersNode\"\n );\n const parametersNodeId = parametersPlaceholder?.id ?? null;\n const parentIndex = actionNodes.findIndex((n) => n.id === afterRfId);\n let insertIndex: number;\n if (parentIndex >= 0) {\n insertIndex = parentIndex + 1;\n } else if (afterRfId === parametersNodeId) {\n insertIndex = 0;\n } else {\n insertIndex = actionNodes.length;\n }\n\n const rfId = `rf-${Date.now()}`;\n const stepDefaults: TaskStep = {\n id: `step-${rfId}`,\n name: \"New Step\",\n action: \"\",\n input: {},\n };\n\n const newStep: TaskStep = {\n ...stepDefaults,\n ...(stepTemplate ?? {}),\n };\n\n const newNode: Node = {\n id: rfId,\n type: \"actionNode\",\n position: { x: fixedXPosition, y: 0 },\n data: {\n rfId,\n step: newStep,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n };\n\n const nextActionNodes = [\n ...actionNodes.slice(0, insertIndex),\n newNode,\n ...actionNodes.slice(insertIndex),\n ];\n\n return composeAndAlign(parameterNodes, nextActionNodes, outputNodes);\n });\n };\n};\n\nexport const createHandleRemoveNode = (\n setNodes: SetNodes,\n setEdges: SetEdges,\n options: CreateHandleRemoveNodeOptions\n) => {\n const { fixedXPosition, verticalSpacing } = options;\n\n return (rfId: string) => {\n setNodes((nodes) => {\n const targetNode = nodes.find((node) => node.id === rfId);\n if (!targetNode || targetNode.type !== \"actionNode\") {\n return nodes;\n }\n\n const remainingNodes = nodes.filter((node) => node.id !== rfId);\n const alignedNodes = alignNodes(\n remainingNodes,\n fixedXPosition,\n verticalSpacing\n );\n setEdges(createSequentialEdges(alignedNodes));\n return alignedNodes;\n });\n };\n};\n\nexport const createHandleRemoveInputKey = (setNodes: SetNodes) => {\n return (rfId: string, key: string) => {\n setNodes((nds) =>\n nds.map((n) => {\n if (n.id !== rfId) {\n return n;\n }\n\n const data = n.data as Partial<ActionNodeData>;\n if (!data.step) {\n return n;\n }\n const nextInput = { ...(data.step.input ?? {}) };\n delete nextInput[key];\n const step = { ...data.step, input: nextInput };\n\n return { ...n, data: { ...data, step } };\n })\n );\n };\n};\n\nexport const createHandleReorderAndAlignNodes = (\n setNodes: SetNodes,\n setEdges: SetEdges,\n options: { fixedXPosition: number; verticalSpacing: number }\n) => {\n const { fixedXPosition, verticalSpacing } = options;\n\n return (updatedNode: Node) => {\n setNodes((prevNodes) => {\n const updatedNodes = prevNodes.map((node) =>\n node.id === updatedNode.id ? updatedNode : node\n );\n\n const parameterNodes = updatedNodes\n .filter((node) => node.type === \"parametersNode\")\n .sort((a, b) => a.position.y - b.position.y);\n const actionNodes = updatedNodes\n .filter((node) => node.type === \"actionNode\")\n .sort((a, b) => a.position.y - b.position.y);\n const outputNodes = updatedNodes\n .filter((node) => node.type === \"outputNode\")\n .sort((a, b) => a.position.y - b.position.y);\n\n const ordered = orderNodes(parameterNodes, actionNodes, outputNodes);\n const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);\n\n setEdges(createSequentialEdges(aligned));\n return aligned;\n });\n };\n};\n\nexport const createHandleUpdateField = (setNodes: SetNodes) => {\n return (rfId: string, field: keyof TaskStep, value: string) => {\n setNodes((nds) =>\n nds.map((n) => {\n if (n.id !== rfId) {\n return n;\n }\n\n const data = n.data as Partial<ActionNodeData>;\n if (!data.step) {\n return n;\n }\n const step = { ...data.step, [field]: value };\n\n return { ...n, data: { ...data, step } };\n })\n );\n };\n};\n\nexport const createHandleUpdateInput = (setNodes: SetNodes) => {\n return (rfId: string, key: string, value: unknown) => {\n setNodes((nds) =>\n nds.map((n) => {\n if (n.id !== rfId) {\n return n;\n }\n\n const data = n.data as Partial<ActionNodeData>;\n if (!data.step) {\n return n;\n }\n const nextInput = { ...(data.step.input ?? {}), [key]: value };\n const step = { ...data.step, input: nextInput };\n\n return { ...n, data: { ...data, step } };\n })\n );\n };\n};\n\nexport const collectStepOutputReferences = (\n nodes: Node[],\n parameterReferences: string[]\n): Record<string, string[]> => {\n const referencesByNode: Record<string, string[]> = {};\n const sortedNodes = [...nodes].sort((a, b) => a.position.y - b.position.y);\n const accumulatedReferences: string[] = [...parameterReferences];\n const accumulatedSet = new Set<string>(parameterReferences);\n\n sortedNodes.forEach((node) => {\n referencesByNode[node.id] = [...accumulatedReferences];\n\n const data = node.data as Partial<ActionNodeData> | undefined;\n if (!data || !data.step) {\n return;\n }\n\n const { step, scaffolderActionOutputsById } = data;\n const stepId =\n step && typeof step.id === \"string\" && step.id.trim().length > 0\n ? step.id\n : null;\n const actionId =\n step && typeof step.action === \"string\" && step.action.trim().length > 0\n ? step.action\n : null;\n\n if (!stepId || !actionId) {\n return;\n }\n\n const outputKeys = new Set<string>();\n const schemaOutputs = scaffolderActionOutputsById?.[actionId];\n if (schemaOutputs && typeof schemaOutputs === \"object\") {\n Object.keys(schemaOutputs).forEach((key) => {\n if (key) {\n outputKeys.add(key);\n }\n });\n }\n\n const stepOutput = (step as { output?: Record<string, unknown> }).output;\n if (stepOutput && typeof stepOutput === \"object\") {\n Object.keys(stepOutput).forEach((key) => {\n if (key) {\n outputKeys.add(key);\n }\n });\n }\n\n outputKeys.forEach((outputKey) => {\n const reference = `\\${{ steps['${stepId}'].output.${outputKey} }}`;\n if (!accumulatedSet.has(reference)) {\n accumulatedSet.add(reference);\n accumulatedReferences.push(reference);\n }\n });\n });\n\n return referencesByNode;\n};\n\nexport const createHandleUpdateOutput = (setNodes: SetNodes) => {\n return (\n rfId: string,\n updater: (prev: OutputNodeData[\"output\"]) => OutputNodeData[\"output\"]\n ) => {\n setNodes((nodes) =>\n nodes.map((node) => {\n if (node.id !== rfId || node.type !== \"outputNode\") {\n return node;\n }\n const data = node.data as OutputNodeData;\n const nextOutput = updater(data.output ?? {});\n return {\n ...node,\n data: {\n ...data,\n output: nextOutput,\n },\n };\n })\n );\n };\n};\n\nexport const createHandleUpdateSections = (setNodes: SetNodes) => {\n return (\n rfId: string,\n updater: (prev: ParameterSectionDisplay[]) => ParameterSectionDisplay[]\n ) => {\n setNodes((nodes) =>\n nodes.map((node) => {\n if (node.id !== rfId || node.type !== \"parametersNode\") {\n return node;\n }\n const data = node.data as ParametersNodeData;\n const previousSections =\n data.sections ?? normalizeParametersToSections(data.parameters);\n const nextSections = sanitizeSections(updater(previousSections));\n const nextParameters = sectionsToParametersValue(nextSections);\n return {\n ...node,\n data: {\n ...data,\n sections: nextSections,\n parameters: nextParameters,\n },\n };\n })\n );\n };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handlers.esm.js","sources":["../../../src/components/DesignerFlow/handlers.ts"],"sourcesContent":["import type { Dispatch, SetStateAction } from \"react\";\nimport type { Edge, Node } from \"@xyflow/react\";\nimport type { TaskStep } from \"@backstage/plugin-scaffolder-common\";\n\n// Stateful handlers that mutate nodes/edges in response to user interactions.\nimport type {\n ActionNodeData,\n AddNodeConfig,\n DesignerNodeType,\n OutputNodeData,\n ParametersNodeData,\n ParameterSectionDisplay,\n TemplateParametersValue,\n} from \"../Nodes/types\";\nimport { createSequentialEdges } from \"../../utils/createSequentialEdges\";\nimport {\n normalizeParametersToSections,\n sanitizeSections,\n sectionsToParametersValue,\n} from \"./parameterTransforms\";\nimport { alignNodes } from \"./nodeLayout\";\n\ntype SetNodes = Dispatch<SetStateAction<Node[]>>;\ntype SetEdges = Dispatch<SetStateAction<Edge[]>>;\n\ninterface CreateHandleAddNodeOptions {\n fixedXPosition: number;\n verticalSpacing: number;\n nodeDefaults: Partial<Node>;\n scaffolderActionIds: string[];\n scaffolderActionInputsById: Record<string, Record<string, unknown>>;\n scaffolderActionInputRequiredById: Record<string, string[]>;\n scaffolderActionOutputsById: Record<string, Record<string, unknown>>;\n}\n\ninterface CreateHandleRemoveNodeOptions {\n fixedXPosition: number;\n verticalSpacing: number;\n}\n\nconst orderNodes = (\n parameterNodes: Node[],\n actionNodes: Node[],\n outputNodes: Node[]\n) => [...parameterNodes, ...actionNodes, ...outputNodes];\n\nconst setSequentialEdgesIfChanged = (\n setEdges: SetEdges,\n alignedNodes: Node[]\n) => {\n setEdges((prevEdges) => {\n const nextEdges = createSequentialEdges(alignedNodes);\n if (\n prevEdges.length === nextEdges.length &&\n prevEdges.every(\n (edge, index) =>\n edge.source === nextEdges[index]?.source &&\n edge.target === nextEdges[index]?.target\n )\n ) {\n return prevEdges;\n }\n return nextEdges;\n });\n};\n\nexport const createHandleAddNode = (\n setNodes: SetNodes,\n setEdges: SetEdges,\n options: CreateHandleAddNodeOptions\n) => {\n const {\n fixedXPosition,\n verticalSpacing,\n nodeDefaults,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } = options;\n\n return (config: AddNodeConfig) => {\n const {\n afterRfId,\n type = \"actionNode\",\n stepTemplate,\n outputTemplate,\n parametersTemplate,\n } = config;\n const nodeType: DesignerNodeType = type;\n\n setNodes((nodes) => {\n const parameterNodes = nodes.filter((n) => n.type === \"parametersNode\");\n const actionNodes = nodes.filter((n) => n.type === \"actionNode\");\n const outputNodes = nodes.filter((n) => n.type === \"outputNode\");\n\n const composeAndAlign = (\n nextParameters: Node[],\n nextActions: Node[],\n nextOutputs: Node[]\n ) => {\n const ordered = orderNodes(nextParameters, nextActions, nextOutputs);\n const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);\n setSequentialEdgesIfChanged(setEdges, aligned);\n return aligned;\n };\n\n if (nodeType === \"parametersNode\") {\n if (parameterNodes.length > 0) {\n return composeAndAlign(parameterNodes, actionNodes, outputNodes);\n }\n\n const rfParametersId = \"rf-parameters\";\n const initialParameters =\n parametersTemplate !== undefined\n ? (JSON.parse(\n JSON.stringify(parametersTemplate)\n ) as TemplateParametersValue)\n : undefined;\n\n const parameterNode: Node = {\n id: rfParametersId,\n type: \"parametersNode\",\n position: { x: fixedXPosition, y: 0 },\n data: {\n rfId: rfParametersId,\n parameters: initialParameters,\n sections: [],\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } satisfies ParametersNodeData,\n ...nodeDefaults,\n };\n\n return composeAndAlign([parameterNode], actionNodes, outputNodes);\n }\n\n if (nodeType === \"outputNode\") {\n if (outputNodes.length > 0) {\n return composeAndAlign(parameterNodes, actionNodes, outputNodes);\n }\n\n const rfOutputId = \"rf-output\";\n const initialOutput =\n outputTemplate !== undefined && outputTemplate !== null\n ? (JSON.parse(JSON.stringify(outputTemplate)) as Record<\n string,\n unknown\n >)\n : {};\n\n const outputNode: Node = {\n id: rfOutputId,\n type: \"outputNode\",\n position: { x: fixedXPosition, y: 0 },\n data: {\n rfId: rfOutputId,\n output: initialOutput,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n };\n\n return composeAndAlign(parameterNodes, actionNodes, [\n ...outputNodes,\n outputNode,\n ]);\n }\n\n const parametersPlaceholder = nodes.find(\n (n) => n.type === \"parametersNode\"\n );\n const parametersNodeId = parametersPlaceholder?.id ?? null;\n const parentIndex = actionNodes.findIndex((n) => n.id === afterRfId);\n let insertIndex: number;\n if (parentIndex >= 0) {\n insertIndex = parentIndex + 1;\n } else if (afterRfId === parametersNodeId) {\n insertIndex = 0;\n } else {\n insertIndex = actionNodes.length;\n }\n\n const rfId = `rf-${Date.now()}`;\n const stepDefaults: TaskStep = {\n id: `step-${rfId}`,\n name: \"New Step\",\n action: \"\",\n input: {},\n };\n\n const newStep: TaskStep = {\n ...stepDefaults,\n ...(stepTemplate ?? {}),\n };\n\n const newNode: Node = {\n id: rfId,\n type: \"actionNode\",\n position: { x: fixedXPosition, y: 0 },\n data: {\n rfId,\n step: newStep,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n };\n\n const nextActionNodes = [\n ...actionNodes.slice(0, insertIndex),\n newNode,\n ...actionNodes.slice(insertIndex),\n ];\n\n return composeAndAlign(parameterNodes, nextActionNodes, outputNodes);\n });\n };\n};\n\nexport const createHandleRemoveNode = (\n setNodes: SetNodes,\n setEdges: SetEdges,\n options: CreateHandleRemoveNodeOptions\n) => {\n const { fixedXPosition, verticalSpacing } = options;\n\n return (rfId: string) => {\n setNodes((nodes) => {\n const targetNode = nodes.find((node) => node.id === rfId);\n if (!targetNode || targetNode.type !== \"actionNode\") {\n return nodes;\n }\n\n const remainingNodes = nodes.filter((node) => node.id !== rfId);\n const alignedNodes = alignNodes(\n remainingNodes,\n fixedXPosition,\n verticalSpacing\n );\n setSequentialEdgesIfChanged(setEdges, alignedNodes);\n return alignedNodes;\n });\n };\n};\n\nexport const createHandleRemoveInputKey = (setNodes: SetNodes) => {\n return (rfId: string, key: string) => {\n setNodes((nds) =>\n nds.map((n) => {\n if (n.id !== rfId) {\n return n;\n }\n\n const data = n.data as Partial<ActionNodeData>;\n if (!data.step) {\n return n;\n }\n const nextInput = { ...(data.step.input ?? {}) };\n delete nextInput[key];\n const step = { ...data.step, input: nextInput };\n\n return { ...n, data: { ...data, step } };\n })\n );\n };\n};\n\nexport const createHandleReorderAndAlignNodes = (\n setNodes: SetNodes,\n setEdges: SetEdges,\n options: { fixedXPosition: number; verticalSpacing: number }\n) => {\n const { fixedXPosition, verticalSpacing } = options;\n\n return (updatedNode: Node) => {\n setNodes((prevNodes) => {\n const updatedNodes = prevNodes.map((node) =>\n node.id === updatedNode.id ? updatedNode : node\n );\n\n const parameterNodes = updatedNodes\n .filter((node) => node.type === \"parametersNode\")\n .sort((a, b) => a.position.y - b.position.y);\n const actionNodes = updatedNodes\n .filter((node) => node.type === \"actionNode\")\n .sort((a, b) => a.position.y - b.position.y);\n const outputNodes = updatedNodes\n .filter((node) => node.type === \"outputNode\")\n .sort((a, b) => a.position.y - b.position.y);\n\n const ordered = orderNodes(parameterNodes, actionNodes, outputNodes);\n const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);\n\n setSequentialEdgesIfChanged(setEdges, aligned);\n return aligned;\n });\n };\n};\n\nexport const createHandleUpdateField = (setNodes: SetNodes) => {\n return (rfId: string, field: keyof TaskStep, value: string) => {\n setNodes((nds) =>\n nds.map((n) => {\n if (n.id !== rfId) {\n return n;\n }\n\n const data = n.data as Partial<ActionNodeData>;\n if (!data.step) {\n return n;\n }\n const step = { ...data.step, [field]: value };\n\n return { ...n, data: { ...data, step } };\n })\n );\n };\n};\n\nexport const createHandleUpdateInput = (setNodes: SetNodes) => {\n return (rfId: string, key: string, value: unknown) => {\n setNodes((nds) =>\n nds.map((n) => {\n if (n.id !== rfId) {\n return n;\n }\n\n const data = n.data as Partial<ActionNodeData>;\n if (!data.step) {\n return n;\n }\n const nextInput = { ...(data.step.input ?? {}), [key]: value };\n const step = { ...data.step, input: nextInput };\n\n return { ...n, data: { ...data, step } };\n })\n );\n };\n};\n\nexport const collectStepOutputReferences = (\n nodes: Node[],\n parameterReferences: string[]\n): Record<string, string[]> => {\n const referencesByNode: Record<string, string[]> = {};\n const sortedNodes = [...nodes].sort((a, b) => a.position.y - b.position.y);\n const accumulatedReferences: string[] = [...parameterReferences];\n const accumulatedSet = new Set<string>(parameterReferences);\n\n sortedNodes.forEach((node) => {\n referencesByNode[node.id] = [...accumulatedReferences];\n\n const data = node.data as Partial<ActionNodeData> | undefined;\n if (!data || !data.step) {\n return;\n }\n\n const { step, scaffolderActionOutputsById } = data;\n const stepId =\n step && typeof step.id === \"string\" && step.id.trim().length > 0\n ? step.id\n : null;\n const actionId =\n step && typeof step.action === \"string\" && step.action.trim().length > 0\n ? step.action\n : null;\n\n if (!stepId || !actionId) {\n return;\n }\n\n const outputKeys = new Set<string>();\n const schemaOutputs = scaffolderActionOutputsById?.[actionId];\n if (schemaOutputs && typeof schemaOutputs === \"object\") {\n Object.keys(schemaOutputs).forEach((key) => {\n if (key) {\n outputKeys.add(key);\n }\n });\n }\n\n const stepOutput = (step as { output?: Record<string, unknown> }).output;\n if (stepOutput && typeof stepOutput === \"object\") {\n Object.keys(stepOutput).forEach((key) => {\n if (key) {\n outputKeys.add(key);\n }\n });\n }\n\n outputKeys.forEach((outputKey) => {\n const reference = `\\${{ steps['${stepId}'].output.${outputKey} }}`;\n if (!accumulatedSet.has(reference)) {\n accumulatedSet.add(reference);\n accumulatedReferences.push(reference);\n }\n });\n });\n\n return referencesByNode;\n};\n\nexport const createHandleUpdateOutput = (setNodes: SetNodes) => {\n return (\n rfId: string,\n updater: (prev: OutputNodeData[\"output\"]) => OutputNodeData[\"output\"]\n ) => {\n setNodes((nodes) =>\n nodes.map((node) => {\n if (node.id !== rfId || node.type !== \"outputNode\") {\n return node;\n }\n const data = node.data as OutputNodeData;\n const nextOutput = updater(data.output ?? {});\n return {\n ...node,\n data: {\n ...data,\n output: nextOutput,\n },\n };\n })\n );\n };\n};\n\nexport const createHandleUpdateSections = (setNodes: SetNodes) => {\n return (\n rfId: string,\n updater: (prev: ParameterSectionDisplay[]) => ParameterSectionDisplay[]\n ) => {\n setNodes((nodes) =>\n nodes.map((node) => {\n if (node.id !== rfId || node.type !== \"parametersNode\") {\n return node;\n }\n const data = node.data as ParametersNodeData;\n const previousSections =\n data.sections ?? normalizeParametersToSections(data.parameters);\n const nextSections = sanitizeSections(updater(previousSections));\n const nextParameters = sectionsToParametersValue(nextSections);\n return {\n ...node,\n data: {\n ...data,\n sections: nextSections,\n parameters: nextParameters,\n },\n };\n })\n );\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { useState, useRef, useEffect } from 'react';
|
|
2
|
+
import { memo, useState, useRef, useEffect } from 'react';
|
|
3
3
|
import { NodeToolbar, Position, Handle } from '@xyflow/react';
|
|
4
4
|
import { useTheme, styled } from '@material-ui/core/styles';
|
|
5
5
|
import { Box, Typography, IconButton, TextField, Button, Divider, Chip } from '@material-ui/core';
|
|
@@ -43,7 +43,7 @@ const DEFAULT_ACTION_OPTIONS = [
|
|
|
43
43
|
"fetch:template"
|
|
44
44
|
// TODO to be fixed later to not uses default actions
|
|
45
45
|
];
|
|
46
|
-
const
|
|
46
|
+
const ActionNodeComponent = ({ data }) => {
|
|
47
47
|
const { rfId, step } = data;
|
|
48
48
|
const [newKey, setNewKey] = useState("");
|
|
49
49
|
const [newVal, setNewVal] = useState("");
|
|
@@ -595,6 +595,7 @@ const ActionNode = ({ data }) => {
|
|
|
595
595
|
/* @__PURE__ */ jsx(Handle, { type: "source", position: Position.Bottom })
|
|
596
596
|
] });
|
|
597
597
|
};
|
|
598
|
+
const ActionNode = memo(ActionNodeComponent);
|
|
598
599
|
|
|
599
600
|
export { ActionNode };
|
|
600
601
|
//# sourceMappingURL=ActionNode.esm.js.map
|