Skip to content

Commit 68e2a8e

Browse files
authored
Merge pull request udecode#4595 from DND-IT/enable-dnd-between-editors
2 parents 80e1dc7 + b3b29bb commit 68e2a8e

6 files changed

Lines changed: 49 additions & 27 deletions

File tree

.changeset/swift-moons-fetch.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@platejs/dnd': patch
3+
---
4+
5+
Enable dnd between editors

packages/dnd/src/transforms/onDropNode.spec.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ describe('onDropNode', () => {
1919
const monitor = { canDrop: () => true } as DropTargetMonitor;
2020
const nodeRef = {};
2121
const dragElement = { id: 'drag' } as unknown as TElement;
22-
const dragItem: DragItemNode = { id: 'drag', element: dragElement };
22+
const dragItem: DragItemNode = {
23+
id: 'drag',
24+
editorId: editor.id,
25+
element: dragElement,
26+
};
2327

2428
const hoverElement = { id: 'hover' } as unknown as TElement;
2529

packages/dnd/src/transforms/onDropNode.ts

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -123,30 +123,34 @@ export const onDropNode = (
123123

124124
const { dragPath, to } = result;
125125

126-
// Check if we're dragging multiple nodes
127-
const draggedIds = Array.isArray(dragItem.id) ? dragItem.id : [dragItem.id];
128-
129-
if (draggedIds.length > 1) {
130-
// Handle multi-node drop - get elements by their IDs and sort them
131-
const elements: TElement[] = [];
132-
133-
draggedIds.forEach((id) => {
134-
const entry = editor.api.node<TElement>({ id, at: [] });
135-
if (entry) {
136-
elements.push(entry[0]);
137-
}
138-
});
139-
140-
editor.tf.moveNodes({
141-
at: [],
142-
to,
143-
match: (n) => elements.some((element) => element.id === n.id),
144-
});
126+
if (dragItem.editorId === editor.id) {
127+
// Check if we're dragging multiple nodes
128+
const draggedIds = Array.isArray(dragItem.id) ? dragItem.id : [dragItem.id];
129+
130+
if (draggedIds.length > 1) {
131+
// Handle multi-node drop - get elements by their IDs and sort them
132+
const elements: TElement[] = [];
133+
134+
draggedIds.forEach((id) => {
135+
const entry = editor.api.node<TElement>({ id, at: [] });
136+
if (entry) {
137+
elements.push(entry[0]);
138+
}
139+
});
140+
141+
editor.tf.moveNodes({
142+
at: [],
143+
to,
144+
match: (n) => elements.some((element) => element.id === n.id),
145+
});
146+
} else {
147+
// Single node drop
148+
editor.tf.moveNodes({
149+
at: dragPath,
150+
to,
151+
});
152+
}
145153
} else {
146-
// Single node drop
147-
editor.tf.moveNodes({
148-
at: dragPath,
149-
to,
150-
});
154+
editor.tf.insertNodes(dragItem.element, { at: to });
151155
}
152156
};

packages/dnd/src/transforms/onHoverNode.spec.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ describe('onHoverNode', () => {
4040
const monitor = {} as DropTargetMonitor;
4141
const nodeRef = {};
4242
const dragElement = { id: 'drag' } as unknown as TElement;
43-
const dragItem: DragItemNode = { id: 'drag', element: dragElement };
43+
const dragItem: DragItemNode = {
44+
id: 'drag',
45+
editorId: editor.id,
46+
element: dragElement,
47+
};
4448

4549
const hoverElement = { id: 'hover' } as unknown as TElement;
4650

packages/dnd/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export interface ElementDragItemNode {
1010
/** Required to identify the node(s). */
1111
id: string[] | string;
1212
[key: string]: unknown;
13+
editorId: string;
1314
element: TElement;
1415
}
1516

packages/dnd/src/utils/getHoverDirection.spec.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ describe('getHoverDirection', () => {
1717
} as unknown as DropTargetMonitor;
1818

1919
const dragElement = { id: 'drag' } as unknown as TElement;
20-
const dragItem: DragItemNode = { id: 'drag', element: dragElement };
20+
const dragItem: DragItemNode = {
21+
id: 'drag',
22+
editorId: 'editor',
23+
element: dragElement,
24+
};
2125

2226
const hoverElement = { id: 'hover' } as unknown as TElement;
2327

0 commit comments

Comments
 (0)