@uipath/apollo-react 6.26.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 (37) 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.types.d.ts.map +1 -1
  12. package/dist/canvas/components/BaseNode/BaseNode.cjs +2 -14
  13. package/dist/canvas/components/BaseNode/BaseNode.d.ts.map +1 -1
  14. package/dist/canvas/components/BaseNode/BaseNode.js +2 -14
  15. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.cjs +2 -1
  16. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts +1 -0
  17. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.d.ts.map +1 -1
  18. package/dist/canvas/components/HierarchicalCanvas/HierarchicalCanvas.js +2 -1
  19. package/dist/canvas/components/LoopNode/LoopNode.cjs +13 -5
  20. package/dist/canvas/components/LoopNode/LoopNode.d.ts.map +1 -1
  21. package/dist/canvas/components/LoopNode/LoopNode.js +13 -5
  22. package/dist/canvas/components/StageNode/StageNode.cjs +15 -11
  23. package/dist/canvas/components/StageNode/StageNode.d.ts.map +1 -1
  24. package/dist/canvas/components/StageNode/StageNode.js +15 -11
  25. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.cjs +29 -6
  26. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.d.ts.map +1 -1
  27. package/dist/canvas/components/StickyNoteNode/StickyNoteNode.js +29 -6
  28. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.cjs +18 -2
  29. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.d.ts +2 -0
  30. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.d.ts.map +1 -1
  31. package/dist/canvas/components/Toolbar/NodeToolbar/NodeToolbar.utils.js +14 -1
  32. package/dist/canvas/storybook-utils/components/StoryPage.d.ts +15 -1
  33. package/dist/canvas/storybook-utils/components/StoryPage.d.ts.map +1 -1
  34. package/dist/canvas/styles/tailwind.canvas.css +1 -1
  35. package/dist/canvas/types.d.ts +1 -0
  36. package/dist/canvas/types.d.ts.map +1 -1
  37. package/package.json +1 -1
@@ -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"}
@@ -1,4 +1,17 @@
1
1
  function isSeparator(item) {
2
2
  return 'separator' === item.id;
3
3
  }
4
- export { isSeparator };
4
+ function lockToolbarConfig(config) {
5
+ return {
6
+ ...config,
7
+ actions: disableActions(config.actions),
8
+ ...config.overflowActions && {
9
+ overflowActions: disableActions(config.overflowActions)
10
+ }
11
+ };
12
+ }
13
+ const disableActions = (actions)=>actions.map((action)=>'separator' === action.id ? action : {
14
+ ...action,
15
+ disabled: true
16
+ });
17
+ export { isSeparator, lockToolbarConfig };
@@ -25,8 +25,22 @@ export interface StoryCardProps {
25
25
  title: string;
26
26
  code?: string;
27
27
  description: ReactNode;
28
+ previewClassName?: string;
28
29
  }
29
- export declare function StoryCard({ preview, title, code, description }: StoryCardProps): import("react/jsx-runtime").JSX.Element;
30
+ export declare function StoryCard({ preview, title, code, description, previewClassName }: StoryCardProps): import("react/jsx-runtime").JSX.Element;
31
+ export declare function StoryWideContent({ children }: {
32
+ children?: ReactNode;
33
+ }): import("react/jsx-runtime").JSX.Element;
34
+ export interface StoryTab {
35
+ value: string;
36
+ label: string;
37
+ content: ReactNode;
38
+ }
39
+ export interface StoryTabsProps {
40
+ tabs: readonly StoryTab[];
41
+ label?: string;
42
+ }
43
+ export declare function StoryTabs({ tabs, label }: StoryTabsProps): import("react/jsx-runtime").JSX.Element | null;
30
44
  export declare function StoryCode({ children }: {
31
45
  children: ReactNode;
32
46
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"StoryPage.d.ts","sourceRoot":"","sources":["../../../../src/canvas/storybook-utils/components/StoryPage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAwBvC,MAAM,WAAW,cAAc;IAE7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IAEd,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAWhF;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAc,EAAE,EAAE,iBAAiB,2CAS/F;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAOD,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE,4BAA4B,2CAiB9B;AAED,MAAM,WAAW,cAAc;IAE7B,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,SAAS,CAAC;CACxB;AAGD,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,cAAc,2CAa9E;AAGD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAE9D;AAGD,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAMnE"}
1
+ {"version":3,"file":"StoryPage.d.ts","sourceRoot":"","sources":["../../../../src/canvas/storybook-utils/components/StoryPage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAwBvC,MAAM,WAAW,cAAc;IAE7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IAEd,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAWhF;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAc,EAAE,EAAE,iBAAiB,2CAS/F;AAED,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAOD,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE,4BAA4B,2CAiB9B;AAED,MAAM,WAAW,cAAc;IAE7B,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,SAAS,CAAC;IAEvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAGD,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,cAAc,2CAahG;AAGD,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,2CAMtE;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;IAE1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,KAAqB,EAAE,EAAE,cAAc,kDA2BxE;AAGD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAE9D;AAGD,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAMnE"}