@uipath/apollo-react 4.11.0 → 4.12.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.
Files changed (61) hide show
  1. package/dist/canvas/components/StageNode/DraggableTask.cjs +3 -17
  2. package/dist/canvas/components/StageNode/DraggableTask.d.ts.map +1 -1
  3. package/dist/canvas/components/StageNode/DraggableTask.js +3 -17
  4. package/dist/canvas/components/StageNode/EventDrivenTask.cjs +80 -0
  5. package/dist/canvas/components/StageNode/EventDrivenTask.d.ts +13 -0
  6. package/dist/canvas/components/StageNode/EventDrivenTask.d.ts.map +1 -0
  7. package/dist/canvas/components/StageNode/EventDrivenTask.js +46 -0
  8. package/dist/canvas/components/StageNode/StageNode.cjs +29 -581
  9. package/dist/canvas/components/StageNode/StageNode.d.ts.map +1 -1
  10. package/dist/canvas/components/StageNode/StageNode.js +28 -580
  11. package/dist/canvas/components/StageNode/StageNode.styles.cjs +12 -12
  12. package/dist/canvas/components/StageNode/StageNode.styles.d.ts +3 -3
  13. package/dist/canvas/components/StageNode/StageNode.styles.d.ts.map +1 -1
  14. package/dist/canvas/components/StageNode/StageNode.styles.js +4 -4
  15. package/dist/canvas/components/StageNode/StageNode.types.d.ts +11 -0
  16. package/dist/canvas/components/StageNode/StageNode.types.d.ts.map +1 -1
  17. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.cjs +98 -0
  18. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.d.ts +13 -0
  19. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.d.ts.map +1 -0
  20. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.js +64 -0
  21. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.cjs +129 -0
  22. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.d.ts +12 -0
  23. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.d.ts.map +1 -0
  24. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.js +95 -0
  25. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.cjs +97 -0
  26. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.d.ts +13 -0
  27. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.d.ts.map +1 -0
  28. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.js +63 -0
  29. package/dist/canvas/components/StageNode/StageNodeHandles.cjs +119 -0
  30. package/dist/canvas/components/StageNode/StageNodeHandles.d.ts +8 -0
  31. package/dist/canvas/components/StageNode/StageNodeHandles.d.ts.map +1 -0
  32. package/dist/canvas/components/StageNode/StageNodeHandles.js +85 -0
  33. package/dist/canvas/components/StageNode/StageNodeHeader.cjs +245 -0
  34. package/dist/canvas/components/StageNode/StageNodeHeader.d.ts +9 -0
  35. package/dist/canvas/components/StageNode/StageNodeHeader.d.ts.map +1 -0
  36. package/dist/canvas/components/StageNode/StageNodeHeader.js +211 -0
  37. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.cjs +176 -0
  38. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.d.ts +16 -0
  39. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.d.ts.map +1 -0
  40. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.js +142 -0
  41. package/dist/canvas/components/StageNode/StageTaskEntryConditionIcon.cjs +57 -0
  42. package/dist/canvas/components/StageNode/StageTaskEntryConditionIcon.d.ts +5 -0
  43. package/dist/canvas/components/StageNode/StageTaskEntryConditionIcon.d.ts.map +1 -0
  44. package/dist/canvas/components/StageNode/StageTaskEntryConditionIcon.js +23 -0
  45. package/dist/canvas/components/StageNode/hooks/useStageTaskDragHandler.cjs +117 -0
  46. package/dist/canvas/components/StageNode/hooks/useStageTaskDragHandler.d.ts +18 -0
  47. package/dist/canvas/components/StageNode/hooks/useStageTaskDragHandler.d.ts.map +1 -0
  48. package/dist/canvas/components/StageNode/hooks/useStageTaskDragHandler.js +83 -0
  49. package/dist/canvas/components/StageNode/hooks/useStageTasksByGroups.cjs +87 -0
  50. package/dist/canvas/components/StageNode/hooks/useStageTasksByGroups.d.ts +22 -0
  51. package/dist/canvas/components/StageNode/hooks/useStageTasksByGroups.d.ts.map +1 -0
  52. package/dist/canvas/components/StageNode/hooks/useStageTasksByGroups.js +53 -0
  53. package/dist/canvas/components/Toolbox/ListView.cjs +3 -2
  54. package/dist/canvas/components/Toolbox/ListView.d.ts +1 -0
  55. package/dist/canvas/components/Toolbox/ListView.d.ts.map +1 -1
  56. package/dist/canvas/components/Toolbox/ListView.js +3 -2
  57. package/dist/canvas/components/Toolbox/Toolbox.cjs +38 -9
  58. package/dist/canvas/components/Toolbox/Toolbox.d.ts.map +1 -1
  59. package/dist/canvas/components/Toolbox/Toolbox.js +38 -9
  60. package/dist/canvas/styles/tailwind.canvas.css +1 -1
  61. 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
  };