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, PropType, computed, VNode, 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
  import type { TreeReactData, VxeTreeEmits, VxeTreePropTypes, TreeInternalData, TreePrivateRef, VxeTreeDefines, VxeTreePrivateComputed, TreePrivateMethods, TreeMethods, ValueOf, VxeTreeConstructor, VxeTreePrivateMethods } from '../../../types'
@@ -40,6 +41,10 @@ function createInternalData (): TreeInternalData {
40
41
  rowHeight: 0
41
42
  },
42
43
 
44
+ // prevDragNode: null,
45
+ // prevDragToChild: false,
46
+ // prevDragPos: ''
47
+
43
48
  lastScrollTime: 0
44
49
  // hpTimeout: undefined
45
50
  }
@@ -134,6 +139,11 @@ export default defineVxeComponent({
134
139
  lazy: Boolean as PropType<VxeTreePropTypes.Lazy>,
135
140
  toggleMethod: Function as PropType<VxeTreePropTypes.ToggleMethod>,
136
141
  loadMethod: Function as PropType<VxeTreePropTypes.LoadMethod>,
142
+ drag: {
143
+ type: Boolean as PropType<VxeTreePropTypes.Drag>,
144
+ default: () => getConfig().tree.drag
145
+ },
146
+ dragConfig: Object as PropType<VxeTreePropTypes.DragConfig>,
137
147
  showIcon: {
138
148
  type: Boolean as PropType<VxeTreePropTypes.ShowIcon>,
139
149
  default: true
@@ -169,7 +179,10 @@ export default defineVxeComponent({
169
179
  'checkbox-change',
170
180
  'load-success',
171
181
  'load-error',
172
- 'scroll'
182
+ 'scroll',
183
+ 'node-dragstart',
184
+ 'node-dragover',
185
+ 'node-dragend'
173
186
  ] as VxeTreeEmits,
174
187
  setup (props, context) {
175
188
  const { emit, slots } = context
@@ -184,6 +197,9 @@ export default defineVxeComponent({
184
197
  const refVirtualWrapper = ref<HTMLDivElement>()
185
198
  const refVirtualBody = ref<HTMLDivElement>()
186
199
 
200
+ const refDragNodeLineElem = ref<HTMLDivElement>()
201
+ const refDragTipElem = ref<HTMLDivElement>()
202
+
187
203
  const reactData = reactive<TreeReactData>({
188
204
  parentHeight: 0,
189
205
  customHeight: 0,
@@ -196,7 +212,9 @@ export default defineVxeComponent({
196
212
  selectRadioKey: enNodeValue(props.checkNodeKey),
197
213
  treeList: [],
198
214
  updateExpandedFlag: 1,
199
- updateCheckboxFlag: 1
215
+ updateCheckboxFlag: 1,
216
+ dragNode: null,
217
+ dragTipText: ''
200
218
  })
201
219
 
202
220
  const internalData = createInternalData()
@@ -272,6 +290,10 @@ export default defineVxeComponent({
272
290
  return Object.assign({}, getConfig().tree.loadingConfig, props.loadingConfig)
273
291
  })
274
292
 
293
+ const computeDragOpts = computed(() => {
294
+ return Object.assign({}, getConfig().tree.dragConfig, props.dragConfig)
295
+ })
296
+
275
297
  const computeTreeStyle = computed(() => {
276
298
  const { customHeight, customMinHeight, customMaxHeight } = reactData
277
299
  const stys: Record<string, string> = {}
@@ -292,11 +314,14 @@ export default defineVxeComponent({
292
314
  })
293
315
 
294
316
  const computeMaps: VxeTreePrivateComputed = {
317
+ computeKeyField,
318
+ computeParentField,
295
319
  computeChildrenField,
296
320
  computeMapChildrenField,
297
321
  computeRadioOpts,
298
322
  computeCheckboxOpts,
299
- computeNodeOpts
323
+ computeNodeOpts,
324
+ computeDragOpts
300
325
  }
301
326
 
302
327
  const $xeTree = {
@@ -433,7 +458,7 @@ export default defineVxeComponent({
433
458
  return el ? el.parentElement : null
434
459
  }
435
460
 
436
- const calcTableHeight = (key: 'height' | 'minHeight' | 'maxHeight') => {
461
+ const calcTreeHeight = (key: 'height' | 'minHeight' | 'maxHeight') => {
437
462
  const { parentHeight } = reactData
438
463
  const val = props[key]
439
464
  let num = 0
@@ -453,9 +478,9 @@ export default defineVxeComponent({
453
478
  }
454
479
 
455
480
  const updateHeight = () => {
456
- reactData.customHeight = calcTableHeight('height')
457
- reactData.customMinHeight = calcTableHeight('minHeight')
458
- reactData.customMaxHeight = calcTableHeight('maxHeight')
481
+ reactData.customHeight = calcTreeHeight('height')
482
+ reactData.customMinHeight = calcTreeHeight('minHeight')
483
+ reactData.customMaxHeight = calcTreeHeight('maxHeight')
459
484
 
460
485
  // 如果启用虚拟滚动,默认高度
461
486
  if (reactData.scrollYLoad && !(reactData.customHeight || reactData.customMinHeight)) {
@@ -492,10 +517,12 @@ export default defineVxeComponent({
492
517
  keyMaps[nodeid] = {
493
518
  item,
494
519
  index,
520
+ $index: -1,
521
+ _index: -1,
495
522
  items,
496
523
  parent,
497
524
  nodes,
498
- level: nodes.length,
525
+ level: nodes.length - 1,
499
526
  treeIndex: index,
500
527
  lineCount: 0,
501
528
  treeLoaded: false
@@ -509,16 +536,20 @@ export default defineVxeComponent({
509
536
  const { afterTreeList, nodeMaps } = internalData
510
537
  const childrenField = computeChildrenField.value
511
538
  const mapChildrenField = computeMapChildrenField.value
539
+ let vtIndex = 0
512
540
  XEUtils.eachTree(afterTreeList, (item, index, items) => {
513
541
  const nodeid = getNodeId(item)
514
542
  const nodeItem = nodeMaps[nodeid]
515
543
  if (nodeItem) {
516
544
  nodeItem.items = items
517
545
  nodeItem.treeIndex = index
546
+ nodeItem._index = vtIndex
518
547
  } else {
519
548
  const rest = {
520
549
  item,
521
550
  index,
551
+ $index: -1,
552
+ _index: vtIndex,
522
553
  items,
523
554
  parent,
524
555
  nodes: [],
@@ -529,6 +560,7 @@ export default defineVxeComponent({
529
560
  }
530
561
  nodeMaps[nodeid] = rest
531
562
  }
563
+ vtIndex++
532
564
  }, { children: transform ? mapChildrenField : childrenField })
533
565
  }
534
566
 
@@ -652,7 +684,7 @@ export default defineVxeComponent({
652
684
 
653
685
  const handleData = (force?: boolean) => {
654
686
  const { scrollYLoad } = reactData
655
- const { scrollYStore } = internalData
687
+ const { scrollYStore, nodeMaps } = internalData
656
688
  let fullList: any[] = internalData.afterVisibleList
657
689
  if (force) {
658
690
  // 更新数据,处理筛选和排序
@@ -661,6 +693,13 @@ export default defineVxeComponent({
661
693
  fullList = handleTreeToList()
662
694
  }
663
695
  const treeList = scrollYLoad ? fullList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullList.slice(0)
696
+ treeList.forEach((item, $index) => {
697
+ const nodeid = getNodeId(item)
698
+ const itemRest = nodeMaps[nodeid]
699
+ if (itemRest) {
700
+ itemRest.$index = $index
701
+ }
702
+ })
664
703
  reactData.treeList = treeList
665
704
  }
666
705
 
@@ -876,6 +915,27 @@ export default defineVxeComponent({
876
915
  return nextTick()
877
916
  }
878
917
 
918
+ const handleNodeMousedownEvent = (evnt: MouseEvent, node: any) => {
919
+ const { drag } = props
920
+ const { nodeMaps } = internalData
921
+ const targetEl = evnt.currentTarget
922
+ const dragConfig = computeDragOpts.value
923
+ const { trigger, isCrossDrag, isPeerDrag, disabledMethod } = dragConfig
924
+ const nodeid = getNodeId(node)
925
+ const triggerTreeNode = getEventTargetNode(evnt, targetEl, 'vxe-tree--node-item-switcher').flag
926
+ let isNodeDrag = false
927
+ if (drag) {
928
+ isNodeDrag = trigger === 'node'
929
+ }
930
+ if (!triggerTreeNode) {
931
+ const params = { node, $tree: $xeTree }
932
+ const itemRest = nodeMaps[nodeid]
933
+ if (isNodeDrag && (isCrossDrag || isPeerDrag || (itemRest && !itemRest.level)) && !(disabledMethod && disabledMethod(params))) {
934
+ handleNodeDragMousedownEvent(evnt, { node })
935
+ }
936
+ }
937
+ }
938
+
879
939
  const handleNodeClickEvent = (evnt: MouseEvent, node: any) => {
880
940
  const { showRadio, showCheckbox, trigger } = props
881
941
  const radioOpts = computeRadioOpts.value
@@ -1563,6 +1623,8 @@ export default defineVxeComponent({
1563
1623
  nodeMaps[itemNodeId] = {
1564
1624
  item: childRow,
1565
1625
  index: -1,
1626
+ $index: -1,
1627
+ _index: -1,
1566
1628
  items,
1567
1629
  parent: parent || parentNodeItem.item,
1568
1630
  nodes: parentNodes.concat(nodes),
@@ -1598,6 +1660,10 @@ export default defineVxeComponent({
1598
1660
  return list
1599
1661
  },
1600
1662
  recalculate,
1663
+ getFullData () {
1664
+ const { treeFullData } = internalData
1665
+ return treeFullData.slice(0)
1666
+ },
1601
1667
  scrollTo: handleScrollTo,
1602
1668
  scrollToNode (node) {
1603
1669
  return $xeTree.scrollToNodeId(getNodeId(node))
@@ -1632,11 +1698,535 @@ export default defineVxeComponent({
1632
1698
  clearScroll
1633
1699
  }
1634
1700
 
1701
+ const clearNodeDropOrigin = () => {
1702
+ const el = refElem.value
1703
+ if (el) {
1704
+ const clss = 'node--drag-origin'
1705
+ XEUtils.arrayEach(el.querySelectorAll(`.${clss}`), (elem) => {
1706
+ (elem as HTMLTableCellElement).draggable = false
1707
+ removeClass(elem, clss)
1708
+ })
1709
+ }
1710
+ }
1711
+
1712
+ const updateNodeDropOrigin = (node: any) => {
1713
+ const el = refElem.value
1714
+ if (el) {
1715
+ const clss = 'node--drag-origin'
1716
+ const nodeid = getNodeId(node)
1717
+ XEUtils.arrayEach(el.querySelectorAll<HTMLDivElement>(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`), (elem) => {
1718
+ addClass(elem, clss)
1719
+ })
1720
+ }
1721
+ }
1722
+
1723
+ const updateRowDropTipContent = (itemEl: HTMLElement) => {
1724
+ const { dragNode } = reactData
1725
+ const dragOpts = computeDragOpts.value
1726
+ const { tooltipMethod } = dragOpts
1727
+ const rTooltipMethod = tooltipMethod
1728
+ let tipContent = ''
1729
+ if (rTooltipMethod) {
1730
+ const rtParams = {
1731
+ $tree: $xeTree,
1732
+ node: dragNode
1733
+ }
1734
+ tipContent = `${rTooltipMethod(rtParams) || ''}`
1735
+ } else {
1736
+ tipContent = getI18n('vxe.tree.dragTip', [itemEl.textContent || ''])
1737
+ }
1738
+ reactData.dragTipText = tipContent
1739
+ }
1740
+
1741
+ const hideDropTip = () => {
1742
+ const rdTipEl = refDragTipElem.value
1743
+ const rdLineEl = refDragNodeLineElem.value
1744
+ if (rdTipEl) {
1745
+ rdTipEl.style.display = ''
1746
+ }
1747
+ if (rdLineEl) {
1748
+ rdLineEl.style.display = ''
1749
+ }
1750
+ }
1751
+
1752
+ const clearDragStatus = () => {
1753
+ const { dragNode } = reactData
1754
+ if (dragNode) {
1755
+ clearNodeDropOrigin()
1756
+ hideDropTip()
1757
+ reactData.dragNode = null
1758
+ }
1759
+ }
1760
+
1761
+ const handleNodeDragMousedownEvent = (evnt: MouseEvent, params: { node: any }) => {
1762
+ evnt.stopPropagation()
1763
+ const { node } = params
1764
+ const dragConfig = computeDragOpts.value
1765
+ const { trigger, dragStartMethod } = dragConfig
1766
+ const dragEl = evnt.currentTarget as HTMLElement
1767
+ const itemEl = trigger === 'node' ? dragEl : (dragEl.parentElement as HTMLElement).parentElement as HTMLElement
1768
+ clearNodeDropOrigin()
1769
+ if (dragStartMethod && !dragStartMethod(params)) {
1770
+ itemEl.draggable = false
1771
+ reactData.dragNode = null
1772
+ hideDropTip()
1773
+ return
1774
+ }
1775
+ reactData.dragNode = node
1776
+ itemEl.draggable = true
1777
+ updateNodeDropOrigin(node)
1778
+ updateRowDropTipContent(itemEl)
1779
+ dispatchEvent('node-dragstart', params, evnt)
1780
+ }
1781
+
1782
+ const handleNodeDragMouseupEvent = () => {
1783
+ clearDragStatus()
1784
+ }
1785
+
1786
+ const showDropTip = (evnt: DragEvent | MouseEvent, itemEl: HTMLElement | null, showLine: boolean, dragPos: string) => {
1787
+ const wrapperEl = refElem.value
1788
+ if (!wrapperEl) {
1789
+ return
1790
+ }
1791
+ const { prevDragToChild } = internalData
1792
+ const wrapperRect = wrapperEl.getBoundingClientRect()
1793
+ const wrapperHeight = wrapperEl.clientHeight
1794
+ if (itemEl) {
1795
+ const rdLineEl = refDragNodeLineElem.value
1796
+ if (rdLineEl) {
1797
+ if (showLine) {
1798
+ const trRect = itemEl.getBoundingClientRect()
1799
+ let itemHeight = itemEl.clientHeight
1800
+ const offsetTop = Math.max(1, trRect.y - wrapperRect.y)
1801
+ if (offsetTop + itemHeight > wrapperHeight) {
1802
+ itemHeight = wrapperHeight - offsetTop
1803
+ }
1804
+ rdLineEl.style.display = 'block'
1805
+ rdLineEl.style.top = `${offsetTop}px`
1806
+ rdLineEl.style.height = `${itemHeight}px`
1807
+ rdLineEl.setAttribute('drag-pos', dragPos)
1808
+ rdLineEl.setAttribute('drag-to-child', prevDragToChild ? 'y' : 'n')
1809
+ } else {
1810
+ rdLineEl.style.display = ''
1811
+ }
1812
+ }
1813
+ }
1814
+ const rdTipEl = refDragTipElem.value
1815
+ if (rdTipEl) {
1816
+ rdTipEl.style.display = 'block'
1817
+ rdTipEl.style.top = `${Math.min(wrapperEl.clientHeight - wrapperEl.scrollTop - rdTipEl.clientHeight, evnt.clientY - wrapperRect.y)}px`
1818
+ rdTipEl.style.left = `${Math.min(wrapperEl.clientWidth - wrapperEl.scrollLeft - rdTipEl.clientWidth - 1, evnt.clientX - wrapperRect.x)}px`
1819
+ rdTipEl.setAttribute('drag-status', showLine ? (prevDragToChild ? 'sub' : 'normal') : 'disabled')
1820
+ }
1821
+ }
1822
+
1823
+ const clearNodeDragData = () => {
1824
+ const wrapperEl = refElem.value
1825
+ const dtClss = ['.vxe-tree--node-wrapper']
1826
+ hideDropTip()
1827
+ clearNodeDropOrigin()
1828
+ clearRowAnimate(wrapperEl, dtClss)
1829
+ internalData.prevDragToChild = false
1830
+ reactData.dragNode = null
1831
+ }
1832
+
1833
+ const handleNodeDragSwapEvent = (evnt: DragEvent | null, dragNode: any, prevDragNode: any, prevDragPos: '' | 'top' | 'bottom' | undefined, prevDragToChild: boolean | undefined) => {
1834
+ const { transform } = props
1835
+ const { nodeMaps, treeFullData, afterVisibleList } = internalData
1836
+ const dragConfig = computeDragOpts.value
1837
+ const { animation, isCrossDrag, isPeerDrag, isSelfToChildDrag, dragEndMethod, dragToChildMethod } = dragConfig
1838
+ const dEndMethod = dragEndMethod || (dragConfig ? dragConfig.dragEndMethod : null)
1839
+ const keyField = computeKeyField.value
1840
+ const parentField = computeParentField.value
1841
+ const childrenField = computeChildrenField.value
1842
+ const mapChildrenField = computeMapChildrenField.value
1843
+ const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0
1844
+ const el = refElem.value
1845
+ const errRest = {
1846
+ status: false
1847
+ }
1848
+ if (!(el && prevDragNode && dragNode)) {
1849
+ return Promise.resolve(errRest)
1850
+ }
1851
+ // 判断是否有拖动
1852
+ if (prevDragNode !== dragNode) {
1853
+ const dragParams = {
1854
+ oldNode: dragNode,
1855
+ newNode: prevDragNode,
1856
+ dragNode,
1857
+ dragPos: prevDragPos as 'top' | 'bottom',
1858
+ dragToChild: !!prevDragToChild,
1859
+ offsetIndex: dragOffsetIndex as 0 | 1
1860
+ }
1861
+ const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild
1862
+ return Promise.resolve(dEndMethod ? dEndMethod(dragParams) : true).then((status) => {
1863
+ if (!status) {
1864
+ return errRest
1865
+ }
1866
+
1867
+ const dragNodeid = getNodeId(dragNode)
1868
+ const dragNodeRest = nodeMaps[dragNodeid] || {}
1869
+ const _dragNodeIndex = dragNodeRest._index
1870
+ let dragNodeHeight = 0
1871
+ let dragOffsetTop = -1
1872
+ if (animation) {
1873
+ const prevItemEl = el.querySelector<HTMLElement>(`.vxe-tree--node-wrapper[nodeid="${prevDragNode}"]`)
1874
+ const oldItemEl = el.querySelector<HTMLElement>(`.vxe-tree--node-wrapper[nodeid="${dragNodeid}"]`)
1875
+ const targetItemEl = prevItemEl || oldItemEl
1876
+ if (targetItemEl) {
1877
+ dragNodeHeight = targetItemEl.offsetHeight
1878
+ }
1879
+ if (oldItemEl) {
1880
+ dragOffsetTop = oldItemEl.offsetTop
1881
+ }
1882
+ }
1883
+
1884
+ let oafIndex = -1
1885
+ let nafIndex = -1
1886
+
1887
+ if (transform) {
1888
+ // 移出源位置
1889
+ const oldRest = dragNodeRest
1890
+ const newNodeid = getNodeId(prevDragNode)
1891
+ const newRest = nodeMaps[newNodeid]
1892
+
1893
+ if (oldRest && newRest) {
1894
+ const { level: oldLevel } = oldRest
1895
+ const { level: newLevel } = newRest
1896
+
1897
+ const oldAllMaps: Record<string, any> = {}
1898
+ XEUtils.eachTree([dragNode], item => {
1899
+ oldAllMaps[getNodeId(item)] = item
1900
+ }, { children: mapChildrenField })
1901
+
1902
+ let isSelfToChildStatus = false
1903
+
1904
+ if (oldLevel && newLevel) {
1905
+ // 子到子
1906
+
1907
+ if (isPeerDrag && !isCrossDrag) {
1908
+ if (oldRest.item[parentField] !== newRest.item[parentField]) {
1909
+ // 非同级
1910
+ return errRest
1911
+ }
1912
+ } else {
1913
+ if (!isCrossDrag) {
1914
+ return errRest
1915
+ }
1916
+ if (oldAllMaps[newNodeid]) {
1917
+ isSelfToChildStatus = true
1918
+ if (!(isCrossDrag && isSelfToChildDrag)) {
1919
+ if (VxeUI.modal) {
1920
+ VxeUI.modal.message({
1921
+ status: 'error',
1922
+ content: getI18n('vxe.error.treeDragChild')
1923
+ })
1924
+ }
1925
+ return errRest
1926
+ }
1927
+ }
1928
+ }
1929
+ } else if (oldLevel) {
1930
+ // 子到根
1931
+
1932
+ if (!isCrossDrag) {
1933
+ return errRest
1934
+ }
1935
+ } else if (newLevel) {
1936
+ // 根到子
1937
+
1938
+ if (!isCrossDrag) {
1939
+ return errRest
1940
+ }
1941
+ if (oldAllMaps[newNodeid]) {
1942
+ isSelfToChildStatus = true
1943
+ if (!(isCrossDrag && isSelfToChildDrag)) {
1944
+ if (VxeUI.modal) {
1945
+ VxeUI.modal.message({
1946
+ status: 'error',
1947
+ content: getI18n('vxe.error.treeDragChild')
1948
+ })
1949
+ }
1950
+ return errRest
1951
+ }
1952
+ }
1953
+ } else {
1954
+ // 根到根
1955
+ }
1956
+
1957
+ const fullList = XEUtils.toTreeArray(internalData.afterTreeList, {
1958
+ key: keyField,
1959
+ parentKey: parentField,
1960
+ children: mapChildrenField
1961
+ })
1962
+
1963
+ // 移出
1964
+ const otfIndex = $xeTree.findNodeIndexOf(fullList, dragNode)
1965
+ fullList.splice(otfIndex, 1)
1966
+
1967
+ // 插入
1968
+ const ptfIndex = $xeTree.findNodeIndexOf(fullList, prevDragNode)
1969
+ const ntfIndex = ptfIndex + dragOffsetIndex
1970
+ fullList.splice(ntfIndex, 0, dragNode)
1971
+
1972
+ // 改变层级
1973
+ if (isSelfToChildStatus && (isCrossDrag && isSelfToChildDrag)) {
1974
+ XEUtils.each(dragNode[childrenField], childNode => {
1975
+ childNode[parentField] = dragNode[parentField]
1976
+ })
1977
+ }
1978
+ dragNode[parentField] = isDragToChildFlag ? prevDragNode[keyField] : prevDragNode[parentField]
1979
+
1980
+ internalData.treeFullData = XEUtils.toArrayTree(fullList, {
1981
+ key: keyField,
1982
+ parentKey: parentField,
1983
+ children: childrenField,
1984
+ mapChildren: mapChildrenField
1985
+ })
1986
+ }
1987
+ } else {
1988
+ // 移出
1989
+ oafIndex = $xeTree.findNodeIndexOf(afterVisibleList, dragNode)
1990
+ const otfIndex = $xeTree.findNodeIndexOf(treeFullData, dragNode)
1991
+ afterVisibleList.splice(oafIndex, 1)
1992
+ treeFullData.splice(otfIndex, 1)
1993
+ // 插入
1994
+ const pafIndex = $xeTree.findNodeIndexOf(afterVisibleList, prevDragNode)
1995
+ const ptfIndex = $xeTree.findNodeIndexOf(treeFullData, prevDragNode)
1996
+ nafIndex = pafIndex + dragOffsetIndex
1997
+ const ntfIndex = ptfIndex + dragOffsetIndex
1998
+ afterVisibleList.splice(nafIndex, 0, dragNode)
1999
+ treeFullData.splice(ntfIndex, 0, dragNode)
2000
+ }
2001
+
2002
+ cacheNodeMap()
2003
+ handleData(transform)
2004
+ if (!(transform)) {
2005
+ updateAfterDataIndex()
2006
+ }
2007
+ updateCheckboxStatus()
2008
+ if (reactData.scrollYLoad) {
2009
+ updateYSpace()
2010
+ }
2011
+
2012
+ if (evnt) {
2013
+ dispatchEvent('node-dragend', {
2014
+ oldNode: dragNode,
2015
+ newNode: prevDragNode,
2016
+ dragNode,
2017
+ dragPos: prevDragPos as any,
2018
+ dragToChild: isDragToChildFlag,
2019
+ offsetIndex: dragOffsetIndex,
2020
+ _index: {
2021
+ newIndex: nafIndex,
2022
+ oldIndex: oafIndex
2023
+ }
2024
+ }, evnt)
2025
+ }
2026
+
2027
+ return nextTick().then(() => {
2028
+ if (animation) {
2029
+ const { treeList } = reactData
2030
+ const { nodeMaps } = internalData
2031
+ const dragNodeRest = nodeMaps[dragNodeid]
2032
+ const _newNodeIndex = dragNodeRest._index
2033
+ const firstNode = treeList[0]
2034
+ const firstNodeRest = nodeMaps[getNodeId(firstNode)]
2035
+ const wrapperEl = el
2036
+ if (firstNodeRest) {
2037
+ const _firstNodeIndex = firstNodeRest._index
2038
+ const _lastNodeIndex = _firstNodeIndex + treeList.length
2039
+
2040
+ let rsIndex = -1
2041
+ let reIndex = -1
2042
+ let offsetRate = 1
2043
+ if (_dragNodeIndex < _firstNodeIndex) {
2044
+ // 从上往下虚拟拖拽
2045
+ rsIndex = 0
2046
+ reIndex = _newNodeIndex - _firstNodeIndex
2047
+ } else if (_dragNodeIndex > _lastNodeIndex) {
2048
+ // 从下往上虚拟拖拽
2049
+ const $newNodeIndex = dragNodeRest.$index
2050
+ rsIndex = $newNodeIndex + 1
2051
+ reIndex = treeList.length
2052
+ offsetRate = -1
2053
+ } else {
2054
+ if (_newNodeIndex > _dragNodeIndex) {
2055
+ // 从上往下拖拽
2056
+ rsIndex = _dragNodeIndex - _firstNodeIndex
2057
+ reIndex = rsIndex + _newNodeIndex - _dragNodeIndex
2058
+ } else {
2059
+ // 从下往上拖拽
2060
+ rsIndex = _newNodeIndex - _firstNodeIndex
2061
+ reIndex = rsIndex + _dragNodeIndex - _newNodeIndex + 1
2062
+ offsetRate = -1
2063
+ }
2064
+ }
2065
+
2066
+ const dragRangeList = treeList.slice(rsIndex, reIndex)
2067
+ if (dragRangeList.length) {
2068
+ const dtClss: string[] = []
2069
+ dragRangeList.forEach(item => {
2070
+ const nodeid = getNodeId(item)
2071
+ dtClss.push(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`)
2072
+ })
2073
+ const dtTrList = wrapperEl.querySelectorAll<HTMLElement>(dtClss.join(','))
2074
+ moveRowAnimateToTb(dtTrList, offsetRate * dragNodeHeight)
2075
+ }
2076
+ }
2077
+
2078
+ const drClss = [`.vxe-tree--node-wrapper[nodeid="${dragNodeid}"]`]
2079
+ const newDtTrList = wrapperEl.querySelectorAll<HTMLElement>(drClss.join(','))
2080
+ const newTrEl = newDtTrList[0]
2081
+ if (dragOffsetTop > -1 && newTrEl) {
2082
+ moveRowAnimateToTb(newDtTrList, dragOffsetTop - newTrEl.offsetTop)
2083
+ }
2084
+ }
2085
+
2086
+ recalculate()
2087
+ }).then(() => {
2088
+ return {
2089
+ status: true
2090
+ }
2091
+ })
2092
+ }).catch(() => {
2093
+ return errRest
2094
+ }).then((rest) => {
2095
+ clearNodeDragData()
2096
+ return rest
2097
+ })
2098
+ }
2099
+ clearNodeDragData()
2100
+ return Promise.resolve(errRest)
2101
+ }
2102
+
2103
+ const handleNodeDragDragstartEvent = (evnt: DragEvent) => {
2104
+ if (evnt.dataTransfer) {
2105
+ evnt.dataTransfer.setDragImage(getTpImg(), 0, 0)
2106
+ }
2107
+ }
2108
+
2109
+ const handleNodeDragDragendEvent = (evnt: DragEvent) => {
2110
+ const { lazy } = props
2111
+ const { dragNode } = reactData
2112
+ const { nodeMaps, prevDragNode, prevDragPos, prevDragToChild } = internalData
2113
+ const hasChildField = computeHasChildField.value
2114
+ if (lazy && prevDragToChild) {
2115
+ // 懒加载
2116
+ const newNodeid = getNodeId(prevDragNode)
2117
+ const nodeRest = nodeMaps[newNodeid]
2118
+ if (prevDragNode[hasChildField]) {
2119
+ if (nodeRest && nodeRest.treeLoaded) {
2120
+ handleNodeDragSwapEvent(evnt, dragNode, prevDragNode, prevDragPos, prevDragToChild)
2121
+ }
2122
+ } else {
2123
+ handleNodeDragSwapEvent(evnt, dragNode, prevDragNode, prevDragPos, prevDragToChild)
2124
+ }
2125
+ } else {
2126
+ handleNodeDragSwapEvent(evnt, dragNode, prevDragNode, prevDragPos, prevDragToChild)
2127
+ }
2128
+ }
2129
+
2130
+ const handleNodeDragDragoverEvent = (evnt: DragEvent) => {
2131
+ const { lazy, transform } = props
2132
+ const { dragNode } = reactData
2133
+ const { nodeMaps } = internalData
2134
+ const dragConfig = computeDragOpts.value
2135
+ const parentField = computeParentField.value
2136
+ const hasChildField = computeHasChildField.value
2137
+ const { isCrossDrag, isPeerDrag, isToChildDrag } = dragConfig
2138
+ if (!dragNode && !isCrossDrag) {
2139
+ evnt.preventDefault()
2140
+ }
2141
+ const isControlKey = hasControlKey(evnt)
2142
+ const itemEl = evnt.currentTarget as HTMLElement
2143
+ const nodeid = itemEl.getAttribute('nodeid') || ''
2144
+ const nodeItem = nodeMaps[nodeid]
2145
+ if (nodeItem) {
2146
+ evnt.preventDefault()
2147
+ const node = nodeItem.item
2148
+ const offsetY = evnt.clientY - itemEl.getBoundingClientRect().y
2149
+ const dragPos = offsetY < itemEl.clientHeight / 2 ? 'top' : 'bottom'
2150
+ internalData.prevDragToChild = !!(transform && (isCrossDrag && isToChildDrag) && isControlKey)
2151
+ internalData.prevDragNode = node
2152
+ internalData.prevDragPos = dragPos
2153
+ if ((dragNode && getNodeId(dragNode) === nodeid) ||
2154
+ (isControlKey && lazy && node[hasChildField] && nodeItem && !nodeItem.treeLoaded) ||
2155
+ (!isCrossDrag && transform && (isPeerDrag ? dragNode[parentField] !== node[parentField] : nodeItem.level))
2156
+ ) {
2157
+ showDropTip(evnt, itemEl, false, dragPos)
2158
+ return
2159
+ }
2160
+ showDropTip(evnt, itemEl, true, dragPos)
2161
+ dispatchEvent('node-dragover', {
2162
+ oldRNode: dragNode,
2163
+ targetNode: node,
2164
+ dragPos
2165
+ }, evnt)
2166
+ }
2167
+ }
2168
+
1635
2169
  const treePrivateMethods: TreePrivateMethods = {
2170
+ handleData,
2171
+ cacheNodeMap,
2172
+ updateAfterDataIndex,
2173
+ updateCheckboxStatus,
2174
+ updateYSpace,
2175
+ findNodeIndexOf (list: any, node: any) {
2176
+ return node ? XEUtils.findIndexOf(list, item => $xeTree.eqNode(item, node)) : -1
2177
+ },
2178
+ eqNode (node1, node2) {
2179
+ if (node1 && node2) {
2180
+ if (node1 === node2) {
2181
+ return true
2182
+ }
2183
+ return getNodeId(node1) === getNodeId(node2)
2184
+ }
2185
+ return false
2186
+ }
1636
2187
  }
1637
2188
 
1638
2189
  Object.assign($xeTree, treeMethods, treePrivateMethods)
1639
2190
 
2191
+ const renderDragIcon = (node: any, nodeid: string) => {
2192
+ const { drag, transform } = props
2193
+ const { nodeMaps } = internalData
2194
+ const dragOpts = computeDragOpts.value
2195
+ const { showIcon, isPeerDrag, isCrossDrag, visibleMethod } = dragOpts
2196
+ const params = { node, $tree: $xeTree }
2197
+ if (drag && showIcon && transform && (!visibleMethod || visibleMethod(params))) {
2198
+ const nodeItem = nodeMaps[nodeid]
2199
+ if (nodeItem && (isPeerDrag || isCrossDrag || !nodeItem.level)) {
2200
+ const dragConfig = computeDragOpts.value
2201
+ const { icon, trigger, disabledMethod } = dragConfig
2202
+ const isDisabled = disabledMethod && disabledMethod(params)
2203
+ const ons: {
2204
+ onMousedown?: any
2205
+ onMouseup?: any
2206
+ } = {}
2207
+ if (trigger !== 'node') {
2208
+ ons.onMousedown = (evnt: MouseEvent) => {
2209
+ if (!isDisabled) {
2210
+ handleNodeDragMousedownEvent(evnt, params)
2211
+ }
2212
+ }
2213
+ ons.onMouseup = handleNodeDragMouseupEvent
2214
+ }
2215
+ return h('div', {
2216
+ class: ['vxe-tree--drag-handle', {
2217
+ 'is--disabled': isDisabled
2218
+ }],
2219
+ ...ons
2220
+ }, [
2221
+ h('i', {
2222
+ class: icon || getIcon().TREE_DRAG
2223
+ })
2224
+ ])
2225
+ }
2226
+ }
2227
+ return renderEmptyElement($xeTree)
2228
+ }
2229
+
1640
2230
  const renderRadio = (node: any, nodeid: string, isChecked: boolean) => {
1641
2231
  const { showRadio } = props
1642
2232
  const radioOpts = computeRadioOpts.value
@@ -1698,7 +2288,7 @@ export default defineVxeComponent({
1698
2288
  }
1699
2289
 
1700
2290
  const renderNode = (node: any, nodeid: string) => {
1701
- const { lazy, showRadio, showCheckbox, showLine, indent, iconOpen, iconClose, iconLoaded, showIcon } = props
2291
+ const { lazy, drag, transform, showRadio, showCheckbox, showLine, indent, iconOpen, iconClose, iconLoaded, showIcon } = props
1702
2292
  const { currentNode, selectRadioKey, updateExpandedFlag } = reactData
1703
2293
  const { afterTreeList, nodeMaps, treeExpandedMaps, treeExpandLazyLoadedMaps } = internalData
1704
2294
  const childrenField = computeChildrenField.value
@@ -1735,10 +2325,37 @@ export default defineVxeComponent({
1735
2325
  const prevNode = nodeItem.items[nodeItem.treeIndex - 1]
1736
2326
  const nParams = { node, isExpand }
1737
2327
 
2328
+ const itemOn: {
2329
+ onMousedown: any
2330
+ onMouseup: any
2331
+ onClick: any
2332
+ onDblclick: any
2333
+ onDragstart?: any
2334
+ onDragend?: any
2335
+ onDragover?: any
2336
+ } = {
2337
+ onMousedown (evnt: MouseEvent) {
2338
+ handleNodeMousedownEvent(evnt, node)
2339
+ },
2340
+ onMouseup: handleNodeDragMouseupEvent,
2341
+ onClick (evnt: MouseEvent) {
2342
+ handleNodeClickEvent(evnt, node)
2343
+ },
2344
+ onDblclick (evnt: MouseEvent) {
2345
+ handleNodeDblclickEvent(evnt, node)
2346
+ }
2347
+ }
2348
+ // 拖拽行事件
2349
+ if (drag && transform) {
2350
+ itemOn.onDragstart = handleNodeDragDragstartEvent
2351
+ itemOn.onDragend = handleNodeDragDragendEvent
2352
+ itemOn.onDragover = handleNodeDragDragoverEvent
2353
+ }
1738
2354
  return h('div', {
1739
2355
  key: nodeid,
1740
2356
  class: ['vxe-tree--node-wrapper', `node--level-${nLevel}`],
1741
- nodeid
2357
+ nodeid,
2358
+ ...itemOn
1742
2359
  }, [
1743
2360
  h('div', {
1744
2361
  class: ['vxe-tree--node-item', {
@@ -1747,13 +2364,7 @@ export default defineVxeComponent({
1747
2364
  'is-checkbox--checked': isCheckboxChecked
1748
2365
  }],
1749
2366
  style: {
1750
- paddingLeft: `${(nLevel - 1) * (indent || 1)}px`
1751
- },
1752
- onClick (evnt) {
1753
- handleNodeClickEvent(evnt, node)
1754
- },
1755
- onDblclick (evnt) {
1756
- handleNodeDblclickEvent(evnt, node)
2367
+ paddingLeft: `${nLevel * (indent || 1)}px`
1757
2368
  }
1758
2369
  }, [
1759
2370
  showLine
@@ -1786,6 +2397,7 @@ export default defineVxeComponent({
1786
2397
  ])
1787
2398
  ]
1788
2399
  : []),
2400
+ renderDragIcon(node, nodeid),
1789
2401
  renderRadio(node, nodeid, isRadioChecked),
1790
2402
  renderCheckbox(node, nodeid, isCheckboxChecked),
1791
2403
  h('div', {
@@ -1833,6 +2445,53 @@ export default defineVxeComponent({
1833
2445
  return nodeVNs
1834
2446
  }
1835
2447
 
2448
+ const renderDragTip = () => {
2449
+ const { drag } = props
2450
+ const { dragNode, dragTipText } = reactData
2451
+ const dragOpts = computeDragOpts.value
2452
+ const dNode = dragNode
2453
+ if (drag) {
2454
+ return h('div', {
2455
+ class: 'vxe-tree--drag-wrapper'
2456
+ }, [
2457
+ h('div', {
2458
+ ref: refDragNodeLineElem,
2459
+ class: ['vxe-tree--drag-node-line', {
2460
+ 'is--guides': dragOpts.showGuidesStatus
2461
+ }]
2462
+ }),
2463
+ dNode && dragOpts.showDragTip
2464
+ ? h('div', {
2465
+ ref: refDragTipElem,
2466
+ class: 'vxe-tree--drag-sort-tip'
2467
+ }, [
2468
+ h('div', {
2469
+ class: 'vxe-tree--drag-sort-tip-wrapper'
2470
+ }, [
2471
+ h('div', {
2472
+ class: 'vxe-tree--drag-sort-tip-status'
2473
+ }, [
2474
+ h('span', {
2475
+ class: ['vxe-tree--drag-sort-tip-normal-status', getIcon().TREE_DRAG_STATUS_NODE]
2476
+ }),
2477
+ h('span', {
2478
+ class: ['vxe-tree--drag-sort-tip-sub-status', getIcon().TREE_DRAG_STATUS_SUB_NODE]
2479
+ }),
2480
+ h('span', {
2481
+ class: ['vxe-tree--drag-sort-tip-disabled-status', getIcon().TREE_DRAG_DISABLED]
2482
+ })
2483
+ ]),
2484
+ h('div', {
2485
+ class: 'vxe-tree--drag-sort-tip-content'
2486
+ }, dragTipText)
2487
+ ])
2488
+ ])
2489
+ : renderEmptyElement($xeTree)
2490
+ ])
2491
+ }
2492
+ return renderEmptyElement($xeTree)
2493
+ }
2494
+
1836
2495
  const renderVN = () => {
1837
2496
  const { loading, trigger, showLine } = props
1838
2497
  const { bodyHeight, topSpaceHeight, treeList } = reactData
@@ -1890,6 +2549,10 @@ export default defineVxeComponent({
1890
2549
  class: 'vxe-tree--footer-wrapper'
1891
2550
  }, footerSlot({ $tree: $xeTree }))
1892
2551
  : renderEmptyElement($xeTree),
2552
+ /**
2553
+ * 拖拽提示
2554
+ */
2555
+ renderDragTip(),
1893
2556
  /**
1894
2557
  * 加载中
1895
2558
  */