@uipath/apollo-react 3.44.2 → 3.45.0

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.
@@ -61,7 +61,7 @@ const StageNodeComponent = (props)=>{
61
61
  const isException = stageDetails?.isException;
62
62
  const isReadOnly = !!stageDetails?.isReadOnly;
63
63
  const icon = stageDetails?.icon;
64
- const selectedTasks = stageDetails?.selectedTasks;
64
+ const selectedTaskId = stageDetails?.selectedTaskId;
65
65
  const defaultContent = stageDetails?.defaultContent || 'Add first task';
66
66
  const status = execution?.stageStatus?.status;
67
67
  const statusLabel = execution?.stageStatus?.label;
@@ -89,17 +89,24 @@ const StageNodeComponent = (props)=>{
89
89
  const [isAddingTask, setIsAddingTask] = (0, external_react_namespaceObject.useState)(false);
90
90
  const [isReplacingTask, setIsReplacingTask] = (0, external_react_namespaceObject.useState)(false);
91
91
  (0, external_react_namespaceObject.useEffect)(()=>{
92
- if (pendingReplaceTask?.groupIndex != null && pendingReplaceTask?.taskIndex != null) {
93
- const taskGroup = tasks[pendingReplaceTask.groupIndex];
94
- taskStateReference.current = {
95
- isParallel: (taskGroup?.length ?? 0) > 1,
96
- groupIndex: pendingReplaceTask.groupIndex,
97
- taskIndex: pendingReplaceTask.taskIndex
98
- };
99
- setIsReplacingTask(true);
100
- } else setIsReplacingTask(false);
92
+ if (pendingReplaceTask) {
93
+ const match = tasks.flatMap((group, gi)=>group.map((task, ti)=>({
94
+ task,
95
+ groupIndex: gi,
96
+ taskIndex: ti
97
+ }))).find(({ task })=>task.id === selectedTaskId);
98
+ if (match) {
99
+ taskStateReference.current = {
100
+ isParallel: (tasks[match.groupIndex]?.length ?? 0) > 1,
101
+ groupIndex: match.groupIndex,
102
+ taskIndex: match.taskIndex
103
+ };
104
+ setIsReplacingTask(true);
105
+ }
106
+ }
101
107
  }, [
102
108
  pendingReplaceTask,
109
+ selectedTaskId,
103
110
  tasks
104
111
  ]);
105
112
  const [activeDragId, setActiveDragId] = (0, external_react_namespaceObject.useState)(null);
@@ -202,7 +209,11 @@ const StageNodeComponent = (props)=>{
202
209
  const contextMenuItems = (0, external_react_namespaceObject.useCallback)((isParallel, groupIndex, taskIndex, tasksLength, taskGroupLength, isAboveParallel, isBelowParallel)=>{
203
210
  const items = [];
204
211
  if (onReplaceTaskFromToolbox) {
205
- items.push((0, external_StageNodeTaskUtilities_cjs_namespaceObject.getMenuItem)('replace-task', 'Replace task', ()=>setIsReplacingTask(true)));
212
+ items.push((0, external_StageNodeTaskUtilities_cjs_namespaceObject.getMenuItem)('replace-task', 'Replace task', ()=>{
213
+ const taskId = tasks[groupIndex]?.[taskIndex]?.id;
214
+ if (taskId) onTaskClick?.(taskId);
215
+ setIsReplacingTask(true);
216
+ }));
206
217
  items.push((0, external_StageNodeTaskUtilities_cjs_namespaceObject.getDivider)());
207
218
  }
208
219
  if (onTaskGroupModification) {
@@ -215,8 +226,10 @@ const StageNodeComponent = (props)=>{
215
226
  return items;
216
227
  }, [
217
228
  onReplaceTaskFromToolbox,
229
+ onTaskClick,
218
230
  onTaskGroupModification,
219
- reGroupTaskFunction
231
+ reGroupTaskFunction,
232
+ tasks
220
233
  ]);
221
234
  const { setSelectedNodeId } = (0, hooks_index_cjs_namespaceObject.useNodeSelection)();
222
235
  const handleStageClick = (0, external_react_namespaceObject.useCallback)(()=>{
@@ -254,17 +267,10 @@ const StageNodeComponent = (props)=>{
254
267
  id
255
268
  ]);
256
269
  const handleReplaceTaskToolboxItemSelected = (0, external_react_namespaceObject.useCallback)((item)=>{
257
- setIsReplacingTask(true);
258
- const groupIndex = taskStateReference.current.groupIndex;
259
- const taskIndex = taskStateReference.current.taskIndex;
260
- const taskId = tasks[groupIndex]?.[taskIndex]?.id;
261
- if (taskId) onTaskClick?.(taskId);
262
270
  onReplaceTaskFromToolbox?.(item, taskStateReference.current.groupIndex, taskStateReference.current.taskIndex);
263
271
  setIsReplacingTask(false);
264
272
  }, [
265
- onReplaceTaskFromToolbox,
266
- onTaskClick,
267
- tasks
273
+ onReplaceTaskFromToolbox
268
274
  ]);
269
275
  const handleConfigurations = (0, external_react_namespaceObject.useMemo)(()=>isException ? [] : [
270
276
  {
@@ -470,17 +476,14 @@ const StageNodeComponent = (props)=>{
470
476
  })
471
477
  }),
472
478
  (onTaskAdd || onAddTaskFromToolbox) && !isReadOnly && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_material_index_cjs_namespaceObject.ApTooltip, {
473
- content: addTaskLoading ? 'Loading...' : addTaskLabel,
479
+ content: addTaskLabel,
474
480
  placement: "top",
475
481
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
476
482
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_material_index_cjs_namespaceObject.ApIconButton, {
477
483
  onClick: handleTaskAddClick,
478
484
  size: "small",
479
- disabled: addTaskLoading,
480
485
  label: addTaskLabel,
481
- children: addTaskLoading ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_material_index_cjs_namespaceObject.ApCircularProgress, {
482
- size: 20
483
- }) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_material_index_cjs_namespaceObject.ApIcon, {
486
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_material_index_cjs_namespaceObject.ApIcon, {
484
487
  name: "add",
485
488
  size: "20px"
486
489
  })
@@ -526,7 +529,7 @@ const StageNodeComponent = (props)=>{
526
529
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_DraggableTask_cjs_namespaceObject.DraggableTask, {
527
530
  task: task,
528
531
  taskExecution: taskExecution,
529
- isSelected: !!selectedTasks?.includes(task.id),
532
+ isSelected: selectedTaskId === task.id,
530
533
  isParallel: isParallel,
531
534
  contextMenuItems: contextMenuItems(isParallel, groupIndex, taskIndex, tasks.length, taskGroup.length, (tasks[groupIndex - 1]?.length ?? 0) > 1, (tasks[groupIndex + 1]?.length ?? 0) > 1),
532
535
  onTaskClick: handleTaskClick,
@@ -595,6 +598,7 @@ const StageNodeComponent = (props)=>{
595
598
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbox_index_cjs_namespaceObject.Toolbox, {
596
599
  title: addTaskLabel,
597
600
  initialItems: taskOptions,
601
+ loading: addTaskLoading,
598
602
  onClose: ()=>setIsAddingTask(false),
599
603
  onItemSelect: handleAddTaskToolboxItemSelected,
600
604
  onSearch: onTaskToolboxSearch
@@ -1 +1 @@
1
- {"version":3,"file":"StageNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.tsx"],"names":[],"mappings":"AAsDA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAkpBxD,eAAO,MAAM,SAAS,8CAxoBa,cAAc,6CAwoBA,CAAC"}
1
+ {"version":3,"file":"StageNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.tsx"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAkpBxD,eAAO,MAAM,SAAS,8CAxoBa,cAAc,6CAwoBA,CAAC"}
@@ -4,7 +4,7 @@ import { SortableContext, sortableKeyboardCoordinates, verticalListSortingStrate
4
4
  import { FontVariantToken, Padding, Spacing } from "@uipath/apollo-core";
5
5
  import { Column, Row } from "../../layouts/index.js";
6
6
  import { Position, useStore, useViewport } from "../../xyflow/react.js";
7
- import { ApCircularProgress, ApIcon, ApIconButton, ApLink, ApTooltip, ApTypography } from "../../../material/index.js";
7
+ import { ApIcon, ApIconButton, ApLink, ApTooltip, ApTypography } from "../../../material/index.js";
8
8
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
9
9
  import { createPortal } from "react-dom";
10
10
  import { useConnectedHandles } from "../BaseCanvas/ConnectedHandlesContext.js";
@@ -33,7 +33,7 @@ const StageNodeComponent = (props)=>{
33
33
  const isException = stageDetails?.isException;
34
34
  const isReadOnly = !!stageDetails?.isReadOnly;
35
35
  const icon = stageDetails?.icon;
36
- const selectedTasks = stageDetails?.selectedTasks;
36
+ const selectedTaskId = stageDetails?.selectedTaskId;
37
37
  const defaultContent = stageDetails?.defaultContent || 'Add first task';
38
38
  const status = execution?.stageStatus?.status;
39
39
  const statusLabel = execution?.stageStatus?.label;
@@ -61,17 +61,24 @@ const StageNodeComponent = (props)=>{
61
61
  const [isAddingTask, setIsAddingTask] = useState(false);
62
62
  const [isReplacingTask, setIsReplacingTask] = useState(false);
63
63
  useEffect(()=>{
64
- if (pendingReplaceTask?.groupIndex != null && pendingReplaceTask?.taskIndex != null) {
65
- const taskGroup = tasks[pendingReplaceTask.groupIndex];
66
- taskStateReference.current = {
67
- isParallel: (taskGroup?.length ?? 0) > 1,
68
- groupIndex: pendingReplaceTask.groupIndex,
69
- taskIndex: pendingReplaceTask.taskIndex
70
- };
71
- setIsReplacingTask(true);
72
- } else setIsReplacingTask(false);
64
+ if (pendingReplaceTask) {
65
+ const match = tasks.flatMap((group, gi)=>group.map((task, ti)=>({
66
+ task,
67
+ groupIndex: gi,
68
+ taskIndex: ti
69
+ }))).find(({ task })=>task.id === selectedTaskId);
70
+ if (match) {
71
+ taskStateReference.current = {
72
+ isParallel: (tasks[match.groupIndex]?.length ?? 0) > 1,
73
+ groupIndex: match.groupIndex,
74
+ taskIndex: match.taskIndex
75
+ };
76
+ setIsReplacingTask(true);
77
+ }
78
+ }
73
79
  }, [
74
80
  pendingReplaceTask,
81
+ selectedTaskId,
75
82
  tasks
76
83
  ]);
77
84
  const [activeDragId, setActiveDragId] = useState(null);
@@ -174,7 +181,11 @@ const StageNodeComponent = (props)=>{
174
181
  const contextMenuItems = useCallback((isParallel, groupIndex, taskIndex, tasksLength, taskGroupLength, isAboveParallel, isBelowParallel)=>{
175
182
  const items = [];
176
183
  if (onReplaceTaskFromToolbox) {
177
- items.push(getMenuItem('replace-task', 'Replace task', ()=>setIsReplacingTask(true)));
184
+ items.push(getMenuItem('replace-task', 'Replace task', ()=>{
185
+ const taskId = tasks[groupIndex]?.[taskIndex]?.id;
186
+ if (taskId) onTaskClick?.(taskId);
187
+ setIsReplacingTask(true);
188
+ }));
178
189
  items.push(getDivider());
179
190
  }
180
191
  if (onTaskGroupModification) {
@@ -187,8 +198,10 @@ const StageNodeComponent = (props)=>{
187
198
  return items;
188
199
  }, [
189
200
  onReplaceTaskFromToolbox,
201
+ onTaskClick,
190
202
  onTaskGroupModification,
191
- reGroupTaskFunction
203
+ reGroupTaskFunction,
204
+ tasks
192
205
  ]);
193
206
  const { setSelectedNodeId } = useNodeSelection();
194
207
  const handleStageClick = useCallback(()=>{
@@ -226,17 +239,10 @@ const StageNodeComponent = (props)=>{
226
239
  id
227
240
  ]);
228
241
  const handleReplaceTaskToolboxItemSelected = useCallback((item)=>{
229
- setIsReplacingTask(true);
230
- const groupIndex = taskStateReference.current.groupIndex;
231
- const taskIndex = taskStateReference.current.taskIndex;
232
- const taskId = tasks[groupIndex]?.[taskIndex]?.id;
233
- if (taskId) onTaskClick?.(taskId);
234
242
  onReplaceTaskFromToolbox?.(item, taskStateReference.current.groupIndex, taskStateReference.current.taskIndex);
235
243
  setIsReplacingTask(false);
236
244
  }, [
237
- onReplaceTaskFromToolbox,
238
- onTaskClick,
239
- tasks
245
+ onReplaceTaskFromToolbox
240
246
  ]);
241
247
  const handleConfigurations = useMemo(()=>isException ? [] : [
242
248
  {
@@ -442,17 +448,14 @@ const StageNodeComponent = (props)=>{
442
448
  })
443
449
  }),
444
450
  (onTaskAdd || onAddTaskFromToolbox) && !isReadOnly && /*#__PURE__*/ jsx(ApTooltip, {
445
- content: addTaskLoading ? 'Loading...' : addTaskLabel,
451
+ content: addTaskLabel,
446
452
  placement: "top",
447
453
  children: /*#__PURE__*/ jsx("span", {
448
454
  children: /*#__PURE__*/ jsx(ApIconButton, {
449
455
  onClick: handleTaskAddClick,
450
456
  size: "small",
451
- disabled: addTaskLoading,
452
457
  label: addTaskLabel,
453
- children: addTaskLoading ? /*#__PURE__*/ jsx(ApCircularProgress, {
454
- size: 20
455
- }) : /*#__PURE__*/ jsx(ApIcon, {
458
+ children: /*#__PURE__*/ jsx(ApIcon, {
456
459
  name: "add",
457
460
  size: "20px"
458
461
  })
@@ -498,7 +501,7 @@ const StageNodeComponent = (props)=>{
498
501
  return /*#__PURE__*/ jsx(DraggableTask, {
499
502
  task: task,
500
503
  taskExecution: taskExecution,
501
- isSelected: !!selectedTasks?.includes(task.id),
504
+ isSelected: selectedTaskId === task.id,
502
505
  isParallel: isParallel,
503
506
  contextMenuItems: contextMenuItems(isParallel, groupIndex, taskIndex, tasks.length, taskGroup.length, (tasks[groupIndex - 1]?.length ?? 0) > 1, (tasks[groupIndex + 1]?.length ?? 0) > 1),
504
507
  onTaskClick: handleTaskClick,
@@ -567,6 +570,7 @@ const StageNodeComponent = (props)=>{
567
570
  children: /*#__PURE__*/ jsx(Toolbox, {
568
571
  title: addTaskLabel,
569
572
  initialItems: taskOptions,
573
+ loading: addTaskLoading,
570
574
  onClose: ()=>setIsAddingTask(false),
571
575
  onItemSelect: handleAddTaskToolboxItemSelected,
572
576
  onSearch: onTaskToolboxSearch
@@ -1339,6 +1339,13 @@ const initialTasksForAddReplace = [
1339
1339
  label: 'Document Review',
1340
1340
  icon: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(DocumentIcon, {})
1341
1341
  }
1342
+ ],
1343
+ [
1344
+ {
1345
+ id: 'task-3',
1346
+ label: 'Process Validation',
1347
+ icon: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(ProcessIcon, {})
1348
+ }
1342
1349
  ]
1343
1350
  ];
1344
1351
  const availableTaskOptions = [
@@ -1408,7 +1415,7 @@ const AddAndReplaceTasksStory = ()=>{
1408
1415
  const edgeTypes = (0, external_react_namespaceObject.useMemo)(()=>({
1409
1416
  stage: external_StageEdge_cjs_namespaceObject.StageEdge
1410
1417
  }), []);
1411
- const [pendingReplaceTask, setPendingReplaceTask] = (0, external_react_namespaceObject.useState)();
1418
+ const [pendingReplaceTask, setPendingReplaceTask] = (0, external_react_namespaceObject.useState)(false);
1412
1419
  const [selectedTaskId, setSelectedTaskId] = (0, external_react_namespaceObject.useState)();
1413
1420
  const [menuAnchorEl, setMenuAnchorEl] = (0, external_react_namespaceObject.useState)(null);
1414
1421
  const [nodesState, setNodes, onNodesChange] = (0, react_cjs_namespaceObject.useNodesState)([
@@ -1482,7 +1489,8 @@ const AddAndReplaceTasksStory = ()=>{
1482
1489
  }
1483
1490
  };
1484
1491
  }));
1485
- setPendingReplaceTask(void 0);
1492
+ setPendingReplaceTask(false);
1493
+ setSelectedTaskId(void 0);
1486
1494
  }, [
1487
1495
  setNodes
1488
1496
  ]);
@@ -1511,17 +1519,28 @@ const AddAndReplaceTasksStory = ()=>{
1511
1519
  const handleTaskClick = (0, external_react_namespaceObject.useCallback)((taskId)=>{
1512
1520
  setSelectedTaskId(taskId);
1513
1521
  }, []);
1522
+ const handlePaneClick = (0, external_react_namespaceObject.useCallback)(()=>{
1523
+ setSelectedTaskId(void 0);
1524
+ setPendingReplaceTask(false);
1525
+ }, []);
1526
+ const handleNodesChange = (0, external_react_namespaceObject.useCallback)((...args)=>{
1527
+ onNodesChange(...args);
1528
+ const deselected = args[0].some((c)=>'select' === c.type && 'add-replace-stage' === c.id && !c.selected);
1529
+ if (deselected) {
1530
+ setPendingReplaceTask(false);
1531
+ setSelectedTaskId(void 0);
1532
+ }
1533
+ }, [
1534
+ onNodesChange
1535
+ ]);
1514
1536
  const currentTasks = nodesState.find((n)=>'add-replace-stage' === n.id)?.data.stageDetails.tasks || [];
1515
- const taskMenuItems = (0, external_react_namespaceObject.useMemo)(()=>currentTasks.flatMap((group, groupIndex)=>group.map((task, taskIndex)=>({
1537
+ const taskMenuItems = (0, external_react_namespaceObject.useMemo)(()=>currentTasks.flatMap((group)=>group.map((task)=>({
1516
1538
  title: task.label,
1517
1539
  variant: 'item',
1518
1540
  startIcon: task.icon,
1519
1541
  onClick: ()=>{
1520
1542
  setSelectedTaskId(task.id);
1521
- setPendingReplaceTask({
1522
- groupIndex,
1523
- taskIndex
1524
- });
1543
+ setPendingReplaceTask(true);
1525
1544
  setMenuAnchorEl(null);
1526
1545
  }
1527
1546
  }))), [
@@ -1531,12 +1550,12 @@ const AddAndReplaceTasksStory = ()=>{
1531
1550
  ...node,
1532
1551
  data: {
1533
1552
  ...node.data,
1534
- pendingReplaceTask: pendingReplaceTask,
1553
+ ...selectedTaskId && {
1554
+ pendingReplaceTask
1555
+ },
1535
1556
  stageDetails: {
1536
1557
  ...node.data.stageDetails,
1537
- selectedTasks: selectedTaskId ? [
1538
- selectedTaskId
1539
- ] : void 0
1558
+ selectedTaskId
1540
1559
  },
1541
1560
  onAddTaskFromToolbox: handleAddTask,
1542
1561
  onReplaceTaskFromToolbox: handleReplaceTask,
@@ -1556,13 +1575,14 @@ const AddAndReplaceTasksStory = ()=>{
1556
1575
  setEdges
1557
1576
  ]);
1558
1577
  const replaceButtonLabel = (0, external_react_namespaceObject.useMemo)(()=>{
1559
- if (pendingReplaceTask) {
1560
- const taskBeingReplaced = currentTasks[pendingReplaceTask.groupIndex]?.[pendingReplaceTask.taskIndex];
1578
+ if (pendingReplaceTask && selectedTaskId) {
1579
+ const taskBeingReplaced = currentTasks.flat().find((t)=>t.id === selectedTaskId);
1561
1580
  if (taskBeingReplaced) return `Replacing Task: ${taskBeingReplaced.label}`;
1562
1581
  }
1563
1582
  return 'Replace Task';
1564
1583
  }, [
1565
1584
  pendingReplaceTask,
1585
+ selectedTaskId,
1566
1586
  currentTasks
1567
1587
  ]);
1568
1588
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
@@ -1574,9 +1594,10 @@ const AddAndReplaceTasksStory = ()=>{
1574
1594
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_BaseCanvas_index_cjs_namespaceObject.BaseCanvas, {
1575
1595
  nodes: nodesWithMetadata,
1576
1596
  edges: edges,
1577
- onNodesChange: onNodesChange,
1597
+ onNodesChange: handleNodesChange,
1578
1598
  onEdgesChange: onEdgesChange,
1579
1599
  onConnect: onConnect,
1600
+ onPaneClick: handlePaneClick,
1580
1601
  nodeTypes: nodeTypes,
1581
1602
  edgeTypes: edgeTypes,
1582
1603
  mode: "design",
@@ -1630,6 +1651,59 @@ const AddAndReplaceTasks = {
1630
1651
  render: ()=>/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(AddAndReplaceTasksStory, {}),
1631
1652
  args: {}
1632
1653
  };
1654
+ const fetchChildren = (id)=>new Promise((resolve)=>{
1655
+ setTimeout(()=>{
1656
+ resolve([
1657
+ {
1658
+ id: `${id}-sub-1`,
1659
+ name: `${id} - Subtask A`,
1660
+ data: {
1661
+ type: `${id}-a`
1662
+ }
1663
+ },
1664
+ {
1665
+ id: `${id}-sub-2`,
1666
+ name: `${id} - Subtask B`,
1667
+ data: {
1668
+ type: `${id}-b`
1669
+ }
1670
+ },
1671
+ {
1672
+ id: `${id}-sub-3`,
1673
+ name: `${id} - Subtask C`,
1674
+ data: {
1675
+ type: `${id}-c`
1676
+ }
1677
+ }
1678
+ ]);
1679
+ }, 2000);
1680
+ });
1681
+ const loadedTaskOptionsWithChildren = [
1682
+ {
1683
+ id: 'email',
1684
+ name: 'Email',
1685
+ data: {
1686
+ type: 'email'
1687
+ },
1688
+ children: (id)=>fetchChildren(id)
1689
+ },
1690
+ {
1691
+ id: 'approval',
1692
+ name: 'Approval',
1693
+ data: {
1694
+ type: 'approval'
1695
+ },
1696
+ children: (id)=>fetchChildren(id)
1697
+ },
1698
+ {
1699
+ id: "script",
1700
+ name: 'Script',
1701
+ data: {
1702
+ type: "script"
1703
+ },
1704
+ children: (id)=>fetchChildren(id)
1705
+ }
1706
+ ];
1633
1707
  const AddTaskLoadingStory = ()=>{
1634
1708
  const StageNodeWrapper = (0, external_react_namespaceObject.useMemo)(()=>function(props) {
1635
1709
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_StageNode_cjs_namespaceObject.StageNode, {
@@ -1656,14 +1730,15 @@ const AddTaskLoadingStory = ()=>{
1656
1730
  width: 304,
1657
1731
  data: {
1658
1732
  stageDetails: {
1659
- label: 'Empty Stage (click +)',
1733
+ label: 'Top-level loading (click +)',
1660
1734
  tasks: []
1661
1735
  },
1662
- addTaskLoading: false
1736
+ addTaskLoading: true,
1737
+ taskOptions: []
1663
1738
  }
1664
1739
  },
1665
1740
  {
1666
- id: 'loading-stage-with-tasks',
1741
+ id: 'loading-stage-children',
1667
1742
  type: 'stage',
1668
1743
  position: {
1669
1744
  x: 400,
@@ -1672,7 +1747,7 @@ const AddTaskLoadingStory = ()=>{
1672
1747
  width: 304,
1673
1748
  data: {
1674
1749
  stageDetails: {
1675
- label: 'With Tasks (click +)',
1750
+ label: 'Async children (click +)',
1676
1751
  tasks: [
1677
1752
  [
1678
1753
  {
@@ -1680,50 +1755,41 @@ const AddTaskLoadingStory = ()=>{
1680
1755
  label: 'Existing Task',
1681
1756
  icon: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(VerificationIcon, {})
1682
1757
  }
1683
- ],
1684
- [
1685
- {
1686
- id: 'task-2',
1687
- label: 'Another Task',
1688
- icon: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(DocumentIcon, {})
1689
- }
1690
1758
  ]
1691
1759
  ]
1692
1760
  },
1693
- addTaskLoading: false
1761
+ addTaskLoading: false,
1762
+ taskOptions: loadedTaskOptionsWithChildren
1694
1763
  }
1695
1764
  }
1696
1765
  ], []);
1697
1766
  const [nodesState, setNodes, onNodesChange] = (0, react_cjs_namespaceObject.useNodesState)(initialNodes);
1698
1767
  const [edges, setEdges, onEdgesChange] = (0, react_cjs_namespaceObject.useEdgesState)([]);
1699
- const setNodeLoading = (0, external_react_namespaceObject.useCallback)((nodeId, loading)=>{
1700
- setNodes((nds)=>nds.map((node)=>node.id === nodeId ? {
1701
- ...node,
1702
- data: {
1703
- ...node.data,
1704
- addTaskLoading: loading
1705
- }
1706
- } : node));
1707
- }, [
1708
- setNodes
1709
- ]);
1710
- const handleTaskAddForNode = (0, external_react_namespaceObject.useCallback)((nodeId)=>{
1711
- setNodeLoading(nodeId, true);
1712
- setTimeout(()=>{
1713
- setNodeLoading(nodeId, false);
1768
+ (0, external_react_namespaceObject.useEffect)(()=>{
1769
+ const timeout = setTimeout(()=>{
1770
+ setNodes((nds)=>nds.map((node)=>'loading-stage-empty' === node.id ? {
1771
+ ...node,
1772
+ data: {
1773
+ ...node.data,
1774
+ addTaskLoading: false,
1775
+ taskOptions: loadedTaskOptionsWithChildren
1776
+ }
1777
+ } : node));
1714
1778
  }, 3000);
1779
+ return ()=>clearTimeout(timeout);
1715
1780
  }, [
1716
- setNodeLoading
1781
+ setNodes
1717
1782
  ]);
1718
1783
  const nodesWithHandler = (0, external_react_namespaceObject.useMemo)(()=>nodesState.map((node)=>({
1719
1784
  ...node,
1720
1785
  data: {
1721
1786
  ...node.data,
1722
- onTaskAdd: ()=>handleTaskAddForNode(node.id)
1787
+ onAddTaskFromToolbox: (taskItem)=>{
1788
+ window.alert(`Added task "${taskItem.name}" to ${node.id}`);
1789
+ }
1723
1790
  }
1724
1791
  })), [
1725
- nodesState,
1726
- handleTaskAddForNode
1792
+ nodesState
1727
1793
  ]);
1728
1794
  const onConnect = (0, external_react_namespaceObject.useCallback)((connection)=>setEdges((eds)=>(0, react_cjs_namespaceObject.addEdge)(connection, eds)), [
1729
1795
  setEdges
@@ -1 +1 @@
1
- {"version":3,"file":"StageNode.stories.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAyBvD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CA0FD,CAAC;AAEjC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA4CnC,eAAO,MAAM,OAAO,EAAE,KA2DrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAsE3B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KA8M7B,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KA+HvC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KAoKpC,CAAC;AA8GF,eAAO,MAAM,uBAAuB,EAAE,KAOrC,CAAC;AA6TF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAuHF,eAAO,MAAM,cAAc,EAAE,KAO5B,CAAC"}
1
+ {"version":3,"file":"StageNode.stories.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAyBvD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CA0FD,CAAC;AAEjC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA4CnC,eAAO,MAAM,OAAO,EAAE,KA2DrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAsE3B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KA8M7B,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KA+HvC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KAoKpC,CAAC;AA8GF,eAAO,MAAM,uBAAuB,EAAE,KAOrC,CAAC;AAkVF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAmJF,eAAO,MAAM,cAAc,EAAE,KAO5B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { ConnectionMode, Panel, ReactFlowProvider, addEdge, useEdgesState, useNodesState } from "../../xyflow/react.js";
3
3
  import { ApButton, ApMenu } from "../../../material/components/index.js";
4
- import { useCallback, useMemo, useState } from "react";
4
+ import { useCallback, useEffect, useMemo, useState } from "react";
5
5
  import { DefaultCanvasTranslations } from "../../types.js";
6
6
  import { createGroupModificationHandlers, getHandlerForModificationType } from "../../utils/GroupModificationUtils.js";
7
7
  import { BaseCanvas } from "../BaseCanvas/index.js";
@@ -1303,6 +1303,13 @@ const initialTasksForAddReplace = [
1303
1303
  label: 'Document Review',
1304
1304
  icon: /*#__PURE__*/ jsx(DocumentIcon, {})
1305
1305
  }
1306
+ ],
1307
+ [
1308
+ {
1309
+ id: 'task-3',
1310
+ label: 'Process Validation',
1311
+ icon: /*#__PURE__*/ jsx(ProcessIcon, {})
1312
+ }
1306
1313
  ]
1307
1314
  ];
1308
1315
  const availableTaskOptions = [
@@ -1372,7 +1379,7 @@ const AddAndReplaceTasksStory = ()=>{
1372
1379
  const edgeTypes = useMemo(()=>({
1373
1380
  stage: StageEdge
1374
1381
  }), []);
1375
- const [pendingReplaceTask, setPendingReplaceTask] = useState();
1382
+ const [pendingReplaceTask, setPendingReplaceTask] = useState(false);
1376
1383
  const [selectedTaskId, setSelectedTaskId] = useState();
1377
1384
  const [menuAnchorEl, setMenuAnchorEl] = useState(null);
1378
1385
  const [nodesState, setNodes, onNodesChange] = useNodesState([
@@ -1446,7 +1453,8 @@ const AddAndReplaceTasksStory = ()=>{
1446
1453
  }
1447
1454
  };
1448
1455
  }));
1449
- setPendingReplaceTask(void 0);
1456
+ setPendingReplaceTask(false);
1457
+ setSelectedTaskId(void 0);
1450
1458
  }, [
1451
1459
  setNodes
1452
1460
  ]);
@@ -1475,17 +1483,28 @@ const AddAndReplaceTasksStory = ()=>{
1475
1483
  const handleTaskClick = useCallback((taskId)=>{
1476
1484
  setSelectedTaskId(taskId);
1477
1485
  }, []);
1486
+ const handlePaneClick = useCallback(()=>{
1487
+ setSelectedTaskId(void 0);
1488
+ setPendingReplaceTask(false);
1489
+ }, []);
1490
+ const handleNodesChange = useCallback((...args)=>{
1491
+ onNodesChange(...args);
1492
+ const deselected = args[0].some((c)=>'select' === c.type && 'add-replace-stage' === c.id && !c.selected);
1493
+ if (deselected) {
1494
+ setPendingReplaceTask(false);
1495
+ setSelectedTaskId(void 0);
1496
+ }
1497
+ }, [
1498
+ onNodesChange
1499
+ ]);
1478
1500
  const currentTasks = nodesState.find((n)=>'add-replace-stage' === n.id)?.data.stageDetails.tasks || [];
1479
- const taskMenuItems = useMemo(()=>currentTasks.flatMap((group, groupIndex)=>group.map((task, taskIndex)=>({
1501
+ const taskMenuItems = useMemo(()=>currentTasks.flatMap((group)=>group.map((task)=>({
1480
1502
  title: task.label,
1481
1503
  variant: 'item',
1482
1504
  startIcon: task.icon,
1483
1505
  onClick: ()=>{
1484
1506
  setSelectedTaskId(task.id);
1485
- setPendingReplaceTask({
1486
- groupIndex,
1487
- taskIndex
1488
- });
1507
+ setPendingReplaceTask(true);
1489
1508
  setMenuAnchorEl(null);
1490
1509
  }
1491
1510
  }))), [
@@ -1495,12 +1514,12 @@ const AddAndReplaceTasksStory = ()=>{
1495
1514
  ...node,
1496
1515
  data: {
1497
1516
  ...node.data,
1498
- pendingReplaceTask: pendingReplaceTask,
1517
+ ...selectedTaskId && {
1518
+ pendingReplaceTask
1519
+ },
1499
1520
  stageDetails: {
1500
1521
  ...node.data.stageDetails,
1501
- selectedTasks: selectedTaskId ? [
1502
- selectedTaskId
1503
- ] : void 0
1522
+ selectedTaskId
1504
1523
  },
1505
1524
  onAddTaskFromToolbox: handleAddTask,
1506
1525
  onReplaceTaskFromToolbox: handleReplaceTask,
@@ -1520,13 +1539,14 @@ const AddAndReplaceTasksStory = ()=>{
1520
1539
  setEdges
1521
1540
  ]);
1522
1541
  const replaceButtonLabel = useMemo(()=>{
1523
- if (pendingReplaceTask) {
1524
- const taskBeingReplaced = currentTasks[pendingReplaceTask.groupIndex]?.[pendingReplaceTask.taskIndex];
1542
+ if (pendingReplaceTask && selectedTaskId) {
1543
+ const taskBeingReplaced = currentTasks.flat().find((t)=>t.id === selectedTaskId);
1525
1544
  if (taskBeingReplaced) return `Replacing Task: ${taskBeingReplaced.label}`;
1526
1545
  }
1527
1546
  return 'Replace Task';
1528
1547
  }, [
1529
1548
  pendingReplaceTask,
1549
+ selectedTaskId,
1530
1550
  currentTasks
1531
1551
  ]);
1532
1552
  return /*#__PURE__*/ jsx("div", {
@@ -1538,9 +1558,10 @@ const AddAndReplaceTasksStory = ()=>{
1538
1558
  children: /*#__PURE__*/ jsxs(BaseCanvas, {
1539
1559
  nodes: nodesWithMetadata,
1540
1560
  edges: edges,
1541
- onNodesChange: onNodesChange,
1561
+ onNodesChange: handleNodesChange,
1542
1562
  onEdgesChange: onEdgesChange,
1543
1563
  onConnect: onConnect,
1564
+ onPaneClick: handlePaneClick,
1544
1565
  nodeTypes: nodeTypes,
1545
1566
  edgeTypes: edgeTypes,
1546
1567
  mode: "design",
@@ -1594,6 +1615,59 @@ const AddAndReplaceTasks = {
1594
1615
  render: ()=>/*#__PURE__*/ jsx(AddAndReplaceTasksStory, {}),
1595
1616
  args: {}
1596
1617
  };
1618
+ const fetchChildren = (id)=>new Promise((resolve)=>{
1619
+ setTimeout(()=>{
1620
+ resolve([
1621
+ {
1622
+ id: `${id}-sub-1`,
1623
+ name: `${id} - Subtask A`,
1624
+ data: {
1625
+ type: `${id}-a`
1626
+ }
1627
+ },
1628
+ {
1629
+ id: `${id}-sub-2`,
1630
+ name: `${id} - Subtask B`,
1631
+ data: {
1632
+ type: `${id}-b`
1633
+ }
1634
+ },
1635
+ {
1636
+ id: `${id}-sub-3`,
1637
+ name: `${id} - Subtask C`,
1638
+ data: {
1639
+ type: `${id}-c`
1640
+ }
1641
+ }
1642
+ ]);
1643
+ }, 2000);
1644
+ });
1645
+ const loadedTaskOptionsWithChildren = [
1646
+ {
1647
+ id: 'email',
1648
+ name: 'Email',
1649
+ data: {
1650
+ type: 'email'
1651
+ },
1652
+ children: (id)=>fetchChildren(id)
1653
+ },
1654
+ {
1655
+ id: 'approval',
1656
+ name: 'Approval',
1657
+ data: {
1658
+ type: 'approval'
1659
+ },
1660
+ children: (id)=>fetchChildren(id)
1661
+ },
1662
+ {
1663
+ id: "script",
1664
+ name: 'Script',
1665
+ data: {
1666
+ type: "script"
1667
+ },
1668
+ children: (id)=>fetchChildren(id)
1669
+ }
1670
+ ];
1597
1671
  const AddTaskLoadingStory = ()=>{
1598
1672
  const StageNodeWrapper = useMemo(()=>function(props) {
1599
1673
  return /*#__PURE__*/ jsx(StageNode, {
@@ -1620,14 +1694,15 @@ const AddTaskLoadingStory = ()=>{
1620
1694
  width: 304,
1621
1695
  data: {
1622
1696
  stageDetails: {
1623
- label: 'Empty Stage (click +)',
1697
+ label: 'Top-level loading (click +)',
1624
1698
  tasks: []
1625
1699
  },
1626
- addTaskLoading: false
1700
+ addTaskLoading: true,
1701
+ taskOptions: []
1627
1702
  }
1628
1703
  },
1629
1704
  {
1630
- id: 'loading-stage-with-tasks',
1705
+ id: 'loading-stage-children',
1631
1706
  type: 'stage',
1632
1707
  position: {
1633
1708
  x: 400,
@@ -1636,7 +1711,7 @@ const AddTaskLoadingStory = ()=>{
1636
1711
  width: 304,
1637
1712
  data: {
1638
1713
  stageDetails: {
1639
- label: 'With Tasks (click +)',
1714
+ label: 'Async children (click +)',
1640
1715
  tasks: [
1641
1716
  [
1642
1717
  {
@@ -1644,50 +1719,41 @@ const AddTaskLoadingStory = ()=>{
1644
1719
  label: 'Existing Task',
1645
1720
  icon: /*#__PURE__*/ jsx(VerificationIcon, {})
1646
1721
  }
1647
- ],
1648
- [
1649
- {
1650
- id: 'task-2',
1651
- label: 'Another Task',
1652
- icon: /*#__PURE__*/ jsx(DocumentIcon, {})
1653
- }
1654
1722
  ]
1655
1723
  ]
1656
1724
  },
1657
- addTaskLoading: false
1725
+ addTaskLoading: false,
1726
+ taskOptions: loadedTaskOptionsWithChildren
1658
1727
  }
1659
1728
  }
1660
1729
  ], []);
1661
1730
  const [nodesState, setNodes, onNodesChange] = useNodesState(initialNodes);
1662
1731
  const [edges, setEdges, onEdgesChange] = useEdgesState([]);
1663
- const setNodeLoading = useCallback((nodeId, loading)=>{
1664
- setNodes((nds)=>nds.map((node)=>node.id === nodeId ? {
1665
- ...node,
1666
- data: {
1667
- ...node.data,
1668
- addTaskLoading: loading
1669
- }
1670
- } : node));
1671
- }, [
1672
- setNodes
1673
- ]);
1674
- const handleTaskAddForNode = useCallback((nodeId)=>{
1675
- setNodeLoading(nodeId, true);
1676
- setTimeout(()=>{
1677
- setNodeLoading(nodeId, false);
1732
+ useEffect(()=>{
1733
+ const timeout = setTimeout(()=>{
1734
+ setNodes((nds)=>nds.map((node)=>'loading-stage-empty' === node.id ? {
1735
+ ...node,
1736
+ data: {
1737
+ ...node.data,
1738
+ addTaskLoading: false,
1739
+ taskOptions: loadedTaskOptionsWithChildren
1740
+ }
1741
+ } : node));
1678
1742
  }, 3000);
1743
+ return ()=>clearTimeout(timeout);
1679
1744
  }, [
1680
- setNodeLoading
1745
+ setNodes
1681
1746
  ]);
1682
1747
  const nodesWithHandler = useMemo(()=>nodesState.map((node)=>({
1683
1748
  ...node,
1684
1749
  data: {
1685
1750
  ...node.data,
1686
- onTaskAdd: ()=>handleTaskAddForNode(node.id)
1751
+ onAddTaskFromToolbox: (taskItem)=>{
1752
+ window.alert(`Added task "${taskItem.name}" to ${node.id}`);
1753
+ }
1687
1754
  }
1688
1755
  })), [
1689
- nodesState,
1690
- handleTaskAddForNode
1756
+ nodesState
1691
1757
  ]);
1692
1758
  const onConnect = useCallback((connection)=>setEdges((eds)=>addEdge(connection, eds)), [
1693
1759
  setEdges
@@ -23,10 +23,7 @@ export interface StageNodeProps extends NodeProps {
23
23
  dragging: boolean;
24
24
  selected: boolean;
25
25
  id: string;
26
- pendingReplaceTask?: {
27
- groupIndex: number;
28
- taskIndex: number;
29
- };
26
+ pendingReplaceTask?: boolean;
30
27
  stageDetails: {
31
28
  label: string;
32
29
  defaultContent?: string;
@@ -38,7 +35,7 @@ export interface StageNodeProps extends NodeProps {
38
35
  isException?: boolean;
39
36
  isReadOnly?: boolean;
40
37
  tasks: StageTaskItem[][];
41
- selectedTasks?: string[];
38
+ selectedTaskId?: string;
42
39
  };
43
40
  addTaskLabel?: string;
44
41
  addTaskLoading?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"StageNode.types.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEjE,aAAK,mBAAmB;IACtB,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,aAAa,kBAAkB;IAC/B,MAAM,WAAW;IACjB,UAAU,eAAe;IACzB,WAAW,gBAAgB;IAC3B,MAAM,WAAW;IACjB,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,GAAG,mBAAmB,EAAE,CAAC;AACnD,MAAM,MAAM,eAAe,GAAG,GAAG,mBAAmB,EAAE,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;CAC3B;AAED,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB,CAAC,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;QAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE;QACV,WAAW,EAAE;YACX,MAAM,CAAC,EAAE,WAAW,CAAC;YACrB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;KAChD,CAAC;IACF,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpD,mBAAmB,CAAC,EAAE,oBAAoB,CAAC;IAC3C,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,uBAAuB,CAAC,EAAE,CACxB,qBAAqB,EAAE,qBAAqB,EAC5C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,KACd,IAAI,CAAC;IACV,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,aAAa,CAAC,EAAE,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE,KAAK,IAAI,CAAC;IAC5D,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/F;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"StageNode.types.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.types.ts"],"names":[],"mappings":"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"}
@@ -71,6 +71,7 @@ function Toolbox({ onClose, onBack, onItemSelect, onSearch, onItemHover, title,
71
71
  const [isTransitioning, setIsTransitioning] = (0, external_react_namespaceObject.useState)(false);
72
72
  const [animationDirection, setAnimationDirection] = (0, external_react_namespaceObject.useState)('forward');
73
73
  const navigationStack = (0, index_cjs_namespaceObject.useNavigationStack)();
74
+ const containerRef = (0, external_react_namespaceObject.useRef)(null);
74
75
  const transitionTimeoutRef = (0, external_react_namespaceObject.useRef)(void 0);
75
76
  const searchIdRef = (0, external_react_namespaceObject.useRef)(0);
76
77
  const initialItemsRef = (0, external_react_namespaceObject.useRef)(initialItems);
@@ -214,8 +215,15 @@ function Toolbox({ onClose, onBack, onItemSelect, onSearch, onItemHover, title,
214
215
  } else if (navigationStack.canGoBack) handleBackTransition();
215
216
  else onClose();
216
217
  };
218
+ const handleClickOutside = (e)=>{
219
+ if (containerRef.current && !containerRef.current.contains(e.target)) onClose();
220
+ };
217
221
  document.addEventListener('keydown', handleKeyDown);
218
- return ()=>document.removeEventListener('keydown', handleKeyDown);
222
+ document.addEventListener('mousedown', handleClickOutside);
223
+ return ()=>{
224
+ document.removeEventListener('keydown', handleKeyDown);
225
+ document.removeEventListener('mousedown', handleClickOutside);
226
+ };
219
227
  }, [
220
228
  isSearching,
221
229
  navigationStack.canGoBack,
@@ -224,39 +232,42 @@ function Toolbox({ onClose, onBack, onItemSelect, onSearch, onItemHover, title,
224
232
  startTransition,
225
233
  handleBackTransition
226
234
  ]);
227
- return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_layouts_index_cjs_namespaceObject.Column, {
228
- px: 20,
229
- py: 12,
230
- gap: 12,
231
- w: 320,
232
- h: 440,
233
- children: [
234
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Header_cjs_namespaceObject.Header, {
235
- title: currentParentItem?.name || title,
236
- onBack: handleBackTransition,
237
- showBackButton: navigationStack.canGoBack
238
- }),
239
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_SearchBox_cjs_namespaceObject.SearchBox, {
240
- value: search,
241
- onChange: handleSearch,
242
- clear: clearSearch,
243
- placeholder: "Search"
244
- }),
245
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbox_styles_cjs_namespaceObject.AnimatedContainer, {
246
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbox_styles_cjs_namespaceObject.AnimatedContent, {
247
- entering: isTransitioning,
248
- direction: animationDirection,
249
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_ListView_cjs_namespaceObject.ListView, {
250
- isLoading: childrenLoading || searchLoading || loading,
251
- items: isSearching && !isSearchingInitialItems ? searchedItems : items,
252
- emptyStateMessage: isSearching ? 'No matching nodes found' : 'No nodes found',
253
- enableSections: !isSearching,
254
- onItemClick: handleItemSelect,
255
- onItemHover: onItemHover
235
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
236
+ ref: containerRef,
237
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_layouts_index_cjs_namespaceObject.Column, {
238
+ px: 20,
239
+ py: 12,
240
+ gap: 12,
241
+ w: 320,
242
+ h: 440,
243
+ children: [
244
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Header_cjs_namespaceObject.Header, {
245
+ title: currentParentItem?.name || title,
246
+ onBack: handleBackTransition,
247
+ showBackButton: navigationStack.canGoBack
248
+ }),
249
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_SearchBox_cjs_namespaceObject.SearchBox, {
250
+ value: search,
251
+ onChange: handleSearch,
252
+ clear: clearSearch,
253
+ placeholder: "Search"
254
+ }),
255
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbox_styles_cjs_namespaceObject.AnimatedContainer, {
256
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbox_styles_cjs_namespaceObject.AnimatedContent, {
257
+ entering: isTransitioning,
258
+ direction: animationDirection,
259
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_ListView_cjs_namespaceObject.ListView, {
260
+ isLoading: childrenLoading || searchLoading || loading,
261
+ items: isSearching && !isSearchingInitialItems ? searchedItems : items,
262
+ emptyStateMessage: isSearching ? 'No matching nodes found' : 'No nodes found',
263
+ enableSections: !isSearching,
264
+ onItemClick: handleItemSelect,
265
+ onItemHover: onItemHover
266
+ })
256
267
  })
257
268
  })
258
- })
259
- ]
269
+ ]
270
+ })
260
271
  });
261
272
  }
262
273
  exports.Toolbox = __webpack_exports__.Toolbox;
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbox.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/Toolbox/Toolbox.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,QAAQ,EAAY,MAAM,YAAY,CAAC;AAuCrD,MAAM,MAAM,oBAAoB,CAAC,CAAC,GAAG,GAAG,IAAI,CAC1C,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,OAAO,EACzB,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,KAC5E,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE5B,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1D,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;CACpC;AAoBD,wBAAgB,OAAO,CAAC,CAAC,EAAE,EACzB,OAAO,EACP,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,KAAK,EACL,YAAY,EACZ,OAAO,GACR,EAAE,YAAY,CAAC,CAAC,CAAC,2CAuPjB"}
1
+ {"version":3,"file":"Toolbox.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/Toolbox/Toolbox.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,QAAQ,EAAY,MAAM,YAAY,CAAC;AAuCrD,MAAM,MAAM,oBAAoB,CAAC,CAAC,GAAG,GAAG,IAAI,CAC1C,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,OAAO,EACzB,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE;IAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,KAC5E,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE5B,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1D,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;CACpC;AAoBD,wBAAgB,OAAO,CAAC,CAAC,EAAE,EACzB,OAAO,EACP,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,KAAK,EACL,YAAY,EACZ,OAAO,GACR,EAAE,YAAY,CAAC,CAAC,CAAC,2CAoQjB"}
@@ -43,6 +43,7 @@ function Toolbox({ onClose, onBack, onItemSelect, onSearch, onItemHover, title,
43
43
  const [isTransitioning, setIsTransitioning] = useState(false);
44
44
  const [animationDirection, setAnimationDirection] = useState('forward');
45
45
  const navigationStack = useNavigationStack();
46
+ const containerRef = useRef(null);
46
47
  const transitionTimeoutRef = useRef(void 0);
47
48
  const searchIdRef = useRef(0);
48
49
  const initialItemsRef = useRef(initialItems);
@@ -186,8 +187,15 @@ function Toolbox({ onClose, onBack, onItemSelect, onSearch, onItemHover, title,
186
187
  } else if (navigationStack.canGoBack) handleBackTransition();
187
188
  else onClose();
188
189
  };
190
+ const handleClickOutside = (e)=>{
191
+ if (containerRef.current && !containerRef.current.contains(e.target)) onClose();
192
+ };
189
193
  document.addEventListener('keydown', handleKeyDown);
190
- return ()=>document.removeEventListener('keydown', handleKeyDown);
194
+ document.addEventListener('mousedown', handleClickOutside);
195
+ return ()=>{
196
+ document.removeEventListener('keydown', handleKeyDown);
197
+ document.removeEventListener('mousedown', handleClickOutside);
198
+ };
191
199
  }, [
192
200
  isSearching,
193
201
  navigationStack.canGoBack,
@@ -196,39 +204,42 @@ function Toolbox({ onClose, onBack, onItemSelect, onSearch, onItemHover, title,
196
204
  startTransition,
197
205
  handleBackTransition
198
206
  ]);
199
- return /*#__PURE__*/ jsxs(Column, {
200
- px: 20,
201
- py: 12,
202
- gap: 12,
203
- w: 320,
204
- h: 440,
205
- children: [
206
- /*#__PURE__*/ jsx(Header, {
207
- title: currentParentItem?.name || title,
208
- onBack: handleBackTransition,
209
- showBackButton: navigationStack.canGoBack
210
- }),
211
- /*#__PURE__*/ jsx(SearchBox, {
212
- value: search,
213
- onChange: handleSearch,
214
- clear: clearSearch,
215
- placeholder: "Search"
216
- }),
217
- /*#__PURE__*/ jsx(AnimatedContainer, {
218
- children: /*#__PURE__*/ jsx(AnimatedContent, {
219
- entering: isTransitioning,
220
- direction: animationDirection,
221
- children: /*#__PURE__*/ jsx(ListView, {
222
- isLoading: childrenLoading || searchLoading || loading,
223
- items: isSearching && !isSearchingInitialItems ? searchedItems : items,
224
- emptyStateMessage: isSearching ? 'No matching nodes found' : 'No nodes found',
225
- enableSections: !isSearching,
226
- onItemClick: handleItemSelect,
227
- onItemHover: onItemHover
207
+ return /*#__PURE__*/ jsx("div", {
208
+ ref: containerRef,
209
+ children: /*#__PURE__*/ jsxs(Column, {
210
+ px: 20,
211
+ py: 12,
212
+ gap: 12,
213
+ w: 320,
214
+ h: 440,
215
+ children: [
216
+ /*#__PURE__*/ jsx(Header, {
217
+ title: currentParentItem?.name || title,
218
+ onBack: handleBackTransition,
219
+ showBackButton: navigationStack.canGoBack
220
+ }),
221
+ /*#__PURE__*/ jsx(SearchBox, {
222
+ value: search,
223
+ onChange: handleSearch,
224
+ clear: clearSearch,
225
+ placeholder: "Search"
226
+ }),
227
+ /*#__PURE__*/ jsx(AnimatedContainer, {
228
+ children: /*#__PURE__*/ jsx(AnimatedContent, {
229
+ entering: isTransitioning,
230
+ direction: animationDirection,
231
+ children: /*#__PURE__*/ jsx(ListView, {
232
+ isLoading: childrenLoading || searchLoading || loading,
233
+ items: isSearching && !isSearchingInitialItems ? searchedItems : items,
234
+ emptyStateMessage: isSearching ? 'No matching nodes found' : 'No nodes found',
235
+ enableSections: !isSearching,
236
+ onItemClick: handleItemSelect,
237
+ onItemHover: onItemHover
238
+ })
228
239
  })
229
240
  })
230
- })
231
- ]
241
+ ]
242
+ })
232
243
  });
233
244
  }
234
245
  export { Toolbox };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uipath/apollo-react",
3
- "version": "3.44.2",
3
+ "version": "3.45.0",
4
4
  "description": "Apollo Design System - React component library with Material UI theming",
5
5
  "repository": {
6
6
  "type": "git",