@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
@@ -38,6 +38,18 @@ const external_ExecutionStatusIcon_index_cjs_namespaceObject = require("../Execu
38
38
  const ExecutionStatusIcon_cjs_namespaceObject = require("../ExecutionStatusIcon/ExecutionStatusIcon.cjs");
39
39
  const external_StageNode_styles_cjs_namespaceObject = require("./StageNode.styles.cjs");
40
40
  const external_StageNode_types_cjs_namespaceObject = require("./StageNode.types.cjs");
41
+ const external_StageTitleInput_cjs_namespaceObject = require("./StageTitleInput.cjs");
42
+ const external_useStageNodeLabels_cjs_namespaceObject = require("./useStageNodeLabels.cjs");
43
+ const SLA_ICON_CONFIG = {
44
+ warning: {
45
+ icon: 'triangle-alert',
46
+ iconColor: 'var(--canvas-warning-icon)'
47
+ },
48
+ error: {
49
+ icon: 'circle-alert',
50
+ iconColor: 'var(--canvas-error-icon)'
51
+ }
52
+ };
41
53
  const CHIP_ICONS = {
42
54
  [external_StageNode_types_cjs_namespaceObject.StageHeaderChipType.Entry]: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_icons_index_cjs_namespaceObject.EntryConditionIcon, {
43
55
  w: apollo_core_namespaceObject.Icon.IconXs,
@@ -61,183 +73,126 @@ const CHIP_ICONS = {
61
73
  })
62
74
  };
63
75
  const StageNodeHeaderInner = ({ props, isReadOnly, isException, status, handleTaskAddClick })=>{
64
- const { id, stageDetails, execution, addTaskLabel = 'Add task', onTaskAdd, onAddTaskFromToolbox, onStageTitleChange, loadingTaskIds } = props;
76
+ const labels = (0, external_useStageNodeLabels_cjs_namespaceObject.useStageNodeLabels)();
77
+ const { id, stageDetails, execution, onTaskAdd, onAddTaskFromToolbox, onStageTitleChange, loadingTaskIds } = props;
65
78
  const isAddTaskDisabled = (loadingTaskIds?.size ?? 0) > 0;
66
79
  const icon = stageDetails?.icon;
67
80
  const statusLabel = execution?.stageStatus?.label;
68
81
  const stageDuration = execution?.stageStatus?.duration;
69
- const isStageTitleEditable = !!onStageTitleChange && !isReadOnly;
70
- const [isStageTitleEditing, setIsStageTitleEditing] = (0, external_react_namespaceObject.useState)(false);
71
- const stageTitleRef = (0, external_react_namespaceObject.useRef)(null);
72
- const [label, setLabel] = (0, external_react_namespaceObject.useState)(props.stageDetails.label);
73
- (0, external_react_namespaceObject.useEffect)(()=>{
74
- setLabel(props.stageDetails.label);
75
- }, [
76
- props.stageDetails.label
77
- ]);
78
- const handleStageTitleChange = (0, external_react_namespaceObject.useCallback)((e)=>{
79
- setIsStageTitleEditing(true);
80
- setLabel(e.target.value);
81
- }, []);
82
- const handleStageTitleClickToSave = (0, external_react_namespaceObject.useCallback)((e)=>{
83
- if (isStageTitleEditing && !stageTitleRef.current?.contains(e.target)) {
84
- setIsStageTitleEditing(false);
85
- if (onStageTitleChange) {
86
- if ('' === label.trim()) setLabel('Untitled Stage');
87
- onStageTitleChange(label);
88
- }
89
- }
90
- }, [
91
- isStageTitleEditing,
92
- onStageTitleChange,
93
- label
94
- ]);
95
- (0, external_react_namespaceObject.useEffect)(()=>{
96
- if (isStageTitleEditing) document.addEventListener('click', handleStageTitleClickToSave);
97
- return ()=>{
98
- document.removeEventListener('click', handleStageTitleClickToSave);
99
- };
100
- }, [
101
- handleStageTitleClickToSave,
102
- isStageTitleEditing
103
- ]);
104
- const handleStageTitleBlurToSave = (0, external_react_namespaceObject.useCallback)(()=>{
105
- if (isStageTitleEditing) {
106
- setIsStageTitleEditing(false);
107
- if (onStageTitleChange) {
108
- if ('' === label.trim()) setLabel('Untitled Stage');
109
- onStageTitleChange(label);
110
- }
111
- }
112
- }, [
113
- isStageTitleEditing,
114
- onStageTitleChange,
115
- label
116
- ]);
117
- const handleStageTitleKeyDown = (0, external_react_namespaceObject.useCallback)((e)=>{
118
- if ('Enter' === e.key) {
119
- setIsStageTitleEditing(false);
120
- if (onStageTitleChange) onStageTitleChange(label);
121
- }
122
- if ('Escape' !== e.key) e.stopPropagation();
123
- }, [
124
- onStageTitleChange,
125
- label
126
- ]);
82
+ const slaText = execution?.stageStatus?.slaText;
83
+ const slaIcon = execution?.stageStatus?.slaIcon;
84
+ const slaIndicator = slaIcon ? SLA_ICON_CONFIG[slaIcon] : void 0;
127
85
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_StageNode_styles_cjs_namespaceObject.StageHeader, {
128
86
  isException: isException,
129
87
  "data-testid": `stage-header-${id}`,
130
88
  children: [
131
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(index_cjs_namespaceObject.Row, {
132
- gap: apollo_core_namespaceObject.Spacing.SpacingMicro,
133
- align: "center",
134
- flex: 1,
135
- minW: 0,
89
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
90
+ className: "flex items-start justify-between gap-1",
136
91
  children: [
137
- icon,
138
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(index_cjs_namespaceObject.Column, {
139
- py: 2,
92
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(index_cjs_namespaceObject.Row, {
93
+ gap: apollo_core_namespaceObject.Spacing.SpacingMicro,
94
+ align: "center",
140
95
  flex: 1,
141
96
  minW: 0,
142
97
  children: [
143
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
144
- className: (0, apollo_wind_namespaceObject.cn)('text-sm', !isStageTitleEditing && 'font-bold'),
145
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
146
- content: label,
147
- placement: "top",
148
- delay: true,
149
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_StageNode_styles_cjs_namespaceObject.StageTitleContainer, {
150
- isEditing: isStageTitleEditing,
151
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_StageNode_styles_cjs_namespaceObject.StageTitleInput, {
152
- name: "Stage Title",
153
- isStageTitleEditable: isStageTitleEditable,
154
- value: label,
155
- ref: stageTitleRef,
156
- isEditing: isStageTitleEditing,
157
- ...onStageTitleChange && {
158
- onFocus: ()=>setIsStageTitleEditing(true),
159
- onInput: handleStageTitleChange,
160
- onKeyDown: handleStageTitleKeyDown,
161
- onBlur: handleStageTitleBlurToSave
162
- },
163
- readOnly: !isStageTitleEditable
164
- })
98
+ icon,
99
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_StageTitleInput_cjs_namespaceObject.StageTitleInput, {
100
+ label: stageDetails.label,
101
+ onChange: isReadOnly ? void 0 : onStageTitleChange,
102
+ className: "flex-1 min-w-0"
103
+ })
104
+ ]
105
+ }),
106
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(index_cjs_namespaceObject.Row, {
107
+ gap: apollo_core_namespaceObject.Spacing.SpacingMicro,
108
+ align: "start",
109
+ py: apollo_core_namespaceObject.Padding.PadS,
110
+ children: [
111
+ status && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
112
+ content: statusLabel,
113
+ placement: "top",
114
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(apollo_wind_namespaceObject.Button, {
115
+ variant: "ghost",
116
+ size: "icon",
117
+ className: "h-6 w-6",
118
+ "aria-label": statusLabel,
119
+ children: 'NotExecuted' === status ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
120
+ icon: "hourglass",
121
+ size: 20,
122
+ color: (0, ExecutionStatusIcon_cjs_namespaceObject.getExecutionStatusColor)('NotExecuted')
123
+ }) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_ExecutionStatusIcon_index_cjs_namespaceObject.ExecutionStatusIcon, {
124
+ status: status,
125
+ size: 20
165
126
  })
166
127
  })
167
128
  }),
168
- stageDuration && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
169
- className: "text-xs text-foreground-muted",
170
- children: stageDuration
171
- }),
172
- stageDetails.headerChips && stageDetails.headerChips.length > 0 && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_StageNode_styles_cjs_namespaceObject.StageHeaderChipsRow, {
173
- children: stageDetails.headerChips.map((chip)=>{
174
- const button = /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_StageNode_styles_cjs_namespaceObject.StageChip, {
175
- type: "button",
176
- "aria-label": 'string' == typeof chip.tooltip ? chip.tooltip : chip.type,
177
- onClick: (e)=>{
178
- e.stopPropagation();
179
- chip.onClick?.();
180
- },
181
- children: [
182
- CHIP_ICONS[chip.type],
183
- void 0 !== chip.count && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
184
- className: "text-xs",
185
- children: chip.count
186
- })
187
- ]
188
- }, chip.type);
189
- if (chip.tooltip) return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
190
- placement: "bottom",
191
- content: chip.tooltip,
192
- children: button
193
- }, chip.type);
194
- return button;
129
+ (onTaskAdd || onAddTaskFromToolbox) && !isReadOnly && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
130
+ content: labels.addTask,
131
+ placement: "top",
132
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(apollo_wind_namespaceObject.Button, {
133
+ variant: "ghost",
134
+ size: "icon",
135
+ className: "h-6 w-6",
136
+ onClick: handleTaskAddClick,
137
+ "aria-label": labels.addTask,
138
+ disabled: isAddTaskDisabled,
139
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
140
+ icon: "plus",
141
+ size: 20
142
+ })
195
143
  })
196
144
  })
197
145
  ]
198
146
  })
199
147
  ]
200
148
  }),
201
- /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(index_cjs_namespaceObject.Row, {
202
- gap: apollo_core_namespaceObject.Spacing.SpacingMicro,
203
- align: "start",
204
- py: apollo_core_namespaceObject.Padding.PadS,
149
+ (slaText || stageDetails.headerChips && stageDetails.headerChips.length > 0) && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
150
+ className: "mt-1 flex flex-wrap items-center justify-between gap-2",
205
151
  children: [
206
- status && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
207
- content: statusLabel,
208
- placement: "top",
209
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(apollo_wind_namespaceObject.Button, {
210
- variant: "ghost",
211
- size: "icon",
212
- className: "h-6 w-6",
213
- "aria-label": statusLabel,
214
- children: 'NotExecuted' === status ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
215
- icon: "hourglass",
216
- size: 20,
217
- color: (0, ExecutionStatusIcon_cjs_namespaceObject.getExecutionStatusColor)('NotExecuted')
218
- }) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_ExecutionStatusIcon_index_cjs_namespaceObject.ExecutionStatusIcon, {
219
- status: status,
220
- size: 20
221
- })
222
- })
152
+ slaText && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("span", {
153
+ className: "inline-flex items-center gap-1 text-xs text-foreground-muted",
154
+ "data-testid": `stage-sla-${id}`,
155
+ "data-sla-icon": slaIcon,
156
+ children: [
157
+ slaIndicator && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
158
+ icon: slaIndicator.icon,
159
+ size: 16,
160
+ color: slaIndicator.iconColor
161
+ }),
162
+ slaText
163
+ ]
223
164
  }),
224
- (onTaskAdd || onAddTaskFromToolbox) && !isReadOnly && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
225
- content: addTaskLabel,
226
- placement: "top",
227
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(apollo_wind_namespaceObject.Button, {
228
- variant: "ghost",
229
- size: "icon",
230
- className: "h-6 w-6",
231
- onClick: handleTaskAddClick,
232
- "aria-label": addTaskLabel,
233
- disabled: isAddTaskDisabled,
234
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(icon_registry_cjs_namespaceObject.CanvasIcon, {
235
- icon: "plus",
236
- size: 20
237
- })
165
+ stageDetails.headerChips && stageDetails.headerChips.length > 0 && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
166
+ className: "flex flex-wrap items-center gap-1",
167
+ children: stageDetails.headerChips.map((chip)=>{
168
+ const button = /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(external_StageNode_styles_cjs_namespaceObject.StageChip, {
169
+ type: "button",
170
+ "aria-label": 'string' == typeof chip.tooltip ? chip.tooltip : chip.type,
171
+ onClick: (e)=>{
172
+ e.stopPropagation();
173
+ chip.onClick?.();
174
+ },
175
+ children: [
176
+ CHIP_ICONS[chip.type],
177
+ void 0 !== chip.count && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
178
+ className: "text-xs",
179
+ children: chip.count
180
+ })
181
+ ]
182
+ }, chip.type);
183
+ if (chip.tooltip) return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_CanvasTooltip_cjs_namespaceObject.CanvasTooltip, {
184
+ placement: "bottom",
185
+ content: chip.tooltip,
186
+ children: button
187
+ }, chip.type);
188
+ return button;
238
189
  })
239
190
  })
240
191
  ]
192
+ }),
193
+ stageDuration && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
194
+ className: "mt-1 text-xs text-foreground-muted",
195
+ children: stageDuration
241
196
  })
242
197
  ]
243
198
  });
@@ -1 +1 @@
1
- {"version":3,"file":"StageNodeHeader.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNodeHeader.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAoMrE,eAAO,MAAM,eAAe,wGAnLzB;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,6CA6KwD,CAAC"}
1
+ {"version":3,"file":"StageNodeHeader.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNodeHeader.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAgB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAqJnF,eAAO,MAAM,eAAe,wGAvHzB;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,6CAiHwD,CAAC"}
@@ -1,15 +1,27 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { Icon, Padding, Spacing } from "@uipath/apollo-core";
3
- import { Column, Row } from "../../layouts/index.js";
4
- import { Button, cn } from "@uipath/apollo-wind";
5
- import { memo, useCallback, useEffect, useRef, useState } from "react";
3
+ import { Row } from "../../layouts/index.js";
4
+ import { Button } from "@uipath/apollo-wind";
5
+ import { memo } from "react";
6
6
  import { EntryConditionIcon, ExitConditionIcon, ReturnToOriginIcon } from "../../icons/index.js";
7
7
  import { CanvasIcon } from "../../utils/icon-registry.js";
8
8
  import { CanvasTooltip } from "../CanvasTooltip.js";
9
9
  import { ExecutionStatusIcon } from "../ExecutionStatusIcon/index.js";
10
10
  import { getExecutionStatusColor } from "../ExecutionStatusIcon/ExecutionStatusIcon.js";
11
- import { StageChip, StageHeader, StageHeaderChipsRow, StageTitleContainer, StageTitleInput } from "./StageNode.styles.js";
11
+ import { StageChip, StageHeader } from "./StageNode.styles.js";
12
12
  import { StageHeaderChipType } from "./StageNode.types.js";
13
+ import { StageTitleInput } from "./StageTitleInput.js";
14
+ import { useStageNodeLabels } from "./useStageNodeLabels.js";
15
+ const SLA_ICON_CONFIG = {
16
+ warning: {
17
+ icon: 'triangle-alert',
18
+ iconColor: 'var(--canvas-warning-icon)'
19
+ },
20
+ error: {
21
+ icon: 'circle-alert',
22
+ iconColor: 'var(--canvas-error-icon)'
23
+ }
24
+ };
13
25
  const CHIP_ICONS = {
14
26
  [StageHeaderChipType.Entry]: /*#__PURE__*/ jsx(EntryConditionIcon, {
15
27
  w: Icon.IconXs,
@@ -33,183 +45,126 @@ const CHIP_ICONS = {
33
45
  })
34
46
  };
35
47
  const StageNodeHeaderInner = ({ props, isReadOnly, isException, status, handleTaskAddClick })=>{
36
- const { id, stageDetails, execution, addTaskLabel = 'Add task', onTaskAdd, onAddTaskFromToolbox, onStageTitleChange, loadingTaskIds } = props;
48
+ const labels = useStageNodeLabels();
49
+ const { id, stageDetails, execution, onTaskAdd, onAddTaskFromToolbox, onStageTitleChange, loadingTaskIds } = props;
37
50
  const isAddTaskDisabled = (loadingTaskIds?.size ?? 0) > 0;
38
51
  const icon = stageDetails?.icon;
39
52
  const statusLabel = execution?.stageStatus?.label;
40
53
  const stageDuration = execution?.stageStatus?.duration;
41
- const isStageTitleEditable = !!onStageTitleChange && !isReadOnly;
42
- const [isStageTitleEditing, setIsStageTitleEditing] = useState(false);
43
- const stageTitleRef = useRef(null);
44
- const [label, setLabel] = useState(props.stageDetails.label);
45
- useEffect(()=>{
46
- setLabel(props.stageDetails.label);
47
- }, [
48
- props.stageDetails.label
49
- ]);
50
- const handleStageTitleChange = useCallback((e)=>{
51
- setIsStageTitleEditing(true);
52
- setLabel(e.target.value);
53
- }, []);
54
- const handleStageTitleClickToSave = useCallback((e)=>{
55
- if (isStageTitleEditing && !stageTitleRef.current?.contains(e.target)) {
56
- setIsStageTitleEditing(false);
57
- if (onStageTitleChange) {
58
- if ('' === label.trim()) setLabel('Untitled Stage');
59
- onStageTitleChange(label);
60
- }
61
- }
62
- }, [
63
- isStageTitleEditing,
64
- onStageTitleChange,
65
- label
66
- ]);
67
- useEffect(()=>{
68
- if (isStageTitleEditing) document.addEventListener('click', handleStageTitleClickToSave);
69
- return ()=>{
70
- document.removeEventListener('click', handleStageTitleClickToSave);
71
- };
72
- }, [
73
- handleStageTitleClickToSave,
74
- isStageTitleEditing
75
- ]);
76
- const handleStageTitleBlurToSave = useCallback(()=>{
77
- if (isStageTitleEditing) {
78
- setIsStageTitleEditing(false);
79
- if (onStageTitleChange) {
80
- if ('' === label.trim()) setLabel('Untitled Stage');
81
- onStageTitleChange(label);
82
- }
83
- }
84
- }, [
85
- isStageTitleEditing,
86
- onStageTitleChange,
87
- label
88
- ]);
89
- const handleStageTitleKeyDown = useCallback((e)=>{
90
- if ('Enter' === e.key) {
91
- setIsStageTitleEditing(false);
92
- if (onStageTitleChange) onStageTitleChange(label);
93
- }
94
- if ('Escape' !== e.key) e.stopPropagation();
95
- }, [
96
- onStageTitleChange,
97
- label
98
- ]);
54
+ const slaText = execution?.stageStatus?.slaText;
55
+ const slaIcon = execution?.stageStatus?.slaIcon;
56
+ const slaIndicator = slaIcon ? SLA_ICON_CONFIG[slaIcon] : void 0;
99
57
  return /*#__PURE__*/ jsxs(StageHeader, {
100
58
  isException: isException,
101
59
  "data-testid": `stage-header-${id}`,
102
60
  children: [
103
- /*#__PURE__*/ jsxs(Row, {
104
- gap: Spacing.SpacingMicro,
105
- align: "center",
106
- flex: 1,
107
- minW: 0,
61
+ /*#__PURE__*/ jsxs("div", {
62
+ className: "flex items-start justify-between gap-1",
108
63
  children: [
109
- icon,
110
- /*#__PURE__*/ jsxs(Column, {
111
- py: 2,
64
+ /*#__PURE__*/ jsxs(Row, {
65
+ gap: Spacing.SpacingMicro,
66
+ align: "center",
112
67
  flex: 1,
113
68
  minW: 0,
114
69
  children: [
115
- /*#__PURE__*/ jsx("span", {
116
- className: cn('text-sm', !isStageTitleEditing && 'font-bold'),
117
- children: /*#__PURE__*/ jsx(CanvasTooltip, {
118
- content: label,
119
- placement: "top",
120
- delay: true,
121
- children: /*#__PURE__*/ jsx(StageTitleContainer, {
122
- isEditing: isStageTitleEditing,
123
- children: /*#__PURE__*/ jsx(StageTitleInput, {
124
- name: "Stage Title",
125
- isStageTitleEditable: isStageTitleEditable,
126
- value: label,
127
- ref: stageTitleRef,
128
- isEditing: isStageTitleEditing,
129
- ...onStageTitleChange && {
130
- onFocus: ()=>setIsStageTitleEditing(true),
131
- onInput: handleStageTitleChange,
132
- onKeyDown: handleStageTitleKeyDown,
133
- onBlur: handleStageTitleBlurToSave
134
- },
135
- readOnly: !isStageTitleEditable
136
- })
70
+ icon,
71
+ /*#__PURE__*/ jsx(StageTitleInput, {
72
+ label: stageDetails.label,
73
+ onChange: isReadOnly ? void 0 : onStageTitleChange,
74
+ className: "flex-1 min-w-0"
75
+ })
76
+ ]
77
+ }),
78
+ /*#__PURE__*/ jsxs(Row, {
79
+ gap: Spacing.SpacingMicro,
80
+ align: "start",
81
+ py: Padding.PadS,
82
+ children: [
83
+ status && /*#__PURE__*/ jsx(CanvasTooltip, {
84
+ content: statusLabel,
85
+ placement: "top",
86
+ children: /*#__PURE__*/ jsx(Button, {
87
+ variant: "ghost",
88
+ size: "icon",
89
+ className: "h-6 w-6",
90
+ "aria-label": statusLabel,
91
+ children: 'NotExecuted' === status ? /*#__PURE__*/ jsx(CanvasIcon, {
92
+ icon: "hourglass",
93
+ size: 20,
94
+ color: getExecutionStatusColor('NotExecuted')
95
+ }) : /*#__PURE__*/ jsx(ExecutionStatusIcon, {
96
+ status: status,
97
+ size: 20
137
98
  })
138
99
  })
139
100
  }),
140
- stageDuration && /*#__PURE__*/ jsx("span", {
141
- className: "text-xs text-foreground-muted",
142
- children: stageDuration
143
- }),
144
- stageDetails.headerChips && stageDetails.headerChips.length > 0 && /*#__PURE__*/ jsx(StageHeaderChipsRow, {
145
- children: stageDetails.headerChips.map((chip)=>{
146
- const button = /*#__PURE__*/ jsxs(StageChip, {
147
- type: "button",
148
- "aria-label": 'string' == typeof chip.tooltip ? chip.tooltip : chip.type,
149
- onClick: (e)=>{
150
- e.stopPropagation();
151
- chip.onClick?.();
152
- },
153
- children: [
154
- CHIP_ICONS[chip.type],
155
- void 0 !== chip.count && /*#__PURE__*/ jsx("span", {
156
- className: "text-xs",
157
- children: chip.count
158
- })
159
- ]
160
- }, chip.type);
161
- if (chip.tooltip) return /*#__PURE__*/ jsx(CanvasTooltip, {
162
- placement: "bottom",
163
- content: chip.tooltip,
164
- children: button
165
- }, chip.type);
166
- return button;
101
+ (onTaskAdd || onAddTaskFromToolbox) && !isReadOnly && /*#__PURE__*/ jsx(CanvasTooltip, {
102
+ content: labels.addTask,
103
+ placement: "top",
104
+ children: /*#__PURE__*/ jsx(Button, {
105
+ variant: "ghost",
106
+ size: "icon",
107
+ className: "h-6 w-6",
108
+ onClick: handleTaskAddClick,
109
+ "aria-label": labels.addTask,
110
+ disabled: isAddTaskDisabled,
111
+ children: /*#__PURE__*/ jsx(CanvasIcon, {
112
+ icon: "plus",
113
+ size: 20
114
+ })
167
115
  })
168
116
  })
169
117
  ]
170
118
  })
171
119
  ]
172
120
  }),
173
- /*#__PURE__*/ jsxs(Row, {
174
- gap: Spacing.SpacingMicro,
175
- align: "start",
176
- py: Padding.PadS,
121
+ (slaText || stageDetails.headerChips && stageDetails.headerChips.length > 0) && /*#__PURE__*/ jsxs("div", {
122
+ className: "mt-1 flex flex-wrap items-center justify-between gap-2",
177
123
  children: [
178
- status && /*#__PURE__*/ jsx(CanvasTooltip, {
179
- content: statusLabel,
180
- placement: "top",
181
- children: /*#__PURE__*/ jsx(Button, {
182
- variant: "ghost",
183
- size: "icon",
184
- className: "h-6 w-6",
185
- "aria-label": statusLabel,
186
- children: 'NotExecuted' === status ? /*#__PURE__*/ jsx(CanvasIcon, {
187
- icon: "hourglass",
188
- size: 20,
189
- color: getExecutionStatusColor('NotExecuted')
190
- }) : /*#__PURE__*/ jsx(ExecutionStatusIcon, {
191
- status: status,
192
- size: 20
193
- })
194
- })
124
+ slaText && /*#__PURE__*/ jsxs("span", {
125
+ className: "inline-flex items-center gap-1 text-xs text-foreground-muted",
126
+ "data-testid": `stage-sla-${id}`,
127
+ "data-sla-icon": slaIcon,
128
+ children: [
129
+ slaIndicator && /*#__PURE__*/ jsx(CanvasIcon, {
130
+ icon: slaIndicator.icon,
131
+ size: 16,
132
+ color: slaIndicator.iconColor
133
+ }),
134
+ slaText
135
+ ]
195
136
  }),
196
- (onTaskAdd || onAddTaskFromToolbox) && !isReadOnly && /*#__PURE__*/ jsx(CanvasTooltip, {
197
- content: addTaskLabel,
198
- placement: "top",
199
- children: /*#__PURE__*/ jsx(Button, {
200
- variant: "ghost",
201
- size: "icon",
202
- className: "h-6 w-6",
203
- onClick: handleTaskAddClick,
204
- "aria-label": addTaskLabel,
205
- disabled: isAddTaskDisabled,
206
- children: /*#__PURE__*/ jsx(CanvasIcon, {
207
- icon: "plus",
208
- size: 20
209
- })
137
+ stageDetails.headerChips && stageDetails.headerChips.length > 0 && /*#__PURE__*/ jsx("div", {
138
+ className: "flex flex-wrap items-center gap-1",
139
+ children: stageDetails.headerChips.map((chip)=>{
140
+ const button = /*#__PURE__*/ jsxs(StageChip, {
141
+ type: "button",
142
+ "aria-label": 'string' == typeof chip.tooltip ? chip.tooltip : chip.type,
143
+ onClick: (e)=>{
144
+ e.stopPropagation();
145
+ chip.onClick?.();
146
+ },
147
+ children: [
148
+ CHIP_ICONS[chip.type],
149
+ void 0 !== chip.count && /*#__PURE__*/ jsx("span", {
150
+ className: "text-xs",
151
+ children: chip.count
152
+ })
153
+ ]
154
+ }, chip.type);
155
+ if (chip.tooltip) return /*#__PURE__*/ jsx(CanvasTooltip, {
156
+ placement: "bottom",
157
+ content: chip.tooltip,
158
+ children: button
159
+ }, chip.type);
160
+ return button;
210
161
  })
211
162
  })
212
163
  ]
164
+ }),
165
+ stageDuration && /*#__PURE__*/ jsx("span", {
166
+ className: "mt-1 text-xs text-foreground-muted",
167
+ children: stageDuration
213
168
  })
214
169
  ]
215
170
  });