@uipath/apollo-react 4.24.2 → 4.25.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.
Files changed (110) hide show
  1. package/dist/canvas/components/BaseCanvas/BaseCanvas.cjs +2 -1
  2. package/dist/canvas/components/BaseCanvas/BaseCanvas.d.ts.map +1 -1
  3. package/dist/canvas/components/BaseCanvas/BaseCanvas.js +2 -1
  4. package/dist/canvas/components/BaseCanvas/BaseCanvas.types.d.ts +2 -0
  5. package/dist/canvas/components/BaseCanvas/BaseCanvas.types.d.ts.map +1 -1
  6. package/dist/canvas/components/BaseCanvas/CanvasProviders.cjs +19 -14
  7. package/dist/canvas/components/BaseCanvas/CanvasProviders.d.ts +2 -1
  8. package/dist/canvas/components/BaseCanvas/CanvasProviders.d.ts.map +1 -1
  9. package/dist/canvas/components/BaseCanvas/CanvasProviders.js +19 -14
  10. package/dist/canvas/components/BaseNode/BaseNodeContainer.cjs +5 -1
  11. package/dist/canvas/components/BaseNode/BaseNodeContainer.d.ts.map +1 -1
  12. package/dist/canvas/components/BaseNode/BaseNodeContainer.js +5 -1
  13. package/dist/canvas/components/ButtonHandle/ButtonHandle.cjs +1 -1
  14. package/dist/canvas/components/ButtonHandle/ButtonHandle.js +1 -1
  15. package/dist/canvas/components/CanvasTooltip.cjs +3 -4
  16. package/dist/canvas/components/CanvasTooltip.d.ts +2 -2
  17. package/dist/canvas/components/CanvasTooltip.d.ts.map +1 -1
  18. package/dist/canvas/components/CanvasTooltip.js +3 -4
  19. package/dist/canvas/components/ExecutionStatusIcon/ExecutionStatusIcon.cjs +1 -0
  20. package/dist/canvas/components/ExecutionStatusIcon/ExecutionStatusIcon.d.ts +1 -1
  21. package/dist/canvas/components/ExecutionStatusIcon/ExecutionStatusIcon.d.ts.map +1 -1
  22. package/dist/canvas/components/ExecutionStatusIcon/ExecutionStatusIcon.js +1 -0
  23. package/dist/canvas/components/LoopNode/IterationNavigator.cjs +143 -0
  24. package/dist/canvas/components/LoopNode/IterationNavigator.d.ts +7 -0
  25. package/dist/canvas/components/LoopNode/IterationNavigator.d.ts.map +1 -0
  26. package/dist/canvas/components/LoopNode/IterationNavigator.js +109 -0
  27. package/dist/canvas/components/LoopNode/LoopNode.cjs +45 -18
  28. package/dist/canvas/components/LoopNode/LoopNode.d.ts.map +1 -1
  29. package/dist/canvas/components/LoopNode/LoopNode.js +45 -18
  30. package/dist/canvas/components/LoopNode/LoopNode.types.d.ts +8 -0
  31. package/dist/canvas/components/LoopNode/LoopNode.types.d.ts.map +1 -1
  32. package/dist/canvas/components/StageNode/AdhocTask.cjs +1 -0
  33. package/dist/canvas/components/StageNode/AdhocTask.d.ts.map +1 -1
  34. package/dist/canvas/components/StageNode/AdhocTask.js +1 -0
  35. package/dist/canvas/components/StageNode/DraggableTask.cjs +1 -0
  36. package/dist/canvas/components/StageNode/DraggableTask.d.ts.map +1 -1
  37. package/dist/canvas/components/StageNode/DraggableTask.js +1 -0
  38. package/dist/canvas/components/StageNode/EventDrivenTask.cjs +1 -0
  39. package/dist/canvas/components/StageNode/EventDrivenTask.d.ts.map +1 -1
  40. package/dist/canvas/components/StageNode/EventDrivenTask.js +1 -0
  41. package/dist/canvas/components/StageNode/StageNode.cjs +5 -3
  42. package/dist/canvas/components/StageNode/StageNode.d.ts.map +1 -1
  43. package/dist/canvas/components/StageNode/StageNode.js +5 -3
  44. package/dist/canvas/components/StageNode/StageNode.styles.cjs +4 -39
  45. package/dist/canvas/components/StageNode/StageNode.styles.d.ts +1 -14
  46. package/dist/canvas/components/StageNode/StageNode.styles.d.ts.map +1 -1
  47. package/dist/canvas/components/StageNode/StageNode.styles.js +4 -33
  48. package/dist/canvas/components/StageNode/StageNode.types.d.ts +4 -2
  49. package/dist/canvas/components/StageNode/StageNode.types.d.ts.map +1 -1
  50. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.cjs +3 -1
  51. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.d.ts.map +1 -1
  52. package/dist/canvas/components/StageNode/StageNodeAdhocTaskGroups.js +3 -1
  53. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.cjs +9 -5
  54. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.d.ts.map +1 -1
  55. package/dist/canvas/components/StageNode/StageNodeAllTaskGroups.js +9 -5
  56. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.cjs +3 -1
  57. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.d.ts.map +1 -1
  58. package/dist/canvas/components/StageNode/StageNodeEventDrivenTaskGroups.js +3 -1
  59. package/dist/canvas/components/StageNode/StageNodeHeader.cjs +106 -151
  60. package/dist/canvas/components/StageNode/StageNodeHeader.d.ts.map +1 -1
  61. package/dist/canvas/components/StageNode/StageNodeHeader.js +110 -155
  62. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.cjs +7 -3
  63. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.d.ts.map +1 -1
  64. package/dist/canvas/components/StageNode/StageNodeSequentialTaskGroups.js +7 -3
  65. package/dist/canvas/components/StageNode/StageNodeTaskUtilities.cjs +11 -11
  66. package/dist/canvas/components/StageNode/StageNodeTaskUtilities.d.ts +14 -1
  67. package/dist/canvas/components/StageNode/StageNodeTaskUtilities.d.ts.map +1 -1
  68. package/dist/canvas/components/StageNode/StageNodeTaskUtilities.js +11 -11
  69. package/dist/canvas/components/StageNode/StageTitleInput.cjs +120 -0
  70. package/dist/canvas/components/StageNode/StageTitleInput.d.ts +8 -0
  71. package/dist/canvas/components/StageNode/StageTitleInput.d.ts.map +1 -0
  72. package/dist/canvas/components/StageNode/StageTitleInput.js +86 -0
  73. package/dist/canvas/components/StageNode/useStageNodeLabels.cjs +122 -0
  74. package/dist/canvas/components/StageNode/useStageNodeLabels.d.ts +15 -0
  75. package/dist/canvas/components/StageNode/useStageNodeLabels.d.ts.map +1 -0
  76. package/dist/canvas/components/StageNode/useStageNodeLabels.js +88 -0
  77. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.cjs +51 -38
  78. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.d.ts.map +1 -1
  79. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.js +49 -36
  80. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.styles.cjs +2 -5
  81. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.styles.d.ts.map +1 -1
  82. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.styles.js +2 -5
  83. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.cjs +5 -5
  84. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.js +5 -5
  85. package/dist/canvas/components/Toolbox/Toolbox.cjs +7 -1
  86. package/dist/canvas/components/Toolbox/Toolbox.d.ts.map +1 -1
  87. package/dist/canvas/components/Toolbox/Toolbox.js +7 -1
  88. package/dist/canvas/index.cjs +65 -47
  89. package/dist/canvas/index.d.ts +2 -0
  90. package/dist/canvas/index.d.ts.map +1 -1
  91. package/dist/canvas/index.js +2 -1
  92. package/dist/canvas/locales/en.cjs +1 -1
  93. package/dist/canvas/locales/en.d.ts.map +1 -1
  94. package/dist/canvas/locales/en.js +1 -1
  95. package/dist/canvas/storybook-utils/decorators.d.ts.map +1 -1
  96. package/dist/canvas/styles/reactflow-reset.css +5 -1
  97. package/dist/canvas/styles/tailwind.canvas.css +1 -1
  98. package/dist/canvas/utils/adornment-resolver.cjs +4 -8
  99. package/dist/canvas/utils/adornment-resolver.d.ts +4 -1
  100. package/dist/canvas/utils/adornment-resolver.d.ts.map +1 -1
  101. package/dist/canvas/utils/adornment-resolver.js +4 -8
  102. package/dist/canvas/utils/testing.cjs +10 -1
  103. package/dist/canvas/utils/testing.d.ts +1 -1
  104. package/dist/canvas/utils/testing.d.ts.map +1 -1
  105. package/dist/canvas/utils/testing.js +10 -1
  106. package/dist/core/index.d.ts.map +1 -1
  107. package/dist/i18n/ApI18nProvider.cjs +3 -1
  108. package/dist/i18n/ApI18nProvider.d.ts.map +1 -1
  109. package/dist/i18n/ApI18nProvider.js +3 -1
  110. package/package.json +5 -6
@@ -0,0 +1,109 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { cn } from "@uipath/apollo-wind";
3
+ import { useCallback } from "react";
4
+ import { clamp } from "../../utils/index.js";
5
+ import { CanvasIcon } from "../../utils/icon-registry.js";
6
+ function resolveState(iterationState) {
7
+ if (!Number.isFinite(iterationState.total)) return;
8
+ const total = Math.trunc(iterationState.total);
9
+ if (total <= 0) return;
10
+ const rawActiveIndex = Number.isFinite(iterationState.activeIndex) ? Math.trunc(iterationState.activeIndex) : 0;
11
+ return {
12
+ ...iterationState,
13
+ total,
14
+ activeIndex: clamp(rawActiveIndex, 0, total - 1)
15
+ };
16
+ }
17
+ function stopCanvasControlEvent(event) {
18
+ event.stopPropagation();
19
+ }
20
+ function IterationNavigator({ iterationState }) {
21
+ const resolvedState = resolveState(iterationState);
22
+ if (!resolvedState) return null;
23
+ return /*#__PURE__*/ jsx(NavigatorContent, {
24
+ iterationState: resolvedState
25
+ });
26
+ }
27
+ function NavigatorContent({ iterationState }) {
28
+ const { activeIndex, total, onActiveIndexChange, disabled, ariaLabel } = iterationState;
29
+ const canInteract = !disabled && 'function' == typeof onActiveIndexChange;
30
+ const canGoPrevious = canInteract && activeIndex > 0;
31
+ const canGoNext = canInteract && activeIndex < total - 1;
32
+ const label = ariaLabel ?? 'Loop iteration';
33
+ const visibleIndex = activeIndex + 1;
34
+ const handlePrevious = useCallback((event)=>{
35
+ event.stopPropagation();
36
+ if (!canGoPrevious) return;
37
+ onActiveIndexChange?.(activeIndex - 1);
38
+ }, [
39
+ activeIndex,
40
+ canGoPrevious,
41
+ onActiveIndexChange
42
+ ]);
43
+ const handleNext = useCallback((event)=>{
44
+ event.stopPropagation();
45
+ if (!canGoNext) return;
46
+ onActiveIndexChange?.(activeIndex + 1);
47
+ }, [
48
+ activeIndex,
49
+ canGoNext,
50
+ onActiveIndexChange
51
+ ]);
52
+ return /*#__PURE__*/ jsxs("fieldset", {
53
+ className: cn('nodrag nopan pointer-events-auto m-0 flex h-6 min-w-0 shrink-0 items-center gap-1 rounded-full px-1 py-0', 'border border-border bg-surface text-foreground shadow-sm'),
54
+ "data-testid": "loop-iteration-navigator",
55
+ onPointerDown: stopCanvasControlEvent,
56
+ onMouseDown: stopCanvasControlEvent,
57
+ onDoubleClick: stopCanvasControlEvent,
58
+ children: [
59
+ /*#__PURE__*/ jsxs("legend", {
60
+ className: "sr-only",
61
+ children: [
62
+ label,
63
+ ": ",
64
+ visibleIndex,
65
+ " of ",
66
+ total
67
+ ]
68
+ }),
69
+ /*#__PURE__*/ jsx("button", {
70
+ type: "button",
71
+ className: cn('nodrag nopan inline-flex h-4 w-4 items-center justify-center rounded-full', 'text-foreground transition-opacity', canGoPrevious ? 'cursor-pointer opacity-100' : 'cursor-not-allowed opacity-40'),
72
+ disabled: !canGoPrevious,
73
+ "aria-label": "Previous loop iteration",
74
+ onClick: handlePrevious,
75
+ onPointerDown: stopCanvasControlEvent,
76
+ onMouseDown: stopCanvasControlEvent,
77
+ "data-testid": "loop-iteration-previous",
78
+ children: /*#__PURE__*/ jsx(CanvasIcon, {
79
+ icon: "chevron-left",
80
+ size: 12
81
+ })
82
+ }),
83
+ /*#__PURE__*/ jsxs("span", {
84
+ className: "min-w-8 select-none px-1 text-center text-[11px] font-semibold leading-4",
85
+ "data-testid": "loop-iteration-label",
86
+ children: [
87
+ visibleIndex,
88
+ " / ",
89
+ total
90
+ ]
91
+ }),
92
+ /*#__PURE__*/ jsx("button", {
93
+ type: "button",
94
+ className: cn('nodrag nopan inline-flex h-4 w-4 items-center justify-center rounded-full', 'text-foreground transition-opacity', canGoNext ? 'cursor-pointer opacity-100' : 'cursor-not-allowed opacity-40'),
95
+ disabled: !canGoNext,
96
+ "aria-label": "Next loop iteration",
97
+ onClick: handleNext,
98
+ onPointerDown: stopCanvasControlEvent,
99
+ onMouseDown: stopCanvasControlEvent,
100
+ "data-testid": "loop-iteration-next",
101
+ children: /*#__PURE__*/ jsx(CanvasIcon, {
102
+ icon: "chevron-right",
103
+ size: 12
104
+ })
105
+ })
106
+ ]
107
+ });
108
+ }
109
+ export { IterationNavigator };
@@ -31,6 +31,7 @@ const react_cjs_namespaceObject = require("../../xyflow/react.cjs");
31
31
  const apollo_wind_namespaceObject = require("@uipath/apollo-wind");
32
32
  const external_react_namespaceObject = require("react");
33
33
  const shallow_namespaceObject = require("zustand/shallow");
34
+ const external_constants_cjs_namespaceObject = require("../../constants.cjs");
34
35
  const index_cjs_namespaceObject = require("../../core/index.cjs");
35
36
  const external_hooks_index_cjs_namespaceObject = require("../../hooks/index.cjs");
36
37
  const adornment_resolver_cjs_namespaceObject = require("../../utils/adornment-resolver.cjs");
@@ -47,10 +48,13 @@ const BaseNodeContainer_cjs_namespaceObject = require("../BaseNode/BaseNodeConta
47
48
  const BaseNodeMissingManifest_cjs_namespaceObject = require("../BaseNode/BaseNodeMissingManifest.cjs");
48
49
  const external_ButtonHandle_index_cjs_namespaceObject = require("../ButtonHandle/index.cjs");
49
50
  const external_Toolbar_index_cjs_namespaceObject = require("../Toolbar/index.cjs");
51
+ const external_IterationNavigator_cjs_namespaceObject = require("./IterationNavigator.cjs");
50
52
  const external_LoopNode_helpers_cjs_namespaceObject = require("./LoopNode.helpers.cjs");
51
53
  const DEFAULT_LOOP_ICON = 'repeat';
52
54
  const DEFAULT_LOOP_TITLE = 'Loop';
53
55
  const EMPTY_DATA = {};
56
+ const LOOP_HEADER_ADORNMENT_GAP = 8;
57
+ const LOOP_HEADER_ADORNMENT_PADDING = external_constants_cjs_namespaceObject.NODE_BADGE_INSET_SQUARE + external_constants_cjs_namespaceObject.NODE_BADGE_SIZE + LOOP_HEADER_ADORNMENT_GAP;
54
58
  const RESIZE_CONTROLS = [
55
59
  {
56
60
  position: 'top-left',
@@ -153,7 +157,7 @@ function resolveLoopHandleConfigurations(manifestHandleConfigurations, data) {
153
157
  return manifestHandleConfigurations ?? [];
154
158
  }
155
159
  function LoopNodeComponent(props) {
156
- const { id, type, data, selected = false, dragging = false, width = 0, height = 0, onAddFirstChild, onResize, toolbarConfig: toolbarConfigProp, adornments: adornmentsProp, executionStatusOverride, suggestionType: suggestionTypeProp } = props;
160
+ const { id, type, data, selected = false, dragging = false, width = 0, height = 0, onAddFirstChild, onResize, toolbarConfig: toolbarConfigProp, adornments: adornmentsProp, executionStatusOverride, suggestionType: suggestionTypeProp, iterationState: iterationStateProp } = props;
157
161
  const nodeTypeRegistry = (0, index_cjs_namespaceObject.useOptionalNodeTypeRegistry)();
158
162
  const [isHovered, setIsHovered] = (0, external_react_namespaceObject.useState)(false);
159
163
  const resolvedData = data ?? EMPTY_DATA;
@@ -222,12 +226,16 @@ function LoopNodeComponent(props) {
222
226
  toolbarConfigProp
223
227
  ]);
224
228
  const adornments = (0, external_react_namespaceObject.useMemo)(()=>({
225
- ...(0, adornment_resolver_cjs_namespaceObject.resolveAdornments)(statusContext),
229
+ ...(0, adornment_resolver_cjs_namespaceObject.resolveAdornments)(statusContext, {
230
+ hideExecutionStatusAdornment: true
231
+ }),
226
232
  ...adornmentsProp ?? {}
227
233
  }), [
228
234
  adornmentsProp,
229
235
  statusContext
230
236
  ]);
237
+ const hasTopLeftAdornment = !!adornments.topLeft;
238
+ const hasTopRightAdornment = !!adornments.topRight;
231
239
  const resolvedHandleGroups = (0, external_react_namespaceObject.useMemo)(()=>{
232
240
  const handleConfigurations = resolveLoopHandleConfigurations(manifest?.handleConfiguration, resolvedData);
233
241
  return (0, manifest_resolver_cjs_namespaceObject.resolveHandles)(handleConfigurations, {
@@ -265,6 +273,9 @@ function LoopNodeComponent(props) {
265
273
  const showHandleAddButtons = isDesignMode && !multipleNodesSelected && !isConnecting && !dragging;
266
274
  const showEmptyStateButton = isDesignMode && !hasChildNodes && !!onAddFirstChild;
267
275
  const interactionState = resolveInteractionState(dragging, selected, isHovered);
276
+ const activeStatus = suggestionType ?? validationState?.validationStatus ?? executionStatus;
277
+ const statusBorder = (0, BaseNodeContainer_cjs_namespaceObject.getStatusBorder)(activeStatus);
278
+ const hasStatusBorder = statusBorder.length > 0;
268
279
  if (!manifest) return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
269
280
  className: "relative",
270
281
  style: nodeSizeStyle,
@@ -285,7 +296,7 @@ function LoopNodeComponent(props) {
285
296
  "data-suggestion-type": suggestionType,
286
297
  "data-validation-status": validationState?.validationStatus,
287
298
  "aria-busy": resolvedData.loading || void 0,
288
- className: (0, apollo_wind_namespaceObject.cn)('group/loop-shell relative box-border flex h-full w-full flex-col overflow-visible rounded-[20px] border bg-transparent', 'transition-[border-color,box-shadow,opacity] shadow-(--canvas-node-shadow-rest)', 'border-border-subtle', (0, BaseNodeContainer_cjs_namespaceObject.getStatusBorder)(suggestionType ?? validationState?.validationStatus ?? executionStatus), isHovered && 'shadow-(--canvas-node-shadow-hover) border-border-hover', selected && 'outline outline-2 outline-foreground-accent-muted', isDropTarget && 'bg-surface-hover outline outline-2 outline-brand', 'drag' === interactionState && 'cursor-grabbing shadow-(--canvas-node-shadow-lifted)'),
299
+ className: (0, apollo_wind_namespaceObject.cn)('group/loop-shell relative box-border flex h-full w-full flex-col overflow-visible rounded-[20px] border bg-transparent', 'transition-[border-color,box-shadow,opacity] shadow-(--canvas-node-shadow-rest)', 'border-border', statusBorder, isHovered && 'shadow-(--canvas-node-shadow-hover)', isHovered && !hasStatusBorder && 'border-border-hover', selected && 'outline outline-2 outline-foreground-accent-muted', isDropTarget && 'bg-surface-hover outline outline-2 outline-brand', 'drag' === interactionState && 'cursor-grabbing shadow-(--canvas-node-shadow-lifted)'),
289
300
  style: {
290
301
  ...nodeSizeStyle,
291
302
  ...display.background ? {
@@ -311,7 +322,10 @@ function LoopNodeComponent(props) {
311
322
  title: displayTitle,
312
323
  icon: displayIcon,
313
324
  loading: isLoading,
314
- isParallel: isParallel
325
+ isParallel: isParallel,
326
+ iterationState: iterationStateProp,
327
+ hasTopLeftAdornment: hasTopLeftAdornment,
328
+ hasTopRightAdornment: hasTopRightAdornment
315
329
  }),
316
330
  /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(BodyFrame, {
317
331
  isEmpty: showEmptyStateButton,
@@ -347,7 +361,7 @@ function LoopNodeComponent(props) {
347
361
  });
348
362
  }
349
363
  const LoopNode = /*#__PURE__*/ (0, external_react_namespaceObject.memo)(LoopNodeComponent);
350
- function Header({ title, icon, loading, isParallel }) {
364
+ function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAdornment, hasTopRightAdornment }) {
351
365
  const titleContent = loading ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
352
366
  className: "h-5 w-28 animate-pulse rounded bg-(--canvas-background-overlay)"
353
367
  }) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
@@ -364,8 +378,13 @@ function Header({ title, icon, loading, isParallel }) {
364
378
  size: 16
365
379
  })
366
380
  }) : null;
381
+ const headerStyle = hasTopLeftAdornment || hasTopRightAdornment ? {
382
+ paddingLeft: hasTopLeftAdornment ? LOOP_HEADER_ADORNMENT_PADDING : void 0,
383
+ paddingRight: hasTopRightAdornment ? LOOP_HEADER_ADORNMENT_PADDING : void 0
384
+ } : void 0;
367
385
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
368
- className: "flex shrink-0 cursor-grab items-center justify-between gap-2.5 px-3.5 pt-2.5 text-foreground active:cursor-grabbing",
386
+ className: (0, apollo_wind_namespaceObject.cn)('flex shrink-0 cursor-grab items-center justify-between gap-2.5 rounded-t-[18px]', '-mb-2.5 bg-surface-overlay px-3.5 pb-2.5 pt-2.5 text-foreground', 'active:cursor-grabbing'),
387
+ style: headerStyle,
369
388
  "data-testid": "loop-node-header",
370
389
  children: [
371
390
  /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
@@ -375,18 +394,26 @@ function Header({ title, icon, loading, isParallel }) {
375
394
  titleContent
376
395
  ]
377
396
  }),
378
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("span", {
379
- className: "flex shrink-0 items-center gap-1 rounded-full border border-border-subtle bg-transparent px-2.5 py-0.5 text-[11px] font-semibold leading-4 text-foreground",
397
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
398
+ className: "flex shrink-0 items-center gap-2",
380
399
  children: [
381
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
382
- className: (0, apollo_wind_namespaceObject.cn)('flex shrink-0', isParallel && 'rotate-90'),
383
- "aria-hidden": true,
384
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
385
- icon: "align-justify",
386
- size: 11
387
- })
388
- }),
389
- isParallel ? 'Parallel' : 'Sequential'
400
+ iterationState ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_IterationNavigator_cjs_namespaceObject.IterationNavigator, {
401
+ iterationState: iterationState
402
+ }) : null,
403
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("span", {
404
+ className: "flex h-6 shrink-0 items-center gap-1 rounded-full border border-border bg-surface px-2.5 text-[11px] font-semibold leading-4 text-foreground shadow-sm",
405
+ children: [
406
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
407
+ className: (0, apollo_wind_namespaceObject.cn)('flex shrink-0', isParallel && 'rotate-90'),
408
+ "aria-hidden": true,
409
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
410
+ icon: "align-justify",
411
+ size: 11
412
+ })
413
+ }),
414
+ isParallel ? 'Parallel' : 'Sequential'
415
+ ]
416
+ })
390
417
  ]
391
418
  })
392
419
  ]
@@ -408,7 +435,7 @@ function BodyFrame({ isEmpty, isLoading }) {
408
435
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
409
436
  "data-testid": "loop-body-frame",
410
437
  "data-empty": isEmpty ? 'true' : 'false',
411
- className: (0, apollo_wind_namespaceObject.cn)('relative m-2.5 flex flex-1 rounded-xl border-[1.5px] border-dashed border-border-subtle bg-transparent', 'pointer-events-none'),
438
+ className: (0, apollo_wind_namespaceObject.cn)('relative m-2.5 flex flex-1 rounded-xl border-[1.5px] border-dashed border-border bg-transparent', 'shadow-[0_0_0_10px_var(--surface-overlay)]', 'pointer-events-none'),
412
439
  children: isLoading ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
413
440
  className: "m-6 h-14 w-full animate-pulse rounded-[18px] bg-(--canvas-background-overlay)"
414
441
  }) : null
@@ -1 +1 @@
1
- {"version":3,"file":"LoopNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.tsx"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAmItD,iBAAS,iBAAiB,CAAC,KAAK,EAAE,aAAa,2CA2O9C;AAED,eAAO,MAAM,QAAQ,+DAA0B,CAAC"}
1
+ {"version":3,"file":"LoopNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.tsx"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAsI1E,iBAAS,iBAAiB,CAAC,KAAK,EAAE,aAAa,2CA0P9C;AAED,eAAO,MAAM,QAAQ,+DAA0B,CAAC"}
@@ -3,6 +3,7 @@ import { NodeResizeControl, useStore, useUpdateNodeInternals } from "../../xyflo
3
3
  import { cn } from "@uipath/apollo-wind";
4
4
  import { memo, useCallback, useEffect, useMemo, useState } from "react";
5
5
  import { shallow } from "zustand/shallow";
6
+ import { NODE_BADGE_INSET_SQUARE, NODE_BADGE_SIZE } from "../../constants.js";
6
7
  import { useOptionalNodeTypeRegistry } from "../../core/index.js";
7
8
  import { useElementValidationStatus, useNodeExecutionState } from "../../hooks/index.js";
8
9
  import { resolveAdornments } from "../../utils/adornment-resolver.js";
@@ -19,10 +20,13 @@ import { getStatusBorder } from "../BaseNode/BaseNodeContainer.js";
19
20
  import { MissingManifestNode } from "../BaseNode/BaseNodeMissingManifest.js";
20
21
  import { ButtonHandles } from "../ButtonHandle/index.js";
21
22
  import { NodeToolbar } from "../Toolbar/index.js";
23
+ import { IterationNavigator } from "./IterationNavigator.js";
22
24
  import { resolveContainerHandleGroups } from "./LoopNode.helpers.js";
23
25
  const DEFAULT_LOOP_ICON = 'repeat';
24
26
  const DEFAULT_LOOP_TITLE = 'Loop';
25
27
  const EMPTY_DATA = {};
28
+ const LOOP_HEADER_ADORNMENT_GAP = 8;
29
+ const LOOP_HEADER_ADORNMENT_PADDING = NODE_BADGE_INSET_SQUARE + NODE_BADGE_SIZE + LOOP_HEADER_ADORNMENT_GAP;
26
30
  const RESIZE_CONTROLS = [
27
31
  {
28
32
  position: 'top-left',
@@ -125,7 +129,7 @@ function resolveLoopHandleConfigurations(manifestHandleConfigurations, data) {
125
129
  return manifestHandleConfigurations ?? [];
126
130
  }
127
131
  function LoopNodeComponent(props) {
128
- const { id, type, data, selected = false, dragging = false, width = 0, height = 0, onAddFirstChild, onResize, toolbarConfig: toolbarConfigProp, adornments: adornmentsProp, executionStatusOverride, suggestionType: suggestionTypeProp } = props;
132
+ const { id, type, data, selected = false, dragging = false, width = 0, height = 0, onAddFirstChild, onResize, toolbarConfig: toolbarConfigProp, adornments: adornmentsProp, executionStatusOverride, suggestionType: suggestionTypeProp, iterationState: iterationStateProp } = props;
129
133
  const nodeTypeRegistry = useOptionalNodeTypeRegistry();
130
134
  const [isHovered, setIsHovered] = useState(false);
131
135
  const resolvedData = data ?? EMPTY_DATA;
@@ -194,12 +198,16 @@ function LoopNodeComponent(props) {
194
198
  toolbarConfigProp
195
199
  ]);
196
200
  const adornments = useMemo(()=>({
197
- ...resolveAdornments(statusContext),
201
+ ...resolveAdornments(statusContext, {
202
+ hideExecutionStatusAdornment: true
203
+ }),
198
204
  ...adornmentsProp ?? {}
199
205
  }), [
200
206
  adornmentsProp,
201
207
  statusContext
202
208
  ]);
209
+ const hasTopLeftAdornment = !!adornments.topLeft;
210
+ const hasTopRightAdornment = !!adornments.topRight;
203
211
  const resolvedHandleGroups = useMemo(()=>{
204
212
  const handleConfigurations = resolveLoopHandleConfigurations(manifest?.handleConfiguration, resolvedData);
205
213
  return resolveHandles(handleConfigurations, {
@@ -237,6 +245,9 @@ function LoopNodeComponent(props) {
237
245
  const showHandleAddButtons = isDesignMode && !multipleNodesSelected && !isConnecting && !dragging;
238
246
  const showEmptyStateButton = isDesignMode && !hasChildNodes && !!onAddFirstChild;
239
247
  const interactionState = resolveInteractionState(dragging, selected, isHovered);
248
+ const activeStatus = suggestionType ?? validationState?.validationStatus ?? executionStatus;
249
+ const statusBorder = getStatusBorder(activeStatus);
250
+ const hasStatusBorder = statusBorder.length > 0;
240
251
  if (!manifest) return /*#__PURE__*/ jsx("div", {
241
252
  className: "relative",
242
253
  style: nodeSizeStyle,
@@ -257,7 +268,7 @@ function LoopNodeComponent(props) {
257
268
  "data-suggestion-type": suggestionType,
258
269
  "data-validation-status": validationState?.validationStatus,
259
270
  "aria-busy": resolvedData.loading || void 0,
260
- className: cn('group/loop-shell relative box-border flex h-full w-full flex-col overflow-visible rounded-[20px] border bg-transparent', 'transition-[border-color,box-shadow,opacity] shadow-(--canvas-node-shadow-rest)', 'border-border-subtle', getStatusBorder(suggestionType ?? validationState?.validationStatus ?? executionStatus), isHovered && 'shadow-(--canvas-node-shadow-hover) border-border-hover', selected && 'outline outline-2 outline-foreground-accent-muted', isDropTarget && 'bg-surface-hover outline outline-2 outline-brand', 'drag' === interactionState && 'cursor-grabbing shadow-(--canvas-node-shadow-lifted)'),
271
+ className: cn('group/loop-shell relative box-border flex h-full w-full flex-col overflow-visible rounded-[20px] border bg-transparent', 'transition-[border-color,box-shadow,opacity] shadow-(--canvas-node-shadow-rest)', 'border-border', statusBorder, isHovered && 'shadow-(--canvas-node-shadow-hover)', isHovered && !hasStatusBorder && 'border-border-hover', selected && 'outline outline-2 outline-foreground-accent-muted', isDropTarget && 'bg-surface-hover outline outline-2 outline-brand', 'drag' === interactionState && 'cursor-grabbing shadow-(--canvas-node-shadow-lifted)'),
261
272
  style: {
262
273
  ...nodeSizeStyle,
263
274
  ...display.background ? {
@@ -283,7 +294,10 @@ function LoopNodeComponent(props) {
283
294
  title: displayTitle,
284
295
  icon: displayIcon,
285
296
  loading: isLoading,
286
- isParallel: isParallel
297
+ isParallel: isParallel,
298
+ iterationState: iterationStateProp,
299
+ hasTopLeftAdornment: hasTopLeftAdornment,
300
+ hasTopRightAdornment: hasTopRightAdornment
287
301
  }),
288
302
  /*#__PURE__*/ jsx(BodyFrame, {
289
303
  isEmpty: showEmptyStateButton,
@@ -319,7 +333,7 @@ function LoopNodeComponent(props) {
319
333
  });
320
334
  }
321
335
  const LoopNode = /*#__PURE__*/ memo(LoopNodeComponent);
322
- function Header({ title, icon, loading, isParallel }) {
336
+ function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAdornment, hasTopRightAdornment }) {
323
337
  const titleContent = loading ? /*#__PURE__*/ jsx("div", {
324
338
  className: "h-5 w-28 animate-pulse rounded bg-(--canvas-background-overlay)"
325
339
  }) : /*#__PURE__*/ jsx("span", {
@@ -336,8 +350,13 @@ function Header({ title, icon, loading, isParallel }) {
336
350
  size: 16
337
351
  })
338
352
  }) : null;
353
+ const headerStyle = hasTopLeftAdornment || hasTopRightAdornment ? {
354
+ paddingLeft: hasTopLeftAdornment ? LOOP_HEADER_ADORNMENT_PADDING : void 0,
355
+ paddingRight: hasTopRightAdornment ? LOOP_HEADER_ADORNMENT_PADDING : void 0
356
+ } : void 0;
339
357
  return /*#__PURE__*/ jsxs("div", {
340
- className: "flex shrink-0 cursor-grab items-center justify-between gap-2.5 px-3.5 pt-2.5 text-foreground active:cursor-grabbing",
358
+ className: cn('flex shrink-0 cursor-grab items-center justify-between gap-2.5 rounded-t-[18px]', '-mb-2.5 bg-surface-overlay px-3.5 pb-2.5 pt-2.5 text-foreground', 'active:cursor-grabbing'),
359
+ style: headerStyle,
341
360
  "data-testid": "loop-node-header",
342
361
  children: [
343
362
  /*#__PURE__*/ jsxs("div", {
@@ -347,18 +366,26 @@ function Header({ title, icon, loading, isParallel }) {
347
366
  titleContent
348
367
  ]
349
368
  }),
350
- /*#__PURE__*/ jsxs("span", {
351
- className: "flex shrink-0 items-center gap-1 rounded-full border border-border-subtle bg-transparent px-2.5 py-0.5 text-[11px] font-semibold leading-4 text-foreground",
369
+ /*#__PURE__*/ jsxs("div", {
370
+ className: "flex shrink-0 items-center gap-2",
352
371
  children: [
353
- /*#__PURE__*/ jsx("span", {
354
- className: cn('flex shrink-0', isParallel && 'rotate-90'),
355
- "aria-hidden": true,
356
- children: /*#__PURE__*/ jsx(CanvasIcon, {
357
- icon: "align-justify",
358
- size: 11
359
- })
360
- }),
361
- isParallel ? 'Parallel' : 'Sequential'
372
+ iterationState ? /*#__PURE__*/ jsx(IterationNavigator, {
373
+ iterationState: iterationState
374
+ }) : null,
375
+ /*#__PURE__*/ jsxs("span", {
376
+ className: "flex h-6 shrink-0 items-center gap-1 rounded-full border border-border bg-surface px-2.5 text-[11px] font-semibold leading-4 text-foreground shadow-sm",
377
+ children: [
378
+ /*#__PURE__*/ jsx("span", {
379
+ className: cn('flex shrink-0', isParallel && 'rotate-90'),
380
+ "aria-hidden": true,
381
+ children: /*#__PURE__*/ jsx(CanvasIcon, {
382
+ icon: "align-justify",
383
+ size: 11
384
+ })
385
+ }),
386
+ isParallel ? 'Parallel' : 'Sequential'
387
+ ]
388
+ })
362
389
  ]
363
390
  })
364
391
  ]
@@ -380,7 +407,7 @@ function BodyFrame({ isEmpty, isLoading }) {
380
407
  return /*#__PURE__*/ jsx("div", {
381
408
  "data-testid": "loop-body-frame",
382
409
  "data-empty": isEmpty ? 'true' : 'false',
383
- className: cn('relative m-2.5 flex flex-1 rounded-xl border-[1.5px] border-dashed border-border-subtle bg-transparent', 'pointer-events-none'),
410
+ className: cn('relative m-2.5 flex flex-1 rounded-xl border-[1.5px] border-dashed border-border bg-transparent', 'shadow-[0_0_0_10px_var(--surface-overlay)]', 'pointer-events-none'),
384
411
  children: isLoading ? /*#__PURE__*/ jsx("div", {
385
412
  className: "m-6 h-14 w-full animate-pulse rounded-[18px] bg-(--canvas-background-overlay)"
386
413
  }) : null
@@ -9,11 +9,19 @@ export interface LoopNodeResizeSize {
9
9
  width: number;
10
10
  height: number;
11
11
  }
12
+ export interface LoopIterationState {
13
+ activeIndex: number;
14
+ total: number;
15
+ onActiveIndexChange?: (nextIndex: number) => void;
16
+ disabled?: boolean;
17
+ ariaLabel?: string;
18
+ }
12
19
  export interface LoopNodeConfig {
13
20
  toolbarConfig?: NodeToolbarConfig | null;
14
21
  adornments?: NodeAdornments;
15
22
  executionStatusOverride?: ElementStatusValues;
16
23
  suggestionType?: SuggestionType;
24
+ iterationState?: LoopIterationState;
17
25
  }
18
26
  export interface LoopNodeProps extends NodeProps<Node<LoopNodeData>>, LoopNodeConfig {
19
27
  onAddFirstChild?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"LoopNode.types.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC;AAExC,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,uBAAuB,CAAC,EAAE,mBAAmB,CAAC;IAC9C,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc;IAClF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC/C"}
1
+ {"version":3,"file":"LoopNode.types.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC;AAExC,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,uBAAuB,CAAC,EAAE,mBAAmB,CAAC;IAC9C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,kBAAkB,CAAC;CACrC;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc;IAClF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC/C"}
@@ -48,6 +48,7 @@ const AdhocTaskItemComponent = ({ task, taskExecution, isSelected, getContextMen
48
48
  "data-testid": `stage-task-${task.id}`,
49
49
  selected: isSelected,
50
50
  status: taskExecution?.status,
51
+ isPlaceholder: task.isPlaceholder,
51
52
  onClick: handleClick,
52
53
  ...getContextMenuItems && !isTaskLoading && {
53
54
  onContextMenu: handleContextMenu
@@ -1 +1 @@
1
- {"version":3,"file":"AdhocTask.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/AdhocTask.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAI3E,UAAU,kBAAkB;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,YAAY,EAAE,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA+CD,eAAO,MAAM,aAAa,0IArCvB,kBAAkB,6CAqCoC,CAAC"}
1
+ {"version":3,"file":"AdhocTask.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/AdhocTask.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAI3E,UAAU,kBAAkB;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,YAAY,EAAE,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAgDD,eAAO,MAAM,aAAa,0IAtCvB,kBAAkB,6CAsCoC,CAAC"}
@@ -20,6 +20,7 @@ const AdhocTaskItemComponent = ({ task, taskExecution, isSelected, getContextMen
20
20
  "data-testid": `stage-task-${task.id}`,
21
21
  selected: isSelected,
22
22
  status: taskExecution?.status,
23
+ isPlaceholder: task.isPlaceholder,
23
24
  onClick: handleClick,
24
25
  ...getContextMenuItems && !isTaskLoading && {
25
26
  onContextMenu: handleContextMenu
@@ -100,6 +100,7 @@ const DraggableTaskComponent = ({ task, taskExecution, isSelected, isParallel, g
100
100
  status: taskExecution?.status,
101
101
  isParallel: isParallel,
102
102
  isDragEnabled: !isDragDisabled,
103
+ isPlaceholder: task.isPlaceholder,
103
104
  onClick: handleClick,
104
105
  ...getContextMenuItems && !isTaskLoading && {
105
106
  onContextMenu: handleContextMenu
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableTask.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/DraggableTask.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA2HhE,eAAO,MAAM,aAAa,iMApGvB,kBAAkB,6CAoGoC,CAAC"}
1
+ {"version":3,"file":"DraggableTask.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/DraggableTask.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA4HhE,eAAO,MAAM,aAAa,iMArGvB,kBAAkB,6CAqGoC,CAAC"}
@@ -72,6 +72,7 @@ const DraggableTaskComponent = ({ task, taskExecution, isSelected, isParallel, g
72
72
  status: taskExecution?.status,
73
73
  isParallel: isParallel,
74
74
  isDragEnabled: !isDragDisabled,
75
+ isPlaceholder: task.isPlaceholder,
75
76
  onClick: handleClick,
76
77
  ...getContextMenuItems && !isTaskLoading && {
77
78
  onContextMenu: handleContextMenu
@@ -48,6 +48,7 @@ const EventDrivenTaskItemComponent = ({ task, taskExecution, isSelected, getCont
48
48
  "data-testid": `stage-task-${task.id}`,
49
49
  selected: isSelected,
50
50
  status: taskExecution?.status,
51
+ isPlaceholder: task.isPlaceholder,
51
52
  onClick: handleClick,
52
53
  ...getContextMenuItems && !isTaskLoading && {
53
54
  onContextMenu: handleContextMenu
@@ -1 +1 @@
1
- {"version":3,"file":"EventDrivenTask.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/EventDrivenTask.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAI3E,UAAU,wBAAwB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,YAAY,EAAE,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA+CD,eAAO,MAAM,mBAAmB,8HAtC7B,wBAAwB,6CAsC0C,CAAC"}
1
+ {"version":3,"file":"EventDrivenTask.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/EventDrivenTask.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAI3E,UAAU,wBAAwB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,YAAY,EAAE,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAgDD,eAAO,MAAM,mBAAmB,8HAvC7B,wBAAwB,6CAuC0C,CAAC"}
@@ -20,6 +20,7 @@ const EventDrivenTaskItemComponent = ({ task, taskExecution, isSelected, getCont
20
20
  "data-testid": `stage-task-${task.id}`,
21
21
  selected: isSelected,
22
22
  status: taskExecution?.status,
23
+ isPlaceholder: task.isPlaceholder,
23
24
  onClick: handleClick,
24
25
  ...getContextMenuItems && !isTaskLoading && {
25
26
  onContextMenu: handleContextMenu
@@ -36,8 +36,10 @@ const external_StageNode_styles_cjs_namespaceObject = require("./StageNode.style
36
36
  const external_StageNodeAllTaskGroups_cjs_namespaceObject = require("./StageNodeAllTaskGroups.cjs");
37
37
  const external_StageNodeHandles_cjs_namespaceObject = require("./StageNodeHandles.cjs");
38
38
  const external_StageNodeHeader_cjs_namespaceObject = require("./StageNodeHeader.cjs");
39
+ const external_useStageNodeLabels_cjs_namespaceObject = require("./useStageNodeLabels.cjs");
39
40
  const StageNodeInner = (props)=>{
40
- const { dragging, selected, id, width, execution, stageDetails, addTaskLabel = 'Add task', replaceTaskLabel = 'Replace task', taskOptions = [], menuItems, pendingReplaceTask, onStageClick, onTaskAdd, onAddTaskFromToolbox, onTaskToolboxSearch, onReplaceTaskFromToolbox } = props;
41
+ const labels = (0, external_useStageNodeLabels_cjs_namespaceObject.useStageNodeLabels)();
42
+ const { dragging, selected, id, width, execution, stageDetails, taskOptions = [], menuItems, pendingReplaceTask, onStageClick, onTaskAdd, onAddTaskFromToolbox, onTaskToolboxSearch, onReplaceTaskFromToolbox } = props;
41
43
  const taskWidth = width ? width - external_StageNode_styles_cjs_namespaceObject.STAGE_CONTENT_INSET : void 0;
42
44
  const allTasks = (0, external_react_namespaceObject.useMemo)(()=>stageDetails?.tasks || [], [
43
45
  stageDetails?.tasks
@@ -167,7 +169,7 @@ const StageNodeInner = (props)=>{
167
169
  nodeId: id,
168
170
  offset: 15,
169
171
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbox_index_cjs_namespaceObject.Toolbox, {
170
- title: addTaskLabel,
172
+ title: labels.addTask,
171
173
  initialItems: taskOptions,
172
174
  onClose: ()=>setIsAddingTask(false),
173
175
  onItemSelect: handleAddTaskToolboxItemSelected,
@@ -179,7 +181,7 @@ const StageNodeInner = (props)=>{
179
181
  nodeId: id,
180
182
  offset: 15,
181
183
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbox_index_cjs_namespaceObject.Toolbox, {
182
- title: replaceTaskLabel,
184
+ title: labels.replaceTask,
183
185
  initialItems: taskOptions,
184
186
  onClose: ()=>setIsReplacingTask(false),
185
187
  onItemSelect: handleReplaceTaskToolboxItemSelected,
@@ -1 +1 @@
1
- {"version":3,"file":"StageNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,mBAAmB,CAAC;AAgM5E,eAAO,MAAM,SAAS,8CA3LS,cAAc,6CA2LA,CAAC"}
1
+ {"version":3,"file":"StageNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,mBAAmB,CAAC;AAgM5E,eAAO,MAAM,SAAS,8CA1LS,cAAc,6CA0LA,CAAC"}
@@ -8,8 +8,10 @@ import { INDENTATION_WIDTH, STAGE_CONTENT_INSET, StageContainer } from "./StageN
8
8
  import { StageNodeAllTaskGroups } from "./StageNodeAllTaskGroups.js";
9
9
  import { StageNodeHandles } from "./StageNodeHandles.js";
10
10
  import { StageNodeHeader } from "./StageNodeHeader.js";
11
+ import { useStageNodeLabels } from "./useStageNodeLabels.js";
11
12
  const StageNodeInner = (props)=>{
12
- const { dragging, selected, id, width, execution, stageDetails, addTaskLabel = 'Add task', replaceTaskLabel = 'Replace task', taskOptions = [], menuItems, pendingReplaceTask, onStageClick, onTaskAdd, onAddTaskFromToolbox, onTaskToolboxSearch, onReplaceTaskFromToolbox } = props;
13
+ const labels = useStageNodeLabels();
14
+ const { dragging, selected, id, width, execution, stageDetails, taskOptions = [], menuItems, pendingReplaceTask, onStageClick, onTaskAdd, onAddTaskFromToolbox, onTaskToolboxSearch, onReplaceTaskFromToolbox } = props;
13
15
  const taskWidth = width ? width - STAGE_CONTENT_INSET : void 0;
14
16
  const allTasks = useMemo(()=>stageDetails?.tasks || [], [
15
17
  stageDetails?.tasks
@@ -139,7 +141,7 @@ const StageNodeInner = (props)=>{
139
141
  nodeId: id,
140
142
  offset: 15,
141
143
  children: /*#__PURE__*/ jsx(Toolbox, {
142
- title: addTaskLabel,
144
+ title: labels.addTask,
143
145
  initialItems: taskOptions,
144
146
  onClose: ()=>setIsAddingTask(false),
145
147
  onItemSelect: handleAddTaskToolboxItemSelected,
@@ -151,7 +153,7 @@ const StageNodeInner = (props)=>{
151
153
  nodeId: id,
152
154
  offset: 15,
153
155
  children: /*#__PURE__*/ jsx(Toolbox, {
154
- title: replaceTaskLabel,
156
+ title: labels.replaceTask,
155
157
  initialItems: taskOptions,
156
158
  onClose: ()=>setIsReplacingTask(false),
157
159
  onItemSelect: handleReplaceTaskToolboxItemSelected,