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.
Files changed (161) hide show
  1. package/es/icon/style.css +1 -1
  2. package/es/language/ar-EG.js +2 -1
  3. package/es/language/de-DE.js +2 -1
  4. package/es/language/en-US.js +2 -1
  5. package/es/language/es-ES.js +2 -1
  6. package/es/language/fr-FR.js +2 -1
  7. package/es/language/hu-HU.js +2 -1
  8. package/es/language/hy-AM.js +2 -1
  9. package/es/language/id-ID.js +2 -1
  10. package/es/language/it-IT.js +2 -1
  11. package/es/language/ja-JP.js +2 -1
  12. package/es/language/ko-KR.js +2 -1
  13. package/es/language/ms-MY.js +2 -1
  14. package/es/language/nb-NO.js +2 -1
  15. package/es/language/pt-BR.js +2 -1
  16. package/es/language/ru-RU.js +2 -1
  17. package/es/language/th-TH.js +2 -1
  18. package/es/language/ug-CN.js +2 -1
  19. package/es/language/uk-UA.js +2 -1
  20. package/es/language/uz-UZ.js +2 -1
  21. package/es/language/vi-VN.js +2 -1
  22. package/es/language/zh-CHT.js +2 -1
  23. package/es/language/zh-CN.js +2 -1
  24. package/es/style.css +1 -1
  25. package/es/style.min.css +1 -1
  26. package/es/tree/src/tree.js +640 -25
  27. package/es/tree/style.css +119 -0
  28. package/es/tree/style.min.css +1 -1
  29. package/es/ui/index.js +11 -1
  30. package/es/ui/src/anime.js +46 -0
  31. package/es/ui/src/log.js +1 -1
  32. package/es/vxe-tree/style.css +119 -0
  33. package/es/vxe-tree/style.min.css +1 -1
  34. package/lib/icon/style/style.css +1 -1
  35. package/lib/icon/style/style.min.css +1 -1
  36. package/lib/index.umd.js +782 -35
  37. package/lib/index.umd.min.js +1 -1
  38. package/lib/language/ar-EG.js +2 -1
  39. package/lib/language/ar-EG.min.js +1 -1
  40. package/lib/language/ar-EG.umd.js +2 -1
  41. package/lib/language/de-DE.js +2 -1
  42. package/lib/language/de-DE.min.js +1 -1
  43. package/lib/language/de-DE.umd.js +2 -1
  44. package/lib/language/en-US.js +2 -1
  45. package/lib/language/en-US.min.js +1 -1
  46. package/lib/language/en-US.umd.js +2 -1
  47. package/lib/language/es-ES.js +2 -1
  48. package/lib/language/es-ES.min.js +1 -1
  49. package/lib/language/es-ES.umd.js +2 -1
  50. package/lib/language/fr-FR.js +2 -1
  51. package/lib/language/fr-FR.min.js +1 -1
  52. package/lib/language/fr-FR.umd.js +2 -1
  53. package/lib/language/hu-HU.js +2 -1
  54. package/lib/language/hu-HU.min.js +1 -1
  55. package/lib/language/hu-HU.umd.js +2 -1
  56. package/lib/language/hy-AM.js +2 -1
  57. package/lib/language/hy-AM.min.js +1 -1
  58. package/lib/language/hy-AM.umd.js +2 -1
  59. package/lib/language/id-ID.js +2 -1
  60. package/lib/language/id-ID.min.js +1 -1
  61. package/lib/language/id-ID.umd.js +2 -1
  62. package/lib/language/it-IT.js +2 -1
  63. package/lib/language/it-IT.min.js +1 -1
  64. package/lib/language/it-IT.umd.js +2 -1
  65. package/lib/language/ja-JP.js +2 -1
  66. package/lib/language/ja-JP.min.js +1 -1
  67. package/lib/language/ja-JP.umd.js +2 -1
  68. package/lib/language/ko-KR.js +2 -1
  69. package/lib/language/ko-KR.min.js +1 -1
  70. package/lib/language/ko-KR.umd.js +2 -1
  71. package/lib/language/ms-MY.js +2 -1
  72. package/lib/language/ms-MY.min.js +1 -1
  73. package/lib/language/ms-MY.umd.js +2 -1
  74. package/lib/language/nb-NO.js +2 -1
  75. package/lib/language/nb-NO.min.js +1 -1
  76. package/lib/language/nb-NO.umd.js +2 -1
  77. package/lib/language/pt-BR.js +2 -1
  78. package/lib/language/pt-BR.min.js +1 -1
  79. package/lib/language/pt-BR.umd.js +2 -1
  80. package/lib/language/ru-RU.js +2 -1
  81. package/lib/language/ru-RU.min.js +1 -1
  82. package/lib/language/ru-RU.umd.js +2 -1
  83. package/lib/language/th-TH.js +2 -1
  84. package/lib/language/th-TH.min.js +1 -1
  85. package/lib/language/th-TH.umd.js +2 -1
  86. package/lib/language/ug-CN.js +2 -1
  87. package/lib/language/ug-CN.min.js +1 -1
  88. package/lib/language/ug-CN.umd.js +2 -1
  89. package/lib/language/uk-UA.js +2 -1
  90. package/lib/language/uk-UA.min.js +1 -1
  91. package/lib/language/uk-UA.umd.js +2 -1
  92. package/lib/language/uz-UZ.js +2 -1
  93. package/lib/language/uz-UZ.min.js +1 -1
  94. package/lib/language/uz-UZ.umd.js +2 -1
  95. package/lib/language/vi-VN.js +2 -1
  96. package/lib/language/vi-VN.min.js +1 -1
  97. package/lib/language/vi-VN.umd.js +2 -1
  98. package/lib/language/zh-CHT.js +2 -1
  99. package/lib/language/zh-CHT.min.js +1 -1
  100. package/lib/language/zh-CHT.umd.js +2 -1
  101. package/lib/language/zh-CN.js +2 -1
  102. package/lib/language/zh-CN.min.js +1 -1
  103. package/lib/language/zh-CN.umd.js +2 -1
  104. package/lib/style.css +1 -1
  105. package/lib/style.min.css +1 -1
  106. package/lib/tree/src/tree.js +704 -20
  107. package/lib/tree/src/tree.min.js +1 -1
  108. package/lib/tree/style/style.css +119 -0
  109. package/lib/tree/style/style.min.css +1 -1
  110. package/lib/ui/index.js +11 -1
  111. package/lib/ui/index.min.js +1 -1
  112. package/lib/ui/src/anime.js +56 -0
  113. package/lib/ui/src/anime.min.js +1 -0
  114. package/lib/ui/src/log.js +1 -1
  115. package/lib/ui/src/log.min.js +1 -1
  116. package/lib/vxe-tree/style/style.css +119 -0
  117. package/lib/vxe-tree/style/style.min.css +1 -1
  118. package/package.json +1 -1
  119. package/packages/language/ar-EG.ts +2 -1
  120. package/packages/language/de-DE.ts +2 -1
  121. package/packages/language/en-US.ts +2 -1
  122. package/packages/language/es-ES.ts +2 -1
  123. package/packages/language/fr-FR.ts +2 -1
  124. package/packages/language/hu-HU.ts +2 -1
  125. package/packages/language/hy-AM.ts +2 -1
  126. package/packages/language/id-ID.ts +2 -1
  127. package/packages/language/it-IT.ts +2 -1
  128. package/packages/language/ja-JP.ts +2 -1
  129. package/packages/language/ko-KR.ts +2 -1
  130. package/packages/language/ms-MY.ts +2 -1
  131. package/packages/language/nb-NO.ts +2 -1
  132. package/packages/language/pt-BR.ts +2 -1
  133. package/packages/language/ru-RU.ts +2 -1
  134. package/packages/language/th-TH.ts +2 -1
  135. package/packages/language/ug-CN.ts +2 -1
  136. package/packages/language/uk-UA.ts +2 -1
  137. package/packages/language/uz-UZ.ts +2 -1
  138. package/packages/language/vi-VN.ts +2 -1
  139. package/packages/language/zh-CHT.ts +2 -1
  140. package/packages/language/zh-CN.ts +2 -1
  141. package/packages/tree/src/tree.ts +683 -20
  142. package/packages/ui/index.ts +10 -0
  143. package/packages/ui/src/anime.ts +52 -0
  144. package/styles/components/tree.scss +116 -0
  145. package/styles/theme/dark.scss +1 -0
  146. package/styles/theme/light.scss +1 -0
  147. package/styles/variable.scss +1 -0
  148. package/types/components/tree.d.ts +173 -10
  149. package/types/ui/global-icon.d.ts +4 -0
  150. /package/es/icon/{iconfont.1765265204333.ttf → iconfont.1765343568078.ttf} +0 -0
  151. /package/es/icon/{iconfont.1765265204333.woff → iconfont.1765343568078.woff} +0 -0
  152. /package/es/icon/{iconfont.1765265204333.woff2 → iconfont.1765343568078.woff2} +0 -0
  153. /package/es/{iconfont.1765265204333.ttf → iconfont.1765343568078.ttf} +0 -0
  154. /package/es/{iconfont.1765265204333.woff → iconfont.1765343568078.woff} +0 -0
  155. /package/es/{iconfont.1765265204333.woff2 → iconfont.1765343568078.woff2} +0 -0
  156. /package/lib/icon/style/{iconfont.1765265204333.ttf → iconfont.1765343568078.ttf} +0 -0
  157. /package/lib/icon/style/{iconfont.1765265204333.woff → iconfont.1765343568078.woff} +0 -0
  158. /package/lib/icon/style/{iconfont.1765265204333.woff2 → iconfont.1765343568078.woff2} +0 -0
  159. /package/lib/{iconfont.1765265204333.ttf → iconfont.1765343568078.ttf} +0 -0
  160. /package/lib/{iconfont.1765265204333.woff → iconfont.1765343568078.woff} +0 -0
  161. /package/lib/{iconfont.1765265204333.woff2 → iconfont.1765343568078.woff2} +0 -0
@@ -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 calcTableHeight = (key) => {
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 = calcTableHeight('height');
412
- reactData.customMinHeight = calcTableHeight('minHeight');
413
- reactData.customMaxHeight = calcTableHeight('maxHeight');
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 treePrivateMethods = {};
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
- return h('div', {
1671
- key: nodeid,
1672
- class: ['vxe-tree--node-wrapper', `node--level-${nLevel}`],
1673
- nodeid
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: `${(nLevel - 1) * (indent || 1)}px`
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
  */