@uipath/apollo-react 6.25.0 → 6.27.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 (55) hide show
  1. package/dist/canvas/components/AgentCanvas/AgentFlow.cjs +4 -3
  2. package/dist/canvas/components/AgentCanvas/AgentFlow.d.ts.map +1 -1
  3. package/dist/canvas/components/AgentCanvas/AgentFlow.js +4 -3
  4. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.cjs +13 -9
  5. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.d.ts.map +1 -1
  6. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.js +13 -9
  7. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.styles.cjs +1 -1
  8. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.styles.d.ts +2 -0
  9. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.styles.d.ts.map +1 -1
  10. package/dist/canvas/components/AgentCanvas/nodes/AgentNode.styles.js +1 -1
  11. package/dist/canvas/components/BaseCanvas/BaseCanvas.cjs +15 -2
  12. package/dist/canvas/components/BaseCanvas/BaseCanvas.d.ts.map +1 -1
  13. package/dist/canvas/components/BaseCanvas/BaseCanvas.hooks.cjs +33 -1
  14. package/dist/canvas/components/BaseCanvas/BaseCanvas.hooks.d.ts +2 -1
  15. package/dist/canvas/components/BaseCanvas/BaseCanvas.hooks.d.ts.map +1 -1
  16. package/dist/canvas/components/BaseCanvas/BaseCanvas.hooks.js +31 -2
  17. package/dist/canvas/components/BaseCanvas/BaseCanvas.js +16 -3
  18. package/dist/canvas/components/BaseCanvas/BaseCanvas.types.d.ts.map +1 -1
  19. package/dist/canvas/components/BaseCanvas/index.cjs +54 -17
  20. package/dist/canvas/components/BaseCanvas/index.d.ts +1 -1
  21. package/dist/canvas/components/BaseCanvas/index.d.ts.map +1 -1
  22. package/dist/canvas/components/BaseCanvas/index.js +2 -2
  23. package/dist/canvas/components/BaseNode/BaseNode.cjs +20 -10
  24. package/dist/canvas/components/BaseNode/BaseNode.d.ts.map +1 -1
  25. package/dist/canvas/components/BaseNode/BaseNode.js +20 -10
  26. package/dist/canvas/components/BaseNode/NodeLabel.cjs +17 -11
  27. package/dist/canvas/components/BaseNode/NodeLabel.d.ts +2 -1
  28. package/dist/canvas/components/BaseNode/NodeLabel.d.ts.map +1 -1
  29. package/dist/canvas/components/BaseNode/NodeLabel.js +17 -11
  30. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.cjs +2 -1
  31. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts +1 -0
  32. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts.map +1 -1
  33. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.js +2 -1
  34. package/dist/canvas/components/LoopNode/LoopNode.cjs +13 -5
  35. package/dist/canvas/components/LoopNode/LoopNode.d.ts.map +1 -1
  36. package/dist/canvas/components/LoopNode/LoopNode.js +13 -5
  37. package/dist/canvas/components/StageNode/StageNode.cjs +15 -11
  38. package/dist/canvas/components/StageNode/StageNode.d.ts.map +1 -1
  39. package/dist/canvas/components/StageNode/StageNode.js +15 -11
  40. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.cjs +29 -6
  41. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.d.ts.map +1 -1
  42. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.js +29 -6
  43. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.cjs +18 -2
  44. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.d.ts +2 -0
  45. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.d.ts.map +1 -1
  46. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.js +14 -1
  47. package/dist/canvas/components/Toolbar/shared/ToolbarButton.cjs +28 -23
  48. package/dist/canvas/components/Toolbar/shared/ToolbarButton.d.ts.map +1 -1
  49. package/dist/canvas/components/Toolbar/shared/ToolbarButton.js +28 -23
  50. package/dist/canvas/storybook-utils/components/StoryPage.d.ts +15 -1
  51. package/dist/canvas/storybook-utils/components/StoryPage.d.ts.map +1 -1
  52. package/dist/canvas/styles/tailwind.canvas.css +1 -1
  53. package/dist/canvas/types.d.ts +1 -0
  54. package/dist/canvas/types.d.ts.map +1 -1
  55. package/package.json +1 -1
@@ -44,6 +44,7 @@ const nodePropsEqual_cjs_namespaceObject = require("../../utils/nodePropsEqual.c
44
44
  const toolbar_resolver_cjs_namespaceObject = require("../../utils/toolbar-resolver.cjs");
45
45
  const BaseCanvasModeProvider_cjs_namespaceObject = require("../BaseCanvas/BaseCanvasModeProvider.cjs");
46
46
  const ConnectedHandlesContext_cjs_namespaceObject = require("../BaseCanvas/ConnectedHandlesContext.cjs");
47
+ const ReadOnlyNodesContext_cjs_namespaceObject = require("../BaseCanvas/ReadOnlyNodesContext.cjs");
47
48
  const SelectionStateContext_cjs_namespaceObject = require("../BaseCanvas/SelectionStateContext.cjs");
48
49
  const BaseNodeBadgeSlot_cjs_namespaceObject = require("../BaseNode/BaseNodeBadgeSlot.cjs");
49
50
  const BaseNodeContainer_cjs_namespaceObject = require("../BaseNode/BaseNodeContainer.cjs");
@@ -51,6 +52,7 @@ const BaseNodeMissingManifest_cjs_namespaceObject = require("../BaseNode/BaseNod
51
52
  const external_ButtonHandle_index_cjs_namespaceObject = require("../ButtonHandle/index.cjs");
52
53
  const external_CanvasTooltip_cjs_namespaceObject = require("../CanvasTooltip.cjs");
53
54
  const external_Toolbar_index_cjs_namespaceObject = require("../Toolbar/index.cjs");
55
+ const NodeToolbar_utils_cjs_namespaceObject = require("../Toolbar/NodeToolbar/NodeToolbar.utils.cjs");
54
56
  const external_LoopNode_helpers_cjs_namespaceObject = require("./LoopNode.helpers.cjs");
55
57
  const external_LoopNodeExecutionCount_cjs_namespaceObject = require("./LoopNodeExecutionCount.cjs");
56
58
  const DEFAULT_LOOP_ICON = 'repeat';
@@ -173,6 +175,8 @@ function LoopNodeComponent(props) {
173
175
  ]);
174
176
  const { mode } = (0, BaseCanvasModeProvider_cjs_namespaceObject.useBaseCanvasMode)();
175
177
  const isDesignMode = 'design' === mode;
178
+ const isNodeReadOnly = (0, ReadOnlyNodesContext_cjs_namespaceObject.useIsNodeReadOnly)(id);
179
+ const canEditNode = isDesignMode && !isNodeReadOnly;
176
180
  const connectedHandleIds = (0, ConnectedHandlesContext_cjs_namespaceObject.useConnectedHandles)(id);
177
181
  const { multipleNodesSelected } = (0, SelectionStateContext_cjs_namespaceObject.useSelectionState)();
178
182
  const isConnecting = (0, react_cjs_namespaceObject.useStore)(NodeUtils_cjs_namespaceObject.selectIsConnecting);
@@ -245,6 +249,10 @@ function LoopNodeComponent(props) {
245
249
  statusContext,
246
250
  toolbarConfigProp
247
251
  ]);
252
+ const effectiveToolbarConfig = (0, external_react_namespaceObject.useMemo)(()=>toolbarConfig && isNodeReadOnly ? (0, NodeToolbar_utils_cjs_namespaceObject.lockToolbarConfig)(toolbarConfig) : toolbarConfig, [
253
+ toolbarConfig,
254
+ isNodeReadOnly
255
+ ]);
248
256
  const adornments = (0, external_react_namespaceObject.useMemo)(()=>({
249
257
  ...(0, adornment_resolver_cjs_namespaceObject.resolveAdornments)(statusContext, {
250
258
  hideExecutionStatusAdornment: true
@@ -302,8 +310,8 @@ function LoopNodeComponent(props) {
302
310
  setIsHovered(false);
303
311
  }, []);
304
312
  const shouldShowHandles = (isConnecting || selected || isHovered) && !dragging;
305
- const showHandleAddButtons = isDesignMode && !multipleNodesSelected && !isConnecting && !dragging;
306
- const showEmptyStateButton = isDesignMode && !hasChildNodes && !!onAddFirstChild;
313
+ const showHandleAddButtons = canEditNode && !multipleNodesSelected && !isConnecting && !dragging;
314
+ const showEmptyStateButton = canEditNode && !hasChildNodes && !!onAddFirstChild;
307
315
  const interactionState = resolveInteractionState(dragging, selected, isHovered);
308
316
  const activeStatus = suggestionType ?? validationState?.validationStatus ?? executionStatus;
309
317
  const statusBorder = (0, BaseNodeContainer_cjs_namespaceObject.getStatusBorder)(activeStatus);
@@ -328,7 +336,7 @@ function LoopNodeComponent(props) {
328
336
  "data-suggestion-type": suggestionType,
329
337
  "data-validation-status": validationState?.validationStatus,
330
338
  "aria-busy": resolvedData.loading || void 0,
331
- 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)'),
339
+ 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-2 outline-foreground-accent-muted', isDropTarget && 'bg-surface-hover outline-2 outline-brand', 'drag' === interactionState && 'cursor-grabbing shadow-(--canvas-node-shadow-lifted)'),
332
340
  style: {
333
341
  ...nodeSizeStyle,
334
342
  ...display.background ? {
@@ -379,9 +387,9 @@ function LoopNodeComponent(props) {
379
387
  onAddFirstChild: handleEmptyClick
380
388
  })
381
389
  }) : null,
382
- toolbarConfig && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbar_index_cjs_namespaceObject.NodeToolbar, {
390
+ effectiveToolbarConfig && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbar_index_cjs_namespaceObject.NodeToolbar, {
383
391
  nodeId: id,
384
- config: toolbarConfig,
392
+ config: effectiveToolbarConfig,
385
393
  expanded: selected || isHovered,
386
394
  hidden: dragging || multipleNodesSelected,
387
395
  portalToNodeOverlay: true
@@ -1 +1 @@
1
- {"version":3,"file":"LoopNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.tsx"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAA+B,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAsInF,iBAAS,iBAAiB,CAAC,KAAK,EAAE,aAAa,2CA4R9C;AAED,eAAO,MAAM,QAAQ,+DAA6D,CAAC"}
1
+ {"version":3,"file":"LoopNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/LoopNode/LoopNode.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAA+B,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAsInF,iBAAS,iBAAiB,CAAC,KAAK,EAAE,aAAa,2CAqS9C;AAED,eAAO,MAAM,QAAQ,+DAA6D,CAAC"}
@@ -16,6 +16,7 @@ import { areNodePropsEqualIgnoringPosition } from "../../utils/nodePropsEqual.js
16
16
  import { resolveToolbar } from "../../utils/toolbar-resolver.js";
17
17
  import { useBaseCanvasMode } from "../BaseCanvas/BaseCanvasModeProvider.js";
18
18
  import { useConnectedHandles } from "../BaseCanvas/ConnectedHandlesContext.js";
19
+ import { useIsNodeReadOnly } from "../BaseCanvas/ReadOnlyNodesContext.js";
19
20
  import { useSelectionState } from "../BaseCanvas/SelectionStateContext.js";
20
21
  import { BaseBadgeSlot } from "../BaseNode/BaseNodeBadgeSlot.js";
21
22
  import { getStatusBorder } from "../BaseNode/BaseNodeContainer.js";
@@ -23,6 +24,7 @@ import { MissingManifestNode } from "../BaseNode/BaseNodeMissingManifest.js";
23
24
  import { ButtonHandles } from "../ButtonHandle/index.js";
24
25
  import { CanvasTooltip } from "../CanvasTooltip.js";
25
26
  import { NodeToolbar } from "../Toolbar/index.js";
27
+ import { lockToolbarConfig } from "../Toolbar/NodeToolbar/NodeToolbar.utils.js";
26
28
  import { resolveContainerHandleGroups } from "./LoopNode.helpers.js";
27
29
  import { LoopNodeExecutionCount } from "./LoopNodeExecutionCount.js";
28
30
  const DEFAULT_LOOP_ICON = 'repeat';
@@ -145,6 +147,8 @@ function LoopNodeComponent(props) {
145
147
  ]);
146
148
  const { mode } = useBaseCanvasMode();
147
149
  const isDesignMode = 'design' === mode;
150
+ const isNodeReadOnly = useIsNodeReadOnly(id);
151
+ const canEditNode = isDesignMode && !isNodeReadOnly;
148
152
  const connectedHandleIds = useConnectedHandles(id);
149
153
  const { multipleNodesSelected } = useSelectionState();
150
154
  const isConnecting = useStore(selectIsConnecting);
@@ -217,6 +221,10 @@ function LoopNodeComponent(props) {
217
221
  statusContext,
218
222
  toolbarConfigProp
219
223
  ]);
224
+ const effectiveToolbarConfig = useMemo(()=>toolbarConfig && isNodeReadOnly ? lockToolbarConfig(toolbarConfig) : toolbarConfig, [
225
+ toolbarConfig,
226
+ isNodeReadOnly
227
+ ]);
220
228
  const adornments = useMemo(()=>({
221
229
  ...resolveAdornments(statusContext, {
222
230
  hideExecutionStatusAdornment: true
@@ -274,8 +282,8 @@ function LoopNodeComponent(props) {
274
282
  setIsHovered(false);
275
283
  }, []);
276
284
  const shouldShowHandles = (isConnecting || selected || isHovered) && !dragging;
277
- const showHandleAddButtons = isDesignMode && !multipleNodesSelected && !isConnecting && !dragging;
278
- const showEmptyStateButton = isDesignMode && !hasChildNodes && !!onAddFirstChild;
285
+ const showHandleAddButtons = canEditNode && !multipleNodesSelected && !isConnecting && !dragging;
286
+ const showEmptyStateButton = canEditNode && !hasChildNodes && !!onAddFirstChild;
279
287
  const interactionState = resolveInteractionState(dragging, selected, isHovered);
280
288
  const activeStatus = suggestionType ?? validationState?.validationStatus ?? executionStatus;
281
289
  const statusBorder = getStatusBorder(activeStatus);
@@ -300,7 +308,7 @@ function LoopNodeComponent(props) {
300
308
  "data-suggestion-type": suggestionType,
301
309
  "data-validation-status": validationState?.validationStatus,
302
310
  "aria-busy": resolvedData.loading || void 0,
303
- 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)'),
311
+ 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-2 outline-foreground-accent-muted', isDropTarget && 'bg-surface-hover outline-2 outline-brand', 'drag' === interactionState && 'cursor-grabbing shadow-(--canvas-node-shadow-lifted)'),
304
312
  style: {
305
313
  ...nodeSizeStyle,
306
314
  ...display.background ? {
@@ -351,9 +359,9 @@ function LoopNodeComponent(props) {
351
359
  onAddFirstChild: handleEmptyClick
352
360
  })
353
361
  }) : null,
354
- toolbarConfig && /*#__PURE__*/ jsx(NodeToolbar, {
362
+ effectiveToolbarConfig && /*#__PURE__*/ jsx(NodeToolbar, {
355
363
  nodeId: id,
356
- config: toolbarConfig,
364
+ config: effectiveToolbarConfig,
357
365
  expanded: selected || isHovered,
358
366
  hidden: dragging || multipleNodesSelected,
359
367
  portalToNodeOverlay: true
@@ -31,6 +31,7 @@ const apollo_core_namespaceObject = require("@uipath/apollo-core");
31
31
  const index_cjs_namespaceObject = require("../../layouts/index.cjs");
32
32
  const external_react_namespaceObject = require("react");
33
33
  const nodePropsEqual_cjs_namespaceObject = require("../../utils/nodePropsEqual.cjs");
34
+ const ReadOnlyNodesContext_cjs_namespaceObject = require("../BaseCanvas/ReadOnlyNodesContext.cjs");
34
35
  const external_FloatingCanvasPanel_index_cjs_namespaceObject = require("../FloatingCanvasPanel/index.cjs");
35
36
  const external_NodeContextMenu_index_cjs_namespaceObject = require("../NodeContextMenu/index.cjs");
36
37
  const hooks_index_cjs_namespaceObject = require("../NodePropertiesPanel/hooks/index.cjs");
@@ -51,7 +52,7 @@ const StageNodeInner = (props)=>{
51
52
  stageDetails?.tasks
52
53
  ]);
53
54
  const isException = stageDetails?.isException;
54
- const isReadOnly = !!stageDetails?.isReadOnly;
55
+ const isReadOnly = (0, ReadOnlyNodesContext_cjs_namespaceObject.useIsNodeReadOnly)(id) || !!stageDetails?.isReadOnly;
55
56
  const selectedTaskId = stageDetails?.selectedTaskId;
56
57
  const status = execution?.stageStatus?.status;
57
58
  const [isHovered, setIsHovered] = (0, external_react_namespaceObject.useState)(false);
@@ -65,7 +66,7 @@ const StageNodeInner = (props)=>{
65
66
  const [isAddingTask, setIsAddingTask] = (0, external_react_namespaceObject.useState)(false);
66
67
  const [isReplacingTask, setIsReplacingTask] = (0, external_react_namespaceObject.useState)(false);
67
68
  (0, external_react_namespaceObject.useEffect)(()=>{
68
- if (pendingReplaceTask) {
69
+ if (pendingReplaceTask && !isReadOnly) {
69
70
  const match = allTasks.flatMap((group, gi)=>group.map((task, ti)=>({
70
71
  task,
71
72
  groupIndex: gi,
@@ -83,21 +84,22 @@ const StageNodeInner = (props)=>{
83
84
  }, [
84
85
  pendingReplaceTask,
85
86
  selectedTaskId,
86
- allTasks
87
+ allTasks,
88
+ isReadOnly
87
89
  ]);
88
90
  (0, external_react_namespaceObject.useEffect)(()=>{
89
- if (false === selected) {
91
+ if (false === selected || isReadOnly) {
90
92
  setIsAddingTask(false);
91
93
  setIsReplacingTask(false);
92
94
  }
93
95
  }, [
94
- selected
96
+ selected,
97
+ isReadOnly
95
98
  ]);
96
- const shouldShowMenu = (0, external_react_namespaceObject.useMemo)(()=>menuItems && menuItems.length > 0 && (selected || isHovered) && !isReadOnly, [
99
+ const shouldShowMenu = (0, external_react_namespaceObject.useMemo)(()=>menuItems && menuItems.length > 0 && (selected || isHovered), [
97
100
  menuItems,
98
101
  selected,
99
- isHovered,
100
- isReadOnly
102
+ isHovered
101
103
  ]);
102
104
  const { setSelectedNodeId } = (0, hooks_index_cjs_namespaceObject.useSetNodeSelection)();
103
105
  const handleStageClick = (0, external_react_namespaceObject.useCallback)(()=>{
@@ -107,6 +109,7 @@ const StageNodeInner = (props)=>{
107
109
  ]);
108
110
  const handleTaskAddClick = (0, external_react_namespaceObject.useCallback)((event)=>{
109
111
  event.stopPropagation();
112
+ if (isReadOnly) return;
110
113
  if (onTaskAdd) onTaskAdd();
111
114
  else if (onAddTaskFromToolbox) setIsAddingTask(true);
112
115
  setSelectedNodeId(id);
@@ -114,7 +117,8 @@ const StageNodeInner = (props)=>{
114
117
  onTaskAdd,
115
118
  onAddTaskFromToolbox,
116
119
  setSelectedNodeId,
117
- id
120
+ id,
121
+ isReadOnly
118
122
  ]);
119
123
  const handleAddTaskToolboxItemSelected = (0, external_react_namespaceObject.useCallback)((item)=>{
120
124
  onAddTaskFromToolbox?.(item);
@@ -190,7 +194,7 @@ const StageNodeInner = (props)=>{
190
194
  })
191
195
  ]
192
196
  }),
193
- onAddTaskFromToolbox && isAddingTask && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_FloatingCanvasPanel_index_cjs_namespaceObject.FloatingCanvasPanel, {
197
+ onAddTaskFromToolbox && isAddingTask && !isReadOnly && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_FloatingCanvasPanel_index_cjs_namespaceObject.FloatingCanvasPanel, {
194
198
  nodeId: id,
195
199
  offset: 15,
196
200
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbox_index_cjs_namespaceObject.Toolbox, {
@@ -201,7 +205,7 @@ const StageNodeInner = (props)=>{
201
205
  onSearch: onTaskToolboxSearch
202
206
  })
203
207
  }),
204
- onReplaceTaskFromToolbox && isReplacingTask && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_FloatingCanvasPanel_index_cjs_namespaceObject.FloatingCanvasPanel, {
208
+ onReplaceTaskFromToolbox && isReplacingTask && !isReadOnly && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_FloatingCanvasPanel_index_cjs_namespaceObject.FloatingCanvasPanel, {
205
209
  nodeId: id,
206
210
  offset: 15,
207
211
  children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbox_index_cjs_namespaceObject.Toolbox, {
@@ -1 +1 @@
1
- {"version":3,"file":"StageNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,mBAAmB,CAAC;AA4M5E,eAAO,MAAM,SAAS,8CAtMS,cAAc,6CAsMmC,CAAC"}
1
+ {"version":3,"file":"StageNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/StageNode.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,mBAAmB,CAAC;AAiN5E,eAAO,MAAM,SAAS,8CA3MS,cAAc,6CA2MmC,CAAC"}
@@ -3,6 +3,7 @@ import { Spacing } from "@uipath/apollo-core";
3
3
  import { Column } from "../../layouts/index.js";
4
4
  import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
5
5
  import { areNodePropsEqualIgnoringPosition } from "../../utils/nodePropsEqual.js";
6
+ import { useIsNodeReadOnly } from "../BaseCanvas/ReadOnlyNodesContext.js";
6
7
  import { FloatingCanvasPanel } from "../FloatingCanvasPanel/index.js";
7
8
  import { NodeContextMenu } from "../NodeContextMenu/index.js";
8
9
  import { useSetNodeSelection } from "../NodePropertiesPanel/hooks/index.js";
@@ -23,7 +24,7 @@ const StageNodeInner = (props)=>{
23
24
  stageDetails?.tasks
24
25
  ]);
25
26
  const isException = stageDetails?.isException;
26
- const isReadOnly = !!stageDetails?.isReadOnly;
27
+ const isReadOnly = useIsNodeReadOnly(id) || !!stageDetails?.isReadOnly;
27
28
  const selectedTaskId = stageDetails?.selectedTaskId;
28
29
  const status = execution?.stageStatus?.status;
29
30
  const [isHovered, setIsHovered] = useState(false);
@@ -37,7 +38,7 @@ const StageNodeInner = (props)=>{
37
38
  const [isAddingTask, setIsAddingTask] = useState(false);
38
39
  const [isReplacingTask, setIsReplacingTask] = useState(false);
39
40
  useEffect(()=>{
40
- if (pendingReplaceTask) {
41
+ if (pendingReplaceTask && !isReadOnly) {
41
42
  const match = allTasks.flatMap((group, gi)=>group.map((task, ti)=>({
42
43
  task,
43
44
  groupIndex: gi,
@@ -55,21 +56,22 @@ const StageNodeInner = (props)=>{
55
56
  }, [
56
57
  pendingReplaceTask,
57
58
  selectedTaskId,
58
- allTasks
59
+ allTasks,
60
+ isReadOnly
59
61
  ]);
60
62
  useEffect(()=>{
61
- if (false === selected) {
63
+ if (false === selected || isReadOnly) {
62
64
  setIsAddingTask(false);
63
65
  setIsReplacingTask(false);
64
66
  }
65
67
  }, [
66
- selected
68
+ selected,
69
+ isReadOnly
67
70
  ]);
68
- const shouldShowMenu = useMemo(()=>menuItems && menuItems.length > 0 && (selected || isHovered) && !isReadOnly, [
71
+ const shouldShowMenu = useMemo(()=>menuItems && menuItems.length > 0 && (selected || isHovered), [
69
72
  menuItems,
70
73
  selected,
71
- isHovered,
72
- isReadOnly
74
+ isHovered
73
75
  ]);
74
76
  const { setSelectedNodeId } = useSetNodeSelection();
75
77
  const handleStageClick = useCallback(()=>{
@@ -79,6 +81,7 @@ const StageNodeInner = (props)=>{
79
81
  ]);
80
82
  const handleTaskAddClick = useCallback((event)=>{
81
83
  event.stopPropagation();
84
+ if (isReadOnly) return;
82
85
  if (onTaskAdd) onTaskAdd();
83
86
  else if (onAddTaskFromToolbox) setIsAddingTask(true);
84
87
  setSelectedNodeId(id);
@@ -86,7 +89,8 @@ const StageNodeInner = (props)=>{
86
89
  onTaskAdd,
87
90
  onAddTaskFromToolbox,
88
91
  setSelectedNodeId,
89
- id
92
+ id,
93
+ isReadOnly
90
94
  ]);
91
95
  const handleAddTaskToolboxItemSelected = useCallback((item)=>{
92
96
  onAddTaskFromToolbox?.(item);
@@ -162,7 +166,7 @@ const StageNodeInner = (props)=>{
162
166
  })
163
167
  ]
164
168
  }),
165
- onAddTaskFromToolbox && isAddingTask && /*#__PURE__*/ jsx(FloatingCanvasPanel, {
169
+ onAddTaskFromToolbox && isAddingTask && !isReadOnly && /*#__PURE__*/ jsx(FloatingCanvasPanel, {
166
170
  nodeId: id,
167
171
  offset: 15,
168
172
  children: /*#__PURE__*/ jsx(Toolbox, {
@@ -173,7 +177,7 @@ const StageNodeInner = (props)=>{
173
177
  onSearch: onTaskToolboxSearch
174
178
  })
175
179
  }),
176
- onReplaceTaskFromToolbox && isReplacingTask && /*#__PURE__*/ jsx(FloatingCanvasPanel, {
180
+ onReplaceTaskFromToolbox && isReplacingTask && !isReadOnly && /*#__PURE__*/ jsx(FloatingCanvasPanel, {
177
181
  nodeId: id,
178
182
  offset: 15,
179
183
  children: /*#__PURE__*/ jsx(Toolbox, {
@@ -52,9 +52,11 @@ const index_cjs_namespaceObject = require("../../../i18n/index.cjs");
52
52
  const external_constants_cjs_namespaceObject = require("../../constants.cjs");
53
53
  const useLatestRef_cjs_namespaceObject = require("../../hooks/useLatestRef.cjs");
54
54
  const nodePropsEqual_cjs_namespaceObject = require("../../utils/nodePropsEqual.cjs");
55
+ const ReadOnlyNodesContext_cjs_namespaceObject = require("../BaseCanvas/ReadOnlyNodesContext.cjs");
55
56
  const SelectionStateContext_cjs_namespaceObject = require("../BaseCanvas/SelectionStateContext.cjs");
56
57
  const external_NodeViewportOverlay_cjs_namespaceObject = require("../NodeViewportOverlay.cjs");
57
58
  const external_Toolbar_index_cjs_namespaceObject = require("../Toolbar/index.cjs");
59
+ const NodeToolbar_utils_cjs_namespaceObject = require("../Toolbar/NodeToolbar/NodeToolbar.utils.cjs");
58
60
  const external_FormattingToolbar_cjs_namespaceObject = require("./FormattingToolbar.cjs");
59
61
  const external_markdown_formatting_index_cjs_namespaceObject = require("./markdown-formatting/index.cjs");
60
62
  const external_StickyNoteCanvasOptionsContext_cjs_namespaceObject = require("./StickyNoteCanvasOptionsContext.cjs");
@@ -71,7 +73,9 @@ const minHeight = 8 * external_constants_cjs_namespaceObject.GRID_SPACING;
71
73
  const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = 'Add text', renderPlaceholderOnSelect = false, readOnly: readOnlyProp, onContentChange, onColorChange, onResize, onResizeStart, onResizeEnd, enableMediaEmbedding: enableMediaEmbeddingProp, formattingActions, markdownComponents: customMarkdownComponents })=>{
72
74
  const { _ } = (0, index_cjs_namespaceObject.useSafeLingui)();
73
75
  const canvasOptions = (0, external_StickyNoteCanvasOptionsContext_cjs_namespaceObject.useStickyNoteCanvasOptions)();
74
- const readOnly = readOnlyProp ?? canvasOptions.readOnly;
76
+ const isNodeReadOnly = (0, ReadOnlyNodesContext_cjs_namespaceObject.useIsNodeReadOnly)(id);
77
+ const stickyNoteReadOnly = readOnlyProp ?? canvasOptions.readOnly;
78
+ const readOnly = isNodeReadOnly || stickyNoteReadOnly;
75
79
  const enableMediaEmbedding = enableMediaEmbeddingProp ?? canvasOptions.enableMediaEmbedding;
76
80
  const { updateNodeData, deleteElements } = (0, react_cjs_namespaceObject.useReactFlow)();
77
81
  const { multipleNodesSelected } = (0, SelectionStateContext_cjs_namespaceObject.useSelectionState)();
@@ -85,6 +89,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
85
89
  const formattingToolbarRef = (0, external_react_namespaceObject.useRef)(null);
86
90
  const skipBlurRef = (0, external_react_namespaceObject.useRef)(null);
87
91
  const resizeActiveRef = (0, external_react_namespaceObject.useRef)(false);
92
+ const readOnlyRef = (0, useLatestRef_cjs_namespaceObject.useLatestRef)(readOnly);
88
93
  const resizeLifecycle = {
89
94
  content: data.content,
90
95
  id,
@@ -155,6 +160,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
155
160
  (0, external_react_namespaceObject.useEffect)(()=>{
156
161
  if (readOnly) {
157
162
  setIsEditing(false);
163
+ setIsColorPickerOpen(false);
158
164
  updateLocalContent(data.content || '');
159
165
  }
160
166
  }, [
@@ -224,6 +230,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
224
230
  skipBlurRef.current = selection.value;
225
231
  let completed = false;
226
232
  const restoreSelection = (next)=>{
233
+ if (readOnlyRef.current) return;
227
234
  setIsEditing(true);
228
235
  requestAnimationFrame(()=>{
229
236
  const currentTextarea = textAreaRef.current;
@@ -237,6 +244,10 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
237
244
  const complete = (next, shouldPersist)=>{
238
245
  if (completed) return;
239
246
  completed = true;
247
+ if (readOnlyRef.current) {
248
+ skipBlurRef.current = null;
249
+ return;
250
+ }
240
251
  skipBlurRef.current = shouldPersist ? next.value : null;
241
252
  setActiveFormats((0, external_markdown_formatting_index_cjs_namespaceObject.detectActiveFormats)(next));
242
253
  if (shouldPersist) {
@@ -273,6 +284,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
273
284
  }, [
274
285
  id,
275
286
  onContentChange,
287
+ readOnlyRef,
276
288
  updateLocalContent,
277
289
  updateNodeData
278
290
  ]);
@@ -437,6 +449,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
437
449
  resizeLifecycleRef
438
450
  ]);
439
451
  const handleColorChange = (0, external_react_namespaceObject.useCallback)((newColor)=>{
452
+ if (readOnly) return;
440
453
  onColorChange?.(newColor);
441
454
  updateNodeData(id, {
442
455
  color: newColor
@@ -445,11 +458,15 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
445
458
  }, [
446
459
  id,
447
460
  updateNodeData,
448
- onColorChange
461
+ onColorChange,
462
+ readOnly
449
463
  ]);
450
464
  const handleToggleColorPicker = (0, external_react_namespaceObject.useCallback)(()=>{
465
+ if (readOnly) return;
451
466
  setIsColorPickerOpen((prev)=>!prev);
452
- }, []);
467
+ }, [
468
+ readOnly
469
+ ]);
453
470
  const handleEditClick = (0, external_react_namespaceObject.useCallback)(()=>{
454
471
  if (readOnly) return;
455
472
  setIsEditing(true);
@@ -463,6 +480,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
463
480
  readOnly
464
481
  ]);
465
482
  const handleDelete = (0, external_react_namespaceObject.useCallback)(()=>{
483
+ if (readOnly) return;
466
484
  deleteElements({
467
485
  nodes: [
468
486
  {
@@ -472,7 +490,8 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
472
490
  });
473
491
  }, [
474
492
  id,
475
- deleteElements
493
+ deleteElements,
494
+ readOnly
476
495
  ]);
477
496
  const builtInMarkdownComponents = (0, external_react_namespaceObject.useMemo)(()=>({
478
497
  a: ({ node: _node, href, children, ...props })=>/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("a", {
@@ -580,7 +599,11 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
580
599
  color,
581
600
  handleDelete
582
601
  ]);
583
- const shouldRenderToolbarOverlay = !readOnly && selected && !dragging && !isResizing && !multipleNodesSelected;
602
+ const effectiveToolbarConfig = (0, external_react_namespaceObject.useMemo)(()=>isNodeReadOnly ? (0, NodeToolbar_utils_cjs_namespaceObject.lockToolbarConfig)(toolbarConfig) : toolbarConfig, [
603
+ isNodeReadOnly,
604
+ toolbarConfig
605
+ ]);
606
+ const shouldRenderToolbarOverlay = !stickyNoteReadOnly && selected && !dragging && !isResizing && !multipleNodesSelected;
584
607
  const shouldRenderResizeControls = !readOnly || isResizing;
585
608
  return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(jsx_runtime_namespaceObject.Fragment, {
586
609
  children: [
@@ -727,7 +750,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
727
750
  }),
728
751
  shouldRenderToolbarOverlay && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_Toolbar_index_cjs_namespaceObject.NodeToolbar, {
729
752
  nodeId: id,
730
- config: toolbarConfig,
753
+ config: effectiveToolbarConfig,
731
754
  expanded: true,
732
755
  portalToNodeOverlay: true
733
756
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"StickyNoteNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StickyNoteNode/StickyNoteNode.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAM1E,OAAsB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA+ChE,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAEd,0BAA0B,EAE3B,MAAM,wBAAwB,CAAC;AAMhC,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC1D,kBAAkB,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;CAC5C;AA4tBD,eAAO,MAAM,cAAc,iUA/rBxB,mBAAmB,6CA+rBwE,CAAC"}
1
+ {"version":3,"file":"StickyNoteNode.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StickyNoteNode/StickyNoteNode.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAM1E,OAAsB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAiDhE,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAEd,0BAA0B,EAE3B,MAAM,wBAAwB,CAAC;AAMhC,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC1D,kBAAkB,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;CAC5C;AAsvBD,eAAO,MAAM,cAAc,iUAztBxB,mBAAmB,6CAytBwE,CAAC"}
@@ -12,9 +12,11 @@ import { useSafeLingui } from "../../../i18n/index.js";
12
12
  import { GRID_SPACING } from "../../constants.js";
13
13
  import { useLatestRef } from "../../hooks/useLatestRef.js";
14
14
  import { areNodePropsEqualIgnoringPosition } from "../../utils/nodePropsEqual.js";
15
+ import { useIsNodeReadOnly } from "../BaseCanvas/ReadOnlyNodesContext.js";
15
16
  import { useSelectionState } from "../BaseCanvas/SelectionStateContext.js";
16
17
  import { NodeViewportOverlay } from "../NodeViewportOverlay.js";
17
18
  import { NodeToolbar } from "../Toolbar/index.js";
19
+ import { lockToolbarConfig } from "../Toolbar/NodeToolbar/NodeToolbar.utils.js";
18
20
  import { FormattingToolbar } from "./FormattingToolbar.js";
19
21
  import { activeFormatsEqual, continueListOnEnter, detectActiveFormats } from "./markdown-formatting/index.js";
20
22
  import { useStickyNoteCanvasOptions } from "./StickyNoteCanvasOptionsContext.js";
@@ -31,7 +33,9 @@ const minHeight = 8 * GRID_SPACING;
31
33
  const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = 'Add text', renderPlaceholderOnSelect = false, readOnly: readOnlyProp, onContentChange, onColorChange, onResize, onResizeStart, onResizeEnd, enableMediaEmbedding: enableMediaEmbeddingProp, formattingActions, markdownComponents: customMarkdownComponents })=>{
32
34
  const { _ } = useSafeLingui();
33
35
  const canvasOptions = useStickyNoteCanvasOptions();
34
- const readOnly = readOnlyProp ?? canvasOptions.readOnly;
36
+ const isNodeReadOnly = useIsNodeReadOnly(id);
37
+ const stickyNoteReadOnly = readOnlyProp ?? canvasOptions.readOnly;
38
+ const readOnly = isNodeReadOnly || stickyNoteReadOnly;
35
39
  const enableMediaEmbedding = enableMediaEmbeddingProp ?? canvasOptions.enableMediaEmbedding;
36
40
  const { updateNodeData, deleteElements } = useReactFlow();
37
41
  const { multipleNodesSelected } = useSelectionState();
@@ -45,6 +49,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
45
49
  const formattingToolbarRef = useRef(null);
46
50
  const skipBlurRef = useRef(null);
47
51
  const resizeActiveRef = useRef(false);
52
+ const readOnlyRef = useLatestRef(readOnly);
48
53
  const resizeLifecycle = {
49
54
  content: data.content,
50
55
  id,
@@ -115,6 +120,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
115
120
  useEffect(()=>{
116
121
  if (readOnly) {
117
122
  setIsEditing(false);
123
+ setIsColorPickerOpen(false);
118
124
  updateLocalContent(data.content || '');
119
125
  }
120
126
  }, [
@@ -184,6 +190,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
184
190
  skipBlurRef.current = selection.value;
185
191
  let completed = false;
186
192
  const restoreSelection = (next)=>{
193
+ if (readOnlyRef.current) return;
187
194
  setIsEditing(true);
188
195
  requestAnimationFrame(()=>{
189
196
  const currentTextarea = textAreaRef.current;
@@ -197,6 +204,10 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
197
204
  const complete = (next, shouldPersist)=>{
198
205
  if (completed) return;
199
206
  completed = true;
207
+ if (readOnlyRef.current) {
208
+ skipBlurRef.current = null;
209
+ return;
210
+ }
200
211
  skipBlurRef.current = shouldPersist ? next.value : null;
201
212
  setActiveFormats(detectActiveFormats(next));
202
213
  if (shouldPersist) {
@@ -233,6 +244,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
233
244
  }, [
234
245
  id,
235
246
  onContentChange,
247
+ readOnlyRef,
236
248
  updateLocalContent,
237
249
  updateNodeData
238
250
  ]);
@@ -397,6 +409,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
397
409
  resizeLifecycleRef
398
410
  ]);
399
411
  const handleColorChange = useCallback((newColor)=>{
412
+ if (readOnly) return;
400
413
  onColorChange?.(newColor);
401
414
  updateNodeData(id, {
402
415
  color: newColor
@@ -405,11 +418,15 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
405
418
  }, [
406
419
  id,
407
420
  updateNodeData,
408
- onColorChange
421
+ onColorChange,
422
+ readOnly
409
423
  ]);
410
424
  const handleToggleColorPicker = useCallback(()=>{
425
+ if (readOnly) return;
411
426
  setIsColorPickerOpen((prev)=>!prev);
412
- }, []);
427
+ }, [
428
+ readOnly
429
+ ]);
413
430
  const handleEditClick = useCallback(()=>{
414
431
  if (readOnly) return;
415
432
  setIsEditing(true);
@@ -423,6 +440,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
423
440
  readOnly
424
441
  ]);
425
442
  const handleDelete = useCallback(()=>{
443
+ if (readOnly) return;
426
444
  deleteElements({
427
445
  nodes: [
428
446
  {
@@ -432,7 +450,8 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
432
450
  });
433
451
  }, [
434
452
  id,
435
- deleteElements
453
+ deleteElements,
454
+ readOnly
436
455
  ]);
437
456
  const builtInMarkdownComponents = useMemo(()=>({
438
457
  a: ({ node: _node, href, children, ...props })=>/*#__PURE__*/ jsx("a", {
@@ -540,7 +559,11 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
540
559
  color,
541
560
  handleDelete
542
561
  ]);
543
- const shouldRenderToolbarOverlay = !readOnly && selected && !dragging && !isResizing && !multipleNodesSelected;
562
+ const effectiveToolbarConfig = useMemo(()=>isNodeReadOnly ? lockToolbarConfig(toolbarConfig) : toolbarConfig, [
563
+ isNodeReadOnly,
564
+ toolbarConfig
565
+ ]);
566
+ const shouldRenderToolbarOverlay = !stickyNoteReadOnly && selected && !dragging && !isResizing && !multipleNodesSelected;
544
567
  const shouldRenderResizeControls = !readOnly || isResizing;
545
568
  return /*#__PURE__*/ jsxs(Fragment, {
546
569
  children: [
@@ -687,7 +710,7 @@ const StickyNoteNodeComponent = ({ id, data, selected, dragging, placeholder = '
687
710
  }),
688
711
  shouldRenderToolbarOverlay && /*#__PURE__*/ jsx(NodeToolbar, {
689
712
  nodeId: id,
690
- config: toolbarConfig,
713
+ config: effectiveToolbarConfig,
691
714
  expanded: true,
692
715
  portalToNodeOverlay: true
693
716
  }),
@@ -24,14 +24,30 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- isSeparator: ()=>isSeparator
27
+ isSeparator: ()=>isSeparator,
28
+ lockToolbarConfig: ()=>lockToolbarConfig
28
29
  });
29
30
  function isSeparator(item) {
30
31
  return 'separator' === item.id;
31
32
  }
33
+ function lockToolbarConfig(config) {
34
+ return {
35
+ ...config,
36
+ actions: disableActions(config.actions),
37
+ ...config.overflowActions && {
38
+ overflowActions: disableActions(config.overflowActions)
39
+ }
40
+ };
41
+ }
42
+ const disableActions = (actions)=>actions.map((action)=>'separator' === action.id ? action : {
43
+ ...action,
44
+ disabled: true
45
+ });
32
46
  exports.isSeparator = __webpack_exports__.isSeparator;
47
+ exports.lockToolbarConfig = __webpack_exports__.lockToolbarConfig;
33
48
  for(var __rspack_i in __webpack_exports__)if (-1 === [
34
- "isSeparator"
49
+ "isSeparator",
50
+ "lockToolbarConfig"
35
51
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
36
52
  Object.defineProperty(exports, '__esModule', {
37
53
  value: true
@@ -1,4 +1,6 @@
1
1
  import type { ExtendedToolbarAction, ToolbarSeparator } from '../shared';
2
+ import type { NodeToolbarConfig } from './NodeToolbar.types';
2
3
  export type ProcessedToolbarItem = ExtendedToolbarAction | ToolbarSeparator;
3
4
  export declare function isSeparator(item: ProcessedToolbarItem): item is ToolbarSeparator;
5
+ export declare function lockToolbarConfig(config: NodeToolbarConfig): NodeToolbarConfig;
4
6
  //# sourceMappingURL=NodeToolbar.utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeToolbar.utils.d.ts","sourceRoot":"","sources":["../../../../../src/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,GAAG,gBAAgB,CAAC;AAE5E,wBAAgB,WAAW,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,IAAI,gBAAgB,CAEhF"}
1
+ {"version":3,"file":"NodeToolbar.utils.d.ts","sourceRoot":"","sources":["../../../../../src/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAiB,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,GAAG,gBAAgB,CAAC;AAE5E,wBAAgB,WAAW,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,IAAI,gBAAgB,CAEhF;AASD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAM9E"}