vxe-pc-ui 4.10.49 → 4.10.50
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.
- package/es/icon/style.css +1 -1
- package/es/language/ar-EG.js +2 -1
- package/es/language/de-DE.js +2 -1
- package/es/language/en-US.js +2 -1
- package/es/language/es-ES.js +2 -1
- package/es/language/fr-FR.js +2 -1
- package/es/language/hu-HU.js +2 -1
- package/es/language/hy-AM.js +2 -1
- package/es/language/id-ID.js +2 -1
- package/es/language/it-IT.js +2 -1
- package/es/language/ja-JP.js +2 -1
- package/es/language/ko-KR.js +2 -1
- package/es/language/ms-MY.js +2 -1
- package/es/language/nb-NO.js +2 -1
- package/es/language/pt-BR.js +2 -1
- package/es/language/ru-RU.js +2 -1
- package/es/language/th-TH.js +2 -1
- package/es/language/ug-CN.js +2 -1
- package/es/language/uk-UA.js +2 -1
- package/es/language/uz-UZ.js +2 -1
- package/es/language/vi-VN.js +2 -1
- package/es/language/zh-CHT.js +2 -1
- package/es/language/zh-CN.js +2 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/tree/src/tree.js +640 -25
- package/es/tree/style.css +119 -0
- package/es/tree/style.min.css +1 -1
- package/es/ui/index.js +11 -1
- package/es/ui/src/anime.js +46 -0
- package/es/ui/src/log.js +1 -1
- package/es/vxe-tree/style.css +119 -0
- package/es/vxe-tree/style.min.css +1 -1
- package/lib/icon/style/style.css +1 -1
- package/lib/icon/style/style.min.css +1 -1
- package/lib/index.umd.js +782 -35
- package/lib/index.umd.min.js +1 -1
- package/lib/language/ar-EG.js +2 -1
- package/lib/language/ar-EG.min.js +1 -1
- package/lib/language/ar-EG.umd.js +2 -1
- package/lib/language/de-DE.js +2 -1
- package/lib/language/de-DE.min.js +1 -1
- package/lib/language/de-DE.umd.js +2 -1
- package/lib/language/en-US.js +2 -1
- package/lib/language/en-US.min.js +1 -1
- package/lib/language/en-US.umd.js +2 -1
- package/lib/language/es-ES.js +2 -1
- package/lib/language/es-ES.min.js +1 -1
- package/lib/language/es-ES.umd.js +2 -1
- package/lib/language/fr-FR.js +2 -1
- package/lib/language/fr-FR.min.js +1 -1
- package/lib/language/fr-FR.umd.js +2 -1
- package/lib/language/hu-HU.js +2 -1
- package/lib/language/hu-HU.min.js +1 -1
- package/lib/language/hu-HU.umd.js +2 -1
- package/lib/language/hy-AM.js +2 -1
- package/lib/language/hy-AM.min.js +1 -1
- package/lib/language/hy-AM.umd.js +2 -1
- package/lib/language/id-ID.js +2 -1
- package/lib/language/id-ID.min.js +1 -1
- package/lib/language/id-ID.umd.js +2 -1
- package/lib/language/it-IT.js +2 -1
- package/lib/language/it-IT.min.js +1 -1
- package/lib/language/it-IT.umd.js +2 -1
- package/lib/language/ja-JP.js +2 -1
- package/lib/language/ja-JP.min.js +1 -1
- package/lib/language/ja-JP.umd.js +2 -1
- package/lib/language/ko-KR.js +2 -1
- package/lib/language/ko-KR.min.js +1 -1
- package/lib/language/ko-KR.umd.js +2 -1
- package/lib/language/ms-MY.js +2 -1
- package/lib/language/ms-MY.min.js +1 -1
- package/lib/language/ms-MY.umd.js +2 -1
- package/lib/language/nb-NO.js +2 -1
- package/lib/language/nb-NO.min.js +1 -1
- package/lib/language/nb-NO.umd.js +2 -1
- package/lib/language/pt-BR.js +2 -1
- package/lib/language/pt-BR.min.js +1 -1
- package/lib/language/pt-BR.umd.js +2 -1
- package/lib/language/ru-RU.js +2 -1
- package/lib/language/ru-RU.min.js +1 -1
- package/lib/language/ru-RU.umd.js +2 -1
- package/lib/language/th-TH.js +2 -1
- package/lib/language/th-TH.min.js +1 -1
- package/lib/language/th-TH.umd.js +2 -1
- package/lib/language/ug-CN.js +2 -1
- package/lib/language/ug-CN.min.js +1 -1
- package/lib/language/ug-CN.umd.js +2 -1
- package/lib/language/uk-UA.js +2 -1
- package/lib/language/uk-UA.min.js +1 -1
- package/lib/language/uk-UA.umd.js +2 -1
- package/lib/language/uz-UZ.js +2 -1
- package/lib/language/uz-UZ.min.js +1 -1
- package/lib/language/uz-UZ.umd.js +2 -1
- package/lib/language/vi-VN.js +2 -1
- package/lib/language/vi-VN.min.js +1 -1
- package/lib/language/vi-VN.umd.js +2 -1
- package/lib/language/zh-CHT.js +2 -1
- package/lib/language/zh-CHT.min.js +1 -1
- package/lib/language/zh-CHT.umd.js +2 -1
- package/lib/language/zh-CN.js +2 -1
- package/lib/language/zh-CN.min.js +1 -1
- package/lib/language/zh-CN.umd.js +2 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/tree/src/tree.js +704 -20
- package/lib/tree/src/tree.min.js +1 -1
- package/lib/tree/style/style.css +119 -0
- package/lib/tree/style/style.min.css +1 -1
- package/lib/ui/index.js +11 -1
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/anime.js +56 -0
- package/lib/ui/src/anime.min.js +1 -0
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/vxe-tree/style/style.css +119 -0
- package/lib/vxe-tree/style/style.min.css +1 -1
- package/package.json +1 -1
- package/packages/language/ar-EG.ts +2 -1
- package/packages/language/de-DE.ts +2 -1
- package/packages/language/en-US.ts +2 -1
- package/packages/language/es-ES.ts +2 -1
- package/packages/language/fr-FR.ts +2 -1
- package/packages/language/hu-HU.ts +2 -1
- package/packages/language/hy-AM.ts +2 -1
- package/packages/language/id-ID.ts +2 -1
- package/packages/language/it-IT.ts +2 -1
- package/packages/language/ja-JP.ts +2 -1
- package/packages/language/ko-KR.ts +2 -1
- package/packages/language/ms-MY.ts +2 -1
- package/packages/language/nb-NO.ts +2 -1
- package/packages/language/pt-BR.ts +2 -1
- package/packages/language/ru-RU.ts +2 -1
- package/packages/language/th-TH.ts +2 -1
- package/packages/language/ug-CN.ts +2 -1
- package/packages/language/uk-UA.ts +2 -1
- package/packages/language/uz-UZ.ts +2 -1
- package/packages/language/vi-VN.ts +2 -1
- package/packages/language/zh-CHT.ts +2 -1
- package/packages/language/zh-CN.ts +2 -1
- package/packages/tree/src/tree.ts +683 -20
- package/packages/ui/index.ts +10 -0
- package/packages/ui/src/anime.ts +52 -0
- package/styles/components/tree.scss +116 -0
- package/styles/theme/dark.scss +1 -0
- package/styles/theme/light.scss +1 -0
- package/styles/variable.scss +1 -0
- package/types/components/tree.d.ts +173 -10
- package/types/ui/global-icon.d.ts +4 -0
- /package/es/icon/{iconfont.1765265204333.ttf → iconfont.1765343568078.ttf} +0 -0
- /package/es/icon/{iconfont.1765265204333.woff → iconfont.1765343568078.woff} +0 -0
- /package/es/icon/{iconfont.1765265204333.woff2 → iconfont.1765343568078.woff2} +0 -0
- /package/es/{iconfont.1765265204333.ttf → iconfont.1765343568078.ttf} +0 -0
- /package/es/{iconfont.1765265204333.woff → iconfont.1765343568078.woff} +0 -0
- /package/es/{iconfont.1765265204333.woff2 → iconfont.1765343568078.woff2} +0 -0
- /package/lib/icon/style/{iconfont.1765265204333.ttf → iconfont.1765343568078.ttf} +0 -0
- /package/lib/icon/style/{iconfont.1765265204333.woff → iconfont.1765343568078.woff} +0 -0
- /package/lib/icon/style/{iconfont.1765265204333.woff2 → iconfont.1765343568078.woff2} +0 -0
- /package/lib/{iconfont.1765265204333.ttf → iconfont.1765343568078.ttf} +0 -0
- /package/lib/{iconfont.1765265204333.woff → iconfont.1765343568078.woff} +0 -0
- /package/lib/{iconfont.1765265204333.woff2 → iconfont.1765343568078.woff2} +0 -0
package/es/tree/src/tree.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { ref, h, reactive, computed, watch, onUnmounted, nextTick, onMounted } from 'vue';
|
|
2
2
|
import { defineVxeComponent } from '../../ui/src/comp';
|
|
3
|
-
import { getI18n, createEvent, getIcon, getConfig, useSize, globalEvents, globalResize, renderEmptyElement } from '../../ui';
|
|
3
|
+
import { VxeUI, getI18n, createEvent, getIcon, getConfig, useSize, globalEvents, globalResize, renderEmptyElement } from '../../ui';
|
|
4
4
|
import { calcTreeLine, enNodeValue, deNodeValue } from './util';
|
|
5
5
|
import { errLog } from '../../ui/src/log';
|
|
6
6
|
import XEUtils from 'xe-utils';
|
|
7
7
|
import { getSlotVNs } from '../../ui/src/vn';
|
|
8
|
-
import { toCssUnit, isScale, getPaddingTopBottomSize } from '../../ui/src/dom';
|
|
8
|
+
import { toCssUnit, isScale, getPaddingTopBottomSize, addClass, removeClass, getTpImg, hasControlKey, getEventTargetNode } from '../../ui/src/dom';
|
|
9
|
+
import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime';
|
|
9
10
|
import VxeLoadingComponent from '../../loading/src/loading';
|
|
10
11
|
/**
|
|
11
12
|
* 生成节点的唯一主键
|
|
@@ -34,6 +35,9 @@ function createInternalData() {
|
|
|
34
35
|
offsetSize: 0,
|
|
35
36
|
rowHeight: 0
|
|
36
37
|
},
|
|
38
|
+
// prevDragNode: null,
|
|
39
|
+
// prevDragToChild: false,
|
|
40
|
+
// prevDragPos: ''
|
|
37
41
|
lastScrollTime: 0
|
|
38
42
|
// hpTimeout: undefined
|
|
39
43
|
};
|
|
@@ -127,6 +131,11 @@ export default defineVxeComponent({
|
|
|
127
131
|
lazy: Boolean,
|
|
128
132
|
toggleMethod: Function,
|
|
129
133
|
loadMethod: Function,
|
|
134
|
+
drag: {
|
|
135
|
+
type: Boolean,
|
|
136
|
+
default: () => getConfig().tree.drag
|
|
137
|
+
},
|
|
138
|
+
dragConfig: Object,
|
|
130
139
|
showIcon: {
|
|
131
140
|
type: Boolean,
|
|
132
141
|
default: true
|
|
@@ -162,7 +171,10 @@ export default defineVxeComponent({
|
|
|
162
171
|
'checkbox-change',
|
|
163
172
|
'load-success',
|
|
164
173
|
'load-error',
|
|
165
|
-
'scroll'
|
|
174
|
+
'scroll',
|
|
175
|
+
'node-dragstart',
|
|
176
|
+
'node-dragover',
|
|
177
|
+
'node-dragend'
|
|
166
178
|
],
|
|
167
179
|
setup(props, context) {
|
|
168
180
|
const { emit, slots } = context;
|
|
@@ -173,6 +185,8 @@ export default defineVxeComponent({
|
|
|
173
185
|
const refFooterWrapperElem = ref();
|
|
174
186
|
const refVirtualWrapper = ref();
|
|
175
187
|
const refVirtualBody = ref();
|
|
188
|
+
const refDragNodeLineElem = ref();
|
|
189
|
+
const refDragTipElem = ref();
|
|
176
190
|
const reactData = reactive({
|
|
177
191
|
parentHeight: 0,
|
|
178
192
|
customHeight: 0,
|
|
@@ -185,7 +199,9 @@ export default defineVxeComponent({
|
|
|
185
199
|
selectRadioKey: enNodeValue(props.checkNodeKey),
|
|
186
200
|
treeList: [],
|
|
187
201
|
updateExpandedFlag: 1,
|
|
188
|
-
updateCheckboxFlag: 1
|
|
202
|
+
updateCheckboxFlag: 1,
|
|
203
|
+
dragNode: null,
|
|
204
|
+
dragTipText: ''
|
|
189
205
|
});
|
|
190
206
|
const internalData = createInternalData();
|
|
191
207
|
const refMaps = {
|
|
@@ -244,6 +260,9 @@ export default defineVxeComponent({
|
|
|
244
260
|
const computeLoadingOpts = computed(() => {
|
|
245
261
|
return Object.assign({}, getConfig().tree.loadingConfig, props.loadingConfig);
|
|
246
262
|
});
|
|
263
|
+
const computeDragOpts = computed(() => {
|
|
264
|
+
return Object.assign({}, getConfig().tree.dragConfig, props.dragConfig);
|
|
265
|
+
});
|
|
247
266
|
const computeTreeStyle = computed(() => {
|
|
248
267
|
const { customHeight, customMinHeight, customMaxHeight } = reactData;
|
|
249
268
|
const stys = {};
|
|
@@ -262,11 +281,14 @@ export default defineVxeComponent({
|
|
|
262
281
|
return Object.assign({}, getConfig().tree.filterConfig, props.filterConfig);
|
|
263
282
|
});
|
|
264
283
|
const computeMaps = {
|
|
284
|
+
computeKeyField,
|
|
285
|
+
computeParentField,
|
|
265
286
|
computeChildrenField,
|
|
266
287
|
computeMapChildrenField,
|
|
267
288
|
computeRadioOpts,
|
|
268
289
|
computeCheckboxOpts,
|
|
269
|
-
computeNodeOpts
|
|
290
|
+
computeNodeOpts,
|
|
291
|
+
computeDragOpts
|
|
270
292
|
};
|
|
271
293
|
const $xeTree = {
|
|
272
294
|
xID,
|
|
@@ -387,7 +409,7 @@ export default defineVxeComponent({
|
|
|
387
409
|
const el = refElem.value;
|
|
388
410
|
return el ? el.parentElement : null;
|
|
389
411
|
};
|
|
390
|
-
const
|
|
412
|
+
const calcTreeHeight = (key) => {
|
|
391
413
|
const { parentHeight } = reactData;
|
|
392
414
|
const val = props[key];
|
|
393
415
|
let num = 0;
|
|
@@ -408,9 +430,9 @@ export default defineVxeComponent({
|
|
|
408
430
|
return num;
|
|
409
431
|
};
|
|
410
432
|
const updateHeight = () => {
|
|
411
|
-
reactData.customHeight =
|
|
412
|
-
reactData.customMinHeight =
|
|
413
|
-
reactData.customMaxHeight =
|
|
433
|
+
reactData.customHeight = calcTreeHeight('height');
|
|
434
|
+
reactData.customMinHeight = calcTreeHeight('minHeight');
|
|
435
|
+
reactData.customMaxHeight = calcTreeHeight('maxHeight');
|
|
414
436
|
// 如果启用虚拟滚动,默认高度
|
|
415
437
|
if (reactData.scrollYLoad && !(reactData.customHeight || reactData.customMinHeight)) {
|
|
416
438
|
reactData.customHeight = 300;
|
|
@@ -442,10 +464,12 @@ export default defineVxeComponent({
|
|
|
442
464
|
keyMaps[nodeid] = {
|
|
443
465
|
item,
|
|
444
466
|
index,
|
|
467
|
+
$index: -1,
|
|
468
|
+
_index: -1,
|
|
445
469
|
items,
|
|
446
470
|
parent,
|
|
447
471
|
nodes,
|
|
448
|
-
level: nodes.length,
|
|
472
|
+
level: nodes.length - 1,
|
|
449
473
|
treeIndex: index,
|
|
450
474
|
lineCount: 0,
|
|
451
475
|
treeLoaded: false
|
|
@@ -458,17 +482,21 @@ export default defineVxeComponent({
|
|
|
458
482
|
const { afterTreeList, nodeMaps } = internalData;
|
|
459
483
|
const childrenField = computeChildrenField.value;
|
|
460
484
|
const mapChildrenField = computeMapChildrenField.value;
|
|
485
|
+
let vtIndex = 0;
|
|
461
486
|
XEUtils.eachTree(afterTreeList, (item, index, items) => {
|
|
462
487
|
const nodeid = getNodeId(item);
|
|
463
488
|
const nodeItem = nodeMaps[nodeid];
|
|
464
489
|
if (nodeItem) {
|
|
465
490
|
nodeItem.items = items;
|
|
466
491
|
nodeItem.treeIndex = index;
|
|
492
|
+
nodeItem._index = vtIndex;
|
|
467
493
|
}
|
|
468
494
|
else {
|
|
469
495
|
const rest = {
|
|
470
496
|
item,
|
|
471
497
|
index,
|
|
498
|
+
$index: -1,
|
|
499
|
+
_index: vtIndex,
|
|
472
500
|
items,
|
|
473
501
|
parent,
|
|
474
502
|
nodes: [],
|
|
@@ -479,6 +507,7 @@ export default defineVxeComponent({
|
|
|
479
507
|
};
|
|
480
508
|
nodeMaps[nodeid] = rest;
|
|
481
509
|
}
|
|
510
|
+
vtIndex++;
|
|
482
511
|
}, { children: transform ? mapChildrenField : childrenField });
|
|
483
512
|
};
|
|
484
513
|
const updateAfterFullData = () => {
|
|
@@ -601,7 +630,7 @@ export default defineVxeComponent({
|
|
|
601
630
|
};
|
|
602
631
|
const handleData = (force) => {
|
|
603
632
|
const { scrollYLoad } = reactData;
|
|
604
|
-
const { scrollYStore } = internalData;
|
|
633
|
+
const { scrollYStore, nodeMaps } = internalData;
|
|
605
634
|
let fullList = internalData.afterVisibleList;
|
|
606
635
|
if (force) {
|
|
607
636
|
// 更新数据,处理筛选和排序
|
|
@@ -610,6 +639,13 @@ export default defineVxeComponent({
|
|
|
610
639
|
fullList = handleTreeToList();
|
|
611
640
|
}
|
|
612
641
|
const treeList = scrollYLoad ? fullList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullList.slice(0);
|
|
642
|
+
treeList.forEach((item, $index) => {
|
|
643
|
+
const nodeid = getNodeId(item);
|
|
644
|
+
const itemRest = nodeMaps[nodeid];
|
|
645
|
+
if (itemRest) {
|
|
646
|
+
itemRest.$index = $index;
|
|
647
|
+
}
|
|
648
|
+
});
|
|
613
649
|
reactData.treeList = treeList;
|
|
614
650
|
};
|
|
615
651
|
const triggerSearchEvent = XEUtils.debounce(() => handleData(true), 350, { trailing: true });
|
|
@@ -814,6 +850,26 @@ export default defineVxeComponent({
|
|
|
814
850
|
internalData.lastScrollLeft = 0;
|
|
815
851
|
return nextTick();
|
|
816
852
|
};
|
|
853
|
+
const handleNodeMousedownEvent = (evnt, node) => {
|
|
854
|
+
const { drag } = props;
|
|
855
|
+
const { nodeMaps } = internalData;
|
|
856
|
+
const targetEl = evnt.currentTarget;
|
|
857
|
+
const dragConfig = computeDragOpts.value;
|
|
858
|
+
const { trigger, isCrossDrag, isPeerDrag, disabledMethod } = dragConfig;
|
|
859
|
+
const nodeid = getNodeId(node);
|
|
860
|
+
const triggerTreeNode = getEventTargetNode(evnt, targetEl, 'vxe-tree--node-item-switcher').flag;
|
|
861
|
+
let isNodeDrag = false;
|
|
862
|
+
if (drag) {
|
|
863
|
+
isNodeDrag = trigger === 'node';
|
|
864
|
+
}
|
|
865
|
+
if (!triggerTreeNode) {
|
|
866
|
+
const params = { node, $tree: $xeTree };
|
|
867
|
+
const itemRest = nodeMaps[nodeid];
|
|
868
|
+
if (isNodeDrag && (isCrossDrag || isPeerDrag || (itemRest && !itemRest.level)) && !(disabledMethod && disabledMethod(params))) {
|
|
869
|
+
handleNodeDragMousedownEvent(evnt, { node });
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
};
|
|
817
873
|
const handleNodeClickEvent = (evnt, node) => {
|
|
818
874
|
const { showRadio, showCheckbox, trigger } = props;
|
|
819
875
|
const radioOpts = computeRadioOpts.value;
|
|
@@ -1504,6 +1560,8 @@ export default defineVxeComponent({
|
|
|
1504
1560
|
nodeMaps[itemNodeId] = {
|
|
1505
1561
|
item: childRow,
|
|
1506
1562
|
index: -1,
|
|
1563
|
+
$index: -1,
|
|
1564
|
+
_index: -1,
|
|
1507
1565
|
items,
|
|
1508
1566
|
parent: parent || parentNodeItem.item,
|
|
1509
1567
|
nodes: parentNodes.concat(nodes),
|
|
@@ -1539,6 +1597,10 @@ export default defineVxeComponent({
|
|
|
1539
1597
|
return list;
|
|
1540
1598
|
},
|
|
1541
1599
|
recalculate,
|
|
1600
|
+
getFullData() {
|
|
1601
|
+
const { treeFullData } = internalData;
|
|
1602
|
+
return treeFullData.slice(0);
|
|
1603
|
+
},
|
|
1542
1604
|
scrollTo: handleScrollTo,
|
|
1543
1605
|
scrollToNode(node) {
|
|
1544
1606
|
return $xeTree.scrollToNodeId(getNodeId(node));
|
|
@@ -1573,8 +1635,502 @@ export default defineVxeComponent({
|
|
|
1573
1635
|
},
|
|
1574
1636
|
clearScroll
|
|
1575
1637
|
};
|
|
1576
|
-
const
|
|
1638
|
+
const clearNodeDropOrigin = () => {
|
|
1639
|
+
const el = refElem.value;
|
|
1640
|
+
if (el) {
|
|
1641
|
+
const clss = 'node--drag-origin';
|
|
1642
|
+
XEUtils.arrayEach(el.querySelectorAll(`.${clss}`), (elem) => {
|
|
1643
|
+
elem.draggable = false;
|
|
1644
|
+
removeClass(elem, clss);
|
|
1645
|
+
});
|
|
1646
|
+
}
|
|
1647
|
+
};
|
|
1648
|
+
const updateNodeDropOrigin = (node) => {
|
|
1649
|
+
const el = refElem.value;
|
|
1650
|
+
if (el) {
|
|
1651
|
+
const clss = 'node--drag-origin';
|
|
1652
|
+
const nodeid = getNodeId(node);
|
|
1653
|
+
XEUtils.arrayEach(el.querySelectorAll(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`), (elem) => {
|
|
1654
|
+
addClass(elem, clss);
|
|
1655
|
+
});
|
|
1656
|
+
}
|
|
1657
|
+
};
|
|
1658
|
+
const updateRowDropTipContent = (itemEl) => {
|
|
1659
|
+
const { dragNode } = reactData;
|
|
1660
|
+
const dragOpts = computeDragOpts.value;
|
|
1661
|
+
const { tooltipMethod } = dragOpts;
|
|
1662
|
+
const rTooltipMethod = tooltipMethod;
|
|
1663
|
+
let tipContent = '';
|
|
1664
|
+
if (rTooltipMethod) {
|
|
1665
|
+
const rtParams = {
|
|
1666
|
+
$tree: $xeTree,
|
|
1667
|
+
node: dragNode
|
|
1668
|
+
};
|
|
1669
|
+
tipContent = `${rTooltipMethod(rtParams) || ''}`;
|
|
1670
|
+
}
|
|
1671
|
+
else {
|
|
1672
|
+
tipContent = getI18n('vxe.tree.dragTip', [itemEl.textContent || '']);
|
|
1673
|
+
}
|
|
1674
|
+
reactData.dragTipText = tipContent;
|
|
1675
|
+
};
|
|
1676
|
+
const hideDropTip = () => {
|
|
1677
|
+
const rdTipEl = refDragTipElem.value;
|
|
1678
|
+
const rdLineEl = refDragNodeLineElem.value;
|
|
1679
|
+
if (rdTipEl) {
|
|
1680
|
+
rdTipEl.style.display = '';
|
|
1681
|
+
}
|
|
1682
|
+
if (rdLineEl) {
|
|
1683
|
+
rdLineEl.style.display = '';
|
|
1684
|
+
}
|
|
1685
|
+
};
|
|
1686
|
+
const clearDragStatus = () => {
|
|
1687
|
+
const { dragNode } = reactData;
|
|
1688
|
+
if (dragNode) {
|
|
1689
|
+
clearNodeDropOrigin();
|
|
1690
|
+
hideDropTip();
|
|
1691
|
+
reactData.dragNode = null;
|
|
1692
|
+
}
|
|
1693
|
+
};
|
|
1694
|
+
const handleNodeDragMousedownEvent = (evnt, params) => {
|
|
1695
|
+
evnt.stopPropagation();
|
|
1696
|
+
const { node } = params;
|
|
1697
|
+
const dragConfig = computeDragOpts.value;
|
|
1698
|
+
const { trigger, dragStartMethod } = dragConfig;
|
|
1699
|
+
const dragEl = evnt.currentTarget;
|
|
1700
|
+
const itemEl = trigger === 'node' ? dragEl : dragEl.parentElement.parentElement;
|
|
1701
|
+
clearNodeDropOrigin();
|
|
1702
|
+
if (dragStartMethod && !dragStartMethod(params)) {
|
|
1703
|
+
itemEl.draggable = false;
|
|
1704
|
+
reactData.dragNode = null;
|
|
1705
|
+
hideDropTip();
|
|
1706
|
+
return;
|
|
1707
|
+
}
|
|
1708
|
+
reactData.dragNode = node;
|
|
1709
|
+
itemEl.draggable = true;
|
|
1710
|
+
updateNodeDropOrigin(node);
|
|
1711
|
+
updateRowDropTipContent(itemEl);
|
|
1712
|
+
dispatchEvent('node-dragstart', params, evnt);
|
|
1713
|
+
};
|
|
1714
|
+
const handleNodeDragMouseupEvent = () => {
|
|
1715
|
+
clearDragStatus();
|
|
1716
|
+
};
|
|
1717
|
+
const showDropTip = (evnt, itemEl, showLine, dragPos) => {
|
|
1718
|
+
const wrapperEl = refElem.value;
|
|
1719
|
+
if (!wrapperEl) {
|
|
1720
|
+
return;
|
|
1721
|
+
}
|
|
1722
|
+
const { prevDragToChild } = internalData;
|
|
1723
|
+
const wrapperRect = wrapperEl.getBoundingClientRect();
|
|
1724
|
+
const wrapperHeight = wrapperEl.clientHeight;
|
|
1725
|
+
if (itemEl) {
|
|
1726
|
+
const rdLineEl = refDragNodeLineElem.value;
|
|
1727
|
+
if (rdLineEl) {
|
|
1728
|
+
if (showLine) {
|
|
1729
|
+
const trRect = itemEl.getBoundingClientRect();
|
|
1730
|
+
let itemHeight = itemEl.clientHeight;
|
|
1731
|
+
const offsetTop = Math.max(1, trRect.y - wrapperRect.y);
|
|
1732
|
+
if (offsetTop + itemHeight > wrapperHeight) {
|
|
1733
|
+
itemHeight = wrapperHeight - offsetTop;
|
|
1734
|
+
}
|
|
1735
|
+
rdLineEl.style.display = 'block';
|
|
1736
|
+
rdLineEl.style.top = `${offsetTop}px`;
|
|
1737
|
+
rdLineEl.style.height = `${itemHeight}px`;
|
|
1738
|
+
rdLineEl.setAttribute('drag-pos', dragPos);
|
|
1739
|
+
rdLineEl.setAttribute('drag-to-child', prevDragToChild ? 'y' : 'n');
|
|
1740
|
+
}
|
|
1741
|
+
else {
|
|
1742
|
+
rdLineEl.style.display = '';
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
const rdTipEl = refDragTipElem.value;
|
|
1747
|
+
if (rdTipEl) {
|
|
1748
|
+
rdTipEl.style.display = 'block';
|
|
1749
|
+
rdTipEl.style.top = `${Math.min(wrapperEl.clientHeight - wrapperEl.scrollTop - rdTipEl.clientHeight, evnt.clientY - wrapperRect.y)}px`;
|
|
1750
|
+
rdTipEl.style.left = `${Math.min(wrapperEl.clientWidth - wrapperEl.scrollLeft - rdTipEl.clientWidth - 1, evnt.clientX - wrapperRect.x)}px`;
|
|
1751
|
+
rdTipEl.setAttribute('drag-status', showLine ? (prevDragToChild ? 'sub' : 'normal') : 'disabled');
|
|
1752
|
+
}
|
|
1753
|
+
};
|
|
1754
|
+
const clearNodeDragData = () => {
|
|
1755
|
+
const wrapperEl = refElem.value;
|
|
1756
|
+
const dtClss = ['.vxe-tree--node-wrapper'];
|
|
1757
|
+
hideDropTip();
|
|
1758
|
+
clearNodeDropOrigin();
|
|
1759
|
+
clearRowAnimate(wrapperEl, dtClss);
|
|
1760
|
+
internalData.prevDragToChild = false;
|
|
1761
|
+
reactData.dragNode = null;
|
|
1762
|
+
};
|
|
1763
|
+
const handleNodeDragSwapEvent = (evnt, dragNode, prevDragNode, prevDragPos, prevDragToChild) => {
|
|
1764
|
+
const { transform } = props;
|
|
1765
|
+
const { nodeMaps, treeFullData, afterVisibleList } = internalData;
|
|
1766
|
+
const dragConfig = computeDragOpts.value;
|
|
1767
|
+
const { animation, isCrossDrag, isPeerDrag, isSelfToChildDrag, dragEndMethod, dragToChildMethod } = dragConfig;
|
|
1768
|
+
const dEndMethod = dragEndMethod || (dragConfig ? dragConfig.dragEndMethod : null);
|
|
1769
|
+
const keyField = computeKeyField.value;
|
|
1770
|
+
const parentField = computeParentField.value;
|
|
1771
|
+
const childrenField = computeChildrenField.value;
|
|
1772
|
+
const mapChildrenField = computeMapChildrenField.value;
|
|
1773
|
+
const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
|
|
1774
|
+
const el = refElem.value;
|
|
1775
|
+
const errRest = {
|
|
1776
|
+
status: false
|
|
1777
|
+
};
|
|
1778
|
+
if (!(el && prevDragNode && dragNode)) {
|
|
1779
|
+
return Promise.resolve(errRest);
|
|
1780
|
+
}
|
|
1781
|
+
// 判断是否有拖动
|
|
1782
|
+
if (prevDragNode !== dragNode) {
|
|
1783
|
+
const dragParams = {
|
|
1784
|
+
oldNode: dragNode,
|
|
1785
|
+
newNode: prevDragNode,
|
|
1786
|
+
dragNode,
|
|
1787
|
+
dragPos: prevDragPos,
|
|
1788
|
+
dragToChild: !!prevDragToChild,
|
|
1789
|
+
offsetIndex: dragOffsetIndex
|
|
1790
|
+
};
|
|
1791
|
+
const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild;
|
|
1792
|
+
return Promise.resolve(dEndMethod ? dEndMethod(dragParams) : true).then((status) => {
|
|
1793
|
+
if (!status) {
|
|
1794
|
+
return errRest;
|
|
1795
|
+
}
|
|
1796
|
+
const dragNodeid = getNodeId(dragNode);
|
|
1797
|
+
const dragNodeRest = nodeMaps[dragNodeid] || {};
|
|
1798
|
+
const _dragNodeIndex = dragNodeRest._index;
|
|
1799
|
+
let dragNodeHeight = 0;
|
|
1800
|
+
let dragOffsetTop = -1;
|
|
1801
|
+
if (animation) {
|
|
1802
|
+
const prevItemEl = el.querySelector(`.vxe-tree--node-wrapper[nodeid="${prevDragNode}"]`);
|
|
1803
|
+
const oldItemEl = el.querySelector(`.vxe-tree--node-wrapper[nodeid="${dragNodeid}"]`);
|
|
1804
|
+
const targetItemEl = prevItemEl || oldItemEl;
|
|
1805
|
+
if (targetItemEl) {
|
|
1806
|
+
dragNodeHeight = targetItemEl.offsetHeight;
|
|
1807
|
+
}
|
|
1808
|
+
if (oldItemEl) {
|
|
1809
|
+
dragOffsetTop = oldItemEl.offsetTop;
|
|
1810
|
+
}
|
|
1811
|
+
}
|
|
1812
|
+
let oafIndex = -1;
|
|
1813
|
+
let nafIndex = -1;
|
|
1814
|
+
if (transform) {
|
|
1815
|
+
// 移出源位置
|
|
1816
|
+
const oldRest = dragNodeRest;
|
|
1817
|
+
const newNodeid = getNodeId(prevDragNode);
|
|
1818
|
+
const newRest = nodeMaps[newNodeid];
|
|
1819
|
+
if (oldRest && newRest) {
|
|
1820
|
+
const { level: oldLevel } = oldRest;
|
|
1821
|
+
const { level: newLevel } = newRest;
|
|
1822
|
+
const oldAllMaps = {};
|
|
1823
|
+
XEUtils.eachTree([dragNode], item => {
|
|
1824
|
+
oldAllMaps[getNodeId(item)] = item;
|
|
1825
|
+
}, { children: mapChildrenField });
|
|
1826
|
+
let isSelfToChildStatus = false;
|
|
1827
|
+
if (oldLevel && newLevel) {
|
|
1828
|
+
// 子到子
|
|
1829
|
+
if (isPeerDrag && !isCrossDrag) {
|
|
1830
|
+
if (oldRest.item[parentField] !== newRest.item[parentField]) {
|
|
1831
|
+
// 非同级
|
|
1832
|
+
return errRest;
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1835
|
+
else {
|
|
1836
|
+
if (!isCrossDrag) {
|
|
1837
|
+
return errRest;
|
|
1838
|
+
}
|
|
1839
|
+
if (oldAllMaps[newNodeid]) {
|
|
1840
|
+
isSelfToChildStatus = true;
|
|
1841
|
+
if (!(isCrossDrag && isSelfToChildDrag)) {
|
|
1842
|
+
if (VxeUI.modal) {
|
|
1843
|
+
VxeUI.modal.message({
|
|
1844
|
+
status: 'error',
|
|
1845
|
+
content: getI18n('vxe.error.treeDragChild')
|
|
1846
|
+
});
|
|
1847
|
+
}
|
|
1848
|
+
return errRest;
|
|
1849
|
+
}
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
else if (oldLevel) {
|
|
1854
|
+
// 子到根
|
|
1855
|
+
if (!isCrossDrag) {
|
|
1856
|
+
return errRest;
|
|
1857
|
+
}
|
|
1858
|
+
}
|
|
1859
|
+
else if (newLevel) {
|
|
1860
|
+
// 根到子
|
|
1861
|
+
if (!isCrossDrag) {
|
|
1862
|
+
return errRest;
|
|
1863
|
+
}
|
|
1864
|
+
if (oldAllMaps[newNodeid]) {
|
|
1865
|
+
isSelfToChildStatus = true;
|
|
1866
|
+
if (!(isCrossDrag && isSelfToChildDrag)) {
|
|
1867
|
+
if (VxeUI.modal) {
|
|
1868
|
+
VxeUI.modal.message({
|
|
1869
|
+
status: 'error',
|
|
1870
|
+
content: getI18n('vxe.error.treeDragChild')
|
|
1871
|
+
});
|
|
1872
|
+
}
|
|
1873
|
+
return errRest;
|
|
1874
|
+
}
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
else {
|
|
1878
|
+
// 根到根
|
|
1879
|
+
}
|
|
1880
|
+
const fullList = XEUtils.toTreeArray(internalData.afterTreeList, {
|
|
1881
|
+
key: keyField,
|
|
1882
|
+
parentKey: parentField,
|
|
1883
|
+
children: mapChildrenField
|
|
1884
|
+
});
|
|
1885
|
+
// 移出
|
|
1886
|
+
const otfIndex = $xeTree.findNodeIndexOf(fullList, dragNode);
|
|
1887
|
+
fullList.splice(otfIndex, 1);
|
|
1888
|
+
// 插入
|
|
1889
|
+
const ptfIndex = $xeTree.findNodeIndexOf(fullList, prevDragNode);
|
|
1890
|
+
const ntfIndex = ptfIndex + dragOffsetIndex;
|
|
1891
|
+
fullList.splice(ntfIndex, 0, dragNode);
|
|
1892
|
+
// 改变层级
|
|
1893
|
+
if (isSelfToChildStatus && (isCrossDrag && isSelfToChildDrag)) {
|
|
1894
|
+
XEUtils.each(dragNode[childrenField], childNode => {
|
|
1895
|
+
childNode[parentField] = dragNode[parentField];
|
|
1896
|
+
});
|
|
1897
|
+
}
|
|
1898
|
+
dragNode[parentField] = isDragToChildFlag ? prevDragNode[keyField] : prevDragNode[parentField];
|
|
1899
|
+
internalData.treeFullData = XEUtils.toArrayTree(fullList, {
|
|
1900
|
+
key: keyField,
|
|
1901
|
+
parentKey: parentField,
|
|
1902
|
+
children: childrenField,
|
|
1903
|
+
mapChildren: mapChildrenField
|
|
1904
|
+
});
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
else {
|
|
1908
|
+
// 移出
|
|
1909
|
+
oafIndex = $xeTree.findNodeIndexOf(afterVisibleList, dragNode);
|
|
1910
|
+
const otfIndex = $xeTree.findNodeIndexOf(treeFullData, dragNode);
|
|
1911
|
+
afterVisibleList.splice(oafIndex, 1);
|
|
1912
|
+
treeFullData.splice(otfIndex, 1);
|
|
1913
|
+
// 插入
|
|
1914
|
+
const pafIndex = $xeTree.findNodeIndexOf(afterVisibleList, prevDragNode);
|
|
1915
|
+
const ptfIndex = $xeTree.findNodeIndexOf(treeFullData, prevDragNode);
|
|
1916
|
+
nafIndex = pafIndex + dragOffsetIndex;
|
|
1917
|
+
const ntfIndex = ptfIndex + dragOffsetIndex;
|
|
1918
|
+
afterVisibleList.splice(nafIndex, 0, dragNode);
|
|
1919
|
+
treeFullData.splice(ntfIndex, 0, dragNode);
|
|
1920
|
+
}
|
|
1921
|
+
cacheNodeMap();
|
|
1922
|
+
handleData(transform);
|
|
1923
|
+
if (!(transform)) {
|
|
1924
|
+
updateAfterDataIndex();
|
|
1925
|
+
}
|
|
1926
|
+
updateCheckboxStatus();
|
|
1927
|
+
if (reactData.scrollYLoad) {
|
|
1928
|
+
updateYSpace();
|
|
1929
|
+
}
|
|
1930
|
+
if (evnt) {
|
|
1931
|
+
dispatchEvent('node-dragend', {
|
|
1932
|
+
oldNode: dragNode,
|
|
1933
|
+
newNode: prevDragNode,
|
|
1934
|
+
dragNode,
|
|
1935
|
+
dragPos: prevDragPos,
|
|
1936
|
+
dragToChild: isDragToChildFlag,
|
|
1937
|
+
offsetIndex: dragOffsetIndex,
|
|
1938
|
+
_index: {
|
|
1939
|
+
newIndex: nafIndex,
|
|
1940
|
+
oldIndex: oafIndex
|
|
1941
|
+
}
|
|
1942
|
+
}, evnt);
|
|
1943
|
+
}
|
|
1944
|
+
return nextTick().then(() => {
|
|
1945
|
+
if (animation) {
|
|
1946
|
+
const { treeList } = reactData;
|
|
1947
|
+
const { nodeMaps } = internalData;
|
|
1948
|
+
const dragNodeRest = nodeMaps[dragNodeid];
|
|
1949
|
+
const _newNodeIndex = dragNodeRest._index;
|
|
1950
|
+
const firstNode = treeList[0];
|
|
1951
|
+
const firstNodeRest = nodeMaps[getNodeId(firstNode)];
|
|
1952
|
+
const wrapperEl = el;
|
|
1953
|
+
if (firstNodeRest) {
|
|
1954
|
+
const _firstNodeIndex = firstNodeRest._index;
|
|
1955
|
+
const _lastNodeIndex = _firstNodeIndex + treeList.length;
|
|
1956
|
+
let rsIndex = -1;
|
|
1957
|
+
let reIndex = -1;
|
|
1958
|
+
let offsetRate = 1;
|
|
1959
|
+
if (_dragNodeIndex < _firstNodeIndex) {
|
|
1960
|
+
// 从上往下虚拟拖拽
|
|
1961
|
+
rsIndex = 0;
|
|
1962
|
+
reIndex = _newNodeIndex - _firstNodeIndex;
|
|
1963
|
+
}
|
|
1964
|
+
else if (_dragNodeIndex > _lastNodeIndex) {
|
|
1965
|
+
// 从下往上虚拟拖拽
|
|
1966
|
+
const $newNodeIndex = dragNodeRest.$index;
|
|
1967
|
+
rsIndex = $newNodeIndex + 1;
|
|
1968
|
+
reIndex = treeList.length;
|
|
1969
|
+
offsetRate = -1;
|
|
1970
|
+
}
|
|
1971
|
+
else {
|
|
1972
|
+
if (_newNodeIndex > _dragNodeIndex) {
|
|
1973
|
+
// 从上往下拖拽
|
|
1974
|
+
rsIndex = _dragNodeIndex - _firstNodeIndex;
|
|
1975
|
+
reIndex = rsIndex + _newNodeIndex - _dragNodeIndex;
|
|
1976
|
+
}
|
|
1977
|
+
else {
|
|
1978
|
+
// 从下往上拖拽
|
|
1979
|
+
rsIndex = _newNodeIndex - _firstNodeIndex;
|
|
1980
|
+
reIndex = rsIndex + _dragNodeIndex - _newNodeIndex + 1;
|
|
1981
|
+
offsetRate = -1;
|
|
1982
|
+
}
|
|
1983
|
+
}
|
|
1984
|
+
const dragRangeList = treeList.slice(rsIndex, reIndex);
|
|
1985
|
+
if (dragRangeList.length) {
|
|
1986
|
+
const dtClss = [];
|
|
1987
|
+
dragRangeList.forEach(item => {
|
|
1988
|
+
const nodeid = getNodeId(item);
|
|
1989
|
+
dtClss.push(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`);
|
|
1990
|
+
});
|
|
1991
|
+
const dtTrList = wrapperEl.querySelectorAll(dtClss.join(','));
|
|
1992
|
+
moveRowAnimateToTb(dtTrList, offsetRate * dragNodeHeight);
|
|
1993
|
+
}
|
|
1994
|
+
}
|
|
1995
|
+
const drClss = [`.vxe-tree--node-wrapper[nodeid="${dragNodeid}"]`];
|
|
1996
|
+
const newDtTrList = wrapperEl.querySelectorAll(drClss.join(','));
|
|
1997
|
+
const newTrEl = newDtTrList[0];
|
|
1998
|
+
if (dragOffsetTop > -1 && newTrEl) {
|
|
1999
|
+
moveRowAnimateToTb(newDtTrList, dragOffsetTop - newTrEl.offsetTop);
|
|
2000
|
+
}
|
|
2001
|
+
}
|
|
2002
|
+
recalculate();
|
|
2003
|
+
}).then(() => {
|
|
2004
|
+
return {
|
|
2005
|
+
status: true
|
|
2006
|
+
};
|
|
2007
|
+
});
|
|
2008
|
+
}).catch(() => {
|
|
2009
|
+
return errRest;
|
|
2010
|
+
}).then((rest) => {
|
|
2011
|
+
clearNodeDragData();
|
|
2012
|
+
return rest;
|
|
2013
|
+
});
|
|
2014
|
+
}
|
|
2015
|
+
clearNodeDragData();
|
|
2016
|
+
return Promise.resolve(errRest);
|
|
2017
|
+
};
|
|
2018
|
+
const handleNodeDragDragstartEvent = (evnt) => {
|
|
2019
|
+
if (evnt.dataTransfer) {
|
|
2020
|
+
evnt.dataTransfer.setDragImage(getTpImg(), 0, 0);
|
|
2021
|
+
}
|
|
2022
|
+
};
|
|
2023
|
+
const handleNodeDragDragendEvent = (evnt) => {
|
|
2024
|
+
const { lazy } = props;
|
|
2025
|
+
const { dragNode } = reactData;
|
|
2026
|
+
const { nodeMaps, prevDragNode, prevDragPos, prevDragToChild } = internalData;
|
|
2027
|
+
const hasChildField = computeHasChildField.value;
|
|
2028
|
+
if (lazy && prevDragToChild) {
|
|
2029
|
+
// 懒加载
|
|
2030
|
+
const newNodeid = getNodeId(prevDragNode);
|
|
2031
|
+
const nodeRest = nodeMaps[newNodeid];
|
|
2032
|
+
if (prevDragNode[hasChildField]) {
|
|
2033
|
+
if (nodeRest && nodeRest.treeLoaded) {
|
|
2034
|
+
handleNodeDragSwapEvent(evnt, dragNode, prevDragNode, prevDragPos, prevDragToChild);
|
|
2035
|
+
}
|
|
2036
|
+
}
|
|
2037
|
+
else {
|
|
2038
|
+
handleNodeDragSwapEvent(evnt, dragNode, prevDragNode, prevDragPos, prevDragToChild);
|
|
2039
|
+
}
|
|
2040
|
+
}
|
|
2041
|
+
else {
|
|
2042
|
+
handleNodeDragSwapEvent(evnt, dragNode, prevDragNode, prevDragPos, prevDragToChild);
|
|
2043
|
+
}
|
|
2044
|
+
};
|
|
2045
|
+
const handleNodeDragDragoverEvent = (evnt) => {
|
|
2046
|
+
const { lazy, transform } = props;
|
|
2047
|
+
const { dragNode } = reactData;
|
|
2048
|
+
const { nodeMaps } = internalData;
|
|
2049
|
+
const dragConfig = computeDragOpts.value;
|
|
2050
|
+
const parentField = computeParentField.value;
|
|
2051
|
+
const hasChildField = computeHasChildField.value;
|
|
2052
|
+
const { isCrossDrag, isPeerDrag, isToChildDrag } = dragConfig;
|
|
2053
|
+
if (!dragNode && !isCrossDrag) {
|
|
2054
|
+
evnt.preventDefault();
|
|
2055
|
+
}
|
|
2056
|
+
const isControlKey = hasControlKey(evnt);
|
|
2057
|
+
const itemEl = evnt.currentTarget;
|
|
2058
|
+
const nodeid = itemEl.getAttribute('nodeid') || '';
|
|
2059
|
+
const nodeItem = nodeMaps[nodeid];
|
|
2060
|
+
if (nodeItem) {
|
|
2061
|
+
evnt.preventDefault();
|
|
2062
|
+
const node = nodeItem.item;
|
|
2063
|
+
const offsetY = evnt.clientY - itemEl.getBoundingClientRect().y;
|
|
2064
|
+
const dragPos = offsetY < itemEl.clientHeight / 2 ? 'top' : 'bottom';
|
|
2065
|
+
internalData.prevDragToChild = !!(transform && (isCrossDrag && isToChildDrag) && isControlKey);
|
|
2066
|
+
internalData.prevDragNode = node;
|
|
2067
|
+
internalData.prevDragPos = dragPos;
|
|
2068
|
+
if ((dragNode && getNodeId(dragNode) === nodeid) ||
|
|
2069
|
+
(isControlKey && lazy && node[hasChildField] && nodeItem && !nodeItem.treeLoaded) ||
|
|
2070
|
+
(!isCrossDrag && transform && (isPeerDrag ? dragNode[parentField] !== node[parentField] : nodeItem.level))) {
|
|
2071
|
+
showDropTip(evnt, itemEl, false, dragPos);
|
|
2072
|
+
return;
|
|
2073
|
+
}
|
|
2074
|
+
showDropTip(evnt, itemEl, true, dragPos);
|
|
2075
|
+
dispatchEvent('node-dragover', {
|
|
2076
|
+
oldRNode: dragNode,
|
|
2077
|
+
targetNode: node,
|
|
2078
|
+
dragPos
|
|
2079
|
+
}, evnt);
|
|
2080
|
+
}
|
|
2081
|
+
};
|
|
2082
|
+
const treePrivateMethods = {
|
|
2083
|
+
handleData,
|
|
2084
|
+
cacheNodeMap,
|
|
2085
|
+
updateAfterDataIndex,
|
|
2086
|
+
updateCheckboxStatus,
|
|
2087
|
+
updateYSpace,
|
|
2088
|
+
findNodeIndexOf(list, node) {
|
|
2089
|
+
return node ? XEUtils.findIndexOf(list, item => $xeTree.eqNode(item, node)) : -1;
|
|
2090
|
+
},
|
|
2091
|
+
eqNode(node1, node2) {
|
|
2092
|
+
if (node1 && node2) {
|
|
2093
|
+
if (node1 === node2) {
|
|
2094
|
+
return true;
|
|
2095
|
+
}
|
|
2096
|
+
return getNodeId(node1) === getNodeId(node2);
|
|
2097
|
+
}
|
|
2098
|
+
return false;
|
|
2099
|
+
}
|
|
2100
|
+
};
|
|
1577
2101
|
Object.assign($xeTree, treeMethods, treePrivateMethods);
|
|
2102
|
+
const renderDragIcon = (node, nodeid) => {
|
|
2103
|
+
const { drag, transform } = props;
|
|
2104
|
+
const { nodeMaps } = internalData;
|
|
2105
|
+
const dragOpts = computeDragOpts.value;
|
|
2106
|
+
const { showIcon, isPeerDrag, isCrossDrag, visibleMethod } = dragOpts;
|
|
2107
|
+
const params = { node, $tree: $xeTree };
|
|
2108
|
+
if (drag && showIcon && transform && (!visibleMethod || visibleMethod(params))) {
|
|
2109
|
+
const nodeItem = nodeMaps[nodeid];
|
|
2110
|
+
if (nodeItem && (isPeerDrag || isCrossDrag || !nodeItem.level)) {
|
|
2111
|
+
const dragConfig = computeDragOpts.value;
|
|
2112
|
+
const { icon, trigger, disabledMethod } = dragConfig;
|
|
2113
|
+
const isDisabled = disabledMethod && disabledMethod(params);
|
|
2114
|
+
const ons = {};
|
|
2115
|
+
if (trigger !== 'node') {
|
|
2116
|
+
ons.onMousedown = (evnt) => {
|
|
2117
|
+
if (!isDisabled) {
|
|
2118
|
+
handleNodeDragMousedownEvent(evnt, params);
|
|
2119
|
+
}
|
|
2120
|
+
};
|
|
2121
|
+
ons.onMouseup = handleNodeDragMouseupEvent;
|
|
2122
|
+
}
|
|
2123
|
+
return h('div', Object.assign({ class: ['vxe-tree--drag-handle', {
|
|
2124
|
+
'is--disabled': isDisabled
|
|
2125
|
+
}] }, ons), [
|
|
2126
|
+
h('i', {
|
|
2127
|
+
class: icon || getIcon().TREE_DRAG
|
|
2128
|
+
})
|
|
2129
|
+
]);
|
|
2130
|
+
}
|
|
2131
|
+
}
|
|
2132
|
+
return renderEmptyElement($xeTree);
|
|
2133
|
+
};
|
|
1578
2134
|
const renderRadio = (node, nodeid, isChecked) => {
|
|
1579
2135
|
const { showRadio } = props;
|
|
1580
2136
|
const radioOpts = computeRadioOpts.value;
|
|
@@ -1634,7 +2190,7 @@ export default defineVxeComponent({
|
|
|
1634
2190
|
return renderEmptyElement($xeTree);
|
|
1635
2191
|
};
|
|
1636
2192
|
const renderNode = (node, nodeid) => {
|
|
1637
|
-
const { lazy, showRadio, showCheckbox, showLine, indent, iconOpen, iconClose, iconLoaded, showIcon } = props;
|
|
2193
|
+
const { lazy, drag, transform, showRadio, showCheckbox, showLine, indent, iconOpen, iconClose, iconLoaded, showIcon } = props;
|
|
1638
2194
|
const { currentNode, selectRadioKey, updateExpandedFlag } = reactData;
|
|
1639
2195
|
const { afterTreeList, nodeMaps, treeExpandedMaps, treeExpandLazyLoadedMaps } = internalData;
|
|
1640
2196
|
const childrenField = computeChildrenField.value;
|
|
@@ -1667,11 +2223,25 @@ export default defineVxeComponent({
|
|
|
1667
2223
|
}
|
|
1668
2224
|
const prevNode = nodeItem.items[nodeItem.treeIndex - 1];
|
|
1669
2225
|
const nParams = { node, isExpand };
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
2226
|
+
const itemOn = {
|
|
2227
|
+
onMousedown(evnt) {
|
|
2228
|
+
handleNodeMousedownEvent(evnt, node);
|
|
2229
|
+
},
|
|
2230
|
+
onMouseup: handleNodeDragMouseupEvent,
|
|
2231
|
+
onClick(evnt) {
|
|
2232
|
+
handleNodeClickEvent(evnt, node);
|
|
2233
|
+
},
|
|
2234
|
+
onDblclick(evnt) {
|
|
2235
|
+
handleNodeDblclickEvent(evnt, node);
|
|
2236
|
+
}
|
|
2237
|
+
};
|
|
2238
|
+
// 拖拽行事件
|
|
2239
|
+
if (drag && transform) {
|
|
2240
|
+
itemOn.onDragstart = handleNodeDragDragstartEvent;
|
|
2241
|
+
itemOn.onDragend = handleNodeDragDragendEvent;
|
|
2242
|
+
itemOn.onDragover = handleNodeDragDragoverEvent;
|
|
2243
|
+
}
|
|
2244
|
+
return h('div', Object.assign({ key: nodeid, class: ['vxe-tree--node-wrapper', `node--level-${nLevel}`], nodeid }, itemOn), [
|
|
1675
2245
|
h('div', {
|
|
1676
2246
|
class: ['vxe-tree--node-item', {
|
|
1677
2247
|
'is--current': currentNode && nodeid === getNodeId(currentNode),
|
|
@@ -1679,13 +2249,7 @@ export default defineVxeComponent({
|
|
|
1679
2249
|
'is-checkbox--checked': isCheckboxChecked
|
|
1680
2250
|
}],
|
|
1681
2251
|
style: {
|
|
1682
|
-
paddingLeft: `${
|
|
1683
|
-
},
|
|
1684
|
-
onClick(evnt) {
|
|
1685
|
-
handleNodeClickEvent(evnt, node);
|
|
1686
|
-
},
|
|
1687
|
-
onDblclick(evnt) {
|
|
1688
|
-
handleNodeDblclickEvent(evnt, node);
|
|
2252
|
+
paddingLeft: `${nLevel * (indent || 1)}px`
|
|
1689
2253
|
}
|
|
1690
2254
|
}, [
|
|
1691
2255
|
showLine
|
|
@@ -1718,6 +2282,7 @@ export default defineVxeComponent({
|
|
|
1718
2282
|
])
|
|
1719
2283
|
]
|
|
1720
2284
|
: []),
|
|
2285
|
+
renderDragIcon(node, nodeid),
|
|
1721
2286
|
renderRadio(node, nodeid, isRadioChecked),
|
|
1722
2287
|
renderCheckbox(node, nodeid, isCheckboxChecked),
|
|
1723
2288
|
h('div', {
|
|
@@ -1763,6 +2328,52 @@ export default defineVxeComponent({
|
|
|
1763
2328
|
});
|
|
1764
2329
|
return nodeVNs;
|
|
1765
2330
|
};
|
|
2331
|
+
const renderDragTip = () => {
|
|
2332
|
+
const { drag } = props;
|
|
2333
|
+
const { dragNode, dragTipText } = reactData;
|
|
2334
|
+
const dragOpts = computeDragOpts.value;
|
|
2335
|
+
const dNode = dragNode;
|
|
2336
|
+
if (drag) {
|
|
2337
|
+
return h('div', {
|
|
2338
|
+
class: 'vxe-tree--drag-wrapper'
|
|
2339
|
+
}, [
|
|
2340
|
+
h('div', {
|
|
2341
|
+
ref: refDragNodeLineElem,
|
|
2342
|
+
class: ['vxe-tree--drag-node-line', {
|
|
2343
|
+
'is--guides': dragOpts.showGuidesStatus
|
|
2344
|
+
}]
|
|
2345
|
+
}),
|
|
2346
|
+
dNode && dragOpts.showDragTip
|
|
2347
|
+
? h('div', {
|
|
2348
|
+
ref: refDragTipElem,
|
|
2349
|
+
class: 'vxe-tree--drag-sort-tip'
|
|
2350
|
+
}, [
|
|
2351
|
+
h('div', {
|
|
2352
|
+
class: 'vxe-tree--drag-sort-tip-wrapper'
|
|
2353
|
+
}, [
|
|
2354
|
+
h('div', {
|
|
2355
|
+
class: 'vxe-tree--drag-sort-tip-status'
|
|
2356
|
+
}, [
|
|
2357
|
+
h('span', {
|
|
2358
|
+
class: ['vxe-tree--drag-sort-tip-normal-status', getIcon().TREE_DRAG_STATUS_NODE]
|
|
2359
|
+
}),
|
|
2360
|
+
h('span', {
|
|
2361
|
+
class: ['vxe-tree--drag-sort-tip-sub-status', getIcon().TREE_DRAG_STATUS_SUB_NODE]
|
|
2362
|
+
}),
|
|
2363
|
+
h('span', {
|
|
2364
|
+
class: ['vxe-tree--drag-sort-tip-disabled-status', getIcon().TREE_DRAG_DISABLED]
|
|
2365
|
+
})
|
|
2366
|
+
]),
|
|
2367
|
+
h('div', {
|
|
2368
|
+
class: 'vxe-tree--drag-sort-tip-content'
|
|
2369
|
+
}, dragTipText)
|
|
2370
|
+
])
|
|
2371
|
+
])
|
|
2372
|
+
: renderEmptyElement($xeTree)
|
|
2373
|
+
]);
|
|
2374
|
+
}
|
|
2375
|
+
return renderEmptyElement($xeTree);
|
|
2376
|
+
};
|
|
1766
2377
|
const renderVN = () => {
|
|
1767
2378
|
const { loading, trigger, showLine } = props;
|
|
1768
2379
|
const { bodyHeight, topSpaceHeight, treeList } = reactData;
|
|
@@ -1819,6 +2430,10 @@ export default defineVxeComponent({
|
|
|
1819
2430
|
class: 'vxe-tree--footer-wrapper'
|
|
1820
2431
|
}, footerSlot({ $tree: $xeTree }))
|
|
1821
2432
|
: renderEmptyElement($xeTree),
|
|
2433
|
+
/**
|
|
2434
|
+
* 拖拽提示
|
|
2435
|
+
*/
|
|
2436
|
+
renderDragTip(),
|
|
1822
2437
|
/**
|
|
1823
2438
|
* 加载中
|
|
1824
2439
|
*/
|