vxe-pc-ui 4.15.13 → 4.15.14

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 (218) hide show
  1. package/dist/all.esm.js +708 -139
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/button/style.css +11 -0
  5. package/es/button/style.min.css +1 -1
  6. package/es/checkbox/src/button.js +3 -1
  7. package/es/checkbox/src/group.js +6 -1
  8. package/es/checkbox-button/style.css +151 -8
  9. package/es/checkbox-button/style.min.css +1 -1
  10. package/es/icon/style.css +1 -1
  11. package/es/icon-picker/src/icon-picker.js +145 -46
  12. package/es/icon-picker/style.css +29 -5
  13. package/es/icon-picker/style.min.css +1 -1
  14. package/es/language/ar-EG.js +3 -0
  15. package/es/language/de-DE.js +3 -0
  16. package/es/language/en-US.js +3 -0
  17. package/es/language/es-ES.js +3 -0
  18. package/es/language/fr-FR.js +3 -0
  19. package/es/language/hu-HU.js +3 -0
  20. package/es/language/hy-AM.js +3 -0
  21. package/es/language/id-ID.js +3 -0
  22. package/es/language/it-IT.js +3 -0
  23. package/es/language/ja-JP.js +3 -0
  24. package/es/language/ko-KR.js +3 -0
  25. package/es/language/ms-MY.js +3 -0
  26. package/es/language/nb-NO.js +3 -0
  27. package/es/language/pt-BR.js +3 -0
  28. package/es/language/ru-RU.js +3 -0
  29. package/es/language/th-TH.js +3 -0
  30. package/es/language/ug-CN.js +3 -0
  31. package/es/language/uk-UA.js +3 -0
  32. package/es/language/uz-UZ.js +3 -0
  33. package/es/language/vi-VN.js +3 -0
  34. package/es/language/zh-CHT.js +3 -0
  35. package/es/language/zh-CN.js +3 -0
  36. package/es/list/src/list.js +14 -1
  37. package/es/radio/src/button.js +3 -1
  38. package/es/radio/src/group.js +6 -1
  39. package/es/radio-button/style.css +151 -8
  40. package/es/radio-button/style.min.css +1 -1
  41. package/es/style.css +1 -1
  42. package/es/style.min.css +1 -1
  43. package/es/tree/src/tree.js +441 -18
  44. package/es/tree/src/util.js +15 -0
  45. package/es/ui/index.js +5 -2
  46. package/es/ui/src/log.js +1 -1
  47. package/es/vxe-button/style.css +11 -0
  48. package/es/vxe-button/style.min.css +1 -1
  49. package/es/vxe-checkbox-button/style.css +151 -8
  50. package/es/vxe-checkbox-button/style.min.css +1 -1
  51. package/es/vxe-icon-picker/style.css +29 -5
  52. package/es/vxe-icon-picker/style.min.css +1 -1
  53. package/es/vxe-radio-button/style.css +151 -8
  54. package/es/vxe-radio-button/style.min.css +1 -1
  55. package/lib/button/style/style.css +11 -0
  56. package/lib/button/style/style.min.css +1 -1
  57. package/lib/checkbox/src/button.js +3 -1
  58. package/lib/checkbox/src/button.min.js +1 -1
  59. package/lib/checkbox/src/group.js +6 -0
  60. package/lib/checkbox/src/group.min.js +1 -1
  61. package/lib/checkbox-button/style/style.css +151 -8
  62. package/lib/checkbox-button/style/style.min.css +1 -1
  63. package/lib/icon/style/style.css +1 -1
  64. package/lib/icon/style/style.min.css +1 -1
  65. package/lib/icon-picker/src/icon-picker.js +143 -29
  66. package/lib/icon-picker/src/icon-picker.min.js +1 -1
  67. package/lib/icon-picker/style/style.css +29 -5
  68. package/lib/icon-picker/style/style.min.css +1 -1
  69. package/lib/index.umd.js +731 -49
  70. package/lib/index.umd.min.js +1 -1
  71. package/lib/language/ar-EG.js +3 -0
  72. package/lib/language/ar-EG.min.js +1 -1
  73. package/lib/language/ar-EG.umd.js +3 -0
  74. package/lib/language/de-DE.js +3 -0
  75. package/lib/language/de-DE.min.js +1 -1
  76. package/lib/language/de-DE.umd.js +3 -0
  77. package/lib/language/en-US.js +3 -0
  78. package/lib/language/en-US.min.js +1 -1
  79. package/lib/language/en-US.umd.js +3 -0
  80. package/lib/language/es-ES.js +3 -0
  81. package/lib/language/es-ES.min.js +1 -1
  82. package/lib/language/es-ES.umd.js +3 -0
  83. package/lib/language/fr-FR.js +3 -0
  84. package/lib/language/fr-FR.min.js +1 -1
  85. package/lib/language/fr-FR.umd.js +3 -0
  86. package/lib/language/hu-HU.js +3 -0
  87. package/lib/language/hu-HU.min.js +1 -1
  88. package/lib/language/hu-HU.umd.js +3 -0
  89. package/lib/language/hy-AM.js +3 -0
  90. package/lib/language/hy-AM.min.js +1 -1
  91. package/lib/language/hy-AM.umd.js +3 -0
  92. package/lib/language/id-ID.js +3 -0
  93. package/lib/language/id-ID.min.js +1 -1
  94. package/lib/language/id-ID.umd.js +3 -0
  95. package/lib/language/it-IT.js +3 -0
  96. package/lib/language/it-IT.min.js +1 -1
  97. package/lib/language/it-IT.umd.js +3 -0
  98. package/lib/language/ja-JP.js +3 -0
  99. package/lib/language/ja-JP.min.js +1 -1
  100. package/lib/language/ja-JP.umd.js +3 -0
  101. package/lib/language/ko-KR.js +3 -0
  102. package/lib/language/ko-KR.min.js +1 -1
  103. package/lib/language/ko-KR.umd.js +3 -0
  104. package/lib/language/ms-MY.js +3 -0
  105. package/lib/language/ms-MY.min.js +1 -1
  106. package/lib/language/ms-MY.umd.js +3 -0
  107. package/lib/language/nb-NO.js +3 -0
  108. package/lib/language/nb-NO.min.js +1 -1
  109. package/lib/language/nb-NO.umd.js +3 -0
  110. package/lib/language/pt-BR.js +3 -0
  111. package/lib/language/pt-BR.min.js +1 -1
  112. package/lib/language/pt-BR.umd.js +3 -0
  113. package/lib/language/ru-RU.js +3 -0
  114. package/lib/language/ru-RU.min.js +1 -1
  115. package/lib/language/ru-RU.umd.js +3 -0
  116. package/lib/language/th-TH.js +3 -0
  117. package/lib/language/th-TH.min.js +1 -1
  118. package/lib/language/th-TH.umd.js +3 -0
  119. package/lib/language/ug-CN.js +3 -0
  120. package/lib/language/ug-CN.min.js +1 -1
  121. package/lib/language/ug-CN.umd.js +3 -0
  122. package/lib/language/uk-UA.js +3 -0
  123. package/lib/language/uk-UA.min.js +1 -1
  124. package/lib/language/uk-UA.umd.js +3 -0
  125. package/lib/language/uz-UZ.js +3 -0
  126. package/lib/language/uz-UZ.min.js +1 -1
  127. package/lib/language/uz-UZ.umd.js +3 -0
  128. package/lib/language/vi-VN.js +3 -0
  129. package/lib/language/vi-VN.min.js +1 -1
  130. package/lib/language/vi-VN.umd.js +3 -0
  131. package/lib/language/zh-CHT.js +3 -0
  132. package/lib/language/zh-CHT.min.js +1 -1
  133. package/lib/language/zh-CHT.umd.js +3 -0
  134. package/lib/language/zh-CN.js +3 -0
  135. package/lib/language/zh-CN.min.js +1 -1
  136. package/lib/language/zh-CN.umd.js +3 -0
  137. package/lib/list/src/list.js +19 -1
  138. package/lib/list/src/list.min.js +1 -1
  139. package/lib/radio/src/button.js +3 -1
  140. package/lib/radio/src/button.min.js +1 -1
  141. package/lib/radio/src/group.js +7 -1
  142. package/lib/radio/src/group.min.js +1 -1
  143. package/lib/radio-button/style/style.css +151 -8
  144. package/lib/radio-button/style/style.min.css +1 -1
  145. package/lib/style.css +1 -1
  146. package/lib/style.min.css +1 -1
  147. package/lib/tree/src/tree.js +525 -14
  148. package/lib/tree/src/tree.min.js +1 -1
  149. package/lib/tree/src/util.js +16 -0
  150. package/lib/tree/src/util.min.js +1 -1
  151. package/lib/ui/index.js +5 -2
  152. package/lib/ui/index.min.js +1 -1
  153. package/lib/ui/src/log.js +1 -1
  154. package/lib/ui/src/log.min.js +1 -1
  155. package/lib/vxe-button/style/style.css +11 -0
  156. package/lib/vxe-button/style/style.min.css +1 -1
  157. package/lib/vxe-checkbox-button/style/style.css +151 -8
  158. package/lib/vxe-checkbox-button/style/style.min.css +1 -1
  159. package/lib/vxe-icon-picker/style/style.css +29 -5
  160. package/lib/vxe-icon-picker/style/style.min.css +1 -1
  161. package/lib/vxe-radio-button/style/style.css +151 -8
  162. package/lib/vxe-radio-button/style/style.min.css +1 -1
  163. package/package.json +1 -1
  164. package/packages/checkbox/src/button.ts +3 -1
  165. package/packages/checkbox/src/group.ts +6 -1
  166. package/packages/icon-picker/src/icon-picker.ts +157 -48
  167. package/packages/language/ar-EG.ts +3 -0
  168. package/packages/language/de-DE.ts +3 -0
  169. package/packages/language/en-US.ts +3 -0
  170. package/packages/language/es-ES.ts +3 -0
  171. package/packages/language/fr-FR.ts +3 -0
  172. package/packages/language/hu-HU.ts +3 -0
  173. package/packages/language/hy-AM.ts +3 -0
  174. package/packages/language/id-ID.ts +3 -0
  175. package/packages/language/it-IT.ts +3 -0
  176. package/packages/language/ja-JP.ts +3 -0
  177. package/packages/language/ko-KR.ts +3 -0
  178. package/packages/language/ms-MY.ts +3 -0
  179. package/packages/language/nb-NO.ts +3 -0
  180. package/packages/language/pt-BR.ts +3 -0
  181. package/packages/language/ru-RU.ts +3 -0
  182. package/packages/language/th-TH.ts +3 -0
  183. package/packages/language/ug-CN.ts +3 -0
  184. package/packages/language/uk-UA.ts +3 -0
  185. package/packages/language/uz-UZ.ts +3 -0
  186. package/packages/language/vi-VN.ts +3 -0
  187. package/packages/language/zh-CHT.ts +3 -0
  188. package/packages/language/zh-CN.ts +3 -0
  189. package/packages/list/src/list.ts +14 -1
  190. package/packages/radio/src/button.ts +3 -1
  191. package/packages/radio/src/group.ts +6 -1
  192. package/packages/tree/src/tree.ts +443 -14
  193. package/packages/tree/src/util.ts +17 -1
  194. package/packages/ui/index.ts +4 -1
  195. package/styles/components/button.scss +24 -69
  196. package/styles/components/checkbox-button.scss +65 -13
  197. package/styles/components/icon-picker.scss +37 -11
  198. package/styles/components/radio-button.scss +65 -13
  199. package/styles/helpers/themeStatus.scss +58 -0
  200. package/types/all.d.ts +205 -0
  201. package/types/components/checkbox-group.d.ts +3 -1
  202. package/types/components/checkbox.d.ts +1 -1
  203. package/types/components/icon-picker.d.ts +27 -4
  204. package/types/components/list.d.ts +2 -2
  205. package/types/components/radio-group.d.ts +3 -1
  206. package/types/components/tree.d.ts +36 -0
  207. /package/es/icon/{iconfont.1782658269305.ttf → iconfont.1782742200841.ttf} +0 -0
  208. /package/es/icon/{iconfont.1782658269305.woff → iconfont.1782742200841.woff} +0 -0
  209. /package/es/icon/{iconfont.1782658269305.woff2 → iconfont.1782742200841.woff2} +0 -0
  210. /package/es/{iconfont.1782658269305.ttf → iconfont.1782742200841.ttf} +0 -0
  211. /package/es/{iconfont.1782658269305.woff → iconfont.1782742200841.woff} +0 -0
  212. /package/es/{iconfont.1782658269305.woff2 → iconfont.1782742200841.woff2} +0 -0
  213. /package/lib/icon/style/{iconfont.1782658269305.ttf → iconfont.1782742200841.ttf} +0 -0
  214. /package/lib/icon/style/{iconfont.1782658269305.woff → iconfont.1782742200841.woff} +0 -0
  215. /package/lib/icon/style/{iconfont.1782658269305.woff2 → iconfont.1782742200841.woff2} +0 -0
  216. /package/lib/{iconfont.1782658269305.ttf → iconfont.1782742200841.ttf} +0 -0
  217. /package/lib/{iconfont.1782658269305.woff → iconfont.1782742200841.woff} +0 -0
  218. /package/lib/{iconfont.1782658269305.woff2 → iconfont.1782742200841.woff2} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { ref, h, reactive, PropType, computed, VNode, watch, onBeforeUnmount, nextTick, onMounted, provide } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import { VxeUI, createEvent, useSize, globalEvents, globalResize, renderEmptyElement } from '../../ui'
4
- import { calcTreeLine } from './util'
4
+ import { calcTreeLine, getItemCacheObj } from './util'
5
5
  import { createComponentLog } from '../../ui/src/log'
6
6
  import { getCrossTreeDragNodeInfo } from './store'
7
7
  import XEUtils from 'xe-utils'
@@ -13,7 +13,7 @@ import VxeLoadingComponent from '../../loading'
13
13
 
14
14
  import type { TreeReactData, VxeTreeEmits, VxeTreePropTypes, TreeInternalData, TreePrivateRef, VxeTreeDefines, VxeTreePrivateComputed, TreePrivateMethods, TreeMethods, ValueOf, VxeTreeConstructor, VxeTreePrivateMethods, VxeComponentStyleType } from '../../../types'
15
15
 
16
- const { errLog } = createComponentLog('tree')
16
+ const { warnLog, errLog } = createComponentLog('tree')
17
17
 
18
18
  const { menus, getConfig, getI18n, getIcon } = VxeUI
19
19
 
@@ -47,6 +47,9 @@ function createInternalData (): TreeInternalData {
47
47
  rowHeight: 0
48
48
  },
49
49
 
50
+ removeRowMaps: {},
51
+ insertRowMaps: {},
52
+
50
53
  // prevDragNode: null,
51
54
  // prevDragToChild: false,
52
55
  // prevDragPos: ''
@@ -70,15 +73,17 @@ function createReactData ():TreeReactData {
70
73
  treeList: [],
71
74
  updateExpandedFlag: 1,
72
75
  updateCheckboxFlag: 1,
76
+ insertRowFlag: 1,
77
+ removeRowFlag: 1,
73
78
  dragNode: null,
74
79
  dragTipText: ''
75
80
  }
76
81
  }
77
82
 
78
- // let crossTreeDragNodeObj: {
79
- // $oldTree: VxeTreeConstructor & VxeTreePrivateMethods
80
- // $newTree: (VxeTreeConstructor & VxeTreePrivateMethods) | null
81
- // } | null = null
83
+ let crossTreeDragNodeObj: {
84
+ $oldTree: VxeTreeConstructor & VxeTreePrivateMethods
85
+ $newTree: (VxeTreeConstructor & VxeTreePrivateMethods) | null
86
+ } | null = null
82
87
 
83
88
  export default defineVxeComponent({
84
89
  name: 'VxeTree',
@@ -216,6 +221,8 @@ export default defineVxeComponent({
216
221
  'node-dragstart',
217
222
  'node-dragover',
218
223
  'node-dragend',
224
+ 'node-remove-dragend',
225
+ 'node-insert-dragend',
219
226
  'node-expand',
220
227
  'node-menu',
221
228
  'menu-click'
@@ -1402,6 +1409,147 @@ export default defineVxeComponent({
1402
1409
  recalculate()
1403
1410
  }
1404
1411
 
1412
+ const insertTreeNode = (newRecords: any[], isAppend: boolean) => {
1413
+ const { treeFullData, nodeMaps } = internalData
1414
+ const keyField = computeKeyField.value
1415
+ const parentField = computeParentField.value
1416
+ const childrenField = computeChildrenField.value
1417
+ const mapChildrenField = computeMapChildrenField.value
1418
+ const funcName = isAppend ? 'push' : 'unshift'
1419
+ newRecords.forEach((item) => {
1420
+ const parentRowId = item[parentField]
1421
+ const nodeid = getNodeId(item)
1422
+ const matchObj = parentRowId ? XEUtils.findTree(treeFullData, (item) => parentRowId === item[keyField], { children: mapChildrenField }) : null
1423
+ const itemRest = getItemCacheObj(item)
1424
+ if (matchObj) {
1425
+ const { item: parentItem } = matchObj
1426
+ const parentRest = nodeMaps[getNodeId(parentItem)]
1427
+ const parentLevel = parentRest ? parentRest.level : 0
1428
+ let pChilds = parentItem[childrenField]
1429
+ let pMapChilds = parentItem[mapChildrenField]
1430
+ if (!XEUtils.isArray(pChilds)) {
1431
+ pChilds = parentItem[childrenField] = []
1432
+ }
1433
+ if (!XEUtils.isArray(pMapChilds)) {
1434
+ pMapChilds = parentItem[mapChildrenField] = []
1435
+ }
1436
+ itemRest.parent = parentItem
1437
+ itemRest.items = pChilds
1438
+ itemRest.level = parentLevel
1439
+ pChilds[funcName](item)
1440
+ pMapChilds[funcName](item)
1441
+ } else {
1442
+ if (parentRowId) {
1443
+ warnLog('vxe.error.unableInsert')
1444
+ }
1445
+ treeFullData[funcName](item)
1446
+ }
1447
+ nodeMaps[nodeid] = itemRest
1448
+ })
1449
+ }
1450
+
1451
+ const handleInsertNodeAt = (records: any[], targetNodeOrNodeid: any, isInsertNextNode?: any) => {
1452
+ const { transform } = props
1453
+ const { treeFullData, nodeMaps } = internalData
1454
+ const keyField = computeKeyField.value
1455
+ const parentField = computeParentField.value
1456
+ const childrenField = computeChildrenField.value
1457
+ const mapChildrenField = computeMapChildrenField.value
1458
+ if (!transform) {
1459
+ errLog('vxe.error.reqSupportProp', ['insert() | insertAt() | insertNextAt()', 'transform'])
1460
+ return Promise.resolve({ node: null, nodes: [] })
1461
+ }
1462
+ if (!XEUtils.isArray(records)) {
1463
+ records = [records]
1464
+ }
1465
+ let targetNode = targetNodeOrNodeid
1466
+ if (XEUtils.isString(targetNodeOrNodeid) || XEUtils.isNumber(targetNodeOrNodeid)) {
1467
+ const nodeRest = nodeMaps[targetNodeOrNodeid]
1468
+ if (nodeRest) {
1469
+ targetNode = nodeRest.item
1470
+ }
1471
+ }
1472
+ if (!records.length) {
1473
+ return Promise.resolve({ node: null, nodes: [] })
1474
+ }
1475
+ const newRecords = records.map(record => XEUtils.assign({ [mapChildrenField]: [], [childrenField]: [] }, record))
1476
+ const treeRecords = XEUtils.toArrayTree(newRecords, { key: keyField, parentKey: parentField, children: childrenField })
1477
+
1478
+ if (XEUtils.eqNull(targetNode)) {
1479
+ insertTreeNode(newRecords, false)
1480
+ } else {
1481
+ if (targetNode === -1) {
1482
+ insertTreeNode(newRecords, true)
1483
+ } else {
1484
+ const matchMapObj = XEUtils.findTree(treeFullData, item => targetNode[keyField] === item[keyField], { children: mapChildrenField })
1485
+ if (matchMapObj) {
1486
+ const { parent: parentNode } = matchMapObj
1487
+ const parentMapChilds = parentNode ? parentNode[mapChildrenField] : treeFullData
1488
+ const parentRest = nodeMaps[getNodeId(parentNode)]
1489
+ const parentLevel = parentRest ? parentRest.level : 0
1490
+ treeRecords.forEach((row, i) => {
1491
+ if (parentNode) {
1492
+ if (row[parentField] !== parentNode[keyField]) {
1493
+ errLog('vxe.error.errProp', [`${parentField}=${row[parentField]}`, `${parentField}=${parentNode[keyField]}`])
1494
+ row[parentField] = parentNode[keyField]
1495
+ }
1496
+ } else {
1497
+ if (row[parentField] !== null) {
1498
+ if (!XEUtils.eqNull(row[parentField])) {
1499
+ errLog('vxe.error.errProp', [`${parentField}=${row[parentField]}`, 'null'])
1500
+ }
1501
+ row[parentField] = null
1502
+ }
1503
+ }
1504
+ let targetIndex = matchMapObj.index + i
1505
+ if (isInsertNextNode) {
1506
+ targetIndex = targetIndex + 1
1507
+ }
1508
+ parentMapChilds.splice(targetIndex, 0, row)
1509
+ })
1510
+ XEUtils.eachTree(treeRecords, (item) => {
1511
+ const nodeid = getNodeId(item)
1512
+ const nodeRest = getItemCacheObj(item)
1513
+ nodeRest.level = parentLevel
1514
+ if (item[childrenField]) {
1515
+ item[mapChildrenField] = item[childrenField]
1516
+ }
1517
+ nodeMaps[nodeid] = nodeRest
1518
+ }, { children: childrenField })
1519
+ // 源
1520
+ if (parentNode) {
1521
+ const matchObj = XEUtils.findTree(treeFullData, item => targetNode[keyField] === item[keyField], { children: childrenField })
1522
+ if (matchObj) {
1523
+ const parentChilds = matchObj.items
1524
+ let targetIndex = matchObj.index
1525
+ if (isInsertNextNode) {
1526
+ targetIndex = targetIndex + 1
1527
+ }
1528
+ parentChilds.splice(targetIndex, 0, ...treeRecords)
1529
+ }
1530
+ }
1531
+ } else {
1532
+ warnLog('vxe.error.unableInsert')
1533
+ insertTreeNode(newRecords, true)
1534
+ }
1535
+ }
1536
+ }
1537
+ reactData.insertRowFlag++
1538
+ cacheNodeMap()
1539
+ handleData(true)
1540
+ updateAfterDataIndex()
1541
+ updateCheckboxStatus()
1542
+ if (reactData.scrollYLoad) {
1543
+ updateYSpace()
1544
+ }
1545
+ return nextTick().then(() => {
1546
+ return {
1547
+ node: newRecords.length ? newRecords[newRecords.length - 1] : null,
1548
+ nodes: newRecords
1549
+ }
1550
+ })
1551
+ }
1552
+
1405
1553
  const treeMethods: TreeMethods = {
1406
1554
  dispatchEvent,
1407
1555
  getNodeId,
@@ -1802,7 +1950,91 @@ export default defineVxeComponent({
1802
1950
  }
1803
1951
  return recalculate()
1804
1952
  },
1805
- clearScroll
1953
+ clearScroll,
1954
+ insert (records) {
1955
+ return handleInsertNodeAt(records, null)
1956
+ },
1957
+ insertAt (records, targetNodeOrNodeid) {
1958
+ return handleInsertNodeAt(records, targetNodeOrNodeid)
1959
+ },
1960
+ insertNextAt (records, targetNodeOrNodeid) {
1961
+ return handleInsertNodeAt(records, targetNodeOrNodeid, true)
1962
+ },
1963
+ remove (nodes) {
1964
+ const { transform } = props
1965
+ const { treeFullData } = internalData
1966
+ const childrenField = computeChildrenField.value
1967
+ const mapChildrenField = computeMapChildrenField.value
1968
+ if (!transform) {
1969
+ errLog('vxe.error.reqSupportProp', ['remove()', 'transform'])
1970
+ return Promise.resolve({ node: null, nodes: [] })
1971
+ }
1972
+ let delList: any[] = []
1973
+ if (!nodes) {
1974
+ nodes = treeFullData
1975
+ } else if (!XEUtils.isArray(nodes)) {
1976
+ nodes = [nodes]
1977
+ }
1978
+ if (!nodes.length) {
1979
+ return Promise.resolve({ node: null, nodes: [] })
1980
+ }
1981
+
1982
+ // 从数据源中移除
1983
+ if (treeFullData === nodes) {
1984
+ nodes = delList = treeFullData.slice(0)
1985
+ internalData.treeFullData = []
1986
+ } else {
1987
+ nodes.forEach((item: any) => {
1988
+ const nodeid = getNodeId(item)
1989
+ const matchMapObj = XEUtils.findTree(treeFullData, item => nodeid === getNodeId(item), { children: mapChildrenField })
1990
+ if (matchMapObj) {
1991
+ const rItems = matchMapObj.items.splice(matchMapObj.index, 1)
1992
+ delList.push(rItems[0])
1993
+ }
1994
+ const matchObj = XEUtils.findTree(treeFullData, item => nodeid === getNodeId(item), { children: childrenField })
1995
+ if (matchObj) {
1996
+ const rItems = matchObj.items.splice(matchObj.index, 1)
1997
+ delList.push(rItems[0])
1998
+ }
1999
+ })
2000
+ }
2001
+ reactData.removeRowFlag++
2002
+ reactData.insertRowFlag++
2003
+ cacheNodeMap()
2004
+ handleData(true)
2005
+ updateAfterDataIndex()
2006
+ updateCheckboxStatus()
2007
+ if (reactData.scrollYLoad) {
2008
+ updateYSpace()
2009
+ }
2010
+ return nextTick().then(() => {
2011
+ return recalculate()
2012
+ }).then(() => {
2013
+ return { node: delList.length ? delList[delList.length - 1] : null, nodes: delList }
2014
+ })
2015
+ },
2016
+ getInsertRecords () {
2017
+ const { insertRowMaps } = internalData
2018
+ const insertRecords: any[] = []
2019
+ XEUtils.each(insertRowMaps, (row) => {
2020
+ insertRecords.push(row)
2021
+ })
2022
+ return insertRecords
2023
+ },
2024
+ getRemoveRecords () {
2025
+ const { removeRowMaps } = internalData
2026
+ const removeRecords: any[] = []
2027
+ XEUtils.each(removeRowMaps, (row) => {
2028
+ removeRecords.push(row)
2029
+ })
2030
+ return removeRecords
2031
+ }
2032
+ }
2033
+
2034
+ const handleNodeDragEndClearStatus = () => {
2035
+ clearNodeDragData()
2036
+ clearCrossTreeDragStatus()
2037
+ recalculate()
1806
2038
  }
1807
2039
 
1808
2040
  const clearNodeDropOrigin = () => {
@@ -1857,7 +2089,7 @@ export default defineVxeComponent({
1857
2089
  }
1858
2090
 
1859
2091
  const clearCrossTreeDragStatus = () => {
1860
- // crossTreeDragNodeObj = null
2092
+ crossTreeDragNodeObj = null
1861
2093
  crossTreeDragNodeInfo.node = null
1862
2094
  }
1863
2095
 
@@ -2242,6 +2474,18 @@ export default defineVxeComponent({
2242
2474
  const { dragNode } = reactData
2243
2475
  const { nodeMaps, prevDragNode, prevDragPos, prevDragToChild } = internalData
2244
2476
  const hasChildField = computeHasChildField.value
2477
+ const dragConfig = computeDragOpts.value
2478
+ const { isCrossDrag, isCrossTreeDrag } = dragConfig
2479
+ // 跨树拖拽
2480
+ if (isCrossTreeDrag && crossTreeDragNodeObj) {
2481
+ const { $newTree } = crossTreeDragNodeObj
2482
+ if ($newTree && $newTree.xID !== $xeTree.xID) {
2483
+ if (isCrossDrag) {
2484
+ $newTree.handleCrossTreeNodeDragInsertEvent(evnt)
2485
+ }
2486
+ return
2487
+ }
2488
+ }
2245
2489
  if (lazy && prevDragToChild) {
2246
2490
  // 懒加载
2247
2491
  const newNodeid = getNodeId(prevDragNode)
@@ -2322,17 +2566,194 @@ export default defineVxeComponent({
2322
2566
  /**
2323
2567
  * 处理跨树拖拽完成
2324
2568
  */
2325
- handleCrossTreeNodeDragFinishEvent () {
2569
+ handleCrossTreeNodeDragFinishEvent (evnt: DragEvent) {
2570
+ const { treeList } = reactData
2571
+ const { nodeMaps } = internalData
2572
+ const dragOpts = computeDragOpts.value
2573
+ const { animation, isCrossTreeDrag } = dragOpts
2574
+ const mapChildrenField = computeMapChildrenField.value
2575
+ const el = refElem.value
2576
+ if (!el) {
2577
+ return
2578
+ }
2579
+ if (isCrossTreeDrag && crossTreeDragNodeObj && crossTreeDragNodeInfo) {
2580
+ const { node: dragNode } = crossTreeDragNodeInfo
2581
+ if (dragNode) {
2582
+ const dragNodeid = getNodeId(dragNode)
2583
+ const dragNodeRest = nodeMaps[dragNodeid]
2584
+ let dragNodeHeight = 0
2585
+ let rsIndex = -1
2586
+ if (dragNodeRest) {
2587
+ if (animation) {
2588
+ const oldItemEl = el.querySelector<HTMLElement>(`.vxe-tree--node-wrapper[nodeid="${dragNodeid}"]`)
2589
+ const targetItemEl = oldItemEl
2590
+ if (targetItemEl) {
2591
+ dragNodeHeight = targetItemEl.offsetHeight
2592
+ }
2593
+ }
2594
+ rsIndex = dragNodeRest.$index
2595
+ }
2596
+ const dragRangeList = rsIndex > -1 && rsIndex < treeList.length - 1 ? treeList.slice(rsIndex + 1) : []
2597
+ const dragList = XEUtils.toTreeArray([dragNode], {
2598
+ updated: true,
2599
+ children: mapChildrenField
2600
+ })
2601
+ $xeTree.remove(dragList).then(() => {
2602
+ if (animation && dragNodeHeight && dragRangeList.length) {
2603
+ const wrapperEl = el
2604
+ const dtClss: string[] = []
2605
+ dragRangeList.forEach(item => {
2606
+ const nodeid = getNodeId(item)
2607
+ dtClss.push(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`)
2608
+ })
2609
+ const dtTrList = wrapperEl.querySelectorAll<HTMLElement>(dtClss.join(','))
2610
+ moveRowAnimateToTb(dtTrList, dragNodeHeight)
2611
+ }
2612
+ })
2613
+ dispatchEvent('node-remove-dragend', {
2614
+ node: dragNode
2615
+ }, evnt)
2616
+ handleNodeDragEndClearStatus()
2617
+ }
2618
+ }
2326
2619
  },
2327
2620
  /**
2328
2621
  * 处理跨树拖至新的空树
2329
2622
  */
2330
- handleCrossTreeNodeDragInsertEvent () {
2623
+ handleCrossTreeNodeDragoverEmptyEvent (evnt: DragEvent) {
2624
+ const { treeList } = reactData
2625
+ const dragOpts = computeDragOpts.value
2626
+ const { isCrossTreeDrag } = dragOpts
2627
+ if (isCrossTreeDrag && crossTreeDragNodeObj && !treeList.length) {
2628
+ const { $oldTree, $newTree } = crossTreeDragNodeObj
2629
+ if ($oldTree) {
2630
+ const oldTreeReactData = $oldTree as unknown as TreeReactData
2631
+ if ($oldTree.xID !== $xeTree.xID) {
2632
+ if ($newTree && $newTree.xID !== $xeTree.xID) {
2633
+ $newTree.hideCrossTreeNodeDropClearStatus()
2634
+ }
2635
+ evnt.preventDefault()
2636
+ $oldTree.hideCrossTreeNodeDropClearStatus()
2637
+ crossTreeDragNodeObj.$newTree = $xeTree
2638
+ internalData.prevDragNode = null
2639
+ reactData.dragTipText = oldTreeReactData.dragTipText
2640
+ showDropTip(evnt, evnt.currentTarget as HTMLDivElement, true, '')
2641
+ }
2642
+ }
2643
+ }
2331
2644
  },
2332
2645
  /**
2333
2646
  * 处理跨树拖插入
2334
2647
  */
2335
- handleCrossTreeNodeDragoverEmptyEvent () {
2648
+ handleCrossTreeNodeDragInsertEvent (evnt: DragEvent) {
2649
+ const { prevDragNode, prevDragPos, prevDragToChild } = internalData
2650
+ const dragOpts = computeDragOpts.value
2651
+ const { animation, isSelfToChildDrag, isCrossTreeDrag, dragEndMethod, dragToChildMethod } = dragOpts
2652
+ const parentField = computeParentField.value
2653
+ const mapChildrenField = computeMapChildrenField.value
2654
+ const childrenField = computeChildrenField.value
2655
+ // 跨表拖拽
2656
+ if (isCrossTreeDrag && crossTreeDragNodeObj && crossTreeDragNodeInfo) {
2657
+ const { node: oldNode } = crossTreeDragNodeInfo
2658
+ const { $oldTree } = crossTreeDragNodeObj
2659
+ const el = refElem.value
2660
+ if (!el) {
2661
+ return
2662
+ }
2663
+ if ($oldTree && oldNode) {
2664
+ const dragNode = oldNode
2665
+ let dragOffsetIndex = -1
2666
+ if (prevDragNode) {
2667
+ dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0
2668
+ }
2669
+ const dragParams = {
2670
+ oldNode: dragNode,
2671
+ newNode: prevDragNode,
2672
+ dragNode,
2673
+ dragPos: prevDragPos as 'top' | 'bottom',
2674
+ dragToChild: !!prevDragToChild,
2675
+ offsetIndex: dragOffsetIndex as 0 | 1
2676
+ }
2677
+ const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild
2678
+ const errRest = {
2679
+ status: false
2680
+ }
2681
+ Promise.resolve(dragEndMethod ? dragEndMethod(dragParams) : true).then((status) => {
2682
+ if (!status) {
2683
+ if ($oldTree) {
2684
+ if ($oldTree.xID !== $xeTree.xID) {
2685
+ $oldTree.handleCrossTreeNodeDragCancelEvent(evnt)
2686
+ }
2687
+ }
2688
+ handleNodeDragEndClearStatus()
2689
+ return errRest
2690
+ }
2691
+ let insertRest: Promise<any> = Promise.resolve()
2692
+ const dragList = XEUtils.toTreeArray([dragNode], {
2693
+ updated: true,
2694
+ children: mapChildrenField
2695
+ })
2696
+ $oldTree.handleCrossTreeNodeDragFinishEvent(evnt)
2697
+ if (prevDragNode) {
2698
+ dragNode[parentField] = prevDragNode[parentField]
2699
+ } else {
2700
+ dragNode[parentField] = null
2701
+ }
2702
+ dragList.forEach(row => {
2703
+ row[childrenField] = undefined
2704
+ row[mapChildrenField] = undefined
2705
+ })
2706
+ if (prevDragNode) {
2707
+ if (prevDragPos === 'bottom') {
2708
+ insertRest = $xeTree.insertNextAt(dragList, prevDragNode)
2709
+ } else {
2710
+ insertRest = $xeTree.insertAt(dragList, prevDragNode)
2711
+ }
2712
+ } else {
2713
+ insertRest = $xeTree.insert(dragList)
2714
+ }
2715
+ $xeTree.dispatchEvent('node-insert-dragend', {
2716
+ oldNode,
2717
+ newNode: prevDragNode,
2718
+ dragNode,
2719
+ dragPos: prevDragPos as any,
2720
+ dragToChild: isDragToChildFlag,
2721
+ offsetIndex: dragOffsetIndex
2722
+ }, evnt)
2723
+ clearNodeDragData()
2724
+
2725
+ insertRest.then(() => {
2726
+ const { treeList } = reactData
2727
+ const { nodeMaps } = internalData
2728
+ const oldNodeid = getNodeId(dragNode)
2729
+ const oldNodeRest = nodeMaps[oldNodeid]
2730
+ let dragNodeHeight = 0
2731
+ let rsIndex = -1
2732
+ if (oldNodeRest) {
2733
+ if (animation) {
2734
+ const oldItemEl = el.querySelector<HTMLElement>(`.vxe-tree--node-wrapper[nodeid="${oldNodeid}"]`)
2735
+ const targetItemEl = oldItemEl
2736
+ if (targetItemEl) {
2737
+ dragNodeHeight = targetItemEl.offsetHeight
2738
+ }
2739
+ }
2740
+ rsIndex = oldNodeRest.$index
2741
+ }
2742
+ const dragRangeList = rsIndex > -1 ? treeList.slice(rsIndex) : []
2743
+ if (animation && dragNodeHeight && dragRangeList.length) {
2744
+ const wrapperEl = el
2745
+ const dtClss: string[] = []
2746
+ dragRangeList.forEach(item => {
2747
+ const nodeid = getNodeId(item)
2748
+ dtClss.push(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`)
2749
+ })
2750
+ const dtTrList = wrapperEl.querySelectorAll<HTMLElement>(dtClss.join(','))
2751
+ moveRowAnimateToTb(dtTrList, -dragNodeHeight)
2752
+ }
2753
+ })
2754
+ })
2755
+ }
2756
+ }
2336
2757
  },
2337
2758
  hideCrossTreeNodeDropClearStatus () {
2338
2759
  hideDropTip()
@@ -2663,10 +3084,17 @@ export default defineVxeComponent({
2663
3084
  const loadingOpts = computeLoadingOpts.value
2664
3085
  const isRowHover = computeIsRowHover.value
2665
3086
  const treeStyle = computeTreeStyle.value
3087
+ const dragOpts = computeDragOpts.value
2666
3088
  const loadingSlot = slots.loading
2667
3089
  const headerSlot = slots.header
2668
3090
  const footerSlot = slots.footer
2669
3091
 
3092
+ const teOns: {
3093
+ onDragover?: (...args: any[]) => void
3094
+ } = { }
3095
+ if (dragOpts.isCrossTreeDrag && !treeList.length) {
3096
+ teOns.onDragover = $xeTree.handleCrossTreeNodeDragInsertEvent
3097
+ }
2670
3098
  return h('div', {
2671
3099
  ref: refElem,
2672
3100
  class: ['vxe-tree', {
@@ -2677,7 +3105,8 @@ export default defineVxeComponent({
2677
3105
  'node--hover': isRowHover,
2678
3106
  'node--trigger': trigger === 'node',
2679
3107
  'is--loading': loading
2680
- }]
3108
+ }],
3109
+ ...teOns
2681
3110
  }, [
2682
3111
  headerSlot
2683
3112
  ? h('div', {
@@ -2790,8 +3219,8 @@ export default defineVxeComponent({
2790
3219
  if (drag && !transform) {
2791
3220
  errLog('vxe.error.notSupportProp', ['drag', 'transform=false', 'transform=true'])
2792
3221
  }
2793
- if (dragOpts.isCrossTreeDrag) {
2794
- errLog('vxe.error.notProp', ['drag-config.isCrossTreeDrag'])
3222
+ if (dragOpts.isCrossTreeDrag && !dragOpts.isCrossDrag) {
3223
+ errLog('vxe.error.reqSupportProp', ['drag-config.isCrossTreeDrag', 'drag-config.isCrossDrag'])
2795
3224
  }
2796
3225
  // if (valueField) {
2797
3226
  // errLog('vxe.error.delProp', ['value-field', 'value-field'])
@@ -1,4 +1,4 @@
1
- import type { VxeTreeConstructor } from '../../../types'
1
+ import type { VxeTreeConstructor, VxeTreeDefines } from '../../../types'
2
2
 
3
3
  function countTreeExpand ($xeTree: VxeTreeConstructor, prevNode: any) {
4
4
  let count = 1
@@ -33,3 +33,19 @@ export function calcTreeLine ($xeTree: VxeTreeConstructor, node: any, prevNode:
33
33
  }
34
34
  return (rowHeight || 28) * expandSize - (prevNode ? 1 : 12)
35
35
  }
36
+
37
+ export function getItemCacheObj (item: any): VxeTreeDefines.NodeCacheItem {
38
+ return {
39
+ item,
40
+ index: -1,
41
+ $index: -1,
42
+ _index: -1,
43
+ items: [],
44
+ parent: null,
45
+ nodes: [],
46
+ level: 0,
47
+ treeIndex: -1,
48
+ lineCount: 0,
49
+ treeLoaded: false
50
+ }
51
+ }
@@ -185,7 +185,10 @@ setConfig({
185
185
  formView: {},
186
186
  icon: {},
187
187
  iconPicker: {
188
- icons: ['home', 'company', 'comment', 'setting', 'send', 'envelope', 'envelope-open', 'bell', 'search', 'print', 'pc', 'goods', 'chart-line', 'edit', 'delete', 'save', 'folder', 'microphone', 'flag', 'link', 'location', 'sunny', 'rmb', 'usd', 'user', 'add-user', 'add-users', 'star', 'unlock', 'time', 'text', 'feedback', 'calendar', 'association-form', 'cloud-download', 'cloud-upload', 'file', 'subtable', 'chart-bar-x', 'chart-bar-y', 'chart-line', 'chart-pie', 'chart-radar']
188
+ icons: ['home', 'company', 'comment', 'setting', 'send', 'envelope', 'envelope-open', 'bell', 'search', 'print', 'pc', 'goods', 'chart-line', 'edit', 'delete', 'save', 'folder', 'microphone', 'flag', 'link', 'location', 'sunny', 'rmb', 'usd', 'user', 'add-user', 'add-users', 'star', 'unlock', 'time', 'text', 'feedback', 'calendar', 'association-form', 'cloud-download', 'cloud-upload', 'file', 'subtable', 'chart-bar-x', 'chart-bar-y', 'chart-line', 'chart-pie', 'chart-radar'],
189
+ popupConfig: {
190
+ // chunkSize: 4
191
+ }
189
192
  },
190
193
  image: {
191
194
  draggable: null,