vxe-pc-ui 4.10.49 → 4.11.0
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/select/src/select.js +23 -2
- package/es/select/style.css +13 -4
- package/es/select/style.min.css +1 -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-select/style.css +13 -4
- package/es/vxe-select/style.min.css +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 +807 -37
- 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/select/src/select.js +25 -2
- package/lib/select/src/select.min.js +1 -1
- package/lib/select/style/style.css +13 -4
- package/lib/select/style/style.min.css +1 -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-select/style/style.css +13 -4
- package/lib/vxe-select/style/style.min.css +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/select/src/select.ts +26 -3
- 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/select.scss +13 -3
- 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/select.d.ts +6 -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.1765418463677.ttf} +0 -0
- /package/es/icon/{iconfont.1765265204333.woff → iconfont.1765418463677.woff} +0 -0
- /package/es/icon/{iconfont.1765265204333.woff2 → iconfont.1765418463677.woff2} +0 -0
- /package/es/{iconfont.1765265204333.ttf → iconfont.1765418463677.ttf} +0 -0
- /package/es/{iconfont.1765265204333.woff → iconfont.1765418463677.woff} +0 -0
- /package/es/{iconfont.1765265204333.woff2 → iconfont.1765418463677.woff2} +0 -0
- /package/lib/icon/style/{iconfont.1765265204333.ttf → iconfont.1765418463677.ttf} +0 -0
- /package/lib/icon/style/{iconfont.1765265204333.woff → iconfont.1765418463677.woff} +0 -0
- /package/lib/icon/style/{iconfont.1765265204333.woff2 → iconfont.1765418463677.woff2} +0 -0
- /package/lib/{iconfont.1765265204333.ttf → iconfont.1765418463677.ttf} +0 -0
- /package/lib/{iconfont.1765265204333.woff → iconfont.1765418463677.woff} +0 -0
- /package/lib/{iconfont.1765265204333.woff2 → iconfont.1765418463677.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
|
|
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 =
|
|
457
|
-
reactData.customMinHeight =
|
|
458
|
-
reactData.customMaxHeight =
|
|
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: `${
|
|
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
|
*/
|