@uipath/apollo-react 4.11.0 → 4.12.1-pr556.9394355

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/dist/canvas/components/AddNodePanel/AddNodeManager.cjs +26 -7
  2. package/dist/canvas/components/AddNodePanel/AddNodeManager.d.ts.map +1 -1
  3. package/dist/canvas/components/AddNodePanel/AddNodeManager.js +26 -7
  4. package/dist/canvas/components/AddNodePanel/createAddNodePreview.cjs +2 -2
  5. package/dist/canvas/components/AddNodePanel/createAddNodePreview.d.ts +8 -1
  6. package/dist/canvas/components/AddNodePanel/createAddNodePreview.d.ts.map +1 -1
  7. package/dist/canvas/components/AddNodePanel/createAddNodePreview.js +2 -2
  8. package/dist/canvas/components/AgentCanvas/agent-flow.manifest.d.ts +1 -0
  9. package/dist/canvas/components/AgentCanvas/agent-flow.manifest.d.ts.map +1 -1
  10. package/dist/canvas/components/BaseNode/BaseNode.cjs +8 -3
  11. package/dist/canvas/components/BaseNode/BaseNode.d.ts +2 -1
  12. package/dist/canvas/components/BaseNode/BaseNode.d.ts.map +1 -1
  13. package/dist/canvas/components/BaseNode/BaseNode.js +5 -3
  14. package/dist/canvas/components/ButtonHandle/ButtonHandle.cjs +115 -34
  15. package/dist/canvas/components/ButtonHandle/ButtonHandle.d.ts +4 -2
  16. package/dist/canvas/components/ButtonHandle/ButtonHandle.d.ts.map +1 -1
  17. package/dist/canvas/components/ButtonHandle/ButtonHandle.js +117 -36
  18. package/dist/canvas/components/ButtonHandle/ButtonHandleStyleUtils.cjs +48 -1
  19. package/dist/canvas/components/ButtonHandle/ButtonHandleStyleUtils.d.ts +4 -0
  20. package/dist/canvas/components/ButtonHandle/ButtonHandleStyleUtils.d.ts.map +1 -1
  21. package/dist/canvas/components/ButtonHandle/ButtonHandleStyleUtils.js +36 -1
  22. package/dist/canvas/components/ButtonHandle/SmartHandle.cjs +1 -1
  23. package/dist/canvas/components/ButtonHandle/SmartHandle.js +1 -1
  24. package/dist/canvas/components/Edges/SequenceEdge.cjs +3 -2
  25. package/dist/canvas/components/Edges/SequenceEdge.d.ts +11 -2
  26. package/dist/canvas/components/Edges/SequenceEdge.d.ts.map +1 -1
  27. package/dist/canvas/components/Edges/SequenceEdge.js +4 -3
  28. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.cjs +20 -10
  29. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts +2 -0
  30. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts.map +1 -1
  31. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.js +21 -11
  32. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.cjs +5 -8
  33. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.d.ts.map +1 -1
  34. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvasWithControls.js +5 -8
  35. package/dist/canvas/components/LoopNode/LoopCanvasNode.cjs +80 -0
  36. package/dist/canvas/components/LoopNode/LoopCanvasNode.d.ts +6 -0
  37. package/dist/canvas/components/LoopNode/LoopCanvasNode.d.ts.map +1 -0
  38. package/dist/canvas/components/LoopNode/LoopCanvasNode.js +46 -0
  39. package/dist/canvas/components/LoopNode/LoopNode.cjs +440 -0
  40. package/dist/canvas/components/LoopNode/LoopNode.constants.cjs +77 -0
  41. package/dist/canvas/components/LoopNode/LoopNode.constants.d.ts +12 -0
  42. package/dist/canvas/components/LoopNode/LoopNode.constants.d.ts.map +1 -0
  43. package/dist/canvas/components/LoopNode/LoopNode.constants.js +13 -0
  44. package/dist/canvas/components/LoopNode/LoopNode.d.ts +5 -0
  45. package/dist/canvas/components/LoopNode/LoopNode.d.ts.map +1 -0
  46. package/dist/canvas/components/LoopNode/LoopNode.helpers.cjs +110 -0
  47. package/dist/canvas/components/LoopNode/LoopNode.helpers.d.ts +19 -0
  48. package/dist/canvas/components/LoopNode/LoopNode.helpers.d.ts.map +1 -0
  49. package/dist/canvas/components/LoopNode/LoopNode.helpers.js +70 -0
  50. package/dist/canvas/components/LoopNode/LoopNode.js +406 -0
  51. package/dist/canvas/components/LoopNode/LoopNode.types.cjs +18 -0
  52. package/dist/canvas/components/LoopNode/LoopNode.types.d.ts +16 -0
  53. package/dist/canvas/components/LoopNode/LoopNode.types.d.ts.map +1 -0
  54. package/dist/canvas/components/LoopNode/LoopNode.types.js +0 -0
  55. package/dist/canvas/components/LoopNode/LoopNodePreview.cjs +81 -0
  56. package/dist/canvas/components/LoopNode/LoopNodePreview.d.ts +8 -0
  57. package/dist/canvas/components/LoopNode/LoopNodePreview.d.ts.map +1 -0
  58. package/dist/canvas/components/LoopNode/LoopNodePreview.js +44 -0
  59. package/dist/canvas/components/LoopNode/index.cjs +72 -0
  60. package/dist/canvas/components/LoopNode/index.d.ts +4 -0
  61. package/dist/canvas/components/LoopNode/index.d.ts.map +1 -0
  62. package/dist/canvas/components/LoopNode/index.js +3 -0
  63. package/dist/canvas/components/StageNode/DraggableTask.cjs +3 -17
  64. package/dist/canvas/components/StageNode/DraggableTask.d.ts.map +1 -1
  65. package/dist/canvas/components/StageNode/DraggableTask.js +3 -17
  66. package/dist/canvas/components/StageNode/EventDrivenTask.cjs +80 -0
  67. package/dist/canvas/components/StageNode/EventDrivenTask.d.ts +13 -0
  68. package/dist/canvas/components/StageNode/EventDrivenTask.d.ts.map +1 -0
  69. package/dist/canvas/components/StageNode/EventDrivenTask.js +46 -0
  70. package/dist/canvas/components/StageNode/StageNode.cjs +29 -581
  71. package/dist/canvas/components/StageNode/StageNode.d.ts.map +1 -1
  72. package/dist/canvas/components/StageNode/StageNode.js +28 -580
  73. package/dist/canvas/components/StageNode/StageNode.styles.cjs +12 -12
  74. package/dist/canvas/components/StageNode/StageNode.styles.d.ts +3 -3
  75. package/dist/canvas/components/StageNode/StageNode.styles.d.ts.map +1 -1
  76. package/dist/canvas/components/StageNode/StageNode.styles.js +4 -4
  77. package/dist/canvas/components/StageNode/StageNode.types.d.ts +11 -0
  78. package/dist/canvas/components/StageNode/StageNode.types.d.ts.map +1 -1
  79. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.cjs +98 -0
  80. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.d.ts +13 -0
  81. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.d.ts.map +1 -0
  82. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.js +64 -0
  83. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.cjs +129 -0
  84. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.d.ts +12 -0
  85. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.d.ts.map +1 -0
  86. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.js +95 -0
  87. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.cjs +97 -0
  88. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.d.ts +13 -0
  89. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.d.ts.map +1 -0
  90. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.js +63 -0
  91. package/dist/canvas/components/StageNode/StageNodeHandles.cjs +119 -0
  92. package/dist/canvas/components/StageNode/StageNodeHandles.d.ts +8 -0
  93. package/dist/canvas/components/StageNode/StageNodeHandles.d.ts.map +1 -0
  94. package/dist/canvas/components/StageNode/StageNodeHandles.js +85 -0
  95. package/dist/canvas/components/StageNode/StageNodeHeader.cjs +245 -0
  96. package/dist/canvas/components/StageNode/StageNodeHeader.d.ts +9 -0
  97. package/dist/canvas/components/StageNode/StageNodeHeader.d.ts.map +1 -0
  98. package/dist/canvas/components/StageNode/StageNodeHeader.js +211 -0
  99. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.cjs +176 -0
  100. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.d.ts +16 -0
  101. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.d.ts.map +1 -0
  102. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.js +142 -0
  103. package/dist/canvas/components/StageNode/StageTaskEntryConditionIcon.cjs +57 -0
  104. package/dist/canvas/components/StageNode/StageTaskEntryConditionIcon.d.ts +5 -0
  105. package/dist/canvas/components/StageNode/StageTaskEntryConditionIcon.d.ts.map +1 -0
  106. package/dist/canvas/components/StageNode/StageTaskEntryConditionIcon.js +23 -0
  107. package/dist/canvas/components/StageNode/hooks/useStageTaskDragHandler.cjs +117 -0
  108. package/dist/canvas/components/StageNode/hooks/useStageTaskDragHandler.d.ts +18 -0
  109. package/dist/canvas/components/StageNode/hooks/useStageTaskDragHandler.d.ts.map +1 -0
  110. package/dist/canvas/components/StageNode/hooks/useStageTaskDragHandler.js +83 -0
  111. package/dist/canvas/components/StageNode/hooks/useStageTasksByGroups.cjs +87 -0
  112. package/dist/canvas/components/StageNode/hooks/useStageTasksByGroups.d.ts +22 -0
  113. package/dist/canvas/components/StageNode/hooks/useStageTasksByGroups.d.ts.map +1 -0
  114. package/dist/canvas/components/StageNode/hooks/useStageTasksByGroups.js +53 -0
  115. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.cjs +20 -18
  116. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.d.ts +2 -1
  117. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.d.ts.map +1 -1
  118. package/dist/canvas/components/Toolbar/EdgeToolbar/useEdgeToolbarState.js +21 -19
  119. package/dist/canvas/components/Toolbox/ListView.cjs +3 -2
  120. package/dist/canvas/components/Toolbox/ListView.d.ts +1 -0
  121. package/dist/canvas/components/Toolbox/ListView.d.ts.map +1 -1
  122. package/dist/canvas/components/Toolbox/ListView.js +3 -2
  123. package/dist/canvas/components/Toolbox/Toolbox.cjs +38 -9
  124. package/dist/canvas/components/Toolbox/Toolbox.d.ts.map +1 -1
  125. package/dist/canvas/components/Toolbox/Toolbox.js +38 -9
  126. package/dist/canvas/components/index.cjs +27 -20
  127. package/dist/canvas/components/index.d.ts +1 -0
  128. package/dist/canvas/components/index.d.ts.map +1 -1
  129. package/dist/canvas/components/index.js +1 -0
  130. package/dist/canvas/core/NodeTypeRegistry.cjs +41 -23
  131. package/dist/canvas/core/NodeTypeRegistry.d.ts +8 -4
  132. package/dist/canvas/core/NodeTypeRegistry.d.ts.map +1 -1
  133. package/dist/canvas/core/NodeTypeRegistry.js +41 -23
  134. package/dist/canvas/core/useNodeTypeRegistry.cjs +4 -3
  135. package/dist/canvas/core/useNodeTypeRegistry.d.ts +1 -1
  136. package/dist/canvas/core/useNodeTypeRegistry.d.ts.map +1 -1
  137. package/dist/canvas/core/useNodeTypeRegistry.js +4 -3
  138. package/dist/canvas/hooks/useAddNodeOnConnectEnd.cjs +4 -3
  139. package/dist/canvas/hooks/useAddNodeOnConnectEnd.d.ts.map +1 -1
  140. package/dist/canvas/hooks/useAddNodeOnConnectEnd.js +4 -3
  141. package/dist/canvas/hooks/usePreviewNode.cjs +4 -2
  142. package/dist/canvas/hooks/usePreviewNode.d.ts.map +1 -1
  143. package/dist/canvas/hooks/usePreviewNode.js +4 -2
  144. package/dist/canvas/schema/node-definition/handle.cjs +10 -2
  145. package/dist/canvas/schema/node-definition/handle.d.ts +9 -0
  146. package/dist/canvas/schema/node-definition/handle.d.ts.map +1 -1
  147. package/dist/canvas/schema/node-definition/handle.js +6 -1
  148. package/dist/canvas/schema/node-definition/index.cjs +4 -1
  149. package/dist/canvas/schema/node-definition/index.d.ts +3 -3
  150. package/dist/canvas/schema/node-definition/index.d.ts.map +1 -1
  151. package/dist/canvas/schema/node-definition/index.js +2 -2
  152. package/dist/canvas/schema/node-definition/node-manifest.d.ts +4 -0
  153. package/dist/canvas/schema/node-definition/node-manifest.d.ts.map +1 -1
  154. package/dist/canvas/storybook-utils/manifests/index.d.ts +1 -0
  155. package/dist/canvas/storybook-utils/manifests/index.d.ts.map +1 -1
  156. package/dist/canvas/storybook-utils/manifests/node-definitions.d.ts.map +1 -1
  157. package/dist/canvas/styles/tailwind.canvas.css +1 -1
  158. package/dist/canvas/utils/createPreviewGraph.cjs +94 -0
  159. package/dist/canvas/utils/createPreviewGraph.d.ts +24 -0
  160. package/dist/canvas/utils/createPreviewGraph.d.ts.map +1 -0
  161. package/dist/canvas/utils/createPreviewGraph.js +51 -0
  162. package/dist/canvas/utils/createPreviewNode.cjs +29 -13
  163. package/dist/canvas/utils/createPreviewNode.d.ts +5 -1
  164. package/dist/canvas/utils/createPreviewNode.d.ts.map +1 -1
  165. package/dist/canvas/utils/createPreviewNode.js +23 -13
  166. package/dist/canvas/utils/index.cjs +33 -26
  167. package/dist/canvas/utils/index.d.ts +2 -1
  168. package/dist/canvas/utils/index.d.ts.map +1 -1
  169. package/dist/canvas/utils/index.js +2 -1
  170. package/package.json +2 -2
@@ -1,102 +1,31 @@
1
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
- import { DndContext, KeyboardSensor, PointerSensor, closestCenter, useSensor, useSensors } from "@dnd-kit/core";
3
- import { SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy } from "@dnd-kit/sortable";
4
- import { Icon, Padding, Spacing } from "@uipath/apollo-core";
5
- import { Column, Row } from "../../layouts/index.js";
6
- import { Position, useStore, useStoreApi } from "../../xyflow/react.js";
7
- import { Button, cn } from "@uipath/apollo-wind";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
8
2
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
9
- import { EntryConditionIcon, ExitConditionIcon, ReturnToOriginIcon } from "../../icons/index.js";
10
- import { GroupModificationType, moveGroupDown, moveGroupUp } from "../../utils/GroupModificationUtils.js";
11
- import { CanvasIcon } from "../../utils/icon-registry.js";
12
- import { useConnectedHandles } from "../BaseCanvas/ConnectedHandlesContext.js";
13
- import { useButtonHandles } from "../ButtonHandle/useButtonHandles.js";
14
- import { CanvasTooltip } from "../CanvasTooltip.js";
15
- import { ExecutionStatusIcon } from "../ExecutionStatusIcon/index.js";
16
3
  import { FloatingCanvasPanel } from "../FloatingCanvasPanel/index.js";
17
4
  import { NodeContextMenu } from "../NodeContextMenu/index.js";
18
5
  import { useSetNodeSelection } from "../NodePropertiesPanel/hooks/index.js";
19
6
  import { Toolbox } from "../Toolbox/index.js";
20
- import { AdhocTaskItem } from "./AdhocTask.js";
21
- import { DraggableTask } from "./DraggableTask.js";
22
- import { INDENTATION_WIDTH, STAGE_CONTENT_INSET, StageAdhocHeaderSection, StageAdhocSection, StageChip, StageContainer, StageContent, StageHeader, StageHeaderChipsRow, StageParallelBracket, StageParallelLabel, StageTaskGroup, StageTaskList, StageTitleContainer, StageTitleInput } from "./StageNode.styles.js";
23
- import { StageHeaderChipType } from "./StageNode.types.js";
24
- import { flattenTasks, getProjection, reorderTasks } from "./StageNode.utils.js";
25
- import { getContextMenuItems, getDivider, getMenuItem } from "./StageNodeTaskUtilities.js";
26
- import { StageTaskDragOverlay } from "./StageTaskDragOverlay.js";
27
- const CHIP_ICONS = {
28
- [StageHeaderChipType.Entry]: /*#__PURE__*/ jsx(EntryConditionIcon, {
29
- w: Icon.IconXs,
30
- h: Icon.IconXs
31
- }),
32
- [StageHeaderChipType.Exit]: /*#__PURE__*/ jsx(ExitConditionIcon, {
33
- w: Icon.IconXs,
34
- h: Icon.IconXs
35
- }),
36
- [StageHeaderChipType.ReturnToOrigin]: /*#__PURE__*/ jsx(ReturnToOriginIcon, {
37
- w: Icon.IconXs,
38
- h: Icon.IconXs
39
- }),
40
- [StageHeaderChipType.CaseExit]: /*#__PURE__*/ jsx(CanvasIcon, {
41
- icon: "x",
42
- size: 16
43
- }),
44
- [StageHeaderChipType.CaseCompletion]: /*#__PURE__*/ jsx(CanvasIcon, {
45
- icon: "check",
46
- size: 16
47
- })
48
- };
7
+ import { INDENTATION_WIDTH, STAGE_CONTENT_INSET, StageContainer } from "./StageNode.styles.js";
8
+ import { StageNodeAllTaskGroups } from "./StageNodeAllTaskGroups.js";
9
+ import { StageNodeHandles } from "./StageNodeHandles.js";
10
+ import { StageNodeHeader } from "./StageNodeHeader.js";
49
11
  const StageNodeInner = (props)=>{
50
- const { dragging, selected, id, width, execution, stageDetails, addTaskLabel = 'Add task', replaceTaskLabel = 'Replace task', taskOptions = [], menuItems, pendingReplaceTask, onStageClick, onTaskAdd, onAddTaskFromToolbox, onTaskToolboxSearch, onTaskClick, onTaskGroupModification, onStageTitleChange, onTaskReorder, onReplaceTaskFromToolbox, onTaskPlay, hideParallelOptions, loadingTaskIds } = props;
12
+ const { dragging, selected, id, width, execution, stageDetails, addTaskLabel = 'Add task', replaceTaskLabel = 'Replace task', taskOptions = [], menuItems, pendingReplaceTask, onStageClick, onTaskAdd, onAddTaskFromToolbox, onTaskToolboxSearch, onReplaceTaskFromToolbox } = props;
51
13
  const taskWidth = width ? width - STAGE_CONTENT_INSET : void 0;
52
14
  const allTasks = useMemo(()=>stageDetails?.tasks || [], [
53
15
  stageDetails?.tasks
54
16
  ]);
55
- const tasks = useMemo(()=>allTasks.filter((group)=>group.some((t)=>!t.isAdhoc)), [
56
- allTasks
57
- ]);
58
- const adhocGroups = useMemo(()=>allTasks.filter((group)=>group.every((t)=>t.isAdhoc)), [
59
- allTasks
60
- ]);
61
- const adhocTasks = useMemo(()=>allTasks.flatMap((group, groupIndex)=>group.map((task, taskIndex)=>({
62
- task,
63
- groupIndex,
64
- taskIndex
65
- })).filter(({ task })=>task.isAdhoc)), [
66
- allTasks
67
- ]);
68
- const flatTasks = useMemo(()=>tasks.flat(), [
69
- tasks
70
- ]);
71
- const taskIds = useMemo(()=>flatTasks.map((task)=>task.id), [
72
- flatTasks
73
- ]);
74
17
  const isException = stageDetails?.isException;
75
18
  const isReadOnly = !!stageDetails?.isReadOnly;
76
- const icon = stageDetails?.icon;
77
19
  const selectedTaskId = stageDetails?.selectedTaskId;
78
- const defaultContent = stageDetails?.defaultContent || (isReadOnly ? 'No tasks' : 'Add first task');
79
20
  const status = execution?.stageStatus?.status;
80
- const statusLabel = execution?.stageStatus?.label;
81
- const stageDuration = execution?.stageStatus?.duration;
82
- const isStageTitleEditable = !!onStageTitleChange && !isReadOnly;
83
21
  const [isHovered, setIsHovered] = useState(false);
84
- const [label, setLabel] = useState(props.stageDetails.label);
85
- useEffect(()=>{
86
- setLabel(props.stageDetails.label);
87
- }, [
88
- props.stageDetails.label
89
- ]);
90
- const [isStageTitleEditing, setIsStageTitleEditing] = useState(false);
91
- const stageTitleRef = useRef(null);
22
+ const handleMouseEnter = useCallback(()=>setIsHovered(true), []);
23
+ const handleMouseLeave = useCallback(()=>setIsHovered(false), []);
92
24
  const taskStateReference = useRef({
93
25
  isParallel: false,
94
26
  groupIndex: -1,
95
27
  taskIndex: -1
96
28
  });
97
- const isConnecting = useStore((state)=>!!state.connectionClickStartHandle);
98
- const storeApi = useStoreApi();
99
- const connectedHandleIds = useConnectedHandles(id);
100
29
  const [isAddingTask, setIsAddingTask] = useState(false);
101
30
  const [isReplacingTask, setIsReplacingTask] = useState(false);
102
31
  useEffect(()=>{
@@ -120,30 +49,6 @@ const StageNodeInner = (props)=>{
120
49
  selectedTaskId,
121
50
  allTasks
122
51
  ]);
123
- const [activeDragId, setActiveDragId] = useState(null);
124
- const [offsetLeft, setOffsetLeft] = useState(0);
125
- const [overId, setOverId] = useState(null);
126
- const activeTask = useMemo(()=>flatTasks.find((t)=>t.id === activeDragId), [
127
- flatTasks,
128
- activeDragId
129
- ]);
130
- const isActiveTaskParallel = useMemo(()=>{
131
- if (!activeDragId) return false;
132
- const group = tasks.find((g)=>g.some((t)=>t.id === activeDragId));
133
- return group ? group.length > 1 : false;
134
- }, [
135
- tasks,
136
- activeDragId
137
- ]);
138
- const projected = useMemo(()=>{
139
- if (!activeDragId || !overId) return null;
140
- return getProjection(tasks, activeDragId, overId, offsetLeft);
141
- }, [
142
- tasks,
143
- activeDragId,
144
- overId,
145
- offsetLeft
146
- ]);
147
52
  useEffect(()=>{
148
53
  if (false === selected) {
149
54
  setIsAddingTask(false);
@@ -152,158 +57,18 @@ const StageNodeInner = (props)=>{
152
57
  }, [
153
58
  selected
154
59
  ]);
155
- const hasConnections = connectedHandleIds.size > 0;
156
- const shouldShowHandles = useMemo(()=>!isReadOnly && (selected || isHovered || isConnecting || hasConnections), [
157
- hasConnections,
158
- isConnecting,
159
- selected,
160
- isHovered,
161
- isReadOnly
162
- ]);
163
- const handleMouseEnter = useCallback(()=>setIsHovered(true), []);
164
- const handleMouseLeave = useCallback(()=>setIsHovered(false), []);
165
60
  const shouldShowMenu = useMemo(()=>menuItems && menuItems.length > 0 && (selected || isHovered) && !isReadOnly, [
166
61
  menuItems,
167
62
  selected,
168
63
  isHovered,
169
64
  isReadOnly
170
65
  ]);
171
- const handleStageTitleChange = useCallback((e)=>{
172
- setIsStageTitleEditing(true);
173
- setLabel(e.target.value);
174
- }, []);
175
- const handleStageTitleClickToSave = useCallback((e)=>{
176
- if (isStageTitleEditing && !stageTitleRef.current?.contains(e.target)) {
177
- setIsStageTitleEditing(false);
178
- if (onStageTitleChange) {
179
- if ('' === label.trim()) setLabel('Untitled Stage');
180
- onStageTitleChange(label);
181
- }
182
- }
183
- }, [
184
- isStageTitleEditing,
185
- onStageTitleChange,
186
- label
187
- ]);
188
- const handleStageTitleBlurToSave = useCallback(()=>{
189
- if (isStageTitleEditing) {
190
- setIsStageTitleEditing(false);
191
- if (onStageTitleChange) {
192
- if ('' === label.trim()) setLabel('Untitled Stage');
193
- onStageTitleChange(label);
194
- }
195
- }
196
- }, [
197
- isStageTitleEditing,
198
- onStageTitleChange,
199
- label
200
- ]);
201
- const handleStageTitleKeyDown = useCallback((e)=>{
202
- if ('Enter' === e.key) {
203
- setIsStageTitleEditing(false);
204
- if (onStageTitleChange) onStageTitleChange(label);
205
- }
206
- if ('Escape' !== e.key) e.stopPropagation();
207
- }, [
208
- onStageTitleChange,
209
- label
210
- ]);
211
- useEffect(()=>{
212
- if (isStageTitleEditing) document.addEventListener('click', handleStageTitleClickToSave);
213
- return ()=>{
214
- document.removeEventListener('click', handleStageTitleClickToSave);
215
- };
216
- }, [
217
- handleStageTitleClickToSave,
218
- isStageTitleEditing
219
- ]);
220
- const hasContextMenu = !!(onReplaceTaskFromToolbox || onTaskGroupModification);
221
- const handleTaskRegroup = useCallback((groupModificationType, groupIndex, taskIndex)=>{
222
- if (onTaskReorder && (groupModificationType === GroupModificationType.TASK_GROUP_UP || groupModificationType === GroupModificationType.TASK_GROUP_DOWN)) {
223
- const mover = groupModificationType === GroupModificationType.TASK_GROUP_UP ? moveGroupUp : moveGroupDown;
224
- const reordered = mover(tasks, groupIndex, taskIndex);
225
- onTaskReorder([
226
- ...reordered,
227
- ...adhocGroups
228
- ]);
229
- return;
230
- }
231
- onTaskGroupModification?.(groupModificationType, groupIndex, taskIndex);
232
- }, [
233
- onTaskReorder,
234
- onTaskGroupModification,
235
- tasks,
236
- adhocGroups
237
- ]);
238
- const buildContextMenuItems = useCallback((groupIndex, taskIndex)=>{
239
- const taskGroup = tasks[groupIndex] ?? [];
240
- const isParallel = taskGroup.length > 1;
241
- const items = [];
242
- if (onReplaceTaskFromToolbox) {
243
- items.push(getMenuItem('replace-task', 'Replace task', ()=>{
244
- taskStateReference.current = {
245
- isParallel,
246
- groupIndex,
247
- taskIndex
248
- };
249
- const taskId = taskGroup[taskIndex]?.id;
250
- if (taskId) onTaskClick?.(taskId);
251
- setIsReplacingTask(true);
252
- }));
253
- items.push(getDivider());
254
- }
255
- if (onTaskGroupModification) {
256
- const reGroupOptions = getContextMenuItems(isParallel, groupIndex, tasks.length, taskIndex, taskGroup.length, (tasks[groupIndex - 1]?.length ?? 0) > 1, (tasks[groupIndex + 1]?.length ?? 0) > 1, handleTaskRegroup, hideParallelOptions);
257
- return [
258
- ...items,
259
- ...reGroupOptions
260
- ];
261
- }
262
- return items;
263
- }, [
264
- onReplaceTaskFromToolbox,
265
- onTaskClick,
266
- onTaskGroupModification,
267
- tasks,
268
- hideParallelOptions,
269
- handleTaskRegroup
270
- ]);
271
- const getAdhocContextMenuItems = useCallback((groupIndex, taskIndex, taskId)=>{
272
- const items = [];
273
- if (onReplaceTaskFromToolbox) items.push(getMenuItem('replace-task', 'Replace task', ()=>{
274
- taskStateReference.current = {
275
- isParallel: false,
276
- groupIndex,
277
- taskIndex
278
- };
279
- onTaskClick?.(taskId);
280
- setIsReplacingTask(true);
281
- }));
282
- if (onTaskGroupModification) {
283
- if (items.length > 0) items.push(getDivider());
284
- items.push(getMenuItem('remove-task', 'Delete task', ()=>onTaskGroupModification(GroupModificationType.REMOVE_TASK, groupIndex, taskIndex)));
285
- }
286
- return items;
287
- }, [
288
- onReplaceTaskFromToolbox,
289
- onTaskClick,
290
- onTaskGroupModification
291
- ]);
292
66
  const { setSelectedNodeId } = useSetNodeSelection();
293
67
  const handleStageClick = useCallback(()=>{
294
68
  onStageClick?.();
295
69
  }, [
296
70
  onStageClick
297
71
  ]);
298
- const handleTaskClick = useCallback((e, taskElementId)=>{
299
- e.stopPropagation();
300
- onTaskClick?.(taskElementId);
301
- setSelectedNodeId(id);
302
- }, [
303
- onTaskClick,
304
- setSelectedNodeId,
305
- id
306
- ]);
307
72
  const handleTaskAddClick = useCallback((event)=>{
308
73
  event.stopPropagation();
309
74
  if (onTaskAdd) onTaskAdd();
@@ -330,124 +95,6 @@ const StageNodeInner = (props)=>{
330
95
  }, [
331
96
  onReplaceTaskFromToolbox
332
97
  ]);
333
- const handleConfigurations = useMemo(()=>isException ? [] : [
334
- {
335
- position: Position.Left,
336
- handles: [
337
- {
338
- id: `${id}____target____left`,
339
- type: 'target',
340
- handleType: 'input'
341
- }
342
- ],
343
- visible: selected || isHovered || isConnecting,
344
- customPositionAndOffsets: {
345
- top: 0,
346
- height: 64
347
- }
348
- },
349
- {
350
- position: Position.Right,
351
- handles: [
352
- {
353
- id: `${id}____source____right`,
354
- type: 'source',
355
- handleType: 'output'
356
- }
357
- ],
358
- visible: selected || isHovered || isConnecting,
359
- customPositionAndOffsets: {
360
- top: 0,
361
- height: 64
362
- }
363
- },
364
- {
365
- position: Position.Bottom,
366
- handles: [
367
- {
368
- id: `${id}____target____bottom`,
369
- type: 'target',
370
- handleType: 'input'
371
- }
372
- ],
373
- visible: selected || isHovered || isConnecting
374
- },
375
- {
376
- position: Position.Bottom,
377
- handles: [
378
- {
379
- id: `${id}____source____bottom`,
380
- type: 'source',
381
- handleType: 'output'
382
- }
383
- ],
384
- visible: selected || isHovered || isConnecting
385
- }
386
- ], [
387
- isException,
388
- id,
389
- selected,
390
- isHovered,
391
- isConnecting
392
- ]);
393
- const handleElements = useButtonHandles({
394
- handleConfigurations,
395
- shouldShowHandles,
396
- nodeId: id,
397
- selected
398
- });
399
- const sensors = useSensors(useSensor(PointerSensor, {
400
- activationConstraint: {
401
- distance: 3
402
- }
403
- }), useSensor(KeyboardSensor, {
404
- coordinateGetter: sortableKeyboardCoordinates
405
- }));
406
- const resetState = useCallback(()=>{
407
- setActiveDragId(null);
408
- setOffsetLeft(0);
409
- setOverId(null);
410
- }, []);
411
- const handleDragStart = useCallback((event)=>{
412
- setActiveDragId(event.active.id);
413
- }, []);
414
- const handleDragMove = useCallback((event)=>{
415
- setOffsetLeft(event.delta.x / storeApi.getState().transform[2]);
416
- }, [
417
- storeApi
418
- ]);
419
- const handleDragOver = useCallback((event)=>{
420
- setOverId(event.over?.id ?? null);
421
- }, []);
422
- const handleDragEnd = useCallback((event)=>{
423
- const { active, over } = event;
424
- const currentOffsetLeft = offsetLeft;
425
- resetState();
426
- if (!over || !onTaskReorder) return;
427
- const projection = getProjection(tasks, active.id, over.id, currentOffsetLeft);
428
- if (!projection) return;
429
- if (active.id === over.id) {
430
- const flattened = flattenTasks(tasks);
431
- const activeTask = flattened.find((t)=>t.id === active.id);
432
- if (activeTask && activeTask.depth === projection.depth) return;
433
- }
434
- const newTasks = reorderTasks(tasks, active.id, over.id, projection.depth);
435
- onTaskReorder([
436
- ...newTasks,
437
- ...adhocGroups
438
- ]);
439
- }, [
440
- tasks,
441
- onTaskReorder,
442
- offsetLeft,
443
- resetState,
444
- adhocGroups
445
- ]);
446
- const handleDragCancel = useCallback(()=>{
447
- resetState();
448
- }, [
449
- resetState
450
- ]);
451
98
  const taskWidthStyle = useMemo(()=>taskWidth ? {
452
99
  '--stage-task-width': `${taskWidth}px`,
453
100
  '--stage-task-width-parallel': `${taskWidth - INDENTATION_WIDTH}px`
@@ -469,226 +116,21 @@ const StageNodeInner = (props)=>{
469
116
  width: width,
470
117
  style: taskWidthStyle,
471
118
  children: [
472
- /*#__PURE__*/ jsxs(StageHeader, {
119
+ /*#__PURE__*/ jsx(StageNodeHeader, {
120
+ props: props,
121
+ isReadOnly: isReadOnly,
473
122
  isException: isException,
474
- "data-testid": `stage-header-${id}`,
475
- children: [
476
- /*#__PURE__*/ jsxs(Row, {
477
- gap: Spacing.SpacingMicro,
478
- align: "center",
479
- flex: 1,
480
- minW: 0,
481
- children: [
482
- icon,
483
- /*#__PURE__*/ jsxs(Column, {
484
- py: 2,
485
- flex: 1,
486
- minW: 0,
487
- children: [
488
- /*#__PURE__*/ jsx("span", {
489
- className: cn('text-sm', !isStageTitleEditing && 'font-bold'),
490
- children: /*#__PURE__*/ jsx(CanvasTooltip, {
491
- content: label,
492
- placement: "top",
493
- delay: true,
494
- children: /*#__PURE__*/ jsx(StageTitleContainer, {
495
- isEditing: isStageTitleEditing,
496
- children: /*#__PURE__*/ jsx(StageTitleInput, {
497
- name: "Stage Title",
498
- isStageTitleEditable: isStageTitleEditable,
499
- value: label,
500
- ref: stageTitleRef,
501
- isEditing: isStageTitleEditing,
502
- ...onStageTitleChange && {
503
- onFocus: ()=>setIsStageTitleEditing(true),
504
- onInput: handleStageTitleChange,
505
- onKeyDown: handleStageTitleKeyDown,
506
- onBlur: handleStageTitleBlurToSave
507
- },
508
- readOnly: !isStageTitleEditable
509
- })
510
- })
511
- })
512
- }),
513
- stageDuration && /*#__PURE__*/ jsx("span", {
514
- className: "text-xs text-foreground-muted",
515
- children: stageDuration
516
- }),
517
- stageDetails.headerChips && stageDetails.headerChips.length > 0 && /*#__PURE__*/ jsx(StageHeaderChipsRow, {
518
- children: stageDetails.headerChips.map((chip)=>{
519
- const button = /*#__PURE__*/ jsxs(StageChip, {
520
- type: "button",
521
- "aria-label": 'string' == typeof chip.tooltip ? chip.tooltip : chip.type,
522
- onClick: (e)=>{
523
- e.stopPropagation();
524
- chip.onClick?.();
525
- },
526
- children: [
527
- CHIP_ICONS[chip.type],
528
- void 0 !== chip.count && /*#__PURE__*/ jsx("span", {
529
- className: "text-xs",
530
- children: chip.count
531
- })
532
- ]
533
- }, chip.type);
534
- if (chip.tooltip) return /*#__PURE__*/ jsx(CanvasTooltip, {
535
- placement: "bottom",
536
- content: chip.tooltip,
537
- children: button
538
- }, chip.type);
539
- return button;
540
- })
541
- })
542
- ]
543
- })
544
- ]
545
- }),
546
- /*#__PURE__*/ jsxs(Row, {
547
- gap: Spacing.SpacingMicro,
548
- align: "start",
549
- py: Padding.PadS,
550
- children: [
551
- status && /*#__PURE__*/ jsx(CanvasTooltip, {
552
- content: statusLabel,
553
- placement: "top",
554
- children: /*#__PURE__*/ jsx(Button, {
555
- variant: "ghost",
556
- size: "icon",
557
- className: "h-6 w-6",
558
- "aria-label": statusLabel,
559
- children: /*#__PURE__*/ jsx(ExecutionStatusIcon, {
560
- status: status,
561
- size: 20
562
- })
563
- })
564
- }),
565
- (onTaskAdd || onAddTaskFromToolbox) && !isReadOnly && /*#__PURE__*/ jsx(CanvasTooltip, {
566
- content: addTaskLabel,
567
- placement: "top",
568
- children: /*#__PURE__*/ jsx(Button, {
569
- variant: "ghost",
570
- size: "icon",
571
- className: "h-6 w-6",
572
- onClick: handleTaskAddClick,
573
- "aria-label": addTaskLabel,
574
- children: /*#__PURE__*/ jsx(CanvasIcon, {
575
- icon: "plus",
576
- size: 20
577
- })
578
- })
579
- })
580
- ]
581
- })
582
- ]
123
+ status: status,
124
+ handleTaskAddClick: handleTaskAddClick
583
125
  }),
584
- /*#__PURE__*/ jsx(StageContent, {
585
- children: 0 === tasks.length && 0 === adhocTasks.length ? /*#__PURE__*/ jsx(Column, {
586
- py: 2,
587
- children: (onTaskAdd || onAddTaskFromToolbox) && !isReadOnly ? /*#__PURE__*/ jsx(Button, {
588
- variant: "link",
589
- onClick: handleTaskAddClick,
590
- style: {
591
- maxWidth: 'fit-content'
592
- },
593
- children: defaultContent
594
- }) : /*#__PURE__*/ jsx("span", {
595
- className: "text-xs text-foreground-muted",
596
- children: defaultContent
597
- })
598
- }) : /*#__PURE__*/ jsxs(Fragment, {
599
- children: [
600
- tasks.length > 0 && /*#__PURE__*/ jsxs(DndContext, {
601
- collisionDetection: closestCenter,
602
- sensors: sensors,
603
- onDragStart: handleDragStart,
604
- onDragMove: handleDragMove,
605
- onDragOver: handleDragOver,
606
- onDragEnd: handleDragEnd,
607
- onDragCancel: handleDragCancel,
608
- children: [
609
- /*#__PURE__*/ jsx(SortableContext, {
610
- items: taskIds,
611
- strategy: verticalListSortingStrategy,
612
- children: /*#__PURE__*/ jsx(StageTaskList, {
613
- className: "nodrag nopan",
614
- children: tasks.map((taskGroup, groupIndex)=>{
615
- const isParallel = taskGroup.length > 1;
616
- return /*#__PURE__*/ jsxs(Row, {
617
- gap: Spacing.SpacingS,
618
- children: [
619
- isParallel && /*#__PURE__*/ jsx(StageParallelBracket, {}),
620
- /*#__PURE__*/ jsxs(StageTaskGroup, {
621
- isParallel: isParallel,
622
- children: [
623
- isParallel && /*#__PURE__*/ jsx(StageParallelLabel, {
624
- children: /*#__PURE__*/ jsx("span", {
625
- className: "text-xs",
626
- children: "Parallel"
627
- })
628
- }),
629
- taskGroup.map((task, taskIndex)=>{
630
- const taskExecution = execution?.taskStatus?.[task.id];
631
- return /*#__PURE__*/ jsx(DraggableTask, {
632
- task: task,
633
- taskExecution: taskExecution,
634
- isSelected: selectedTaskId === task.id,
635
- isParallel: isParallel,
636
- groupIndex: groupIndex,
637
- taskIndex: taskIndex,
638
- onTaskClick: handleTaskClick,
639
- projectedDepth: task.id === activeDragId && projected ? projected.depth : void 0,
640
- isDragDisabled: !onTaskReorder || isReadOnly,
641
- isTaskLoading: loadingTaskIds?.has(task.id),
642
- ...hasContextMenu && !isReadOnly && {
643
- getContextMenuItems: buildContextMenuItems
644
- }
645
- }, task.id);
646
- })
647
- ]
648
- })
649
- ]
650
- }, `group-${groupIndex}`);
651
- })
652
- })
653
- }),
654
- /*#__PURE__*/ jsx(StageTaskDragOverlay, {
655
- activeTask: activeTask,
656
- isActiveTaskParallel: isActiveTaskParallel,
657
- taskWidthStyle: taskWidthStyle
658
- })
659
- ]
660
- }),
661
- adhocTasks.length > 0 && /*#__PURE__*/ jsxs(StageAdhocSection, {
662
- style: {
663
- marginTop: tasks.length > 0 ? Spacing.SpacingS : '0px'
664
- },
665
- children: [
666
- /*#__PURE__*/ jsx(StageAdhocHeaderSection, {
667
- children: /*#__PURE__*/ jsx("span", {
668
- className: "text-xs font-bold text-foreground-muted",
669
- children: "Ad hoc tasks"
670
- })
671
- }),
672
- /*#__PURE__*/ jsx(StageTaskList, {
673
- children: adhocTasks.map(({ task, groupIndex, taskIndex })=>{
674
- const taskExecution = execution?.taskStatus?.[task.id];
675
- return /*#__PURE__*/ jsx(AdhocTaskItem, {
676
- task: task,
677
- taskExecution: taskExecution,
678
- isSelected: selectedTaskId === task.id,
679
- onTaskClick: handleTaskClick,
680
- onTaskPlay: onTaskPlay,
681
- isTaskLoading: loadingTaskIds?.has(task.id),
682
- ...(onTaskGroupModification || onReplaceTaskFromToolbox) && !isReadOnly && {
683
- getContextMenuItems: ()=>getAdhocContextMenuItems(groupIndex, taskIndex, task.id)
684
- }
685
- }, task.id);
686
- })
687
- })
688
- ]
689
- })
690
- ]
691
- })
126
+ /*#__PURE__*/ jsx(StageNodeAllTaskGroups, {
127
+ props: props,
128
+ isReadOnly: isReadOnly,
129
+ taskWidthStyle: taskWidthStyle,
130
+ taskStateReference: taskStateReference,
131
+ setSelectedNodeId: setSelectedNodeId,
132
+ handleTaskAddClick: handleTaskAddClick,
133
+ setIsReplacingTask: setIsReplacingTask
692
134
  })
693
135
  ]
694
136
  }),
@@ -720,7 +162,13 @@ const StageNodeInner = (props)=>{
720
162
  menuItems: menuItems,
721
163
  isVisible: shouldShowMenu
722
164
  }),
723
- handleElements
165
+ /*#__PURE__*/ jsx(StageNodeHandles, {
166
+ id: id,
167
+ isReadOnly: isReadOnly,
168
+ selected: selected,
169
+ isHovered: isHovered,
170
+ isException: isException
171
+ })
724
172
  ]
725
173
  });
726
174
  };