Skip to content

Commit f4969a8

Browse files
committed
feat: JavaScript 实现拖动逻辑
1 parent c26e3d7 commit f4969a8

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

src/BootstrapBlazor/Components/TreeView/TreeView.razor.js

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export function init(id, options) {
77
return
88
}
99

10-
const { invoke, method, allowDrag } = options
10+
const { invoke, method, allowDrag, triggerDragEnd } = options
1111
EventHandler.on(el, 'keydown', '.tree-root', e => {
1212
if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
1313
const v = el.getAttribute('data-bb-keyboard');
@@ -32,60 +32,68 @@ export function init(id, options) {
3232
resetTreeViewRow(el);
3333

3434
EventHandler.on(el, 'dragstart', e => {
35-
console.log(e.target);
3635
el.targetItem = e.target;
3736
el.targetItem.classList.add('drag-item');
37+
3838
e.dataTransfer.setData('text/plain', '');
3939
e.dataTransfer.effectAllowed = 'move';
4040
el.classList.add('dragging');
41-
console.log('Drag start event triggered');
4241
});
4342

4443
EventHandler.on(el, 'dragend', e => {
4544
el.classList.remove('dragging');
4645
el.targetItem.classList.remove('drag-item');
46+
47+
const item = el.targetItem.closest('.tree-content');
48+
const originalIndex = parseInt(item.getAttribute("data-bb-tree-view-index"));
49+
50+
let isChildren = false;
51+
let targetItem = null;
4752
const overItem = el.querySelector('.tree-drag-inside-over');
4853
if (overItem) {
4954
overItem.classList.remove('tree-drag-inside-over');
55+
isChildren = true;
56+
targetItem = overItem.closest('.tree-content');
5057
}
51-
const belowItem = el.querySelector('.tree-node-placeholder');
52-
if (belowItem) {
53-
belowItem.remove();
58+
else {
59+
const belowItem = el.querySelector('.tree-node-placeholder');
60+
targetItem = belowItem.closest('.tree-content');
61+
if (belowItem) {
62+
belowItem.remove();
63+
}
5464
}
5565
delete el.targetItem;
56-
console.log('Drag end event triggered');
66+
67+
const currentIndex = parseInt(targetItem.getAttribute("data-bb-tree-view-index"));
68+
invoke.invokeMethodAsync(triggerDragEnd, originalIndex, currentIndex, isChildren);
5769
});
5870

5971
EventHandler.on(el, 'dragenter', '.tree-drop-child-inside', e => {
6072
e.preventDefault();
6173

6274
const item = e.delegateTarget;
6375
item.classList.add('tree-drag-inside-over');
64-
console.log('inside Drag enter event triggered');
6576
});
6677
EventHandler.on(el, 'dragenter', '.tree-drop-child-below', e => {
6778
e.preventDefault()
6879

6980
const item = e.delegateTarget;
7081
const placeholder = createPlaceholder();
7182
item.appendChild(placeholder);
72-
console.log('below Drag enter event triggered');
7383
});
7484

7585
EventHandler.on(el, 'dragleave', '.tree-drop-child-inside', e => {
7686
e.preventDefault()
7787

7888
const item = e.delegateTarget;
7989
item.classList.remove('tree-drag-inside-over');
80-
console.log('inside Drag leave event triggered');
8190
});
8291
EventHandler.on(el, 'dragleave', '.tree-drop-child-below', e => {
8392
e.preventDefault()
8493

8594
const item = e.delegateTarget;
8695
item.classList.remove('tree-drag-below-over');
8796
item.innerHTML = "";
88-
console.log('below Drag leave event triggered');
8997
});
9098

9199
EventHandler.on(el, 'dragover', '.tree-drop-zone', e => {
@@ -100,8 +108,11 @@ const resetTreeViewRow = el => {
100108
const node = row.querySelector('.tree-node');
101109
if (node) {
102110
node.setAttribute('draggable', 'true');
103-
const dropzone = createDropzone();
104-
insertBefore(node, dropzone);
111+
const prevElement = node.previousElementSibling;
112+
if (prevElement && !prevElement.classList.contains('tree-drop-zone')) {
113+
const dropzone = createDropzone();
114+
insertBefore(node, dropzone);
115+
}
105116
}
106117
});
107118
}
@@ -223,5 +234,10 @@ export function dispose(id) {
223234

224235
if (el) {
225236
EventHandler.off(el, 'keyup', '.tree-root');
237+
EventHandler.off(el, 'dragstart');
238+
EventHandler.off(el, 'dragend');
239+
EventHandler.off(el, 'dragenter');
240+
EventHandler.off(el, 'dragleave');
241+
EventHandler.off(el, 'dragover');
226242
}
227243
}

0 commit comments

Comments
 (0)