@uipath/apollo-react 4.31.1 → 4.32.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 (27) hide show
  1. package/dist/canvas/components/LoopNode/IterationNavigator.cjs +29 -13
  2. package/dist/canvas/components/LoopNode/IterationNavigator.d.ts.map +1 -1
  3. package/dist/canvas/components/LoopNode/IterationNavigator.js +27 -11
  4. package/dist/canvas/components/LoopNode/LoopNode.cjs +39 -18
  5. package/dist/canvas/components/LoopNode/LoopNode.d.ts.map +1 -1
  6. package/dist/canvas/components/LoopNode/LoopNode.js +37 -16
  7. package/dist/canvas/components/StageNode/StageNodeHeader.cjs +6 -2
  8. package/dist/canvas/components/StageNode/StageNodeHeader.d.ts.map +1 -1
  9. package/dist/canvas/components/StageNode/StageNodeHeader.js +6 -2
  10. package/dist/canvas/components/StageNode/TaskContent.cjs +8 -6
  11. package/dist/canvas/components/StageNode/TaskContent.d.ts.map +1 -1
  12. package/dist/canvas/components/StageNode/TaskContent.js +8 -6
  13. package/dist/canvas/components/StageNode/useExecutionStatusLabel.cjs +89 -0
  14. package/dist/canvas/components/StageNode/useExecutionStatusLabel.d.ts +3 -0
  15. package/dist/canvas/components/StageNode/useExecutionStatusLabel.d.ts.map +1 -0
  16. package/dist/canvas/components/StageNode/useExecutionStatusLabel.js +55 -0
  17. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.cjs +17 -5
  18. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.d.ts.map +1 -1
  19. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.js +15 -3
  20. package/dist/canvas/locales/en.cjs +1 -1
  21. package/dist/canvas/locales/en.d.ts.map +1 -1
  22. package/dist/canvas/locales/en.js +1 -1
  23. package/dist/canvas/styles/tailwind.canvas.css +1 -1
  24. package/dist/i18n/useSafeLingui.cjs +12 -1
  25. package/dist/i18n/useSafeLingui.d.ts.map +1 -1
  26. package/dist/i18n/useSafeLingui.js +12 -1
  27. package/package.json +3 -3
@@ -29,7 +29,8 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  const jsx_runtime_namespaceObject = require("react/jsx-runtime");
30
30
  const apollo_wind_namespaceObject = require("@uipath/apollo-wind");
31
31
  const external_react_namespaceObject = require("react");
32
- const index_cjs_namespaceObject = require("../../utils/index.cjs");
32
+ const index_cjs_namespaceObject = require("../../../i18n/index.cjs");
33
+ const external_utils_index_cjs_namespaceObject = require("../../utils/index.cjs");
33
34
  const icon_registry_cjs_namespaceObject = require("../../utils/icon-registry.cjs");
34
35
  function resolveState(iterationState) {
35
36
  if (!Number.isFinite(iterationState.total)) return;
@@ -39,7 +40,7 @@ function resolveState(iterationState) {
39
40
  return {
40
41
  ...iterationState,
41
42
  total,
42
- activeIndex: (0, index_cjs_namespaceObject.clamp)(rawActiveIndex, 0, total - 1)
43
+ activeIndex: (0, external_utils_index_cjs_namespaceObject.clamp)(rawActiveIndex, 0, total - 1)
43
44
  };
44
45
  }
45
46
  function stopCanvasControlEvent(event) {
@@ -53,12 +54,33 @@ function IterationNavigator({ iterationState }) {
53
54
  });
54
55
  }
55
56
  function NavigatorContent({ iterationState }) {
57
+ const { _ } = (0, index_cjs_namespaceObject.useSafeLingui)();
56
58
  const { activeIndex, total, onActiveIndexChange, disabled, ariaLabel } = iterationState;
57
59
  const canInteract = !disabled && 'function' == typeof onActiveIndexChange;
58
60
  const canGoPrevious = canInteract && activeIndex > 0;
59
61
  const canGoNext = canInteract && activeIndex < total - 1;
60
- const label = ariaLabel ?? 'Loop iteration';
62
+ const label = ariaLabel ?? _({
63
+ id: 'loop-node.iteration.label',
64
+ message: 'Loop iteration'
65
+ });
61
66
  const visibleIndex = activeIndex + 1;
67
+ const statusLabel = _({
68
+ id: 'loop-node.iteration.status',
69
+ message: '{label}: {visibleIndex} of {total}',
70
+ values: {
71
+ label,
72
+ visibleIndex,
73
+ total
74
+ }
75
+ });
76
+ const previousLabel = _({
77
+ id: 'loop-node.iteration.previous',
78
+ message: 'Previous loop iteration'
79
+ });
80
+ const nextLabel = _({
81
+ id: 'loop-node.iteration.next',
82
+ message: 'Next loop iteration'
83
+ });
62
84
  const handlePrevious = (0, external_react_namespaceObject.useCallback)((event)=>{
63
85
  event.stopPropagation();
64
86
  if (!canGoPrevious) return;
@@ -84,21 +106,15 @@ function NavigatorContent({ iterationState }) {
84
106
  onMouseDown: stopCanvasControlEvent,
85
107
  onDoubleClick: stopCanvasControlEvent,
86
108
  children: [
87
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("legend", {
109
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("legend", {
88
110
  className: "sr-only",
89
- children: [
90
- label,
91
- ": ",
92
- visibleIndex,
93
- " of ",
94
- total
95
- ]
111
+ children: statusLabel
96
112
  }),
97
113
  /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("button", {
98
114
  type: "button",
99
115
  className: (0, apollo_wind_namespaceObject.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'),
100
116
  disabled: !canGoPrevious,
101
- "aria-label": "Previous loop iteration",
117
+ "aria-label": previousLabel,
102
118
  onClick: handlePrevious,
103
119
  onPointerDown: stopCanvasControlEvent,
104
120
  onMouseDown: stopCanvasControlEvent,
@@ -121,7 +137,7 @@ function NavigatorContent({ iterationState }) {
121
137
  type: "button",
122
138
  className: (0, apollo_wind_namespaceObject.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'),
123
139
  disabled: !canGoNext,
124
- "aria-label": "Next loop iteration",
140
+ "aria-label": nextLabel,
125
141
  onClick: handleNext,
126
142
  onPointerDown: stopCanvasControlEvent,
127
143
  onMouseDown: stopCanvasControlEvent,
@@ -1 +1 @@
1
- {"version":3,"file":"IterationNavigator.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/IterationNavigator.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,UAAU,uBAAuB;IAC/B,cAAc,EAAE,kBAAkB,CAAC;CACpC;AA4BD,wBAAgB,kBAAkB,CAAC,EAAE,cAAc,EAAE,EAAE,uBAAuB,kDAQ7E"}
1
+ {"version":3,"file":"IterationNavigator.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/IterationNavigator.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,UAAU,uBAAuB;IAC/B,cAAc,EAAE,kBAAkB,CAAC;CACpC;AA4BD,wBAAgB,kBAAkB,CAAC,EAAE,cAAc,EAAE,EAAE,uBAAuB,kDAQ7E"}
@@ -1,6 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "@uipath/apollo-wind";
3
3
  import { useCallback } from "react";
4
+ import { useSafeLingui } from "../../../i18n/index.js";
4
5
  import { clamp } from "../../utils/index.js";
5
6
  import { CanvasIcon } from "../../utils/icon-registry.js";
6
7
  function resolveState(iterationState) {
@@ -25,12 +26,33 @@ function IterationNavigator({ iterationState }) {
25
26
  });
26
27
  }
27
28
  function NavigatorContent({ iterationState }) {
29
+ const { _ } = useSafeLingui();
28
30
  const { activeIndex, total, onActiveIndexChange, disabled, ariaLabel } = iterationState;
29
31
  const canInteract = !disabled && 'function' == typeof onActiveIndexChange;
30
32
  const canGoPrevious = canInteract && activeIndex > 0;
31
33
  const canGoNext = canInteract && activeIndex < total - 1;
32
- const label = ariaLabel ?? 'Loop iteration';
34
+ const label = ariaLabel ?? _({
35
+ id: 'loop-node.iteration.label',
36
+ message: 'Loop iteration'
37
+ });
33
38
  const visibleIndex = activeIndex + 1;
39
+ const statusLabel = _({
40
+ id: 'loop-node.iteration.status',
41
+ message: '{label}: {visibleIndex} of {total}',
42
+ values: {
43
+ label,
44
+ visibleIndex,
45
+ total
46
+ }
47
+ });
48
+ const previousLabel = _({
49
+ id: 'loop-node.iteration.previous',
50
+ message: 'Previous loop iteration'
51
+ });
52
+ const nextLabel = _({
53
+ id: 'loop-node.iteration.next',
54
+ message: 'Next loop iteration'
55
+ });
34
56
  const handlePrevious = useCallback((event)=>{
35
57
  event.stopPropagation();
36
58
  if (!canGoPrevious) return;
@@ -56,21 +78,15 @@ function NavigatorContent({ iterationState }) {
56
78
  onMouseDown: stopCanvasControlEvent,
57
79
  onDoubleClick: stopCanvasControlEvent,
58
80
  children: [
59
- /*#__PURE__*/ jsxs("legend", {
81
+ /*#__PURE__*/ jsx("legend", {
60
82
  className: "sr-only",
61
- children: [
62
- label,
63
- ": ",
64
- visibleIndex,
65
- " of ",
66
- total
67
- ]
83
+ children: statusLabel
68
84
  }),
69
85
  /*#__PURE__*/ jsx("button", {
70
86
  type: "button",
71
87
  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
88
  disabled: !canGoPrevious,
73
- "aria-label": "Previous loop iteration",
89
+ "aria-label": previousLabel,
74
90
  onClick: handlePrevious,
75
91
  onPointerDown: stopCanvasControlEvent,
76
92
  onMouseDown: stopCanvasControlEvent,
@@ -93,7 +109,7 @@ function NavigatorContent({ iterationState }) {
93
109
  type: "button",
94
110
  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
111
  disabled: !canGoNext,
96
- "aria-label": "Next loop iteration",
112
+ "aria-label": nextLabel,
97
113
  onClick: handleNext,
98
114
  onPointerDown: stopCanvasControlEvent,
99
115
  onMouseDown: stopCanvasControlEvent,
@@ -31,8 +31,9 @@ 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 index_cjs_namespaceObject = require("../../../i18n/index.cjs");
34
35
  const external_constants_cjs_namespaceObject = require("../../constants.cjs");
35
- const index_cjs_namespaceObject = require("../../core/index.cjs");
36
+ const external_core_index_cjs_namespaceObject = require("../../core/index.cjs");
36
37
  const external_hooks_index_cjs_namespaceObject = require("../../hooks/index.cjs");
37
38
  const adornment_resolver_cjs_namespaceObject = require("../../utils/adornment-resolver.cjs");
38
39
  const container_cjs_namespaceObject = require("../../utils/container.cjs");
@@ -47,11 +48,11 @@ const BaseNodeBadgeSlot_cjs_namespaceObject = require("../BaseNode/BaseNodeBadge
47
48
  const BaseNodeContainer_cjs_namespaceObject = require("../BaseNode/BaseNodeContainer.cjs");
48
49
  const BaseNodeMissingManifest_cjs_namespaceObject = require("../BaseNode/BaseNodeMissingManifest.cjs");
49
50
  const external_ButtonHandle_index_cjs_namespaceObject = require("../ButtonHandle/index.cjs");
51
+ const external_CanvasTooltip_cjs_namespaceObject = require("../CanvasTooltip.cjs");
50
52
  const external_Toolbar_index_cjs_namespaceObject = require("../Toolbar/index.cjs");
51
53
  const external_IterationNavigator_cjs_namespaceObject = require("./IterationNavigator.cjs");
52
54
  const external_LoopNode_helpers_cjs_namespaceObject = require("./LoopNode.helpers.cjs");
53
55
  const DEFAULT_LOOP_ICON = 'repeat';
54
- const DEFAULT_LOOP_TITLE = 'Loop';
55
56
  const EMPTY_DATA = {};
56
57
  const LOOP_HEADER_ADORNMENT_GAP = 8;
57
58
  const LOOP_HEADER_ADORNMENT_PADDING = external_constants_cjs_namespaceObject.NODE_BADGE_INSET_SQUARE + external_constants_cjs_namespaceObject.NODE_BADGE_SIZE + LOOP_HEADER_ADORNMENT_GAP;
@@ -158,7 +159,8 @@ function resolveLoopHandleConfigurations(manifestHandleConfigurations, data) {
158
159
  }
159
160
  function LoopNodeComponent(props) {
160
161
  const { id, type, data, selected = false, dragging = false, width = 0, height = 0, onAddFirstChild, onResize, toolbarConfig: toolbarConfigProp, adornments: adornmentsProp, executionStatusOverride, suggestionType: suggestionTypeProp, iterationState: iterationStateProp } = props;
161
- const nodeTypeRegistry = (0, index_cjs_namespaceObject.useOptionalNodeTypeRegistry)();
162
+ const nodeTypeRegistry = (0, external_core_index_cjs_namespaceObject.useOptionalNodeTypeRegistry)();
163
+ const { _ } = (0, index_cjs_namespaceObject.useSafeLingui)();
162
164
  const [isHovered, setIsHovered] = (0, external_react_namespaceObject.useState)(false);
163
165
  const [isResizing, setIsResizing] = (0, external_react_namespaceObject.useState)(false);
164
166
  const resolvedData = data ?? EMPTY_DATA;
@@ -203,9 +205,23 @@ function LoopNodeComponent(props) {
203
205
  id,
204
206
  resolvedData
205
207
  ]);
206
- const displayTitle = display.label ?? DEFAULT_LOOP_TITLE;
208
+ const displayTitle = display.label ?? _({
209
+ id: 'loop-node.title',
210
+ message: 'Loop'
211
+ });
207
212
  const displayIcon = display.icon ?? DEFAULT_LOOP_ICON;
208
213
  const isParallel = true === resolvedData.parallel;
214
+ const label = isParallel ? _({
215
+ id: 'loop-node.mode.parallel',
216
+ message: 'Parallel'
217
+ }) : _({
218
+ id: 'loop-node.mode.sequential',
219
+ message: 'Sequential'
220
+ });
221
+ const addNodeToLoopLabel = _({
222
+ id: 'loop-node.add-node',
223
+ message: 'Add node to loop'
224
+ });
209
225
  const isDropTarget = true === resolvedData.isDropTarget;
210
226
  const containerWidth = width || container_cjs_namespaceObject.DEFAULT_CONTAINER_WIDTH;
211
227
  const containerHeight = height || container_cjs_namespaceObject.DEFAULT_CONTAINER_HEIGHT;
@@ -330,6 +346,7 @@ function LoopNodeComponent(props) {
330
346
  icon: displayIcon,
331
347
  loading: isLoading,
332
348
  isParallel: isParallel,
349
+ label: label,
333
350
  iterationState: iterationStateProp,
334
351
  hasTopLeftAdornment: hasTopLeftAdornment,
335
352
  hasTopRightAdornment: hasTopRightAdornment
@@ -341,6 +358,7 @@ function LoopNodeComponent(props) {
341
358
  showEmptyStateButton ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
342
359
  className: (0, apollo_wind_namespaceObject.cn)('pointer-events-none absolute left-1/2 top-1/2', '-translate-x-1/2 -translate-y-1/2'),
343
360
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(EmptyState, {
361
+ label: addNodeToLoopLabel,
344
362
  onAddFirstChild: handleEmptyClick
345
363
  })
346
364
  }) : null,
@@ -368,7 +386,7 @@ function LoopNodeComponent(props) {
368
386
  });
369
387
  }
370
388
  const LoopNode = /*#__PURE__*/ (0, external_react_namespaceObject.memo)(LoopNodeComponent);
371
- function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAdornment, hasTopRightAdornment }) {
389
+ function Header({ title, icon, loading, isParallel, label, iterationState, hasTopLeftAdornment, hasTopRightAdornment }) {
372
390
  const titleContent = loading ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
373
391
  className: "h-5 w-28 animate-pulse rounded bg-(--canvas-background-overlay)"
374
392
  }) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
@@ -389,7 +407,6 @@ function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAd
389
407
  paddingLeft: hasTopLeftAdornment ? LOOP_HEADER_ADORNMENT_PADDING : void 0,
390
408
  paddingRight: hasTopRightAdornment ? LOOP_HEADER_ADORNMENT_PADDING : void 0
391
409
  } : void 0;
392
- const executionModeIcon = isParallel ? 'columns-3' : 'rows-3';
393
410
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
394
411
  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'),
395
412
  style: headerStyle,
@@ -412,14 +429,14 @@ function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAd
412
429
  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",
413
430
  children: [
414
431
  /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
415
- className: "flex shrink-0",
432
+ className: (0, apollo_wind_namespaceObject.cn)('flex shrink-0', isParallel && 'rotate-90'),
416
433
  "aria-hidden": true,
417
434
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
418
- icon: executionModeIcon,
435
+ icon: "text-align-justify",
419
436
  size: 12
420
437
  })
421
438
  }),
422
- isParallel ? 'Parallel' : 'Sequential'
439
+ label
423
440
  ]
424
441
  })
425
442
  ]
@@ -427,15 +444,19 @@ function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAd
427
444
  ]
428
445
  });
429
446
  }
430
- function EmptyState({ onAddFirstChild }) {
431
- return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("button", {
432
- type: "button",
433
- onClick: onAddFirstChild,
434
- "aria-label": "Add node to loop",
435
- className: (0, apollo_wind_namespaceObject.cn)('nodrag nopan', 'pointer-events-auto flex h-8 w-8 items-center justify-center rounded-xl', 'border border-border bg-surface-overlay text-foreground', 'shadow-(--canvas-node-shadow-lifted)', 'transition-colors', 'hover:bg-surface-hover hover:border-brand'),
436
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
437
- icon: "plus",
438
- size: 14
447
+ function EmptyState({ label, onAddFirstChild }) {
448
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
449
+ content: label,
450
+ placement: "top",
451
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("button", {
452
+ type: "button",
453
+ onClick: onAddFirstChild,
454
+ "aria-label": label,
455
+ className: (0, apollo_wind_namespaceObject.cn)('nodrag nopan', 'pointer-events-auto flex h-8 w-8 items-center justify-center rounded-xl', 'border border-border bg-surface-overlay text-foreground', 'shadow-(--canvas-node-shadow-lifted)', 'transition-colors', 'hover:bg-surface-hover hover:border-brand'),
456
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
457
+ icon: "plus",
458
+ size: 14
459
+ })
439
460
  })
440
461
  });
441
462
  }
@@ -1 +1 @@
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,2CAoQ9C;AAED,eAAO,MAAM,QAAQ,+DAA0B,CAAC"}
1
+ {"version":3,"file":"LoopNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.tsx"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAqI1E,iBAAS,iBAAiB,CAAC,KAAK,EAAE,aAAa,2CA6Q9C;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 { useSafeLingui } from "../../../i18n/index.js";
6
7
  import { NODE_BADGE_INSET_SQUARE, NODE_BADGE_SIZE } from "../../constants.js";
7
8
  import { useOptionalNodeTypeRegistry } from "../../core/index.js";
8
9
  import { useElementValidationStatus, useNodeExecutionState } from "../../hooks/index.js";
@@ -19,11 +20,11 @@ import { BaseBadgeSlot } from "../BaseNode/BaseNodeBadgeSlot.js";
19
20
  import { getStatusBorder } from "../BaseNode/BaseNodeContainer.js";
20
21
  import { MissingManifestNode } from "../BaseNode/BaseNodeMissingManifest.js";
21
22
  import { ButtonHandles } from "../ButtonHandle/index.js";
23
+ import { CanvasTooltip } from "../CanvasTooltip.js";
22
24
  import { NodeToolbar } from "../Toolbar/index.js";
23
25
  import { IterationNavigator } from "./IterationNavigator.js";
24
26
  import { resolveContainerHandleGroups } from "./LoopNode.helpers.js";
25
27
  const DEFAULT_LOOP_ICON = 'repeat';
26
- const DEFAULT_LOOP_TITLE = 'Loop';
27
28
  const EMPTY_DATA = {};
28
29
  const LOOP_HEADER_ADORNMENT_GAP = 8;
29
30
  const LOOP_HEADER_ADORNMENT_PADDING = NODE_BADGE_INSET_SQUARE + NODE_BADGE_SIZE + LOOP_HEADER_ADORNMENT_GAP;
@@ -131,6 +132,7 @@ function resolveLoopHandleConfigurations(manifestHandleConfigurations, data) {
131
132
  function LoopNodeComponent(props) {
132
133
  const { id, type, data, selected = false, dragging = false, width = 0, height = 0, onAddFirstChild, onResize, toolbarConfig: toolbarConfigProp, adornments: adornmentsProp, executionStatusOverride, suggestionType: suggestionTypeProp, iterationState: iterationStateProp } = props;
133
134
  const nodeTypeRegistry = useOptionalNodeTypeRegistry();
135
+ const { _ } = useSafeLingui();
134
136
  const [isHovered, setIsHovered] = useState(false);
135
137
  const [isResizing, setIsResizing] = useState(false);
136
138
  const resolvedData = data ?? EMPTY_DATA;
@@ -175,9 +177,23 @@ function LoopNodeComponent(props) {
175
177
  id,
176
178
  resolvedData
177
179
  ]);
178
- const displayTitle = display.label ?? DEFAULT_LOOP_TITLE;
180
+ const displayTitle = display.label ?? _({
181
+ id: 'loop-node.title',
182
+ message: 'Loop'
183
+ });
179
184
  const displayIcon = display.icon ?? DEFAULT_LOOP_ICON;
180
185
  const isParallel = true === resolvedData.parallel;
186
+ const label = isParallel ? _({
187
+ id: 'loop-node.mode.parallel',
188
+ message: 'Parallel'
189
+ }) : _({
190
+ id: 'loop-node.mode.sequential',
191
+ message: 'Sequential'
192
+ });
193
+ const addNodeToLoopLabel = _({
194
+ id: 'loop-node.add-node',
195
+ message: 'Add node to loop'
196
+ });
181
197
  const isDropTarget = true === resolvedData.isDropTarget;
182
198
  const containerWidth = width || DEFAULT_CONTAINER_WIDTH;
183
199
  const containerHeight = height || DEFAULT_CONTAINER_HEIGHT;
@@ -302,6 +318,7 @@ function LoopNodeComponent(props) {
302
318
  icon: displayIcon,
303
319
  loading: isLoading,
304
320
  isParallel: isParallel,
321
+ label: label,
305
322
  iterationState: iterationStateProp,
306
323
  hasTopLeftAdornment: hasTopLeftAdornment,
307
324
  hasTopRightAdornment: hasTopRightAdornment
@@ -313,6 +330,7 @@ function LoopNodeComponent(props) {
313
330
  showEmptyStateButton ? /*#__PURE__*/ jsx("div", {
314
331
  className: cn('pointer-events-none absolute left-1/2 top-1/2', '-translate-x-1/2 -translate-y-1/2'),
315
332
  children: /*#__PURE__*/ jsx(EmptyState, {
333
+ label: addNodeToLoopLabel,
316
334
  onAddFirstChild: handleEmptyClick
317
335
  })
318
336
  }) : null,
@@ -340,7 +358,7 @@ function LoopNodeComponent(props) {
340
358
  });
341
359
  }
342
360
  const LoopNode = /*#__PURE__*/ memo(LoopNodeComponent);
343
- function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAdornment, hasTopRightAdornment }) {
361
+ function Header({ title, icon, loading, isParallel, label, iterationState, hasTopLeftAdornment, hasTopRightAdornment }) {
344
362
  const titleContent = loading ? /*#__PURE__*/ jsx("div", {
345
363
  className: "h-5 w-28 animate-pulse rounded bg-(--canvas-background-overlay)"
346
364
  }) : /*#__PURE__*/ jsx("span", {
@@ -361,7 +379,6 @@ function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAd
361
379
  paddingLeft: hasTopLeftAdornment ? LOOP_HEADER_ADORNMENT_PADDING : void 0,
362
380
  paddingRight: hasTopRightAdornment ? LOOP_HEADER_ADORNMENT_PADDING : void 0
363
381
  } : void 0;
364
- const executionModeIcon = isParallel ? 'columns-3' : 'rows-3';
365
382
  return /*#__PURE__*/ jsxs("div", {
366
383
  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'),
367
384
  style: headerStyle,
@@ -384,14 +401,14 @@ function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAd
384
401
  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",
385
402
  children: [
386
403
  /*#__PURE__*/ jsx("span", {
387
- className: "flex shrink-0",
404
+ className: cn('flex shrink-0', isParallel && 'rotate-90'),
388
405
  "aria-hidden": true,
389
406
  children: /*#__PURE__*/ jsx(CanvasIcon, {
390
- icon: executionModeIcon,
407
+ icon: "text-align-justify",
391
408
  size: 12
392
409
  })
393
410
  }),
394
- isParallel ? 'Parallel' : 'Sequential'
411
+ label
395
412
  ]
396
413
  })
397
414
  ]
@@ -399,15 +416,19 @@ function Header({ title, icon, loading, isParallel, iterationState, hasTopLeftAd
399
416
  ]
400
417
  });
401
418
  }
402
- function EmptyState({ onAddFirstChild }) {
403
- return /*#__PURE__*/ jsx("button", {
404
- type: "button",
405
- onClick: onAddFirstChild,
406
- "aria-label": "Add node to loop",
407
- className: cn('nodrag nopan', 'pointer-events-auto flex h-8 w-8 items-center justify-center rounded-xl', 'border border-border bg-surface-overlay text-foreground', 'shadow-(--canvas-node-shadow-lifted)', 'transition-colors', 'hover:bg-surface-hover hover:border-brand'),
408
- children: /*#__PURE__*/ jsx(CanvasIcon, {
409
- icon: "plus",
410
- size: 14
419
+ function EmptyState({ label, onAddFirstChild }) {
420
+ return /*#__PURE__*/ jsx(CanvasTooltip, {
421
+ content: label,
422
+ placement: "top",
423
+ children: /*#__PURE__*/ jsx("button", {
424
+ type: "button",
425
+ onClick: onAddFirstChild,
426
+ "aria-label": label,
427
+ className: cn('nodrag nopan', 'pointer-events-auto flex h-8 w-8 items-center justify-center rounded-xl', 'border border-border bg-surface-overlay text-foreground', 'shadow-(--canvas-node-shadow-lifted)', 'transition-colors', 'hover:bg-surface-hover hover:border-brand'),
428
+ children: /*#__PURE__*/ jsx(CanvasIcon, {
429
+ icon: "plus",
430
+ size: 14
431
+ })
411
432
  })
412
433
  });
413
434
  }
@@ -40,6 +40,7 @@ const ExecutionStatusIcon_cjs_namespaceObject = require("../ExecutionStatusIcon/
40
40
  const external_StageNode_styles_cjs_namespaceObject = require("./StageNode.styles.cjs");
41
41
  const external_StageNode_types_cjs_namespaceObject = require("./StageNode.types.cjs");
42
42
  const external_StageTitleInput_cjs_namespaceObject = require("./StageTitleInput.cjs");
43
+ const external_useExecutionStatusLabel_cjs_namespaceObject = require("./useExecutionStatusLabel.cjs");
43
44
  const external_useStageNodeLabels_cjs_namespaceObject = require("./useStageNodeLabels.cjs");
44
45
  const SLA_ICON_CONFIG = {
45
46
  warning: {
@@ -70,6 +71,7 @@ const CHIP_ICONS = {
70
71
  };
71
72
  const StageNodeHeaderInner = ({ props, isReadOnly, isException, status, handleTaskAddClick })=>{
72
73
  const labels = (0, external_useStageNodeLabels_cjs_namespaceObject.useStageNodeLabels)();
74
+ const getStatusName = (0, external_useExecutionStatusLabel_cjs_namespaceObject.useExecutionStatusLabel)();
73
75
  const { id, stageDetails, execution, onTaskAdd, onAddTaskFromToolbox, onStageTitleChange, loadingTaskIds } = props;
74
76
  const isAddTaskDisabled = (loadingTaskIds?.size ?? 0) > 0;
75
77
  const icon = stageDetails?.icon;
@@ -78,6 +80,8 @@ const StageNodeHeaderInner = ({ props, isReadOnly, isException, status, handleTa
78
80
  const slaText = execution?.stageStatus?.slaText;
79
81
  const slaIcon = execution?.stageStatus?.slaIcon;
80
82
  const slaIndicator = slaIcon ? SLA_ICON_CONFIG[slaIcon] : void 0;
83
+ const statusFallbackName = status ? getStatusName(status) : '';
84
+ const statusTooltip = statusLabel || statusFallbackName;
81
85
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_StageNode_styles_cjs_namespaceObject.StageHeader, {
82
86
  isException: isException,
83
87
  "data-testid": `stage-header-${id}`,
@@ -106,13 +110,13 @@ const StageNodeHeaderInner = ({ props, isReadOnly, isException, status, handleTa
106
110
  py: apollo_core_namespaceObject.Padding.PadS,
107
111
  children: [
108
112
  status && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
109
- content: statusLabel,
113
+ content: statusTooltip,
110
114
  placement: "top",
111
115
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(apollo_wind_namespaceObject.Button, {
112
116
  variant: "ghost",
113
117
  size: "icon",
114
118
  className: "h-6 w-6",
115
- "aria-label": statusLabel,
119
+ "aria-label": statusTooltip,
116
120
  children: 'NotExecuted' === status ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
117
121
  icon: "hourglass",
118
122
  size: 20,
@@ -1 +1 @@
1
- {"version":3,"file":"StageNodeHeader.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNodeHeader.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAgB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAqJnF,eAAO,MAAM,eAAe,wGAxHzB;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,kBAAkB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CACvD,6CAkHwD,CAAC"}
1
+ {"version":3,"file":"StageNodeHeader.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNodeHeader.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAgB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAyJnF,eAAO,MAAM,eAAe,wGA3HzB;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,kBAAkB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CACvD,6CAqHwD,CAAC"}
@@ -12,6 +12,7 @@ import { getExecutionStatusColor } from "../ExecutionStatusIcon/ExecutionStatusI
12
12
  import { StageChip, StageHeader } from "./StageNode.styles.js";
13
13
  import { StageHeaderChipType } from "./StageNode.types.js";
14
14
  import { StageTitleInput } from "./StageTitleInput.js";
15
+ import { useExecutionStatusLabel } from "./useExecutionStatusLabel.js";
15
16
  import { useStageNodeLabels } from "./useStageNodeLabels.js";
16
17
  const SLA_ICON_CONFIG = {
17
18
  warning: {
@@ -42,6 +43,7 @@ const CHIP_ICONS = {
42
43
  };
43
44
  const StageNodeHeaderInner = ({ props, isReadOnly, isException, status, handleTaskAddClick })=>{
44
45
  const labels = useStageNodeLabels();
46
+ const getStatusName = useExecutionStatusLabel();
45
47
  const { id, stageDetails, execution, onTaskAdd, onAddTaskFromToolbox, onStageTitleChange, loadingTaskIds } = props;
46
48
  const isAddTaskDisabled = (loadingTaskIds?.size ?? 0) > 0;
47
49
  const icon = stageDetails?.icon;
@@ -50,6 +52,8 @@ const StageNodeHeaderInner = ({ props, isReadOnly, isException, status, handleTa
50
52
  const slaText = execution?.stageStatus?.slaText;
51
53
  const slaIcon = execution?.stageStatus?.slaIcon;
52
54
  const slaIndicator = slaIcon ? SLA_ICON_CONFIG[slaIcon] : void 0;
55
+ const statusFallbackName = status ? getStatusName(status) : '';
56
+ const statusTooltip = statusLabel || statusFallbackName;
53
57
  return /*#__PURE__*/ jsxs(StageHeader, {
54
58
  isException: isException,
55
59
  "data-testid": `stage-header-${id}`,
@@ -78,13 +82,13 @@ const StageNodeHeaderInner = ({ props, isReadOnly, isException, status, handleTa
78
82
  py: Padding.PadS,
79
83
  children: [
80
84
  status && /*#__PURE__*/ jsx(CanvasTooltip, {
81
- content: statusLabel,
85
+ content: statusTooltip,
82
86
  placement: "top",
83
87
  children: /*#__PURE__*/ jsx(Button, {
84
88
  variant: "ghost",
85
89
  size: "icon",
86
90
  className: "h-6 w-6",
87
- "aria-label": statusLabel,
91
+ "aria-label": statusTooltip,
88
92
  children: 'NotExecuted' === status ? /*#__PURE__*/ jsx(CanvasIcon, {
89
93
  icon: "hourglass",
90
94
  size: 20,
@@ -47,6 +47,7 @@ const external_CanvasTooltip_cjs_namespaceObject = require("../CanvasTooltip.cjs
47
47
  const external_ExecutionStatusIcon_index_cjs_namespaceObject = require("../ExecutionStatusIcon/index.cjs");
48
48
  const external_StageNode_styles_cjs_namespaceObject = require("./StageNode.styles.cjs");
49
49
  const external_StageTaskEntryConditionIcon_cjs_namespaceObject = require("./StageTaskEntryConditionIcon.cjs");
50
+ const external_useExecutionStatusLabel_cjs_namespaceObject = require("./useExecutionStatusLabel.cjs");
50
51
  const ProcessCanvasIcon = ()=>/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("svg", {
51
52
  viewBox: "0 0 24 24",
52
53
  fill: "none",
@@ -147,9 +148,12 @@ const TaskPlayButton = /*#__PURE__*/ (0, external_react_namespaceObject.memo)(({
147
148
  });
148
149
  });
149
150
  const TaskContent = /*#__PURE__*/ (0, external_react_namespaceObject.memo)(({ task, taskExecution, isDragging, onTaskPlay })=>{
151
+ const getStatusName = (0, external_useExecutionStatusLabel_cjs_namespaceObject.useExecutionStatusLabel)();
150
152
  const hasExecutionStatus = !!taskExecution?.status;
151
153
  const hasSecondRowContent = taskExecution && (taskExecution.duration || taskExecution.retryDuration || taskExecution.badge);
152
154
  const showPlayButtonSmall = onTaskPlay && hasExecutionStatus;
155
+ const taskStatusFallbackName = hasExecutionStatus ? getStatusName(taskExecution?.status) : '';
156
+ const taskStatusTooltip = taskExecution?.message || taskStatusFallbackName;
153
157
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(index_cjs_namespaceObject.Column, {
154
158
  flex: 1,
155
159
  style: {
@@ -196,21 +200,19 @@ const TaskContent = /*#__PURE__*/ (0, external_react_namespaceObject.memo)(({ ta
196
200
  flexShrink: 0
197
201
  },
198
202
  children: [
199
- hasExecutionStatus && (taskExecution.message ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
200
- content: taskExecution.message,
203
+ hasExecutionStatus && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
204
+ content: taskStatusTooltip,
201
205
  placement: "top",
202
206
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(apollo_wind_namespaceObject.Button, {
203
207
  variant: "ghost",
204
208
  size: "icon",
205
209
  className: "h-4 w-4",
206
- "aria-label": taskExecution.message,
210
+ "aria-label": taskStatusTooltip,
207
211
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_ExecutionStatusIcon_index_cjs_namespaceObject.ExecutionStatusIcon, {
208
212
  status: taskExecution.status
209
213
  })
210
214
  })
211
- }) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_ExecutionStatusIcon_index_cjs_namespaceObject.ExecutionStatusIcon, {
212
- status: taskExecution.status
213
- })),
215
+ }),
214
216
  !hasSecondRowContent && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_StageTaskEntryConditionIcon_cjs_namespaceObject.StageTaskEntryConditionIcon, {
215
217
  task: task,
216
218
  small: !!hasExecutionStatus
@@ -1 +1 @@
1
- {"version":3,"file":"TaskContent.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/TaskContent.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AA+F3E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,WAAW,wFAC4B,gBAAgB,6CAqFnE,CAAC"}
1
+ {"version":3,"file":"TaskContent.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/TaskContent.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAgG3E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,WAAW,wFAC4B,gBAAgB,6CAqFnE,CAAC"}
@@ -9,6 +9,7 @@ import { CanvasTooltip } from "../CanvasTooltip.js";
9
9
  import { ExecutionStatusIcon } from "../ExecutionStatusIcon/index.js";
10
10
  import { StageTaskIcon, StageTaskRetryDuration } from "./StageNode.styles.js";
11
11
  import { StageTaskEntryConditionIcon } from "./StageTaskEntryConditionIcon.js";
12
+ import { useExecutionStatusLabel } from "./useExecutionStatusLabel.js";
12
13
  const ProcessCanvasIcon = ()=>/*#__PURE__*/ jsxs("svg", {
13
14
  viewBox: "0 0 24 24",
14
15
  fill: "none",
@@ -109,9 +110,12 @@ const TaskPlayButton = /*#__PURE__*/ memo(({ taskId, onTaskPlay, small })=>{
109
110
  });
110
111
  });
111
112
  const TaskContent = /*#__PURE__*/ memo(({ task, taskExecution, isDragging, onTaskPlay })=>{
113
+ const getStatusName = useExecutionStatusLabel();
112
114
  const hasExecutionStatus = !!taskExecution?.status;
113
115
  const hasSecondRowContent = taskExecution && (taskExecution.duration || taskExecution.retryDuration || taskExecution.badge);
114
116
  const showPlayButtonSmall = onTaskPlay && hasExecutionStatus;
117
+ const taskStatusFallbackName = hasExecutionStatus ? getStatusName(taskExecution?.status) : '';
118
+ const taskStatusTooltip = taskExecution?.message || taskStatusFallbackName;
115
119
  return /*#__PURE__*/ jsxs(Column, {
116
120
  flex: 1,
117
121
  style: {
@@ -158,21 +162,19 @@ const TaskContent = /*#__PURE__*/ memo(({ task, taskExecution, isDragging, onTas
158
162
  flexShrink: 0
159
163
  },
160
164
  children: [
161
- hasExecutionStatus && (taskExecution.message ? /*#__PURE__*/ jsx(CanvasTooltip, {
162
- content: taskExecution.message,
165
+ hasExecutionStatus && /*#__PURE__*/ jsx(CanvasTooltip, {
166
+ content: taskStatusTooltip,
163
167
  placement: "top",
164
168
  children: /*#__PURE__*/ jsx(Button, {
165
169
  variant: "ghost",
166
170
  size: "icon",
167
171
  className: "h-4 w-4",
168
- "aria-label": taskExecution.message,
172
+ "aria-label": taskStatusTooltip,
169
173
  children: /*#__PURE__*/ jsx(ExecutionStatusIcon, {
170
174
  status: taskExecution.status
171
175
  })
172
176
  })
173
- }) : /*#__PURE__*/ jsx(ExecutionStatusIcon, {
174
- status: taskExecution.status
175
- })),
177
+ }),
176
178
  !hasSecondRowContent && /*#__PURE__*/ jsx(StageTaskEntryConditionIcon, {
177
179
  task: task,
178
180
  small: !!hasExecutionStatus