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, computed, 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';
@@ -10,7 +10,7 @@ import { toCssUnit, isScale, getPaddingTopBottomSize, addClass, removeClass, get
10
10
  import { isEnableConf, enModelValue, deModelValue } from '../../ui/src/utils';
11
11
  import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime';
12
12
  import VxeLoadingComponent from '../../loading';
13
- const { errLog } = createComponentLog('tree');
13
+ const { warnLog, errLog } = createComponentLog('tree');
14
14
  const { menus, getConfig, getI18n, getIcon } = VxeUI;
15
15
  /**
16
16
  * 生成节点的唯一主键
@@ -39,6 +39,8 @@ function createInternalData() {
39
39
  offsetSize: 0,
40
40
  rowHeight: 0
41
41
  },
42
+ removeRowMaps: {},
43
+ insertRowMaps: {},
42
44
  // prevDragNode: null,
43
45
  // prevDragToChild: false,
44
46
  // prevDragPos: ''
@@ -60,14 +62,13 @@ function createReactData() {
60
62
  treeList: [],
61
63
  updateExpandedFlag: 1,
62
64
  updateCheckboxFlag: 1,
65
+ insertRowFlag: 1,
66
+ removeRowFlag: 1,
63
67
  dragNode: null,
64
68
  dragTipText: ''
65
69
  };
66
70
  }
67
- // let crossTreeDragNodeObj: {
68
- // $oldTree: VxeTreeConstructor & VxeTreePrivateMethods
69
- // $newTree: (VxeTreeConstructor & VxeTreePrivateMethods) | null
70
- // } | null = null
71
+ let crossTreeDragNodeObj = null;
71
72
  export default defineVxeComponent({
72
73
  name: 'VxeTree',
73
74
  props: {
@@ -204,6 +205,8 @@ export default defineVxeComponent({
204
205
  'node-dragstart',
205
206
  'node-dragover',
206
207
  'node-dragend',
208
+ 'node-remove-dragend',
209
+ 'node-insert-dragend',
207
210
  'node-expand',
208
211
  'node-menu',
209
212
  'menu-click'
@@ -1331,6 +1334,149 @@ export default defineVxeComponent({
1331
1334
  }
1332
1335
  recalculate();
1333
1336
  };
1337
+ const insertTreeNode = (newRecords, isAppend) => {
1338
+ const { treeFullData, nodeMaps } = internalData;
1339
+ const keyField = computeKeyField.value;
1340
+ const parentField = computeParentField.value;
1341
+ const childrenField = computeChildrenField.value;
1342
+ const mapChildrenField = computeMapChildrenField.value;
1343
+ const funcName = isAppend ? 'push' : 'unshift';
1344
+ newRecords.forEach((item) => {
1345
+ const parentRowId = item[parentField];
1346
+ const nodeid = getNodeId(item);
1347
+ const matchObj = parentRowId ? XEUtils.findTree(treeFullData, (item) => parentRowId === item[keyField], { children: mapChildrenField }) : null;
1348
+ const itemRest = getItemCacheObj(item);
1349
+ if (matchObj) {
1350
+ const { item: parentItem } = matchObj;
1351
+ const parentRest = nodeMaps[getNodeId(parentItem)];
1352
+ const parentLevel = parentRest ? parentRest.level : 0;
1353
+ let pChilds = parentItem[childrenField];
1354
+ let pMapChilds = parentItem[mapChildrenField];
1355
+ if (!XEUtils.isArray(pChilds)) {
1356
+ pChilds = parentItem[childrenField] = [];
1357
+ }
1358
+ if (!XEUtils.isArray(pMapChilds)) {
1359
+ pMapChilds = parentItem[mapChildrenField] = [];
1360
+ }
1361
+ itemRest.parent = parentItem;
1362
+ itemRest.items = pChilds;
1363
+ itemRest.level = parentLevel;
1364
+ pChilds[funcName](item);
1365
+ pMapChilds[funcName](item);
1366
+ }
1367
+ else {
1368
+ if (parentRowId) {
1369
+ warnLog('vxe.error.unableInsert');
1370
+ }
1371
+ treeFullData[funcName](item);
1372
+ }
1373
+ nodeMaps[nodeid] = itemRest;
1374
+ });
1375
+ };
1376
+ const handleInsertNodeAt = (records, targetNodeOrNodeid, isInsertNextNode) => {
1377
+ const { transform } = props;
1378
+ const { treeFullData, nodeMaps } = internalData;
1379
+ const keyField = computeKeyField.value;
1380
+ const parentField = computeParentField.value;
1381
+ const childrenField = computeChildrenField.value;
1382
+ const mapChildrenField = computeMapChildrenField.value;
1383
+ if (!transform) {
1384
+ errLog('vxe.error.reqSupportProp', ['insert() | insertAt() | insertNextAt()', 'transform']);
1385
+ return Promise.resolve({ node: null, nodes: [] });
1386
+ }
1387
+ if (!XEUtils.isArray(records)) {
1388
+ records = [records];
1389
+ }
1390
+ let targetNode = targetNodeOrNodeid;
1391
+ if (XEUtils.isString(targetNodeOrNodeid) || XEUtils.isNumber(targetNodeOrNodeid)) {
1392
+ const nodeRest = nodeMaps[targetNodeOrNodeid];
1393
+ if (nodeRest) {
1394
+ targetNode = nodeRest.item;
1395
+ }
1396
+ }
1397
+ if (!records.length) {
1398
+ return Promise.resolve({ node: null, nodes: [] });
1399
+ }
1400
+ const newRecords = records.map(record => XEUtils.assign({ [mapChildrenField]: [], [childrenField]: [] }, record));
1401
+ const treeRecords = XEUtils.toArrayTree(newRecords, { key: keyField, parentKey: parentField, children: childrenField });
1402
+ if (XEUtils.eqNull(targetNode)) {
1403
+ insertTreeNode(newRecords, false);
1404
+ }
1405
+ else {
1406
+ if (targetNode === -1) {
1407
+ insertTreeNode(newRecords, true);
1408
+ }
1409
+ else {
1410
+ const matchMapObj = XEUtils.findTree(treeFullData, item => targetNode[keyField] === item[keyField], { children: mapChildrenField });
1411
+ if (matchMapObj) {
1412
+ const { parent: parentNode } = matchMapObj;
1413
+ const parentMapChilds = parentNode ? parentNode[mapChildrenField] : treeFullData;
1414
+ const parentRest = nodeMaps[getNodeId(parentNode)];
1415
+ const parentLevel = parentRest ? parentRest.level : 0;
1416
+ treeRecords.forEach((row, i) => {
1417
+ if (parentNode) {
1418
+ if (row[parentField] !== parentNode[keyField]) {
1419
+ errLog('vxe.error.errProp', [`${parentField}=${row[parentField]}`, `${parentField}=${parentNode[keyField]}`]);
1420
+ row[parentField] = parentNode[keyField];
1421
+ }
1422
+ }
1423
+ else {
1424
+ if (row[parentField] !== null) {
1425
+ if (!XEUtils.eqNull(row[parentField])) {
1426
+ errLog('vxe.error.errProp', [`${parentField}=${row[parentField]}`, 'null']);
1427
+ }
1428
+ row[parentField] = null;
1429
+ }
1430
+ }
1431
+ let targetIndex = matchMapObj.index + i;
1432
+ if (isInsertNextNode) {
1433
+ targetIndex = targetIndex + 1;
1434
+ }
1435
+ parentMapChilds.splice(targetIndex, 0, row);
1436
+ });
1437
+ XEUtils.eachTree(treeRecords, (item) => {
1438
+ const nodeid = getNodeId(item);
1439
+ const nodeRest = getItemCacheObj(item);
1440
+ nodeRest.level = parentLevel;
1441
+ if (item[childrenField]) {
1442
+ item[mapChildrenField] = item[childrenField];
1443
+ }
1444
+ nodeMaps[nodeid] = nodeRest;
1445
+ }, { children: childrenField });
1446
+ // 源
1447
+ if (parentNode) {
1448
+ const matchObj = XEUtils.findTree(treeFullData, item => targetNode[keyField] === item[keyField], { children: childrenField });
1449
+ if (matchObj) {
1450
+ const parentChilds = matchObj.items;
1451
+ let targetIndex = matchObj.index;
1452
+ if (isInsertNextNode) {
1453
+ targetIndex = targetIndex + 1;
1454
+ }
1455
+ parentChilds.splice(targetIndex, 0, ...treeRecords);
1456
+ }
1457
+ }
1458
+ }
1459
+ else {
1460
+ warnLog('vxe.error.unableInsert');
1461
+ insertTreeNode(newRecords, true);
1462
+ }
1463
+ }
1464
+ }
1465
+ reactData.insertRowFlag++;
1466
+ cacheNodeMap();
1467
+ handleData(true);
1468
+ updateAfterDataIndex();
1469
+ updateCheckboxStatus();
1470
+ if (reactData.scrollYLoad) {
1471
+ updateYSpace();
1472
+ }
1473
+ return nextTick().then(() => {
1474
+ return {
1475
+ node: newRecords.length ? newRecords[newRecords.length - 1] : null,
1476
+ nodes: newRecords
1477
+ };
1478
+ });
1479
+ };
1334
1480
  const treeMethods = {
1335
1481
  dispatchEvent,
1336
1482
  getNodeId,
@@ -1734,7 +1880,91 @@ export default defineVxeComponent({
1734
1880
  }
1735
1881
  return recalculate();
1736
1882
  },
1737
- clearScroll
1883
+ clearScroll,
1884
+ insert(records) {
1885
+ return handleInsertNodeAt(records, null);
1886
+ },
1887
+ insertAt(records, targetNodeOrNodeid) {
1888
+ return handleInsertNodeAt(records, targetNodeOrNodeid);
1889
+ },
1890
+ insertNextAt(records, targetNodeOrNodeid) {
1891
+ return handleInsertNodeAt(records, targetNodeOrNodeid, true);
1892
+ },
1893
+ remove(nodes) {
1894
+ const { transform } = props;
1895
+ const { treeFullData } = internalData;
1896
+ const childrenField = computeChildrenField.value;
1897
+ const mapChildrenField = computeMapChildrenField.value;
1898
+ if (!transform) {
1899
+ errLog('vxe.error.reqSupportProp', ['remove()', 'transform']);
1900
+ return Promise.resolve({ node: null, nodes: [] });
1901
+ }
1902
+ let delList = [];
1903
+ if (!nodes) {
1904
+ nodes = treeFullData;
1905
+ }
1906
+ else if (!XEUtils.isArray(nodes)) {
1907
+ nodes = [nodes];
1908
+ }
1909
+ if (!nodes.length) {
1910
+ return Promise.resolve({ node: null, nodes: [] });
1911
+ }
1912
+ // 从数据源中移除
1913
+ if (treeFullData === nodes) {
1914
+ nodes = delList = treeFullData.slice(0);
1915
+ internalData.treeFullData = [];
1916
+ }
1917
+ else {
1918
+ nodes.forEach((item) => {
1919
+ const nodeid = getNodeId(item);
1920
+ const matchMapObj = XEUtils.findTree(treeFullData, item => nodeid === getNodeId(item), { children: mapChildrenField });
1921
+ if (matchMapObj) {
1922
+ const rItems = matchMapObj.items.splice(matchMapObj.index, 1);
1923
+ delList.push(rItems[0]);
1924
+ }
1925
+ const matchObj = XEUtils.findTree(treeFullData, item => nodeid === getNodeId(item), { children: childrenField });
1926
+ if (matchObj) {
1927
+ const rItems = matchObj.items.splice(matchObj.index, 1);
1928
+ delList.push(rItems[0]);
1929
+ }
1930
+ });
1931
+ }
1932
+ reactData.removeRowFlag++;
1933
+ reactData.insertRowFlag++;
1934
+ cacheNodeMap();
1935
+ handleData(true);
1936
+ updateAfterDataIndex();
1937
+ updateCheckboxStatus();
1938
+ if (reactData.scrollYLoad) {
1939
+ updateYSpace();
1940
+ }
1941
+ return nextTick().then(() => {
1942
+ return recalculate();
1943
+ }).then(() => {
1944
+ return { node: delList.length ? delList[delList.length - 1] : null, nodes: delList };
1945
+ });
1946
+ },
1947
+ getInsertRecords() {
1948
+ const { insertRowMaps } = internalData;
1949
+ const insertRecords = [];
1950
+ XEUtils.each(insertRowMaps, (row) => {
1951
+ insertRecords.push(row);
1952
+ });
1953
+ return insertRecords;
1954
+ },
1955
+ getRemoveRecords() {
1956
+ const { removeRowMaps } = internalData;
1957
+ const removeRecords = [];
1958
+ XEUtils.each(removeRowMaps, (row) => {
1959
+ removeRecords.push(row);
1960
+ });
1961
+ return removeRecords;
1962
+ }
1963
+ };
1964
+ const handleNodeDragEndClearStatus = () => {
1965
+ clearNodeDragData();
1966
+ clearCrossTreeDragStatus();
1967
+ recalculate();
1738
1968
  };
1739
1969
  const clearNodeDropOrigin = () => {
1740
1970
  const el = refElem.value;
@@ -1785,7 +2015,7 @@ export default defineVxeComponent({
1785
2015
  }
1786
2016
  };
1787
2017
  const clearCrossTreeDragStatus = () => {
1788
- // crossTreeDragNodeObj = null
2018
+ crossTreeDragNodeObj = null;
1789
2019
  crossTreeDragNodeInfo.node = null;
1790
2020
  };
1791
2021
  const clearDragStatus = () => {
@@ -2150,6 +2380,18 @@ export default defineVxeComponent({
2150
2380
  const { dragNode } = reactData;
2151
2381
  const { nodeMaps, prevDragNode, prevDragPos, prevDragToChild } = internalData;
2152
2382
  const hasChildField = computeHasChildField.value;
2383
+ const dragConfig = computeDragOpts.value;
2384
+ const { isCrossDrag, isCrossTreeDrag } = dragConfig;
2385
+ // 跨树拖拽
2386
+ if (isCrossTreeDrag && crossTreeDragNodeObj) {
2387
+ const { $newTree } = crossTreeDragNodeObj;
2388
+ if ($newTree && $newTree.xID !== $xeTree.xID) {
2389
+ if (isCrossDrag) {
2390
+ $newTree.handleCrossTreeNodeDragInsertEvent(evnt);
2391
+ }
2392
+ return;
2393
+ }
2394
+ }
2153
2395
  if (lazy && prevDragToChild) {
2154
2396
  // 懒加载
2155
2397
  const newNodeid = getNodeId(prevDragNode);
@@ -2229,17 +2471,196 @@ export default defineVxeComponent({
2229
2471
  /**
2230
2472
  * 处理跨树拖拽完成
2231
2473
  */
2232
- handleCrossTreeNodeDragFinishEvent() {
2474
+ handleCrossTreeNodeDragFinishEvent(evnt) {
2475
+ const { treeList } = reactData;
2476
+ const { nodeMaps } = internalData;
2477
+ const dragOpts = computeDragOpts.value;
2478
+ const { animation, isCrossTreeDrag } = dragOpts;
2479
+ const mapChildrenField = computeMapChildrenField.value;
2480
+ const el = refElem.value;
2481
+ if (!el) {
2482
+ return;
2483
+ }
2484
+ if (isCrossTreeDrag && crossTreeDragNodeObj && crossTreeDragNodeInfo) {
2485
+ const { node: dragNode } = crossTreeDragNodeInfo;
2486
+ if (dragNode) {
2487
+ const dragNodeid = getNodeId(dragNode);
2488
+ const dragNodeRest = nodeMaps[dragNodeid];
2489
+ let dragNodeHeight = 0;
2490
+ let rsIndex = -1;
2491
+ if (dragNodeRest) {
2492
+ if (animation) {
2493
+ const oldItemEl = el.querySelector(`.vxe-tree--node-wrapper[nodeid="${dragNodeid}"]`);
2494
+ const targetItemEl = oldItemEl;
2495
+ if (targetItemEl) {
2496
+ dragNodeHeight = targetItemEl.offsetHeight;
2497
+ }
2498
+ }
2499
+ rsIndex = dragNodeRest.$index;
2500
+ }
2501
+ const dragRangeList = rsIndex > -1 && rsIndex < treeList.length - 1 ? treeList.slice(rsIndex + 1) : [];
2502
+ const dragList = XEUtils.toTreeArray([dragNode], {
2503
+ updated: true,
2504
+ children: mapChildrenField
2505
+ });
2506
+ $xeTree.remove(dragList).then(() => {
2507
+ if (animation && dragNodeHeight && dragRangeList.length) {
2508
+ const wrapperEl = el;
2509
+ const dtClss = [];
2510
+ dragRangeList.forEach(item => {
2511
+ const nodeid = getNodeId(item);
2512
+ dtClss.push(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`);
2513
+ });
2514
+ const dtTrList = wrapperEl.querySelectorAll(dtClss.join(','));
2515
+ moveRowAnimateToTb(dtTrList, dragNodeHeight);
2516
+ }
2517
+ });
2518
+ dispatchEvent('node-remove-dragend', {
2519
+ node: dragNode
2520
+ }, evnt);
2521
+ handleNodeDragEndClearStatus();
2522
+ }
2523
+ }
2233
2524
  },
2234
2525
  /**
2235
2526
  * 处理跨树拖至新的空树
2236
2527
  */
2237
- handleCrossTreeNodeDragInsertEvent() {
2528
+ handleCrossTreeNodeDragoverEmptyEvent(evnt) {
2529
+ const { treeList } = reactData;
2530
+ const dragOpts = computeDragOpts.value;
2531
+ const { isCrossTreeDrag } = dragOpts;
2532
+ if (isCrossTreeDrag && crossTreeDragNodeObj && !treeList.length) {
2533
+ const { $oldTree, $newTree } = crossTreeDragNodeObj;
2534
+ if ($oldTree) {
2535
+ const oldTreeReactData = $oldTree;
2536
+ if ($oldTree.xID !== $xeTree.xID) {
2537
+ if ($newTree && $newTree.xID !== $xeTree.xID) {
2538
+ $newTree.hideCrossTreeNodeDropClearStatus();
2539
+ }
2540
+ evnt.preventDefault();
2541
+ $oldTree.hideCrossTreeNodeDropClearStatus();
2542
+ crossTreeDragNodeObj.$newTree = $xeTree;
2543
+ internalData.prevDragNode = null;
2544
+ reactData.dragTipText = oldTreeReactData.dragTipText;
2545
+ showDropTip(evnt, evnt.currentTarget, true, '');
2546
+ }
2547
+ }
2548
+ }
2238
2549
  },
2239
2550
  /**
2240
2551
  * 处理跨树拖插入
2241
2552
  */
2242
- handleCrossTreeNodeDragoverEmptyEvent() {
2553
+ handleCrossTreeNodeDragInsertEvent(evnt) {
2554
+ const { prevDragNode, prevDragPos, prevDragToChild } = internalData;
2555
+ const dragOpts = computeDragOpts.value;
2556
+ const { animation, isSelfToChildDrag, isCrossTreeDrag, dragEndMethod, dragToChildMethod } = dragOpts;
2557
+ const parentField = computeParentField.value;
2558
+ const mapChildrenField = computeMapChildrenField.value;
2559
+ const childrenField = computeChildrenField.value;
2560
+ // 跨表拖拽
2561
+ if (isCrossTreeDrag && crossTreeDragNodeObj && crossTreeDragNodeInfo) {
2562
+ const { node: oldNode } = crossTreeDragNodeInfo;
2563
+ const { $oldTree } = crossTreeDragNodeObj;
2564
+ const el = refElem.value;
2565
+ if (!el) {
2566
+ return;
2567
+ }
2568
+ if ($oldTree && oldNode) {
2569
+ const dragNode = oldNode;
2570
+ let dragOffsetIndex = -1;
2571
+ if (prevDragNode) {
2572
+ dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
2573
+ }
2574
+ const dragParams = {
2575
+ oldNode: dragNode,
2576
+ newNode: prevDragNode,
2577
+ dragNode,
2578
+ dragPos: prevDragPos,
2579
+ dragToChild: !!prevDragToChild,
2580
+ offsetIndex: dragOffsetIndex
2581
+ };
2582
+ const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild;
2583
+ const errRest = {
2584
+ status: false
2585
+ };
2586
+ Promise.resolve(dragEndMethod ? dragEndMethod(dragParams) : true).then((status) => {
2587
+ if (!status) {
2588
+ if ($oldTree) {
2589
+ if ($oldTree.xID !== $xeTree.xID) {
2590
+ $oldTree.handleCrossTreeNodeDragCancelEvent(evnt);
2591
+ }
2592
+ }
2593
+ handleNodeDragEndClearStatus();
2594
+ return errRest;
2595
+ }
2596
+ let insertRest = Promise.resolve();
2597
+ const dragList = XEUtils.toTreeArray([dragNode], {
2598
+ updated: true,
2599
+ children: mapChildrenField
2600
+ });
2601
+ $oldTree.handleCrossTreeNodeDragFinishEvent(evnt);
2602
+ if (prevDragNode) {
2603
+ dragNode[parentField] = prevDragNode[parentField];
2604
+ }
2605
+ else {
2606
+ dragNode[parentField] = null;
2607
+ }
2608
+ dragList.forEach(row => {
2609
+ row[childrenField] = undefined;
2610
+ row[mapChildrenField] = undefined;
2611
+ });
2612
+ if (prevDragNode) {
2613
+ if (prevDragPos === 'bottom') {
2614
+ insertRest = $xeTree.insertNextAt(dragList, prevDragNode);
2615
+ }
2616
+ else {
2617
+ insertRest = $xeTree.insertAt(dragList, prevDragNode);
2618
+ }
2619
+ }
2620
+ else {
2621
+ insertRest = $xeTree.insert(dragList);
2622
+ }
2623
+ $xeTree.dispatchEvent('node-insert-dragend', {
2624
+ oldNode,
2625
+ newNode: prevDragNode,
2626
+ dragNode,
2627
+ dragPos: prevDragPos,
2628
+ dragToChild: isDragToChildFlag,
2629
+ offsetIndex: dragOffsetIndex
2630
+ }, evnt);
2631
+ clearNodeDragData();
2632
+ insertRest.then(() => {
2633
+ const { treeList } = reactData;
2634
+ const { nodeMaps } = internalData;
2635
+ const oldNodeid = getNodeId(dragNode);
2636
+ const oldNodeRest = nodeMaps[oldNodeid];
2637
+ let dragNodeHeight = 0;
2638
+ let rsIndex = -1;
2639
+ if (oldNodeRest) {
2640
+ if (animation) {
2641
+ const oldItemEl = el.querySelector(`.vxe-tree--node-wrapper[nodeid="${oldNodeid}"]`);
2642
+ const targetItemEl = oldItemEl;
2643
+ if (targetItemEl) {
2644
+ dragNodeHeight = targetItemEl.offsetHeight;
2645
+ }
2646
+ }
2647
+ rsIndex = oldNodeRest.$index;
2648
+ }
2649
+ const dragRangeList = rsIndex > -1 ? treeList.slice(rsIndex) : [];
2650
+ if (animation && dragNodeHeight && dragRangeList.length) {
2651
+ const wrapperEl = el;
2652
+ const dtClss = [];
2653
+ dragRangeList.forEach(item => {
2654
+ const nodeid = getNodeId(item);
2655
+ dtClss.push(`.vxe-tree--node-wrapper[nodeid="${nodeid}"]`);
2656
+ });
2657
+ const dtTrList = wrapperEl.querySelectorAll(dtClss.join(','));
2658
+ moveRowAnimateToTb(dtTrList, -dragNodeHeight);
2659
+ }
2660
+ });
2661
+ });
2662
+ }
2663
+ }
2243
2664
  },
2244
2665
  hideCrossTreeNodeDropClearStatus() {
2245
2666
  hideDropTip();
@@ -2537,12 +2958,15 @@ export default defineVxeComponent({
2537
2958
  const loadingOpts = computeLoadingOpts.value;
2538
2959
  const isRowHover = computeIsRowHover.value;
2539
2960
  const treeStyle = computeTreeStyle.value;
2961
+ const dragOpts = computeDragOpts.value;
2540
2962
  const loadingSlot = slots.loading;
2541
2963
  const headerSlot = slots.header;
2542
2964
  const footerSlot = slots.footer;
2543
- return h('div', {
2544
- ref: refElem,
2545
- class: ['vxe-tree', {
2965
+ const teOns = {};
2966
+ if (dragOpts.isCrossTreeDrag && !treeList.length) {
2967
+ teOns.onDragover = $xeTree.handleCrossTreeNodeDragInsertEvent;
2968
+ }
2969
+ return h('div', Object.assign({ ref: refElem, class: ['vxe-tree', {
2546
2970
  [`size--${vSize}`]: vSize,
2547
2971
  'show--line': showLine,
2548
2972
  'checkbox--highlight': checkboxOpts.highlight,
@@ -2550,8 +2974,7 @@ export default defineVxeComponent({
2550
2974
  'node--hover': isRowHover,
2551
2975
  'node--trigger': trigger === 'node',
2552
2976
  'is--loading': loading
2553
- }]
2554
- }, [
2977
+ }] }, teOns), [
2555
2978
  headerSlot
2556
2979
  ? h('div', {
2557
2980
  ref: refHeaderWrapperElem,
@@ -2657,8 +3080,8 @@ export default defineVxeComponent({
2657
3080
  if (drag && !transform) {
2658
3081
  errLog('vxe.error.notSupportProp', ['drag', 'transform=false', 'transform=true']);
2659
3082
  }
2660
- if (dragOpts.isCrossTreeDrag) {
2661
- errLog('vxe.error.notProp', ['drag-config.isCrossTreeDrag']);
3083
+ if (dragOpts.isCrossTreeDrag && !dragOpts.isCrossDrag) {
3084
+ errLog('vxe.error.reqSupportProp', ['drag-config.isCrossTreeDrag', 'drag-config.isCrossDrag']);
2662
3085
  }
2663
3086
  // if (valueField) {
2664
3087
  // errLog('vxe.error.delProp', ['value-field', 'value-field'])
@@ -30,3 +30,18 @@ export function calcTreeLine($xeTree, node, prevNode) {
30
30
  }
31
31
  return (rowHeight || 28) * expandSize - (prevNode ? 1 : 12);
32
32
  }
33
+ export function getItemCacheObj(item) {
34
+ return {
35
+ item,
36
+ index: -1,
37
+ $index: -1,
38
+ _index: -1,
39
+ items: [],
40
+ parent: null,
41
+ nodes: [],
42
+ level: 0,
43
+ treeIndex: -1,
44
+ lineCount: 0,
45
+ treeLoaded: false
46
+ };
47
+ }
package/es/ui/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { VxeUI, setConfig, setIcon } from '@vxe-ui/core';
2
2
  import { dynamicApp } from '../dynamics';
3
3
  import { warnLog } from './src/log';
4
- export const version = "4.15.13";
4
+ export const version = "4.15.14";
5
5
  VxeUI.uiVersion = version;
6
6
  VxeUI.dynamicApp = dynamicApp;
7
7
  export function config(options) {
@@ -176,7 +176,10 @@ setConfig({
176
176
  formView: {},
177
177
  icon: {},
178
178
  iconPicker: {
179
- 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']
179
+ 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'],
180
+ popupConfig: {
181
+ // chunkSize: 4
182
+ }
180
183
  },
181
184
  image: {
182
185
  draggable: null,
package/es/ui/src/log.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { VxeUI } from '@vxe-ui/core';
2
2
  const { log } = VxeUI;
3
- const uiVersion = `ui v${"4.15.13"}`;
3
+ const uiVersion = `ui v${"4.15.14"}`;
4
4
  export function createComponentLog(name) {
5
5
  const tableVersion = VxeUI.tableVersion ? `table v${VxeUI.tableVersion}` : '';
6
6
  const ganttVersion = VxeUI.ganttVersion ? `gantt v${VxeUI.ganttVersion}` : '';
@@ -211,6 +211,17 @@
211
211
  border-color: var(--vxe-ui-font-primary-darken-color);
212
212
  background-color: var(--vxe-ui-layout-background-color);
213
213
  }
214
+ .vxe-button.type--button:not(.is--disabled):hover {
215
+ color: var(--vxe-ui-font-primary-lighten-color);
216
+ }
217
+ .vxe-button.type--button:not(.is--disabled):focus {
218
+ border-color: var(--vxe-ui-font-primary-color);
219
+ }
220
+ .vxe-button.type--button:not(.is--disabled):active {
221
+ color: var(--vxe-ui-font-primary-darken-color);
222
+ border-color: var(--vxe-ui-font-primary-darken-color);
223
+ background-color: var(--vxe-ui-layout-background-color);
224
+ }
214
225
  .vxe-button.type--button.theme--primary {
215
226
  color: #fff;
216
227
  }