@uipath/apollo-react 3.44.0 → 3.44.2-pr255.af80ea0

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 (121) hide show
  1. package/dist/canvas/components/StageNode/CrossStageTaskDrag.stories.cjs +581 -0
  2. package/dist/canvas/components/StageNode/CrossStageTaskDrag.stories.d.ts +6 -0
  3. package/dist/canvas/components/StageNode/CrossStageTaskDrag.stories.d.ts.map +1 -0
  4. package/dist/canvas/components/StageNode/CrossStageTaskDrag.stories.js +544 -0
  5. package/dist/canvas/components/StageNode/DropPlaceholder.cjs +106 -0
  6. package/dist/canvas/components/StageNode/DropPlaceholder.d.ts +10 -0
  7. package/dist/canvas/components/StageNode/DropPlaceholder.d.ts.map +1 -0
  8. package/dist/canvas/components/StageNode/DropPlaceholder.js +72 -0
  9. package/dist/canvas/components/StageNode/StageNode.cjs +334 -389
  10. package/dist/canvas/components/StageNode/StageNode.d.ts.map +1 -1
  11. package/dist/canvas/components/StageNode/StageNode.js +336 -391
  12. package/dist/canvas/components/StageNode/StageNode.stories.cjs +1910 -1416
  13. package/dist/canvas/components/StageNode/StageNode.stories.d.ts +1 -1
  14. package/dist/canvas/components/StageNode/StageNode.stories.d.ts.map +1 -1
  15. package/dist/canvas/components/StageNode/StageNode.stories.js +1906 -1412
  16. package/dist/canvas/components/StageNode/StageNode.styles.cjs +1 -1
  17. package/dist/canvas/components/StageNode/StageNode.styles.js +1 -1
  18. package/dist/canvas/components/StageNode/StageNode.types.d.ts +26 -10
  19. package/dist/canvas/components/StageNode/StageNode.types.d.ts.map +1 -1
  20. package/dist/canvas/components/StageNode/StageNodeTaskUtilities.cjs +10 -5
  21. package/dist/canvas/components/StageNode/StageNodeTaskUtilities.d.ts +2 -1
  22. package/dist/canvas/components/StageNode/StageNodeTaskUtilities.d.ts.map +1 -1
  23. package/dist/canvas/components/StageNode/StageNodeTaskUtilities.js +6 -4
  24. package/dist/canvas/components/StageNode/TaskMenu.cjs +11 -43
  25. package/dist/canvas/components/StageNode/TaskMenu.d.ts +1 -6
  26. package/dist/canvas/components/StageNode/TaskMenu.d.ts.map +1 -1
  27. package/dist/canvas/components/StageNode/TaskMenu.js +13 -35
  28. package/dist/canvas/components/StageNode/index.cjs +17 -3
  29. package/dist/canvas/components/StageNode/index.d.ts +4 -1
  30. package/dist/canvas/components/StageNode/index.d.ts.map +1 -1
  31. package/dist/canvas/components/StageNode/index.js +3 -1
  32. package/dist/canvas/components/TaskNode/PlaceholderTaskNode.cjs +51 -0
  33. package/dist/canvas/components/TaskNode/PlaceholderTaskNode.d.ts +8 -0
  34. package/dist/canvas/components/TaskNode/PlaceholderTaskNode.d.ts.map +1 -0
  35. package/dist/canvas/components/TaskNode/PlaceholderTaskNode.js +17 -0
  36. package/dist/canvas/components/TaskNode/TaskNode.cjs +235 -0
  37. package/dist/canvas/components/TaskNode/TaskNode.d.ts +11 -0
  38. package/dist/canvas/components/TaskNode/TaskNode.d.ts.map +1 -0
  39. package/dist/canvas/components/TaskNode/TaskNode.js +198 -0
  40. package/dist/canvas/components/TaskNode/TaskNode.stories.cjs +558 -0
  41. package/dist/canvas/components/TaskNode/TaskNode.stories.d.ts +8 -0
  42. package/dist/canvas/components/TaskNode/TaskNode.stories.d.ts.map +1 -0
  43. package/dist/canvas/components/TaskNode/TaskNode.stories.js +515 -0
  44. package/dist/canvas/components/TaskNode/TaskNode.types.d.ts +40 -0
  45. package/dist/canvas/components/TaskNode/TaskNode.types.d.ts.map +1 -0
  46. package/dist/canvas/components/TaskNode/TaskNodeContext.cjs +86 -0
  47. package/dist/canvas/components/TaskNode/TaskNodeContext.d.ts +24 -0
  48. package/dist/canvas/components/TaskNode/TaskNodeContext.d.ts.map +1 -0
  49. package/dist/canvas/components/TaskNode/TaskNodeContext.js +40 -0
  50. package/dist/canvas/components/TaskNode/index.cjs +82 -0
  51. package/dist/canvas/components/TaskNode/index.d.ts +8 -0
  52. package/dist/canvas/components/TaskNode/index.d.ts.map +1 -0
  53. package/dist/canvas/components/TaskNode/index.js +6 -0
  54. package/dist/canvas/components/TaskNode/taskReorderUtils.cjs +206 -0
  55. package/dist/canvas/components/TaskNode/taskReorderUtils.d.ts +23 -0
  56. package/dist/canvas/components/TaskNode/taskReorderUtils.d.ts.map +1 -0
  57. package/dist/canvas/components/TaskNode/taskReorderUtils.js +154 -0
  58. package/dist/canvas/components/TaskNode/useTaskPositions.cjs +153 -0
  59. package/dist/canvas/components/TaskNode/useTaskPositions.d.ts +29 -0
  60. package/dist/canvas/components/TaskNode/useTaskPositions.d.ts.map +1 -0
  61. package/dist/canvas/components/TaskNode/useTaskPositions.js +110 -0
  62. package/dist/canvas/core/TaskTypeRegistry.cjs +132 -0
  63. package/dist/canvas/core/TaskTypeRegistry.d.ts +18 -0
  64. package/dist/canvas/core/TaskTypeRegistry.d.ts.map +1 -0
  65. package/dist/canvas/core/TaskTypeRegistry.js +98 -0
  66. package/dist/canvas/core/index.cjs +21 -3
  67. package/dist/canvas/core/index.d.ts +2 -0
  68. package/dist/canvas/core/index.d.ts.map +1 -1
  69. package/dist/canvas/core/index.js +2 -0
  70. package/dist/canvas/core/useTaskTypeRegistry.cjs +82 -0
  71. package/dist/canvas/core/useTaskTypeRegistry.d.ts +13 -0
  72. package/dist/canvas/core/useTaskTypeRegistry.d.ts.map +1 -0
  73. package/dist/canvas/core/useTaskTypeRegistry.js +33 -0
  74. package/dist/canvas/hooks/CrossStageDragContext.cjs +45 -0
  75. package/dist/canvas/hooks/CrossStageDragContext.d.ts +8 -0
  76. package/dist/canvas/hooks/CrossStageDragContext.d.ts.map +1 -0
  77. package/dist/canvas/hooks/CrossStageDragContext.js +8 -0
  78. package/dist/canvas/hooks/calculateTaskDropPosition.cjs +253 -0
  79. package/dist/canvas/hooks/calculateTaskDropPosition.d.ts +11 -0
  80. package/dist/canvas/hooks/calculateTaskDropPosition.d.ts.map +1 -0
  81. package/dist/canvas/hooks/calculateTaskDropPosition.js +216 -0
  82. package/dist/canvas/hooks/index.cjs +57 -30
  83. package/dist/canvas/hooks/index.d.ts +3 -0
  84. package/dist/canvas/hooks/index.d.ts.map +1 -1
  85. package/dist/canvas/hooks/index.js +3 -0
  86. package/dist/canvas/hooks/useCrossStageTaskDrag.cjs +346 -0
  87. package/dist/canvas/hooks/useCrossStageTaskDrag.d.ts +44 -0
  88. package/dist/canvas/hooks/useCrossStageTaskDrag.d.ts.map +1 -0
  89. package/dist/canvas/hooks/useCrossStageTaskDrag.js +312 -0
  90. package/dist/canvas/hooks/useTaskCopyPaste.cjs +155 -0
  91. package/dist/canvas/hooks/useTaskCopyPaste.d.ts +34 -0
  92. package/dist/canvas/hooks/useTaskCopyPaste.d.ts.map +1 -0
  93. package/dist/canvas/hooks/useTaskCopyPaste.js +121 -0
  94. package/dist/canvas/schema/index.cjs +12 -3
  95. package/dist/canvas/schema/index.d.ts +1 -0
  96. package/dist/canvas/schema/index.d.ts.map +1 -1
  97. package/dist/canvas/schema/index.js +1 -0
  98. package/dist/canvas/schema/task-definition/index.cjs +60 -0
  99. package/dist/canvas/schema/task-definition/index.d.ts +2 -0
  100. package/dist/canvas/schema/task-definition/index.d.ts.map +1 -0
  101. package/dist/canvas/schema/task-definition/index.js +1 -0
  102. package/dist/canvas/schema/task-definition/task-manifest.cjs +78 -0
  103. package/dist/canvas/schema/task-definition/task-manifest.d.ts +43 -0
  104. package/dist/canvas/schema/task-definition/task-manifest.d.ts.map +1 -0
  105. package/dist/canvas/schema/task-definition/task-manifest.js +29 -0
  106. package/dist/material/components/ap-sankey-diagram/ApSankeyDiagram.cjs +44 -21
  107. package/dist/material/components/ap-sankey-diagram/ApSankeyDiagram.d.ts.map +1 -1
  108. package/dist/material/components/ap-sankey-diagram/ApSankeyDiagram.js +44 -21
  109. package/package.json +3 -3
  110. package/dist/canvas/components/StageNode/DraggableTask.cjs +0 -271
  111. package/dist/canvas/components/StageNode/DraggableTask.d.ts +0 -4
  112. package/dist/canvas/components/StageNode/DraggableTask.d.ts.map +0 -1
  113. package/dist/canvas/components/StageNode/DraggableTask.js +0 -234
  114. package/dist/canvas/components/StageNode/DraggableTask.types.d.ts +0 -20
  115. package/dist/canvas/components/StageNode/DraggableTask.types.d.ts.map +0 -1
  116. package/dist/canvas/components/StageNode/StageNode.utils.cjs +0 -164
  117. package/dist/canvas/components/StageNode/StageNode.utils.d.ts +0 -19
  118. package/dist/canvas/components/StageNode/StageNode.utils.d.ts.map +0 -1
  119. package/dist/canvas/components/StageNode/StageNode.utils.js +0 -121
  120. /package/dist/canvas/components/{StageNode/DraggableTask.types.cjs → TaskNode/TaskNode.types.cjs} +0 -0
  121. /package/dist/canvas/components/{StageNode/DraggableTask.types.js → TaskNode/TaskNode.types.js} +0 -0
@@ -0,0 +1,312 @@
1
+ import { useReactFlow } from "@xyflow/react";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { insertTaskAtPosition, removeTaskFromTaskIds } from "../components/TaskNode/taskReorderUtils.js";
4
+ import { DEFAULT_TASK_POSITION_CONFIG, calculateTaskPositions } from "../components/TaskNode/useTaskPositions.js";
5
+ import { calculateDropPosition, convertToGroupPosition } from "./calculateTaskDropPosition.js";
6
+ function isPointInStage(x, y, stageX, stageY, stageWidth, stageHeight) {
7
+ return x >= stageX && x <= stageX + stageWidth && y >= stageY && y <= stageY + stageHeight;
8
+ }
9
+ function useCrossStageTaskDrag(callbacks = {}) {
10
+ const { setNodes, getNodes } = useReactFlow();
11
+ const { onTaskMove, onTaskCopy, onTaskReorder } = callbacks;
12
+ const [dragState, setDragState] = useState({
13
+ isDragging: false,
14
+ taskId: null,
15
+ sourceStageId: null,
16
+ targetStageId: null,
17
+ isCopyMode: false,
18
+ dropPosition: null
19
+ });
20
+ const isCopyModeRef = useRef(false);
21
+ const isDraggingRef = useRef(false);
22
+ const draggedTaskIdRef = useRef(null);
23
+ const sourceStageIdRef = useRef(null);
24
+ const currentDropPositionRef = useRef(null);
25
+ const currentTargetStageRef = useRef(null);
26
+ const lastDropPositionRef = useRef(null);
27
+ useEffect(()=>{
28
+ if (!dragState.isDragging || !dragState.dropPosition || !dragState.taskId || !dragState.targetStageId) {
29
+ lastDropPositionRef.current = null;
30
+ return;
31
+ }
32
+ const { groupIndex, taskIndex, isParallel } = dragState.dropPosition;
33
+ const lastPos = lastDropPositionRef.current;
34
+ if (lastPos && lastPos.groupIndex === groupIndex && lastPos.taskIndex === taskIndex && lastPos.isParallel === isParallel && lastPos.targetStageId === dragState.targetStageId) return;
35
+ lastDropPositionRef.current = {
36
+ groupIndex,
37
+ taskIndex,
38
+ isParallel,
39
+ targetStageId: dragState.targetStageId
40
+ };
41
+ const allNodes = getNodes();
42
+ const targetStage = allNodes.find((n)=>n.id === dragState.targetStageId);
43
+ if (!targetStage) return;
44
+ const targetStageData = targetStage.data;
45
+ const stageDetails = targetStageData?.stageDetails;
46
+ const taskIds = stageDetails?.taskIds || [];
47
+ const filteredTaskIds = removeTaskFromTaskIds(taskIds, dragState.taskId);
48
+ const placeholderId = '__placeholder__';
49
+ const taskIdsWithPlaceholder = insertTaskAtPosition(filteredTaskIds, placeholderId, {
50
+ groupIndex,
51
+ taskIndex,
52
+ isParallel
53
+ });
54
+ const stageWidth = targetStage.style?.width || 304;
55
+ setNodes((currentNodes)=>{
56
+ const positions = calculateTaskPositions(taskIdsWithPlaceholder, stageWidth, currentNodes);
57
+ const getOriginalPositions = (stageId)=>{
58
+ const stage = currentNodes.find((s)=>s.id === stageId);
59
+ if (!stage) return null;
60
+ const stageData = stage.data;
61
+ const details = stageData?.stageDetails;
62
+ const stageTaskIds = details?.taskIds || [];
63
+ const filteredIds = dragState.taskId ? removeTaskFromTaskIds(stageTaskIds, dragState.taskId) : stageTaskIds;
64
+ const width = stage.style?.width || 304;
65
+ return calculateTaskPositions(filteredIds, width, currentNodes);
66
+ };
67
+ let updatedNodes = currentNodes.map((n)=>{
68
+ if ('task' === n.type && n.id !== dragState.taskId && n.parentId === dragState.targetStageId) {
69
+ const pos = positions.get(n.id);
70
+ if (pos) return {
71
+ ...n,
72
+ position: {
73
+ x: pos.x,
74
+ y: pos.y
75
+ }
76
+ };
77
+ }
78
+ if ('task' === n.type && n.id !== dragState.taskId && dragState.sourceStageId && dragState.sourceStageId !== dragState.targetStageId && n.parentId === dragState.sourceStageId) {
79
+ const sourcePositions = getOriginalPositions(dragState.sourceStageId);
80
+ if (sourcePositions) {
81
+ const pos = sourcePositions.get(n.id);
82
+ if (pos) return {
83
+ ...n,
84
+ position: {
85
+ x: pos.x,
86
+ y: pos.y
87
+ }
88
+ };
89
+ }
90
+ }
91
+ if ('task' === n.type && n.id !== dragState.taskId && n.parentId !== dragState.targetStageId && n.parentId !== dragState.sourceStageId) {
92
+ const otherPositions = getOriginalPositions(n.parentId);
93
+ if (otherPositions) {
94
+ const pos = otherPositions.get(n.id);
95
+ if (pos) return {
96
+ ...n,
97
+ position: {
98
+ x: pos.x,
99
+ y: pos.y
100
+ }
101
+ };
102
+ }
103
+ }
104
+ return n;
105
+ });
106
+ updatedNodes = updatedNodes.filter((n)=>'__placeholder__' !== n.id);
107
+ const placeholderPos = positions.get(placeholderId);
108
+ if (placeholderPos && dragState.targetStageId) updatedNodes.push({
109
+ id: '__placeholder__',
110
+ type: 'placeholder',
111
+ parentId: dragState.targetStageId,
112
+ extent: 'parent',
113
+ position: {
114
+ x: placeholderPos.x,
115
+ y: placeholderPos.y
116
+ },
117
+ width: placeholderPos.width,
118
+ data: {
119
+ isParallel
120
+ },
121
+ draggable: false,
122
+ selectable: false,
123
+ focusable: false
124
+ });
125
+ return updatedNodes;
126
+ });
127
+ }, [
128
+ dragState,
129
+ setNodes,
130
+ getNodes
131
+ ]);
132
+ const handleKeyDown = useCallback((e)=>{
133
+ if (e.altKey || e.metaKey) {
134
+ isCopyModeRef.current = true;
135
+ setDragState((prev)=>({
136
+ ...prev,
137
+ isCopyMode: true
138
+ }));
139
+ }
140
+ }, []);
141
+ const handleKeyUp = useCallback((e)=>{
142
+ if (!e.altKey && !e.metaKey) {
143
+ isCopyModeRef.current = false;
144
+ setDragState((prev)=>({
145
+ ...prev,
146
+ isCopyMode: false
147
+ }));
148
+ }
149
+ }, []);
150
+ const onNodeDragStart = useCallback((_event, node, _nodes)=>{
151
+ if ('task' !== node.type) return;
152
+ const sourceStageId = node.parentId;
153
+ if (!sourceStageId) return;
154
+ isDraggingRef.current = true;
155
+ draggedTaskIdRef.current = node.id;
156
+ sourceStageIdRef.current = sourceStageId;
157
+ currentTargetStageRef.current = sourceStageId;
158
+ setDragState({
159
+ isDragging: true,
160
+ taskId: node.id,
161
+ sourceStageId,
162
+ targetStageId: sourceStageId,
163
+ isCopyMode: isCopyModeRef.current,
164
+ dropPosition: null
165
+ });
166
+ window.addEventListener('keydown', handleKeyDown);
167
+ window.addEventListener('keyup', handleKeyUp);
168
+ }, [
169
+ handleKeyDown,
170
+ handleKeyUp
171
+ ]);
172
+ const onNodeDrag = useCallback((_event, node, _nodes)=>{
173
+ if ('task' !== node.type || !dragState.isDragging) return;
174
+ const allNodes = getNodes();
175
+ const nodeWidth = node.width || DEFAULT_TASK_POSITION_CONFIG.taskHeight;
176
+ const nodeHeight = node.measured?.height || DEFAULT_TASK_POSITION_CONFIG.taskHeight;
177
+ const parentStage = allNodes.find((n)=>n.id === node.parentId);
178
+ const absoluteX = (parentStage?.position.x || 0) + node.position.x;
179
+ const absoluteY = (parentStage?.position.y || 0) + node.position.y;
180
+ const nodeCenterX = absoluteX + nodeWidth / 2;
181
+ const nodeCenterY = absoluteY + nodeHeight / 2;
182
+ const stageNodes = allNodes.filter((n)=>{
183
+ const nodeType = n.data?.nodeType;
184
+ return 'stage' === n.type || 'stageV2' === n.type || 'string' == typeof nodeType && nodeType.includes('Stage');
185
+ });
186
+ let targetStage;
187
+ for (const stage of stageNodes){
188
+ const stageWidth = stage.style?.width || stage.width || 304;
189
+ const stageHeight = stage.style?.height || stage.measured?.height || 200;
190
+ if (isPointInStage(nodeCenterX, nodeCenterY, stage.position.x, stage.position.y, stageWidth, stageHeight)) {
191
+ targetStage = stage;
192
+ break;
193
+ }
194
+ }
195
+ if (targetStage) {
196
+ const targetStageData = targetStage.data;
197
+ const stageDetails = targetStageData?.stageDetails;
198
+ const taskIds = stageDetails?.taskIds || [];
199
+ const stageWidth = targetStage.style?.width || 304;
200
+ const relativeX = absoluteX - targetStage.position.x;
201
+ const relativeY = absoluteY - targetStage.position.y;
202
+ const dropPos = calculateDropPosition(relativeY, nodeHeight, relativeX, nodeWidth, stageWidth, taskIds, node.id);
203
+ const filteredTaskIds = taskIds.map((g)=>g.filter((id)=>id !== node.id)).filter((g)=>g.length > 0);
204
+ const { groupIndex, taskIndex } = convertToGroupPosition(dropPos.index, dropPos.isParallel, filteredTaskIds, dropPos.draggedYCenter, taskIds);
205
+ currentDropPositionRef.current = {
206
+ groupIndex,
207
+ taskIndex,
208
+ isParallel: dropPos.isParallel
209
+ };
210
+ currentTargetStageRef.current = targetStage.id;
211
+ setDragState((prev)=>({
212
+ ...prev,
213
+ targetStageId: targetStage.id,
214
+ dropPosition: {
215
+ groupIndex,
216
+ taskIndex,
217
+ isParallel: dropPos.isParallel
218
+ }
219
+ }));
220
+ }
221
+ }, [
222
+ dragState.isDragging,
223
+ getNodes
224
+ ]);
225
+ const onNodeDragStop = useCallback((_event, node, _nodes)=>{
226
+ if ('task' !== node.type || !isDraggingRef.current) return;
227
+ window.removeEventListener('keydown', handleKeyDown);
228
+ window.removeEventListener('keyup', handleKeyUp);
229
+ const taskId = draggedTaskIdRef.current;
230
+ const sourceStageId = sourceStageIdRef.current;
231
+ const isCopyMode = isCopyModeRef.current;
232
+ const dropPosition = currentDropPositionRef.current;
233
+ const targetStageId = currentTargetStageRef.current;
234
+ if (taskId && sourceStageId && targetStageId && dropPosition) {
235
+ const isCrossStage = sourceStageId !== targetStageId;
236
+ if (isCrossStage) if (isCopyMode) {
237
+ const newTaskId = `task-${crypto.randomUUID()}`;
238
+ onTaskCopy?.({
239
+ taskId,
240
+ newTaskId,
241
+ sourceStageId,
242
+ targetStageId,
243
+ position: dropPosition
244
+ });
245
+ } else onTaskMove?.({
246
+ taskId,
247
+ sourceStageId,
248
+ targetStageId,
249
+ position: dropPosition
250
+ });
251
+ else onTaskReorder?.({
252
+ taskId,
253
+ stageId: sourceStageId,
254
+ position: dropPosition
255
+ });
256
+ }
257
+ isDraggingRef.current = false;
258
+ draggedTaskIdRef.current = null;
259
+ sourceStageIdRef.current = null;
260
+ currentDropPositionRef.current = null;
261
+ currentTargetStageRef.current = null;
262
+ setNodes((nodes)=>{
263
+ const filteredNodes = nodes.filter((n)=>'__placeholder__' !== n.id);
264
+ const draggedNode = filteredNodes.find((n)=>n.id === taskId);
265
+ if (!draggedNode || !draggedNode.parentId) return filteredNodes;
266
+ const parentStage = filteredNodes.find((n)=>n.id === draggedNode.parentId);
267
+ if (!parentStage) return filteredNodes;
268
+ const stageData = parentStage.data;
269
+ const stageDetails = stageData?.stageDetails;
270
+ const stageTaskIds = stageDetails?.taskIds || [];
271
+ const stageWidth = parentStage.style?.width || 304;
272
+ const positions = calculateTaskPositions(stageTaskIds, stageWidth, filteredNodes);
273
+ return filteredNodes.map((n)=>{
274
+ if ('task' === n.type && n.parentId === draggedNode.parentId) {
275
+ const pos = positions.get(n.id);
276
+ if (pos) return {
277
+ ...n,
278
+ position: {
279
+ x: pos.x,
280
+ y: pos.y
281
+ }
282
+ };
283
+ }
284
+ return n;
285
+ });
286
+ });
287
+ setDragState({
288
+ isDragging: false,
289
+ taskId: null,
290
+ sourceStageId: null,
291
+ targetStageId: null,
292
+ isCopyMode: false,
293
+ dropPosition: null
294
+ });
295
+ }, [
296
+ handleKeyDown,
297
+ handleKeyUp,
298
+ onTaskCopy,
299
+ onTaskMove,
300
+ onTaskReorder,
301
+ setNodes
302
+ ]);
303
+ return {
304
+ dragState,
305
+ handlers: {
306
+ onNodeDragStart,
307
+ onNodeDrag,
308
+ onNodeDragStop
309
+ }
310
+ };
311
+ }
312
+ export { useCrossStageTaskDrag };
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ useTaskCopyPaste: ()=>useTaskCopyPaste
28
+ });
29
+ const react_namespaceObject = require("@xyflow/react");
30
+ const external_react_namespaceObject = require("react");
31
+ function useTaskCopyPaste(callbacks = {}, options = {}) {
32
+ const { getNode } = (0, react_namespaceObject.useReactFlow)();
33
+ const { onTaskPaste, onTaskCopy } = callbacks;
34
+ const { selectedTaskId = null, targetStageId = null, targetTaskIds = [], enabled = true } = options;
35
+ const [clipboard, setClipboard] = (0, external_react_namespaceObject.useState)(null);
36
+ const selectedTaskIdRef = (0, external_react_namespaceObject.useRef)(selectedTaskId);
37
+ const targetStageIdRef = (0, external_react_namespaceObject.useRef)(targetStageId);
38
+ const targetTaskIdsRef = (0, external_react_namespaceObject.useRef)(targetTaskIds);
39
+ (0, external_react_namespaceObject.useEffect)(()=>{
40
+ selectedTaskIdRef.current = selectedTaskId;
41
+ targetStageIdRef.current = targetStageId;
42
+ targetTaskIdsRef.current = targetTaskIds;
43
+ }, [
44
+ selectedTaskId,
45
+ targetStageId,
46
+ targetTaskIds
47
+ ]);
48
+ const copyTask = (0, external_react_namespaceObject.useCallback)(()=>{
49
+ const taskId = selectedTaskIdRef.current;
50
+ if (!taskId) return false;
51
+ const taskNode = getNode(taskId);
52
+ if (!taskNode || 'task' !== taskNode.type) return false;
53
+ const taskData = taskNode.data;
54
+ const sourceStageId = taskNode.parentId;
55
+ if (!sourceStageId) return false;
56
+ const clipboardTask = {
57
+ originalId: taskId,
58
+ sourceStageId,
59
+ data: {
60
+ taskType: taskData.taskType,
61
+ label: taskData.label,
62
+ icon: taskData.icon,
63
+ iconElement: taskData.iconElement,
64
+ execution: taskData.execution
65
+ }
66
+ };
67
+ setClipboard(clipboardTask);
68
+ onTaskCopy?.(clipboardTask);
69
+ return true;
70
+ }, [
71
+ getNode,
72
+ onTaskCopy
73
+ ]);
74
+ const pasteTask = (0, external_react_namespaceObject.useCallback)(()=>{
75
+ if (!clipboard) return false;
76
+ const targetId = targetStageIdRef.current;
77
+ if (!targetId) return false;
78
+ const targetNode = getNode(targetId);
79
+ if (!targetNode) return false;
80
+ const nodeType = targetNode.type;
81
+ const nodeData = targetNode.data;
82
+ const dataNodeType = nodeData?.nodeType;
83
+ const isStage = 'stage' === nodeType || 'stageV2' === nodeType || 'string' == typeof dataNodeType && dataNodeType.includes('Stage');
84
+ if (!isStage) return false;
85
+ const newTaskId = `task-${crypto.randomUUID()}`;
86
+ const currentTaskIds = targetTaskIdsRef.current;
87
+ const position = {
88
+ groupIndex: currentTaskIds.length,
89
+ taskIndex: 0
90
+ };
91
+ onTaskPaste?.({
92
+ newTaskId,
93
+ originalData: clipboard.data,
94
+ sourceStageId: clipboard.sourceStageId,
95
+ targetStageId: targetId,
96
+ position
97
+ });
98
+ return true;
99
+ }, [
100
+ clipboard,
101
+ getNode,
102
+ onTaskPaste
103
+ ]);
104
+ const hasClipboardContent = null !== clipboard;
105
+ const clearClipboard = (0, external_react_namespaceObject.useCallback)(()=>{
106
+ setClipboard(null);
107
+ }, []);
108
+ const handleKeyDown = (0, external_react_namespaceObject.useCallback)((event)=>{
109
+ if (!enabled) return;
110
+ const isModifierPressed = event.ctrlKey || event.metaKey;
111
+ if (!isModifierPressed) return;
112
+ const target = event.target;
113
+ if ('INPUT' === target.tagName || 'TEXTAREA' === target.tagName || target.isContentEditable) return;
114
+ switch(event.key.toLowerCase()){
115
+ case 'c':
116
+ if (copyTask()) event.preventDefault();
117
+ break;
118
+ case 'v':
119
+ if (pasteTask()) event.preventDefault();
120
+ break;
121
+ }
122
+ }, [
123
+ enabled,
124
+ copyTask,
125
+ pasteTask
126
+ ]);
127
+ (0, external_react_namespaceObject.useEffect)(()=>{
128
+ if (!enabled) return;
129
+ window.addEventListener('keydown', handleKeyDown, {
130
+ capture: true
131
+ });
132
+ return ()=>{
133
+ window.removeEventListener('keydown', handleKeyDown, {
134
+ capture: true
135
+ });
136
+ };
137
+ }, [
138
+ enabled,
139
+ handleKeyDown
140
+ ]);
141
+ return {
142
+ clipboard,
143
+ hasClipboardContent,
144
+ copyTask,
145
+ pasteTask,
146
+ clearClipboard
147
+ };
148
+ }
149
+ exports.useTaskCopyPaste = __webpack_exports__.useTaskCopyPaste;
150
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
151
+ "useTaskCopyPaste"
152
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
153
+ Object.defineProperty(exports, '__esModule', {
154
+ value: true
155
+ });
@@ -0,0 +1,34 @@
1
+ import type { TaskNodeData } from '../components/TaskNode/TaskNode.types';
2
+ export interface ClipboardTask {
3
+ originalId: string;
4
+ sourceStageId: string;
5
+ data: Omit<TaskNodeData, 'groupIndex' | 'taskIndex'>;
6
+ }
7
+ export interface TaskPasteParams {
8
+ newTaskId: string;
9
+ originalData: Omit<TaskNodeData, 'groupIndex' | 'taskIndex'>;
10
+ sourceStageId: string;
11
+ targetStageId: string;
12
+ position: {
13
+ groupIndex: number;
14
+ taskIndex: number;
15
+ };
16
+ }
17
+ export interface TaskCopyPasteCallbacks {
18
+ onTaskPaste?: (params: TaskPasteParams) => void;
19
+ onTaskCopy?: (task: ClipboardTask) => void;
20
+ }
21
+ export interface UseTaskCopyPasteOptions {
22
+ selectedTaskId?: string | null;
23
+ targetStageId?: string | null;
24
+ targetTaskIds?: string[][];
25
+ enabled?: boolean;
26
+ }
27
+ export declare function useTaskCopyPaste(callbacks?: TaskCopyPasteCallbacks, options?: UseTaskCopyPasteOptions): {
28
+ clipboard: ClipboardTask | null;
29
+ hasClipboardContent: boolean;
30
+ copyTask: () => boolean;
31
+ pasteTask: () => boolean;
32
+ clearClipboard: () => void;
33
+ };
34
+ //# sourceMappingURL=useTaskCopyPaste.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTaskCopyPaste.d.ts","sourceRoot":"","sources":["../../../src/canvas/hooks/useTaskCopyPaste.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAK1E,MAAM,WAAW,aAAa;IAE5B,UAAU,EAAE,MAAM,CAAC;IAEnB,aAAa,EAAE,MAAM,CAAC;IAEtB,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,WAAW,CAAC,CAAC;CACtD;AAKD,MAAM,WAAW,eAAe;IAE9B,SAAS,EAAE,MAAM,CAAC;IAElB,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,WAAW,CAAC,CAAC;IAE7D,aAAa,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,MAAM,CAAC;IAEtB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAKD,MAAM,WAAW,sBAAsB;IAErC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IAEhD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;CAC5C;AAKD,MAAM,WAAW,uBAAuB;IAEtC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IAE3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAKD,wBAAgB,gBAAgB,CAC9B,SAAS,GAAE,sBAA2B,EACtC,OAAO,GAAE,uBAA4B;;;;;;EA2KtC"}
@@ -0,0 +1,121 @@
1
+ import { useReactFlow } from "@xyflow/react";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ function useTaskCopyPaste(callbacks = {}, options = {}) {
4
+ const { getNode } = useReactFlow();
5
+ const { onTaskPaste, onTaskCopy } = callbacks;
6
+ const { selectedTaskId = null, targetStageId = null, targetTaskIds = [], enabled = true } = options;
7
+ const [clipboard, setClipboard] = useState(null);
8
+ const selectedTaskIdRef = useRef(selectedTaskId);
9
+ const targetStageIdRef = useRef(targetStageId);
10
+ const targetTaskIdsRef = useRef(targetTaskIds);
11
+ useEffect(()=>{
12
+ selectedTaskIdRef.current = selectedTaskId;
13
+ targetStageIdRef.current = targetStageId;
14
+ targetTaskIdsRef.current = targetTaskIds;
15
+ }, [
16
+ selectedTaskId,
17
+ targetStageId,
18
+ targetTaskIds
19
+ ]);
20
+ const copyTask = useCallback(()=>{
21
+ const taskId = selectedTaskIdRef.current;
22
+ if (!taskId) return false;
23
+ const taskNode = getNode(taskId);
24
+ if (!taskNode || 'task' !== taskNode.type) return false;
25
+ const taskData = taskNode.data;
26
+ const sourceStageId = taskNode.parentId;
27
+ if (!sourceStageId) return false;
28
+ const clipboardTask = {
29
+ originalId: taskId,
30
+ sourceStageId,
31
+ data: {
32
+ taskType: taskData.taskType,
33
+ label: taskData.label,
34
+ icon: taskData.icon,
35
+ iconElement: taskData.iconElement,
36
+ execution: taskData.execution
37
+ }
38
+ };
39
+ setClipboard(clipboardTask);
40
+ onTaskCopy?.(clipboardTask);
41
+ return true;
42
+ }, [
43
+ getNode,
44
+ onTaskCopy
45
+ ]);
46
+ const pasteTask = useCallback(()=>{
47
+ if (!clipboard) return false;
48
+ const targetId = targetStageIdRef.current;
49
+ if (!targetId) return false;
50
+ const targetNode = getNode(targetId);
51
+ if (!targetNode) return false;
52
+ const nodeType = targetNode.type;
53
+ const nodeData = targetNode.data;
54
+ const dataNodeType = nodeData?.nodeType;
55
+ const isStage = 'stage' === nodeType || 'stageV2' === nodeType || 'string' == typeof dataNodeType && dataNodeType.includes('Stage');
56
+ if (!isStage) return false;
57
+ const newTaskId = `task-${crypto.randomUUID()}`;
58
+ const currentTaskIds = targetTaskIdsRef.current;
59
+ const position = {
60
+ groupIndex: currentTaskIds.length,
61
+ taskIndex: 0
62
+ };
63
+ onTaskPaste?.({
64
+ newTaskId,
65
+ originalData: clipboard.data,
66
+ sourceStageId: clipboard.sourceStageId,
67
+ targetStageId: targetId,
68
+ position
69
+ });
70
+ return true;
71
+ }, [
72
+ clipboard,
73
+ getNode,
74
+ onTaskPaste
75
+ ]);
76
+ const hasClipboardContent = null !== clipboard;
77
+ const clearClipboard = useCallback(()=>{
78
+ setClipboard(null);
79
+ }, []);
80
+ const handleKeyDown = useCallback((event)=>{
81
+ if (!enabled) return;
82
+ const isModifierPressed = event.ctrlKey || event.metaKey;
83
+ if (!isModifierPressed) return;
84
+ const target = event.target;
85
+ if ('INPUT' === target.tagName || 'TEXTAREA' === target.tagName || target.isContentEditable) return;
86
+ switch(event.key.toLowerCase()){
87
+ case 'c':
88
+ if (copyTask()) event.preventDefault();
89
+ break;
90
+ case 'v':
91
+ if (pasteTask()) event.preventDefault();
92
+ break;
93
+ }
94
+ }, [
95
+ enabled,
96
+ copyTask,
97
+ pasteTask
98
+ ]);
99
+ useEffect(()=>{
100
+ if (!enabled) return;
101
+ window.addEventListener('keydown', handleKeyDown, {
102
+ capture: true
103
+ });
104
+ return ()=>{
105
+ window.removeEventListener('keydown', handleKeyDown, {
106
+ capture: true
107
+ });
108
+ };
109
+ }, [
110
+ enabled,
111
+ handleKeyDown
112
+ ]);
113
+ return {
114
+ clipboard,
115
+ hasClipboardContent,
116
+ copyTask,
117
+ pasteTask,
118
+ clearClipboard
119
+ };
120
+ }
121
+ export { useTaskCopyPaste };
@@ -6,6 +6,9 @@ var __webpack_modules__ = {
6
6
  "./node-instance": function(module) {
7
7
  module.exports = require("./node-instance/index.cjs");
8
8
  },
9
+ "./task-definition": function(module) {
10
+ module.exports = require("./task-definition/index.cjs");
11
+ },
9
12
  "./toolbar": function(module) {
10
13
  module.exports = require("./toolbar.cjs");
11
14
  }
@@ -65,10 +68,16 @@ var __webpack_exports__ = {};
65
68
  return _node_instance__WEBPACK_IMPORTED_MODULE_1__[key];
66
69
  }).bind(0, __WEBPACK_IMPORT_KEY__);
67
70
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
68
- var _toolbar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./toolbar");
71
+ var _task_definition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("./task-definition");
72
+ var __WEBPACK_REEXPORT_OBJECT__ = {};
73
+ for(var __WEBPACK_IMPORT_KEY__ in _task_definition__WEBPACK_IMPORTED_MODULE_2__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
74
+ return _task_definition__WEBPACK_IMPORTED_MODULE_2__[key];
75
+ }).bind(0, __WEBPACK_IMPORT_KEY__);
76
+ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
77
+ var _toolbar__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./toolbar");
69
78
  var __WEBPACK_REEXPORT_OBJECT__ = {};
70
- for(var __WEBPACK_IMPORT_KEY__ in _toolbar__WEBPACK_IMPORTED_MODULE_2__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
71
- return _toolbar__WEBPACK_IMPORTED_MODULE_2__[key];
79
+ for(var __WEBPACK_IMPORT_KEY__ in _toolbar__WEBPACK_IMPORTED_MODULE_3__)if ("default" !== __WEBPACK_IMPORT_KEY__) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
80
+ return _toolbar__WEBPACK_IMPORTED_MODULE_3__[key];
72
81
  }).bind(0, __WEBPACK_IMPORT_KEY__);
73
82
  __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
74
83
  })();
@@ -1,4 +1,5 @@
1
1
  export * from './node-definition';
2
2
  export * from './node-instance';
3
+ export * from './task-definition';
3
4
  export * from './toolbar';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/canvas/schema/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/canvas/schema/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from "./node-definition/index.js";
2
2
  export * from "./node-instance/index.js";
3
+ export * from "./task-definition/index.js";
3
4
  export * from "./toolbar.js";