@uipath/apollo-react 3.44.1 → 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 (118) 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/package.json +1 -1
  107. package/dist/canvas/components/StageNode/DraggableTask.cjs +0 -271
  108. package/dist/canvas/components/StageNode/DraggableTask.d.ts +0 -4
  109. package/dist/canvas/components/StageNode/DraggableTask.d.ts.map +0 -1
  110. package/dist/canvas/components/StageNode/DraggableTask.js +0 -234
  111. package/dist/canvas/components/StageNode/DraggableTask.types.d.ts +0 -20
  112. package/dist/canvas/components/StageNode/DraggableTask.types.d.ts.map +0 -1
  113. package/dist/canvas/components/StageNode/StageNode.utils.cjs +0 -164
  114. package/dist/canvas/components/StageNode/StageNode.utils.d.ts +0 -19
  115. package/dist/canvas/components/StageNode/StageNode.utils.d.ts.map +0 -1
  116. package/dist/canvas/components/StageNode/StageNode.utils.js +0 -121
  117. /package/dist/canvas/components/{StageNode/DraggableTask.types.cjs → TaskNode/TaskNode.types.cjs} +0 -0
  118. /package/dist/canvas/components/{StageNode/DraggableTask.types.js → TaskNode/TaskNode.types.js} +0 -0
@@ -0,0 +1,544 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { ConnectionMode, Panel, ReactFlowProvider, useEdgesState, useNodesState } from "../../xyflow/react.js";
3
+ import { useCallback, useEffect, useMemo, useState } from "react";
4
+ import { CrossStageDragProvider } from "../../hooks/CrossStageDragContext.js";
5
+ import { useCrossStageTaskDrag } from "../../hooks/useCrossStageTaskDrag.js";
6
+ import { useTaskCopyPaste } from "../../hooks/useTaskCopyPaste.js";
7
+ import { DefaultCanvasTranslations } from "../../types.js";
8
+ import { BaseCanvas } from "../BaseCanvas/index.js";
9
+ import { CanvasPositionControls } from "../CanvasPositionControls.js";
10
+ import { TaskIcon, TaskItemTypeValues } from "../TaskIcon/index.js";
11
+ import { PlaceholderTaskNode, TaskNode } from "../TaskNode/index.js";
12
+ import { insertTaskAtPosition, moveTaskBetweenStages, moveTaskWithinStage } from "../TaskNode/taskReorderUtils.js";
13
+ import { calculateTaskPositions } from "../TaskNode/useTaskPositions.js";
14
+ import { StageConnectionEdge } from "./StageConnectionEdge.js";
15
+ import { StageEdge } from "./StageEdge.js";
16
+ import { StageNode } from "./StageNode.js";
17
+ const meta = {
18
+ title: 'Canvas/StageNode',
19
+ parameters: {
20
+ layout: 'fullscreen'
21
+ }
22
+ };
23
+ const CrossStageTaskDrag_stories = meta;
24
+ const StageNodeWrapper = (props)=>/*#__PURE__*/ jsx(StageNode, {
25
+ ...props,
26
+ ...props.data
27
+ });
28
+ const TaskNodeWrapper = (props)=>/*#__PURE__*/ jsx(TaskNode, {
29
+ ...props,
30
+ ...props.data
31
+ });
32
+ const initialStageData = {
33
+ 'stage-1': {
34
+ taskIds: [
35
+ [
36
+ 'task-1'
37
+ ],
38
+ [
39
+ 'task-2',
40
+ 'task-6'
41
+ ],
42
+ [
43
+ 'task-3',
44
+ 'task-4'
45
+ ],
46
+ [
47
+ 'task-5'
48
+ ]
49
+ ],
50
+ tasks: {
51
+ 'task-1': {
52
+ label: 'KYC Verification',
53
+ taskType: 'uipath.case-management.run-human-action'
54
+ },
55
+ 'task-2': {
56
+ label: 'Document Review',
57
+ taskType: 'uipath.case-management.process'
58
+ },
59
+ 'task-6': {
60
+ label: 'Credit Check',
61
+ taskType: 'uipath.case-management.rpa'
62
+ },
63
+ 'task-3': {
64
+ label: 'Address Check',
65
+ taskType: 'uipath.case-management.rpa'
66
+ },
67
+ 'task-4': {
68
+ label: 'Property Check',
69
+ taskType: 'uipath.case-management.rpa'
70
+ },
71
+ 'task-5': {
72
+ label: 'Final Approval',
73
+ taskType: 'uipath.case-management.agent'
74
+ }
75
+ }
76
+ },
77
+ 'stage-2': {
78
+ taskIds: [
79
+ [
80
+ 'task-7'
81
+ ],
82
+ [
83
+ 'task-8'
84
+ ]
85
+ ],
86
+ tasks: {
87
+ 'task-7': {
88
+ label: 'Report Generation',
89
+ taskType: 'uipath.case-management.api-workflow'
90
+ },
91
+ 'task-8': {
92
+ label: 'Send Notification',
93
+ taskType: 'uipath.case-management.action'
94
+ }
95
+ }
96
+ },
97
+ 'stage-3': {
98
+ taskIds: [],
99
+ tasks: {}
100
+ }
101
+ };
102
+ function getTaskIcon(taskType) {
103
+ if (taskType.includes('human-action')) return /*#__PURE__*/ jsx(TaskIcon, {
104
+ type: TaskItemTypeValues.User,
105
+ size: "sm"
106
+ });
107
+ if (taskType.includes('rpa')) return /*#__PURE__*/ jsx(TaskIcon, {
108
+ type: TaskItemTypeValues.Automation,
109
+ size: "sm"
110
+ });
111
+ if (taskType.includes('agent')) return /*#__PURE__*/ jsx(TaskIcon, {
112
+ type: TaskItemTypeValues.Agent,
113
+ size: "sm"
114
+ });
115
+ if (taskType.includes('api-workflow')) return /*#__PURE__*/ jsx(TaskIcon, {
116
+ type: TaskItemTypeValues.ApiAutomation,
117
+ size: "sm"
118
+ });
119
+ return /*#__PURE__*/ jsx(TaskIcon, {
120
+ type: TaskItemTypeValues.AgenticProcess,
121
+ size: "sm"
122
+ });
123
+ }
124
+ function createTaskNodes(stageId, stageData, stageWidth) {
125
+ const positions = calculateTaskPositions(stageData.taskIds, stageWidth);
126
+ const nodes = [];
127
+ stageData.taskIds.forEach((group, groupIndex)=>{
128
+ group.forEach((taskId, taskIndex)=>{
129
+ const taskInfo = stageData.tasks[taskId];
130
+ if (!taskInfo) return;
131
+ const position = positions.get(taskId);
132
+ if (!position) return;
133
+ nodes.push({
134
+ id: taskId,
135
+ type: 'task',
136
+ parentId: stageId,
137
+ position: {
138
+ x: position.x,
139
+ y: position.y
140
+ },
141
+ width: position.width,
142
+ data: {
143
+ taskType: taskInfo.taskType,
144
+ label: taskInfo.label,
145
+ iconElement: getTaskIcon(taskInfo.taskType),
146
+ groupIndex,
147
+ taskIndex,
148
+ width: position.width
149
+ }
150
+ });
151
+ });
152
+ });
153
+ return nodes;
154
+ }
155
+ const CrossStageTaskDragDemo = ()=>{
156
+ const [stageData, setStageData] = useState(initialStageData);
157
+ const [dragInfo, setDragInfo] = useState('');
158
+ const [selectedTaskId, setSelectedTaskId] = useState(null);
159
+ const [selectedStageId, setSelectedStageId] = useState(null);
160
+ const stageNodes = useMemo(()=>[
161
+ {
162
+ id: 'stage-1',
163
+ type: 'stageV2',
164
+ position: {
165
+ x: 48,
166
+ y: 96
167
+ },
168
+ style: {
169
+ width: 304
170
+ },
171
+ data: {
172
+ nodeType: 'case-management:Stage',
173
+ stageDetails: {
174
+ label: 'Processing',
175
+ taskIds: stageData['stage-1']?.taskIds ?? []
176
+ },
177
+ onTaskClick: (taskId)=>{
178
+ setSelectedTaskId(taskId);
179
+ setSelectedStageId('stage-1');
180
+ }
181
+ }
182
+ },
183
+ {
184
+ id: 'stage-2',
185
+ type: 'stageV2',
186
+ position: {
187
+ x: 400,
188
+ y: 96
189
+ },
190
+ style: {
191
+ width: 304
192
+ },
193
+ data: {
194
+ nodeType: 'case-management:Stage',
195
+ stageDetails: {
196
+ label: 'Review',
197
+ taskIds: stageData['stage-2']?.taskIds ?? []
198
+ },
199
+ onTaskClick: (taskId)=>{
200
+ setSelectedTaskId(taskId);
201
+ setSelectedStageId('stage-2');
202
+ }
203
+ }
204
+ },
205
+ {
206
+ id: 'stage-3',
207
+ type: 'stageV2',
208
+ position: {
209
+ x: 752,
210
+ y: 96
211
+ },
212
+ style: {
213
+ width: 304
214
+ },
215
+ data: {
216
+ nodeType: 'case-management:Stage',
217
+ stageDetails: {
218
+ label: 'Closing (Drop Here)',
219
+ taskIds: stageData['stage-3']?.taskIds ?? [],
220
+ defaultContent: 'Drag a task here'
221
+ },
222
+ onTaskClick: (taskId)=>{
223
+ setSelectedTaskId(taskId);
224
+ setSelectedStageId('stage-3');
225
+ },
226
+ onStageClick: ()=>setSelectedStageId('stage-3')
227
+ }
228
+ }
229
+ ], [
230
+ stageData
231
+ ]);
232
+ const taskNodes = useMemo(()=>{
233
+ const nodes = [];
234
+ for (const stageId of Object.keys(stageData)){
235
+ const data = stageData[stageId];
236
+ if (data) nodes.push(...createTaskNodes(stageId, data, 304));
237
+ }
238
+ return nodes;
239
+ }, [
240
+ stageData
241
+ ]);
242
+ const allNodes = useMemo(()=>[
243
+ ...stageNodes,
244
+ ...taskNodes
245
+ ], [
246
+ stageNodes,
247
+ taskNodes
248
+ ]);
249
+ const [nodes, setNodes, onNodesChange] = useNodesState(allNodes);
250
+ const [edges, _setEdges, onEdgesChange] = useEdgesState([
251
+ {
252
+ id: 'e1',
253
+ type: 'stage',
254
+ source: 'stage-1',
255
+ sourceHandle: 'stage-1____source____right',
256
+ target: 'stage-2',
257
+ targetHandle: 'stage-2____target____left'
258
+ },
259
+ {
260
+ id: 'e2',
261
+ type: 'stage',
262
+ source: 'stage-2',
263
+ sourceHandle: 'stage-2____source____right',
264
+ target: 'stage-3',
265
+ targetHandle: 'stage-3____target____left'
266
+ }
267
+ ]);
268
+ useEffect(()=>{
269
+ setNodes(allNodes);
270
+ }, [
271
+ allNodes,
272
+ setNodes
273
+ ]);
274
+ const handleTaskMove = useCallback((params)=>{
275
+ const { taskId, sourceStageId, targetStageId, position } = params;
276
+ setDragInfo(`Moved ${taskId} from ${sourceStageId} to ${targetStageId} at group ${position.groupIndex}${position.isParallel ? ' (parallel)' : ''}`);
277
+ setStageData((prev)=>{
278
+ const sourceStage = prev[sourceStageId];
279
+ const targetStage = prev[targetStageId];
280
+ if (!sourceStage?.tasks || !sourceStage?.taskIds || !targetStage) return prev;
281
+ const taskInfo = sourceStage.tasks[taskId];
282
+ if (!taskInfo) return prev;
283
+ const { sourceTaskIds: newSourceTaskIds, targetTaskIds: newTargetTaskIds } = moveTaskBetweenStages(sourceStage.taskIds, targetStage.taskIds || [], taskId, position);
284
+ const newSourceTasks = {
285
+ ...sourceStage.tasks
286
+ };
287
+ delete newSourceTasks[taskId];
288
+ return {
289
+ ...prev,
290
+ [sourceStageId]: {
291
+ ...sourceStage,
292
+ taskIds: newSourceTaskIds,
293
+ tasks: newSourceTasks
294
+ },
295
+ [targetStageId]: {
296
+ ...targetStage,
297
+ taskIds: newTargetTaskIds,
298
+ tasks: {
299
+ ...targetStage.tasks || {},
300
+ [taskId]: taskInfo
301
+ }
302
+ }
303
+ };
304
+ });
305
+ }, []);
306
+ const handleTaskCopy = useCallback((params)=>{
307
+ const { taskId, newTaskId, sourceStageId, targetStageId, position } = params;
308
+ setDragInfo(`Copied ${taskId} to ${newTaskId} in ${targetStageId} at group ${position.groupIndex}${position.isParallel ? ' (parallel)' : ''}`);
309
+ setStageData((prev)=>{
310
+ const sourceStage = prev[sourceStageId];
311
+ const targetStage = prev[targetStageId];
312
+ if (!sourceStage?.tasks || !targetStage) return prev;
313
+ const taskInfo = sourceStage.tasks[taskId];
314
+ if (!taskInfo) return prev;
315
+ const newTargetTaskIds = insertTaskAtPosition(targetStage.taskIds || [], newTaskId, position);
316
+ return {
317
+ ...prev,
318
+ [targetStageId]: {
319
+ ...targetStage,
320
+ taskIds: newTargetTaskIds,
321
+ tasks: {
322
+ ...targetStage.tasks || {},
323
+ [newTaskId]: {
324
+ ...taskInfo,
325
+ label: `${taskInfo.label} (Copy)`
326
+ }
327
+ }
328
+ }
329
+ };
330
+ });
331
+ }, []);
332
+ const handleTaskReorder = useCallback((params)=>{
333
+ const { taskId, stageId, position } = params;
334
+ setDragInfo(`Reordered ${taskId} in ${stageId} to group ${position.groupIndex}${position.isParallel ? ' (parallel)' : ''}`);
335
+ setStageData((prev)=>{
336
+ const stage = prev[stageId];
337
+ if (!stage) return prev;
338
+ const newTaskIds = moveTaskWithinStage(stage.taskIds, taskId, position);
339
+ return {
340
+ ...prev,
341
+ [stageId]: {
342
+ ...stage,
343
+ taskIds: newTaskIds
344
+ }
345
+ };
346
+ });
347
+ }, []);
348
+ const handleTaskPaste = useCallback((params)=>{
349
+ const { newTaskId, originalData, targetStageId, position } = params;
350
+ setDragInfo(`Pasted task ${newTaskId} to ${targetStageId} at group ${position.groupIndex}`);
351
+ setStageData((prev)=>{
352
+ const newData = {
353
+ ...prev
354
+ };
355
+ const targetStage = newData[targetStageId];
356
+ if (!targetStage) return prev;
357
+ const newTargetTaskIds = [
358
+ ...targetStage.taskIds || []
359
+ ];
360
+ if (position.groupIndex >= newTargetTaskIds.length) newTargetTaskIds.push([
361
+ newTaskId
362
+ ]);
363
+ else newTargetTaskIds.splice(position.groupIndex, 0, [
364
+ newTaskId
365
+ ]);
366
+ newData[targetStageId] = {
367
+ ...targetStage,
368
+ taskIds: newTargetTaskIds,
369
+ tasks: {
370
+ ...targetStage.tasks || {},
371
+ [newTaskId]: {
372
+ label: `${originalData.label} (Pasted)`,
373
+ taskType: originalData.taskType
374
+ }
375
+ }
376
+ };
377
+ return newData;
378
+ });
379
+ }, []);
380
+ const targetTaskIds = useMemo(()=>{
381
+ if (!selectedStageId) return [];
382
+ return stageData[selectedStageId]?.taskIds || [];
383
+ }, [
384
+ selectedStageId,
385
+ stageData
386
+ ]);
387
+ const nodeTypes = useMemo(()=>({
388
+ stageV2: StageNodeWrapper,
389
+ task: TaskNodeWrapper,
390
+ placeholder: (props)=>/*#__PURE__*/ jsx(PlaceholderTaskNode, {
391
+ ...props
392
+ })
393
+ }), []);
394
+ const edgeTypes = useMemo(()=>({
395
+ stage: StageEdge
396
+ }), []);
397
+ return /*#__PURE__*/ jsx("div", {
398
+ style: {
399
+ width: '100vw',
400
+ height: '100vh'
401
+ },
402
+ children: /*#__PURE__*/ jsxs(ReactFlowProvider, {
403
+ children: [
404
+ /*#__PURE__*/ jsx(CrossStageTaskDragCanvas, {
405
+ nodes: nodes,
406
+ edges: edges,
407
+ onNodesChange: onNodesChange,
408
+ onEdgesChange: onEdgesChange,
409
+ nodeTypes: nodeTypes,
410
+ edgeTypes: edgeTypes,
411
+ onTaskMove: handleTaskMove,
412
+ onTaskCopy: handleTaskCopy,
413
+ onTaskPaste: handleTaskPaste,
414
+ onTaskReorder: handleTaskReorder,
415
+ selectedTaskId: selectedTaskId,
416
+ selectedStageId: selectedStageId,
417
+ targetTaskIds: targetTaskIds
418
+ }),
419
+ dragInfo && /*#__PURE__*/ jsx(Panel, {
420
+ position: "top-left",
421
+ children: /*#__PURE__*/ jsx("div", {
422
+ style: {
423
+ background: 'var(--uix-palette-surface-paper)',
424
+ padding: '8px 16px',
425
+ borderRadius: '4px',
426
+ boxShadow: '0 2px 4px rgba(0,0,0,0.1)'
427
+ },
428
+ children: dragInfo
429
+ })
430
+ }),
431
+ /*#__PURE__*/ jsx(Panel, {
432
+ position: "bottom-left",
433
+ children: /*#__PURE__*/ jsxs("div", {
434
+ style: {
435
+ background: 'var(--uix-palette-surface-paper)',
436
+ padding: '8px 16px',
437
+ borderRadius: '4px',
438
+ boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
439
+ maxWidth: '300px'
440
+ },
441
+ children: [
442
+ /*#__PURE__*/ jsx("strong", {
443
+ children: "Instructions:"
444
+ }),
445
+ /*#__PURE__*/ jsxs("ul", {
446
+ style: {
447
+ margin: '8px 0',
448
+ paddingLeft: '16px'
449
+ },
450
+ children: [
451
+ /*#__PURE__*/ jsx("li", {
452
+ children: "Click a task to select it"
453
+ }),
454
+ /*#__PURE__*/ jsx("li", {
455
+ children: "Drag tasks between stages"
456
+ }),
457
+ /*#__PURE__*/ jsx("li", {
458
+ children: "Hold Alt/Cmd while dragging to copy"
459
+ }),
460
+ /*#__PURE__*/ jsx("li", {
461
+ children: "Ctrl/Cmd+C to copy selected task"
462
+ }),
463
+ /*#__PURE__*/ jsx("li", {
464
+ children: "Ctrl/Cmd+V to paste (click stage first)"
465
+ })
466
+ ]
467
+ })
468
+ ]
469
+ })
470
+ })
471
+ ]
472
+ })
473
+ });
474
+ };
475
+ const CrossStageTaskDragCanvas = ({ nodes, edges, onNodesChange, onEdgesChange, nodeTypes, edgeTypes, onTaskMove, onTaskCopy, onTaskPaste, onTaskReorder, selectedTaskId, selectedStageId, targetTaskIds })=>{
476
+ const { dragState, handlers } = useCrossStageTaskDrag({
477
+ onTaskMove,
478
+ onTaskCopy,
479
+ onTaskReorder
480
+ });
481
+ useTaskCopyPaste({
482
+ onTaskPaste
483
+ }, {
484
+ selectedTaskId,
485
+ targetStageId: selectedStageId,
486
+ targetTaskIds,
487
+ enabled: true
488
+ });
489
+ return /*#__PURE__*/ jsx(CrossStageDragProvider, {
490
+ value: {
491
+ dragState
492
+ },
493
+ children: /*#__PURE__*/ jsxs(BaseCanvas, {
494
+ nodes: nodes,
495
+ edges: edges,
496
+ onNodesChange: onNodesChange,
497
+ onEdgesChange: onEdgesChange,
498
+ nodeTypes: nodeTypes,
499
+ edgeTypes: edgeTypes,
500
+ mode: "design",
501
+ connectionMode: ConnectionMode.Strict,
502
+ defaultEdgeOptions: {
503
+ type: 'stage'
504
+ },
505
+ connectionLineComponent: StageConnectionEdge,
506
+ elevateEdgesOnSelect: true,
507
+ onNodeDragStart: handlers.onNodeDragStart,
508
+ onNodeDrag: handlers.onNodeDrag,
509
+ onNodeDragStop: handlers.onNodeDragStop,
510
+ children: [
511
+ /*#__PURE__*/ jsx(Panel, {
512
+ position: "bottom-right",
513
+ children: /*#__PURE__*/ jsx(CanvasPositionControls, {
514
+ translations: DefaultCanvasTranslations
515
+ })
516
+ }),
517
+ dragState.isDragging && /*#__PURE__*/ jsx(Panel, {
518
+ position: "top-right",
519
+ children: /*#__PURE__*/ jsxs("div", {
520
+ style: {
521
+ background: dragState.isCopyMode ? 'var(--uix-palette-info-light)' : 'var(--uix-palette-warning-light)',
522
+ padding: '8px 16px',
523
+ borderRadius: '4px'
524
+ },
525
+ children: [
526
+ dragState.isCopyMode ? 'Copy Mode (Alt/Cmd)' : 'Move Mode',
527
+ dragState.targetStageId !== dragState.sourceStageId && /*#__PURE__*/ jsxs("div", {
528
+ children: [
529
+ "Target: ",
530
+ dragState.targetStageId
531
+ ]
532
+ })
533
+ ]
534
+ })
535
+ })
536
+ ]
537
+ })
538
+ });
539
+ };
540
+ const DragAndDrop = {
541
+ name: 'Drag and Drop',
542
+ render: ()=>/*#__PURE__*/ jsx(CrossStageTaskDragDemo, {})
543
+ };
544
+ export { DragAndDrop, CrossStageTaskDrag_stories as default };
@@ -0,0 +1,106 @@
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
+ DropPlaceholder: ()=>DropPlaceholder
28
+ });
29
+ const jsx_runtime_namespaceObject = require("react/jsx-runtime");
30
+ const apollo_core_namespaceObject = require("@uipath/apollo-core");
31
+ const useTaskPositions_cjs_namespaceObject = require("../TaskNode/useTaskPositions.cjs");
32
+ function calculatePlaceholderY(groupIndex, taskIndex, taskIds) {
33
+ const config = useTaskPositions_cjs_namespaceObject.DEFAULT_TASK_POSITION_CONFIG;
34
+ let y = config.headerHeight + config.contentPaddingTop;
35
+ for(let gi = 0; gi < taskIds.length; gi++){
36
+ const group = taskIds[gi];
37
+ if (group) {
38
+ if (gi === groupIndex) {
39
+ for(let ti = 0; ti < taskIndex && ti < group.length; ti++){
40
+ y += config.taskHeight;
41
+ if (ti < group.length - 1) y += config.taskGap;
42
+ }
43
+ return y;
44
+ }
45
+ y += group.length * config.taskHeight;
46
+ y += (group.length - 1) * config.taskGap;
47
+ y += config.taskGap;
48
+ }
49
+ }
50
+ return y;
51
+ }
52
+ const DropPlaceholder = ({ groupIndex, taskIndex, taskIds, isParallel, draggedTaskId })=>{
53
+ let adjustedTaskIds = taskIds;
54
+ let adjustedGroupIndex = groupIndex;
55
+ if (draggedTaskId) {
56
+ const tempTaskIds = taskIds.map((group)=>[
57
+ ...group
58
+ ]);
59
+ for(let gi = 0; gi < tempTaskIds.length; gi++){
60
+ const group = tempTaskIds[gi];
61
+ if (!group) continue;
62
+ const index = group.indexOf(draggedTaskId);
63
+ if (-1 !== index) {
64
+ group.splice(index, 1);
65
+ if (gi < groupIndex) adjustedGroupIndex--;
66
+ break;
67
+ }
68
+ }
69
+ adjustedTaskIds = tempTaskIds.filter((g)=>g && g.length > 0);
70
+ }
71
+ const y = calculatePlaceholderY(adjustedGroupIndex, taskIndex, adjustedTaskIds);
72
+ const x = isParallel ? useTaskPositions_cjs_namespaceObject.DEFAULT_TASK_POSITION_CONFIG.contentPaddingX + useTaskPositions_cjs_namespaceObject.DEFAULT_TASK_POSITION_CONFIG.parallelIndent : useTaskPositions_cjs_namespaceObject.DEFAULT_TASK_POSITION_CONFIG.contentPaddingX;
73
+ const width = isParallel ? "var(--stage-task-width-parallel, 216px)" : "var(--stage-task-width, 246px)";
74
+ console.log('[DropPlaceholder] Rendering at', {
75
+ x,
76
+ y,
77
+ groupIndex: adjustedGroupIndex,
78
+ taskIndex,
79
+ isParallel,
80
+ draggedTaskId
81
+ });
82
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
83
+ style: {
84
+ position: 'absolute',
85
+ top: y,
86
+ left: x,
87
+ width,
88
+ height: 36,
89
+ border: '2px dashed rgba(100, 150, 255, 0.8)',
90
+ borderRadius: apollo_core_namespaceObject.Spacing.SpacingXs,
91
+ backgroundColor: 'rgba(100, 150, 255, 0.1)',
92
+ opacity: 1,
93
+ pointerEvents: 'none',
94
+ zIndex: 100,
95
+ boxSizing: 'border-box'
96
+ },
97
+ "data-testid": "drop-placeholder"
98
+ });
99
+ };
100
+ exports.DropPlaceholder = __webpack_exports__.DropPlaceholder;
101
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
102
+ "DropPlaceholder"
103
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
104
+ Object.defineProperty(exports, '__esModule', {
105
+ value: true
106
+ });
@@ -0,0 +1,10 @@
1
+ interface DropPlaceholderProps {
2
+ groupIndex: number;
3
+ taskIndex: number;
4
+ taskIds: string[][];
5
+ isParallel: boolean;
6
+ draggedTaskId?: string | null;
7
+ }
8
+ export declare const DropPlaceholder: ({ groupIndex, taskIndex, taskIds, isParallel, draggedTaskId, }: DropPlaceholderProps) => import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=DropPlaceholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DropPlaceholder.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/StageNode/DropPlaceholder.tsx"],"names":[],"mappings":"AAOA,UAAU,oBAAoB;IAE5B,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;IAEpB,UAAU,EAAE,OAAO,CAAC;IAEpB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAmCD,eAAO,MAAM,eAAe,GAAI,gEAM7B,oBAAoB,4CAgEtB,CAAC"}