vxe-pc-ui 4.7.5 → 4.7.7

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 (197) hide show
  1. package/es/icon/style.css +1 -1
  2. package/es/language/ar-EG.js +19 -1
  3. package/es/language/de-DE.js +19 -1
  4. package/es/language/en-US.js +20 -2
  5. package/es/language/es-ES.js +19 -1
  6. package/es/language/fr-FR.js +19 -1
  7. package/es/language/hu-HU.js +19 -1
  8. package/es/language/hy-AM.js +18 -0
  9. package/es/language/id-ID.js +19 -1
  10. package/es/language/it-IT.js +19 -1
  11. package/es/language/ja-JP.js +19 -1
  12. package/es/language/ko-KR.js +19 -1
  13. package/es/language/ms-MY.js +19 -1
  14. package/es/language/nb-NO.js +19 -1
  15. package/es/language/pt-BR.js +19 -1
  16. package/es/language/ru-RU.js +19 -1
  17. package/es/language/th-TH.js +19 -1
  18. package/es/language/ug-CN.js +19 -1
  19. package/es/language/uk-UA.js +19 -1
  20. package/es/language/uz-UZ.js +19 -1
  21. package/es/language/vi-VN.js +19 -1
  22. package/es/language/zh-CHT.js +19 -1
  23. package/es/language/zh-CN.js +18 -0
  24. package/es/list/src/list.js +1 -1
  25. package/es/select/src/select.js +135 -42
  26. package/es/select/style.css +21 -0
  27. package/es/select/style.min.css +1 -1
  28. package/es/style.css +1 -1
  29. package/es/style.min.css +1 -1
  30. package/es/tree/src/tree.js +924 -407
  31. package/es/tree/src/util.js +32 -0
  32. package/es/tree/style.css +29 -26
  33. package/es/tree/style.min.css +1 -1
  34. package/es/tree-select/src/tree-select.js +227 -18
  35. package/es/tree-select/style.css +36 -1
  36. package/es/tree-select/style.min.css +1 -1
  37. package/es/ui/index.js +19 -3
  38. package/es/ui/src/dom.js +9 -0
  39. package/es/ui/src/log.js +1 -1
  40. package/es/vxe-select/style.css +21 -0
  41. package/es/vxe-select/style.min.css +1 -1
  42. package/es/vxe-tree/style.css +29 -26
  43. package/es/vxe-tree/style.min.css +1 -1
  44. package/es/vxe-tree-select/style.css +36 -1
  45. package/es/vxe-tree-select/style.min.css +1 -1
  46. package/lib/icon/style/style.css +1 -1
  47. package/lib/icon/style/style.min.css +1 -1
  48. package/lib/index.umd.js +1512 -530
  49. package/lib/index.umd.min.js +1 -1
  50. package/lib/language/ar-EG.js +19 -1
  51. package/lib/language/ar-EG.min.js +1 -1
  52. package/lib/language/ar-EG.umd.js +19 -1
  53. package/lib/language/de-DE.js +19 -1
  54. package/lib/language/de-DE.min.js +1 -1
  55. package/lib/language/de-DE.umd.js +19 -1
  56. package/lib/language/en-US.js +20 -2
  57. package/lib/language/en-US.min.js +1 -1
  58. package/lib/language/en-US.umd.js +20 -2
  59. package/lib/language/es-ES.js +19 -1
  60. package/lib/language/es-ES.min.js +1 -1
  61. package/lib/language/es-ES.umd.js +19 -1
  62. package/lib/language/fr-FR.js +19 -1
  63. package/lib/language/fr-FR.min.js +1 -1
  64. package/lib/language/fr-FR.umd.js +19 -1
  65. package/lib/language/hu-HU.js +19 -1
  66. package/lib/language/hu-HU.min.js +1 -1
  67. package/lib/language/hu-HU.umd.js +19 -1
  68. package/lib/language/hy-AM.js +18 -0
  69. package/lib/language/hy-AM.min.js +1 -1
  70. package/lib/language/hy-AM.umd.js +18 -0
  71. package/lib/language/id-ID.js +19 -1
  72. package/lib/language/id-ID.min.js +1 -1
  73. package/lib/language/id-ID.umd.js +19 -1
  74. package/lib/language/it-IT.js +19 -1
  75. package/lib/language/it-IT.min.js +1 -1
  76. package/lib/language/it-IT.umd.js +19 -1
  77. package/lib/language/ja-JP.js +19 -1
  78. package/lib/language/ja-JP.min.js +1 -1
  79. package/lib/language/ja-JP.umd.js +19 -1
  80. package/lib/language/ko-KR.js +19 -1
  81. package/lib/language/ko-KR.min.js +1 -1
  82. package/lib/language/ko-KR.umd.js +19 -1
  83. package/lib/language/ms-MY.js +19 -1
  84. package/lib/language/ms-MY.min.js +1 -1
  85. package/lib/language/ms-MY.umd.js +19 -1
  86. package/lib/language/nb-NO.js +19 -1
  87. package/lib/language/nb-NO.min.js +1 -1
  88. package/lib/language/nb-NO.umd.js +19 -1
  89. package/lib/language/pt-BR.js +19 -1
  90. package/lib/language/pt-BR.min.js +1 -1
  91. package/lib/language/pt-BR.umd.js +19 -1
  92. package/lib/language/ru-RU.js +19 -1
  93. package/lib/language/ru-RU.min.js +1 -1
  94. package/lib/language/ru-RU.umd.js +19 -1
  95. package/lib/language/th-TH.js +19 -1
  96. package/lib/language/th-TH.min.js +1 -1
  97. package/lib/language/th-TH.umd.js +19 -1
  98. package/lib/language/ug-CN.js +19 -1
  99. package/lib/language/ug-CN.min.js +1 -1
  100. package/lib/language/ug-CN.umd.js +19 -1
  101. package/lib/language/uk-UA.js +19 -1
  102. package/lib/language/uk-UA.min.js +1 -1
  103. package/lib/language/uk-UA.umd.js +19 -1
  104. package/lib/language/uz-UZ.js +19 -1
  105. package/lib/language/uz-UZ.min.js +1 -1
  106. package/lib/language/uz-UZ.umd.js +19 -1
  107. package/lib/language/vi-VN.js +19 -1
  108. package/lib/language/vi-VN.min.js +1 -1
  109. package/lib/language/vi-VN.umd.js +19 -1
  110. package/lib/language/zh-CHT.js +19 -1
  111. package/lib/language/zh-CHT.min.js +1 -1
  112. package/lib/language/zh-CHT.umd.js +19 -1
  113. package/lib/language/zh-CN.js +18 -0
  114. package/lib/language/zh-CN.min.js +1 -1
  115. package/lib/language/zh-CN.umd.js +18 -0
  116. package/lib/list/src/list.js +1 -1
  117. package/lib/list/src/list.min.js +1 -1
  118. package/lib/select/src/select.js +139 -44
  119. package/lib/select/src/select.min.js +1 -1
  120. package/lib/select/style/style.css +21 -0
  121. package/lib/select/style/style.min.css +1 -1
  122. package/lib/style.css +1 -1
  123. package/lib/style.min.css +1 -1
  124. package/lib/tree/src/tree.js +1154 -572
  125. package/lib/tree/src/tree.min.js +1 -1
  126. package/lib/tree/src/util.js +51 -0
  127. package/lib/tree/src/util.min.js +1 -0
  128. package/lib/tree/style/style.css +29 -26
  129. package/lib/tree/style/style.min.css +1 -1
  130. package/lib/tree-select/src/tree-select.js +237 -21
  131. package/lib/tree-select/src/tree-select.min.js +1 -1
  132. package/lib/tree-select/style/style.css +36 -1
  133. package/lib/tree-select/style/style.min.css +1 -1
  134. package/lib/ui/index.js +19 -3
  135. package/lib/ui/index.min.js +1 -1
  136. package/lib/ui/src/dom.js +10 -0
  137. package/lib/ui/src/dom.min.js +1 -1
  138. package/lib/ui/src/log.js +1 -1
  139. package/lib/ui/src/log.min.js +1 -1
  140. package/lib/vxe-select/style/style.css +21 -0
  141. package/lib/vxe-select/style/style.min.css +1 -1
  142. package/lib/vxe-tree/style/style.css +29 -26
  143. package/lib/vxe-tree/style/style.min.css +1 -1
  144. package/lib/vxe-tree-select/style/style.css +36 -1
  145. package/lib/vxe-tree-select/style/style.min.css +1 -1
  146. package/package.json +1 -1
  147. package/packages/language/ar-EG.ts +19 -1
  148. package/packages/language/de-DE.ts +19 -1
  149. package/packages/language/en-US.ts +20 -2
  150. package/packages/language/es-ES.ts +19 -1
  151. package/packages/language/fr-FR.ts +19 -1
  152. package/packages/language/hu-HU.ts +19 -1
  153. package/packages/language/hy-AM.ts +18 -0
  154. package/packages/language/id-ID.ts +19 -1
  155. package/packages/language/it-IT.ts +19 -1
  156. package/packages/language/ja-JP.ts +19 -1
  157. package/packages/language/ko-KR.ts +19 -1
  158. package/packages/language/ms-MY.ts +19 -1
  159. package/packages/language/nb-NO.ts +19 -1
  160. package/packages/language/pt-BR.ts +19 -1
  161. package/packages/language/ru-RU.ts +19 -1
  162. package/packages/language/th-TH.ts +19 -1
  163. package/packages/language/ug-CN.ts +19 -1
  164. package/packages/language/uk-UA.ts +19 -1
  165. package/packages/language/uz-UZ.ts +19 -1
  166. package/packages/language/vi-VN.ts +19 -1
  167. package/packages/language/zh-CHT.ts +19 -1
  168. package/packages/language/zh-CN.ts +18 -0
  169. package/packages/list/src/list.ts +1 -1
  170. package/packages/select/src/select.ts +146 -50
  171. package/packages/tree/src/tree.ts +947 -410
  172. package/packages/tree/src/util.ts +35 -0
  173. package/packages/tree-select/src/tree-select.ts +240 -19
  174. package/packages/ui/index.ts +18 -2
  175. package/packages/ui/src/dom.ts +10 -0
  176. package/styles/components/select.scss +19 -0
  177. package/styles/components/tree-select.scss +36 -1
  178. package/styles/components/tree.scss +34 -31
  179. package/types/components/button.d.ts +11 -1
  180. package/types/components/grid.d.ts +5 -0
  181. package/types/components/icon-picker.d.ts +11 -1
  182. package/types/components/input.d.ts +2 -2
  183. package/types/components/select.d.ts +28 -39
  184. package/types/components/tree-select.d.ts +73 -12
  185. package/types/components/tree.d.ts +125 -8
  186. /package/es/icon/{iconfont.1752151733538.ttf → iconfont.1752462949194.ttf} +0 -0
  187. /package/es/icon/{iconfont.1752151733538.woff → iconfont.1752462949194.woff} +0 -0
  188. /package/es/icon/{iconfont.1752151733538.woff2 → iconfont.1752462949194.woff2} +0 -0
  189. /package/es/{iconfont.1752151733538.ttf → iconfont.1752462949194.ttf} +0 -0
  190. /package/es/{iconfont.1752151733538.woff → iconfont.1752462949194.woff} +0 -0
  191. /package/es/{iconfont.1752151733538.woff2 → iconfont.1752462949194.woff2} +0 -0
  192. /package/lib/icon/style/{iconfont.1752151733538.ttf → iconfont.1752462949194.ttf} +0 -0
  193. /package/lib/icon/style/{iconfont.1752151733538.woff → iconfont.1752462949194.woff} +0 -0
  194. /package/lib/icon/style/{iconfont.1752151733538.woff2 → iconfont.1752462949194.woff2} +0 -0
  195. /package/lib/{iconfont.1752151733538.ttf → iconfont.1752462949194.ttf} +0 -0
  196. /package/lib/{iconfont.1752151733538.woff → iconfont.1752462949194.woff} +0 -0
  197. /package/lib/{iconfont.1752151733538.woff2 → iconfont.1752462949194.woff2} +0 -0
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
  var _vue = require("vue");
8
8
  var _comp = require("../../ui/src/comp");
9
9
  var _ui = require("../../ui");
10
+ var _util = require("./util");
11
+ var _log = require("../../ui/src/log");
10
12
  var _xeUtils = _interopRequireDefault(require("xe-utils"));
11
13
  var _vn = require("../../ui/src/vn");
12
14
  var _dom = require("../../ui/src/dom");
@@ -22,7 +24,15 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
22
24
  name: 'VxeTree',
23
25
  props: {
24
26
  data: Array,
27
+ autoResize: {
28
+ type: Boolean,
29
+ default: () => (0, _ui.getConfig)().tree.autoResize
30
+ },
25
31
  height: [String, Number],
32
+ maxHeight: {
33
+ type: [String, Number],
34
+ default: () => (0, _ui.getConfig)().tree.maxHeight
35
+ },
26
36
  minHeight: {
27
37
  type: [String, Number],
28
38
  default: () => (0, _ui.getConfig)().tree.minHeight
@@ -114,12 +124,15 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
114
124
  type: String,
115
125
  default: () => (0, _ui.getConfig)().tree.iconLoaded
116
126
  },
127
+ filterValue: [String, Number],
128
+ filterConfig: Object,
117
129
  size: {
118
130
  type: String,
119
131
  default: () => (0, _ui.getConfig)().tree.size || (0, _ui.getConfig)().size
120
- }
132
+ },
133
+ virtualYConfig: Object
121
134
  },
122
- emits: ['update:modelValue', 'update:checkNodeKey', 'update:checkNodeKeys', 'node-click', 'node-dblclick', 'current-change', 'radio-change', 'checkbox-change', 'load-success', 'load-error'],
135
+ emits: ['update:modelValue', 'update:checkNodeKey', 'update:checkNodeKeys', 'node-click', 'node-dblclick', 'current-change', 'radio-change', 'checkbox-change', 'load-success', 'load-error', 'scroll'],
123
136
  setup(props, context) {
124
137
  const {
125
138
  emit,
@@ -130,8 +143,19 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
130
143
  computeSize
131
144
  } = (0, _ui.useSize)(props);
132
145
  const refElem = (0, _vue.ref)();
146
+ const refHeaderWrapperElem = (0, _vue.ref)();
147
+ const refFooterWrapperElem = (0, _vue.ref)();
148
+ const refVirtualWrapper = (0, _vue.ref)();
149
+ const refVirtualBody = (0, _vue.ref)();
133
150
  const reactData = (0, _vue.reactive)({
151
+ parentHeight: 0,
152
+ customHeight: 0,
153
+ customMinHeight: 0,
154
+ customMaxHeight: 0,
134
155
  currentNode: null,
156
+ scrollYLoad: false,
157
+ bodyHeight: 0,
158
+ topSpaceHeight: 0,
135
159
  selectRadioKey: props.checkNodeKey,
136
160
  treeList: [],
137
161
  updateExpandedFlag: 1,
@@ -139,11 +163,26 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
139
163
  });
140
164
  const internalData = {
141
165
  // initialized: false,
166
+ // lastFilterValue: '',
167
+ treeFullData: [],
168
+ afterTreeList: [],
169
+ afterVisibleList: [],
142
170
  nodeMaps: {},
143
171
  selectCheckboxMaps: {},
144
172
  indeterminateRowMaps: {},
145
173
  treeExpandedMaps: {},
146
- treeExpandLazyLoadedMaps: {}
174
+ treeExpandLazyLoadedMaps: {},
175
+ lastScrollLeft: 0,
176
+ lastScrollTop: 0,
177
+ scrollYStore: {
178
+ startIndex: 0,
179
+ endIndex: 0,
180
+ visibleSize: 0,
181
+ offsetSize: 0,
182
+ rowHeight: 0
183
+ },
184
+ lastScrollTime: 0
185
+ // hpTimeout: undefined
147
186
  };
148
187
  const refMaps = {
149
188
  refElem
@@ -170,6 +209,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
170
209
  const computeHasChildField = (0, _vue.computed)(() => {
171
210
  return props.hasChildField || 'hasChild';
172
211
  });
212
+ const computeVirtualYOpts = (0, _vue.computed)(() => {
213
+ return Object.assign({}, (0, _ui.getConfig)().tree.virtualYConfig, props.virtualYConfig);
214
+ });
173
215
  const computeIsRowCurrent = (0, _vue.computed)(() => {
174
216
  const nodeOpts = computeNodeOpts.value;
175
217
  const {
@@ -208,19 +250,28 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
208
250
  });
209
251
  const computeTreeStyle = (0, _vue.computed)(() => {
210
252
  const {
211
- height,
212
- minHeight
213
- } = props;
253
+ customHeight,
254
+ customMinHeight,
255
+ customMaxHeight
256
+ } = reactData;
214
257
  const stys = {};
215
- if (height) {
216
- stys.height = (0, _dom.toCssUnit)(height);
258
+ if (customHeight) {
259
+ stys.height = (0, _dom.toCssUnit)(customHeight);
260
+ }
261
+ if (customMinHeight) {
262
+ stys.minHeight = (0, _dom.toCssUnit)(customMinHeight);
217
263
  }
218
- if (minHeight) {
219
- stys.minHeight = (0, _dom.toCssUnit)(minHeight);
264
+ if (customMaxHeight) {
265
+ stys.maxHeight = (0, _dom.toCssUnit)(customMaxHeight);
220
266
  }
221
267
  return stys;
222
268
  });
269
+ const computeFilterOpts = (0, _vue.computed)(() => {
270
+ return Object.assign({}, (0, _ui.getConfig)().tree.filterConfig, props.filterConfig);
271
+ });
223
272
  const computeMaps = {
273
+ computeChildrenField,
274
+ computeMapChildrenField,
224
275
  computeRadioOpts,
225
276
  computeCheckboxOpts,
226
277
  computeNodeOpts
@@ -376,6 +427,39 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
376
427
  $tree: $xeTree
377
428
  }, params));
378
429
  };
430
+ const getParentElem = () => {
431
+ const el = refElem.value;
432
+ return el ? el.parentElement : null;
433
+ };
434
+ const calcTableHeight = key => {
435
+ const {
436
+ parentHeight
437
+ } = reactData;
438
+ const val = props[key];
439
+ let num = 0;
440
+ if (val) {
441
+ if (val === '100%' || val === 'auto') {
442
+ num = parentHeight;
443
+ } else {
444
+ if ((0, _dom.isScale)(val)) {
445
+ num = Math.floor((_xeUtils.default.toInteger(val) || 1) / 100 * parentHeight);
446
+ } else {
447
+ num = _xeUtils.default.toNumber(val);
448
+ }
449
+ num = Math.max(40, num);
450
+ }
451
+ }
452
+ return num;
453
+ };
454
+ const updateHeight = () => {
455
+ reactData.customHeight = calcTableHeight('height');
456
+ reactData.customMinHeight = calcTableHeight('minHeight');
457
+ reactData.customMaxHeight = calcTableHeight('maxHeight');
458
+ // 如果启用虚拟滚动,默认高度
459
+ if (reactData.scrollYLoad && !(reactData.customHeight || reactData.customMinHeight)) {
460
+ reactData.customHeight = 300;
461
+ }
462
+ };
379
463
  const createNode = records => {
380
464
  const valueField = computeValueField.value;
381
465
  return Promise.resolve(records.map(obj => {
@@ -388,427 +472,453 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
388
472
  return item;
389
473
  }));
390
474
  };
391
- const treeMethods = {
392
- dispatchEvent,
393
- clearCurrentNode() {
394
- reactData.currentNode = null;
395
- return (0, _vue.nextTick)();
396
- },
397
- getCurrentNodeId() {
398
- const {
399
- currentNode
400
- } = reactData;
401
- if (currentNode) {
402
- return getNodeId(currentNode);
475
+ const cacheNodeMap = () => {
476
+ const {
477
+ treeFullData
478
+ } = internalData;
479
+ const valueField = computeValueField.value;
480
+ const childrenField = computeChildrenField.value;
481
+ const keyMaps = {};
482
+ _xeUtils.default.eachTree(treeFullData, (item, index, items, path, parent, nodes) => {
483
+ let nodeid = getNodeId(item);
484
+ if (!nodeid) {
485
+ nodeid = getNodeUniqueId();
486
+ _xeUtils.default.set(item, valueField, nodeid);
403
487
  }
404
- return null;
405
- },
406
- getCurrentNode() {
407
- const {
408
- currentNode
409
- } = reactData;
410
- const {
411
- nodeMaps
412
- } = internalData;
413
- if (currentNode) {
414
- const nodeItem = nodeMaps[getNodeId(currentNode)];
415
- if (nodeItem) {
416
- return nodeItem.item;
488
+ keyMaps[nodeid] = {
489
+ item,
490
+ index,
491
+ items,
492
+ parent,
493
+ nodes,
494
+ level: nodes.length,
495
+ treeIndex: index,
496
+ lineCount: 0,
497
+ treeLoaded: false
498
+ };
499
+ }, {
500
+ children: childrenField
501
+ });
502
+ internalData.nodeMaps = keyMaps;
503
+ };
504
+ const updateAfterDataIndex = () => {
505
+ const {
506
+ transform
507
+ } = props;
508
+ const {
509
+ afterTreeList,
510
+ nodeMaps
511
+ } = internalData;
512
+ const childrenField = computeChildrenField.value;
513
+ const mapChildrenField = computeMapChildrenField.value;
514
+ _xeUtils.default.eachTree(afterTreeList, (item, index, items) => {
515
+ const nodeid = getNodeId(item);
516
+ const nodeItem = nodeMaps[nodeid];
517
+ if (nodeItem) {
518
+ nodeItem.items = items;
519
+ nodeItem.treeIndex = index;
520
+ } else {
521
+ const rest = {
522
+ item,
523
+ index,
524
+ items,
525
+ parent,
526
+ nodes: [],
527
+ level: 0,
528
+ treeIndex: index,
529
+ lineCount: 0,
530
+ treeLoaded: false
531
+ };
532
+ nodeMaps[nodeid] = rest;
533
+ }
534
+ }, {
535
+ children: transform ? mapChildrenField : childrenField
536
+ });
537
+ };
538
+ const updateAfterFullData = () => {
539
+ const {
540
+ transform,
541
+ filterValue
542
+ } = props;
543
+ const {
544
+ treeFullData,
545
+ lastFilterValue
546
+ } = internalData;
547
+ const titleField = computeTitleField.value;
548
+ const childrenField = computeChildrenField.value;
549
+ const mapChildrenField = computeMapChildrenField.value;
550
+ const filterOpts = computeFilterOpts.value;
551
+ const {
552
+ autoExpandAll,
553
+ beforeFilterMethod,
554
+ filterMethod,
555
+ afterFilterMethod
556
+ } = filterOpts;
557
+ let fullList = treeFullData;
558
+ let treeList = fullList;
559
+ let filterStr = '';
560
+ if (filterValue || filterValue === 0) {
561
+ filterStr = `${filterValue}`;
562
+ const handleSearch = filterMethod ? item => {
563
+ return filterMethod({
564
+ $tree: $xeTree,
565
+ node: item,
566
+ filterValue: filterStr
567
+ });
568
+ } : item => {
569
+ return String(item[titleField]).toLowerCase().indexOf(filterStr) > -1;
570
+ };
571
+ const bafParams = {
572
+ $tree: $xeTree,
573
+ filterValue: filterStr
574
+ };
575
+ if (beforeFilterMethod) {
576
+ beforeFilterMethod(bafParams);
577
+ }
578
+ if (transform) {
579
+ treeList = _xeUtils.default.searchTree(treeFullData, handleSearch, {
580
+ children: childrenField,
581
+ mapChildren: mapChildrenField,
582
+ isEvery: true
583
+ });
584
+ fullList = treeList;
585
+ } else {
586
+ fullList = treeFullData.filter(handleSearch);
587
+ }
588
+ internalData.lastFilterValue = filterStr;
589
+ (0, _vue.nextTick)(() => {
590
+ // 筛选时自动展开
591
+ if (autoExpandAll) {
592
+ $xeTree.setAllExpandNode(true).then(() => {
593
+ if (afterFilterMethod) {
594
+ afterFilterMethod(bafParams);
595
+ }
596
+ });
597
+ } else {
598
+ if (afterFilterMethod) {
599
+ afterFilterMethod(bafParams);
600
+ }
601
+ }
602
+ });
603
+ } else {
604
+ if (transform) {
605
+ treeList = _xeUtils.default.searchTree(treeFullData, () => true, {
606
+ children: childrenField,
607
+ mapChildren: mapChildrenField,
608
+ isEvery: true
609
+ });
610
+ fullList = treeList;
611
+ if (lastFilterValue) {
612
+ const bafParams = {
613
+ $tree: $xeTree,
614
+ filterValue: filterStr
615
+ };
616
+ if (beforeFilterMethod) {
617
+ beforeFilterMethod(bafParams);
618
+ }
619
+ // 取消筛选时自动收起
620
+ (0, _vue.nextTick)(() => {
621
+ if (autoExpandAll) {
622
+ $xeTree.clearAllExpandNode().then(() => {
623
+ if (afterFilterMethod) {
624
+ afterFilterMethod(bafParams);
625
+ }
626
+ });
627
+ } else {
628
+ if (afterFilterMethod) {
629
+ afterFilterMethod(bafParams);
630
+ }
631
+ }
632
+ });
417
633
  }
418
634
  }
419
- return null;
420
- },
421
- setCurrentNodeId(nodeKey) {
422
- const {
423
- nodeMaps
424
- } = internalData;
425
- const nodeItem = nodeMaps[nodeKey];
426
- reactData.currentNode = nodeItem ? nodeItem.item : null;
427
- return (0, _vue.nextTick)();
428
- },
429
- setCurrentNode(node) {
430
- reactData.currentNode = node;
431
- return (0, _vue.nextTick)();
432
- },
433
- clearRadioNode() {
434
- reactData.selectRadioKey = null;
435
- return (0, _vue.nextTick)();
436
- },
437
- getRadioNodeId() {
438
- return reactData.selectRadioKey || null;
439
- },
440
- getRadioNode() {
441
- const {
442
- selectRadioKey
443
- } = reactData;
444
- const {
445
- nodeMaps
446
- } = internalData;
447
- if (selectRadioKey) {
448
- const nodeItem = nodeMaps[selectRadioKey];
449
- if (nodeItem) {
450
- return nodeItem.item;
635
+ internalData.lastFilterValue = '';
636
+ }
637
+ internalData.afterVisibleList = fullList;
638
+ internalData.afterTreeList = treeList;
639
+ updateAfterDataIndex();
640
+ };
641
+ /**
642
+ * 如果为虚拟树、则将树结构拍平
643
+ */
644
+ const handleTreeToList = () => {
645
+ const {
646
+ transform
647
+ } = props;
648
+ const {
649
+ afterTreeList,
650
+ treeExpandedMaps
651
+ } = internalData;
652
+ const mapChildrenField = computeMapChildrenField.value;
653
+ const expandMaps = {};
654
+ if (transform) {
655
+ const fullData = [];
656
+ _xeUtils.default.eachTree(afterTreeList, (item, index, items, path, parentRow) => {
657
+ const nodeid = getNodeId(item);
658
+ const parentNodeid = getNodeId(parentRow);
659
+ if (!parentRow || expandMaps[parentNodeid] && treeExpandedMaps[parentNodeid]) {
660
+ expandMaps[nodeid] = 1;
661
+ fullData.push(item);
451
662
  }
663
+ }, {
664
+ children: mapChildrenField
665
+ });
666
+ updateScrollYStatus(fullData);
667
+ internalData.afterVisibleList = fullData;
668
+ return fullData;
669
+ }
670
+ return internalData.afterVisibleList;
671
+ };
672
+ const handleData = force => {
673
+ const {
674
+ scrollYLoad
675
+ } = reactData;
676
+ const {
677
+ scrollYStore
678
+ } = internalData;
679
+ let fullList = internalData.afterVisibleList;
680
+ if (force) {
681
+ // 更新数据,处理筛选和排序
682
+ updateAfterFullData();
683
+ // 如果为虚拟树,将树结构拍平
684
+ fullList = handleTreeToList();
685
+ }
686
+ const treeList = scrollYLoad ? fullList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullList.slice(0);
687
+ reactData.treeList = treeList;
688
+ };
689
+ const triggerSearchEvent = _xeUtils.default.debounce(() => handleData(true), 350, {
690
+ trailing: true
691
+ });
692
+ const loadData = list => {
693
+ const {
694
+ expandAll,
695
+ transform
696
+ } = props;
697
+ const {
698
+ initialized,
699
+ scrollYStore
700
+ } = internalData;
701
+ const keyField = computeKeyField.value;
702
+ const parentField = computeParentField.value;
703
+ const childrenField = computeChildrenField.value;
704
+ const fullData = transform ? _xeUtils.default.toArrayTree(list, {
705
+ key: keyField,
706
+ parentKey: parentField,
707
+ mapChildren: childrenField
708
+ }) : list ? list.slice(0) : [];
709
+ internalData.treeFullData = fullData;
710
+ Object.assign(scrollYStore, {
711
+ startIndex: 0,
712
+ endIndex: 1,
713
+ visibleSize: 0
714
+ });
715
+ const sYLoad = updateScrollYStatus(fullData);
716
+ cacheNodeMap();
717
+ handleData(true);
718
+ if (sYLoad) {
719
+ if (!(props.height || props.maxHeight)) {
720
+ (0, _log.errLog)('vxe.error.reqProp', ['height | max-height | virtual-y-config.enabled=false']);
452
721
  }
453
- return null;
454
- },
455
- setRadioNodeId(nodeKey) {
456
- reactData.selectRadioKey = nodeKey;
457
- return (0, _vue.nextTick)();
458
- },
459
- setRadioNode,
460
- setCheckboxNode,
461
- setCheckboxByNodeId,
462
- getCheckboxNodeIds() {
722
+ }
723
+ return computeScrollLoad().then(() => {
724
+ if (!initialized) {
725
+ if (list && list.length) {
726
+ internalData.initialized = true;
727
+ if (expandAll) {
728
+ $xeTree.setAllExpandNode(true);
729
+ }
730
+ $xeTree.setCheckboxByNodeId(props.checkNodeKeys || [], true);
731
+ }
732
+ }
733
+ updateHeight();
734
+ refreshScroll();
735
+ });
736
+ };
737
+ const updateScrollYStatus = fullData => {
738
+ const {
739
+ transform
740
+ } = props;
741
+ const virtualYOpts = computeVirtualYOpts.value;
742
+ const allList = fullData || internalData.treeFullData;
743
+ // 如果gt为0,则总是启用
744
+ const scrollYLoad = !!transform && !!virtualYOpts.enabled && virtualYOpts.gt > -1 && (virtualYOpts.gt === 0 || virtualYOpts.gt < allList.length);
745
+ reactData.scrollYLoad = scrollYLoad;
746
+ return scrollYLoad;
747
+ };
748
+ const updateYSpace = () => {
749
+ const {
750
+ scrollYLoad
751
+ } = reactData;
752
+ const {
753
+ scrollYStore,
754
+ afterVisibleList
755
+ } = internalData;
756
+ reactData.bodyHeight = scrollYLoad ? afterVisibleList.length * scrollYStore.rowHeight : 0;
757
+ reactData.topSpaceHeight = scrollYLoad ? Math.max(scrollYStore.startIndex * scrollYStore.rowHeight, 0) : 0;
758
+ };
759
+ const updateYData = () => {
760
+ handleData();
761
+ updateYSpace();
762
+ };
763
+ const computeScrollLoad = () => {
764
+ return (0, _vue.nextTick)().then(() => {
463
765
  const {
464
- selectCheckboxMaps
465
- } = internalData;
466
- return Object.keys(selectCheckboxMaps);
467
- },
468
- getCheckboxNodes() {
766
+ scrollYLoad
767
+ } = reactData;
469
768
  const {
470
- nodeMaps,
471
- selectCheckboxMaps
769
+ scrollYStore
472
770
  } = internalData;
473
- const list = [];
474
- _xeUtils.default.each(selectCheckboxMaps, (item, nodeid) => {
475
- const nodeItem = nodeMaps[nodeid];
476
- if (nodeItem) {
477
- list.push(nodeItem.item);
771
+ const virtualBodyElem = refVirtualBody.value;
772
+ const virtualYOpts = computeVirtualYOpts.value;
773
+ let rowHeight = 0;
774
+ let firstItemElem;
775
+ if (virtualBodyElem) {
776
+ if (!firstItemElem) {
777
+ firstItemElem = virtualBodyElem.children[0];
478
778
  }
779
+ }
780
+ if (firstItemElem) {
781
+ rowHeight = firstItemElem.offsetHeight;
782
+ }
783
+ rowHeight = Math.max(20, rowHeight);
784
+ scrollYStore.rowHeight = rowHeight;
785
+ // 计算 Y 逻辑
786
+ if (scrollYLoad) {
787
+ const scrollBodyElem = refVirtualWrapper.value;
788
+ const visibleYSize = Math.max(8, scrollBodyElem ? Math.ceil(scrollBodyElem.clientHeight / rowHeight) : 0);
789
+ const offsetYSize = Math.max(0, Math.min(2, _xeUtils.default.toNumber(virtualYOpts.oSize)));
790
+ scrollYStore.offsetSize = offsetYSize;
791
+ scrollYStore.visibleSize = visibleYSize;
792
+ scrollYStore.endIndex = Math.max(scrollYStore.startIndex, visibleYSize + offsetYSize, scrollYStore.endIndex);
793
+ updateYData();
794
+ } else {
795
+ updateYSpace();
796
+ }
797
+ });
798
+ };
799
+ /**
800
+ * 如果有滚动条,则滚动到对应的位置
801
+ * @param {Number} scrollLeft 左距离
802
+ * @param {Number} scrollTop 上距离
803
+ */
804
+ const scrollTo = (scrollLeft, scrollTop) => {
805
+ const scrollBodyElem = refVirtualWrapper.value;
806
+ if (scrollBodyElem) {
807
+ if (_xeUtils.default.isNumber(scrollLeft)) {
808
+ scrollBodyElem.scrollLeft = scrollLeft;
809
+ }
810
+ if (_xeUtils.default.isNumber(scrollTop)) {
811
+ scrollBodyElem.scrollTop = scrollTop;
812
+ }
813
+ }
814
+ if (reactData.scrollYLoad) {
815
+ return new Promise(resolve => {
816
+ setTimeout(() => {
817
+ (0, _vue.nextTick)(() => {
818
+ resolve();
819
+ });
820
+ }, 50);
479
821
  });
480
- return list;
481
- },
482
- clearCheckboxNode() {
483
- internalData.selectCheckboxMaps = {};
484
- reactData.updateCheckboxFlag++;
485
- return (0, _vue.nextTick)();
486
- },
487
- setAllCheckboxNode(checked) {
488
- const {
489
- transform
490
- } = props;
491
- const selectMaps = {};
492
- const childrenField = computeChildrenField.value;
493
- const mapChildrenField = computeMapChildrenField.value;
494
- if (checked) {
495
- _xeUtils.default.eachTree(reactData.treeList, node => {
496
- const nodeid = getNodeId(node);
497
- selectMaps[nodeid] = true;
498
- }, {
499
- children: transform ? mapChildrenField : childrenField
500
- });
822
+ }
823
+ return (0, _vue.nextTick)();
824
+ };
825
+ /**
826
+ * 刷新滚动条
827
+ */
828
+ const refreshScroll = () => {
829
+ const {
830
+ lastScrollLeft,
831
+ lastScrollTop
832
+ } = internalData;
833
+ return clearScroll().then(() => {
834
+ if (lastScrollLeft || lastScrollTop) {
835
+ internalData.lastScrollLeft = 0;
836
+ internalData.lastScrollTop = 0;
837
+ return scrollTo(lastScrollLeft, lastScrollTop);
501
838
  }
502
- internalData.selectCheckboxMaps = selectMaps;
503
- reactData.updateCheckboxFlag++;
504
- return (0, _vue.nextTick)();
505
- },
506
- clearExpandNode() {
507
- return treeMethods.clearAllExpandNode();
508
- },
509
- clearAllExpandNode() {
510
- const {
511
- nodeMaps
512
- } = internalData;
513
- _xeUtils.default.each(nodeMaps, nodeItem => {
514
- nodeItem.treeLoaded = false;
515
- });
516
- internalData.treeExpandedMaps = {};
517
- reactData.updateExpandedFlag++;
518
- return (0, _vue.nextTick)();
519
- },
520
- setExpandByNodeId(nodeids, expanded) {
521
- const {
522
- treeExpandedMaps
523
- } = internalData;
524
- if (nodeids) {
525
- if (!_xeUtils.default.isArray(nodeids)) {
526
- nodeids = [nodeids];
527
- }
528
- nodeids.forEach(nodeid => {
529
- handleSetExpand(nodeid, expanded, treeExpandedMaps);
530
- });
531
- reactData.updateExpandedFlag++;
532
- }
533
- return (0, _vue.nextTick)();
534
- },
535
- getExpandNodeIds() {
536
- const {
537
- treeExpandedMaps
538
- } = internalData;
539
- return _xeUtils.default.keys(treeExpandedMaps);
540
- },
541
- getExpandNodes() {
542
- const {
543
- nodeMaps,
544
- treeExpandedMaps
545
- } = internalData;
546
- const list = [];
547
- _xeUtils.default.each(treeExpandedMaps, (item, nodeid) => {
548
- const nodeItem = nodeMaps[nodeid];
549
- if (nodeItem) {
550
- list.push(nodeItem.item);
551
- }
552
- });
553
- return list;
554
- },
555
- setExpandNode(nodes, expanded) {
556
- const {
557
- treeExpandedMaps
558
- } = internalData;
559
- if (nodes) {
560
- if (!_xeUtils.default.isArray(nodes)) {
561
- nodes = [nodes];
562
- }
563
- nodes.forEach(node => {
564
- const nodeid = getNodeId(node);
565
- handleSetExpand(nodeid, expanded, treeExpandedMaps);
566
- });
567
- reactData.updateExpandedFlag++;
568
- }
569
- return (0, _vue.nextTick)();
570
- },
571
- toggleExpandByNodeId(nodeids) {
572
- const {
573
- treeExpandedMaps
574
- } = internalData;
575
- if (nodeids) {
576
- if (!_xeUtils.default.isArray(nodeids)) {
577
- nodeids = [nodeids];
578
- }
579
- nodeids.forEach(nodeid => {
580
- handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
581
- });
582
- reactData.updateExpandedFlag++;
583
- }
584
- return (0, _vue.nextTick)();
585
- },
586
- toggleExpandNode(nodes) {
587
- const {
588
- treeExpandedMaps
589
- } = internalData;
590
- if (nodes) {
591
- if (!_xeUtils.default.isArray(nodes)) {
592
- nodes = [nodes];
593
- }
594
- nodes.forEach(node => {
595
- const nodeid = getNodeId(node);
596
- handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
597
- });
598
- reactData.updateExpandedFlag++;
599
- }
600
- return (0, _vue.nextTick)();
601
- },
602
- setAllExpandNode(expanded) {
603
- const {
604
- transform
605
- } = props;
606
- const {
607
- treeExpandedMaps
608
- } = internalData;
609
- const childrenField = computeChildrenField.value;
610
- const mapChildrenField = computeMapChildrenField.value;
611
- if (expanded) {
612
- _xeUtils.default.eachTree(reactData.treeList, node => {
613
- const childList = _xeUtils.default.get(node, childrenField);
614
- const hasChild = childList && childList.length;
615
- if (hasChild) {
616
- const nodeid = getNodeId(node);
617
- treeExpandedMaps[nodeid] = true;
618
- }
619
- }, {
620
- children: transform ? mapChildrenField : childrenField
621
- });
622
- } else {
623
- internalData.treeExpandedMaps = {};
624
- }
625
- reactData.updateExpandedFlag++;
626
- return (0, _vue.nextTick)();
627
- },
628
- reloadExpandNode(node) {
629
- const {
630
- lazy
631
- } = props;
632
- if (lazy) {
633
- treeMethods.clearExpandLoaded(node);
634
- return handleAsyncTreeExpandChilds(node);
635
- }
636
- return (0, _vue.nextTick)();
637
- },
638
- clearExpandLoaded(node) {
639
- const {
640
- lazy
641
- } = props;
642
- const {
643
- nodeMaps
644
- } = internalData;
645
- if (lazy) {
646
- const nodeItem = nodeMaps[getNodeId(node)];
647
- if (nodeItem) {
648
- nodeItem.treeLoaded = false;
649
- }
650
- }
651
- return (0, _vue.nextTick)();
652
- },
653
- /**
654
- * 用于树结构,给行数据加载子节点
655
- */
656
- loadChildrenNode(node, childRecords) {
657
- const {
658
- lazy,
659
- transform
660
- } = props;
661
- const {
662
- nodeMaps
663
- } = internalData;
664
- if (!lazy) {
665
- return Promise.resolve([]);
666
- }
667
- const childrenField = computeChildrenField.value;
668
- const parentNodeItem = nodeMaps[getNodeId(node)];
669
- const parentLevel = parentNodeItem ? parentNodeItem.level : 0;
670
- const parentNodes = parentNodeItem ? parentNodeItem.nodes : [];
671
- return createNode(childRecords).then(nodeList => {
672
- _xeUtils.default.eachTree(nodeList, (childRow, index, items, path, parent, nodes) => {
673
- const itemNodeId = getNodeId(childRow);
674
- nodeMaps[itemNodeId] = {
675
- item: node,
676
- itemIndex: -1,
677
- items,
678
- parent: parent || parentNodeItem.item,
679
- nodes: parentNodes.concat(nodes),
680
- level: parentLevel + nodes.length,
681
- lineCount: 0,
682
- treeLoaded: false
683
- };
684
- }, {
685
- children: childrenField
686
- });
687
- node[childrenField] = nodeList;
688
- if (transform) {
689
- node[childrenField] = nodeList;
690
- }
691
- updateNodeLine(node);
692
- return nodeList;
693
- });
694
- },
695
- isExpandByNode,
696
- isCheckedByRadioNodeId,
697
- isCheckedByRadioNode,
698
- isCheckedByCheckboxNodeId,
699
- isIndeterminateByCheckboxNode,
700
- isCheckedByCheckboxNode,
701
- getCheckboxIndeterminateNodes() {
702
- const {
703
- nodeMaps,
704
- indeterminateRowMaps
705
- } = internalData;
706
- const list = [];
707
- _xeUtils.default.each(indeterminateRowMaps, (item, nodeid) => {
708
- const nodeItem = nodeMaps[nodeid];
709
- if (nodeItem) {
710
- list.push(nodeItem.item);
711
- }
712
- });
713
- return list;
714
- }
839
+ });
715
840
  };
716
- const cacheNodeMap = () => {
841
+ /**
842
+ * 重新计算列表
843
+ */
844
+ const recalculate = () => {
717
845
  const {
718
- transform
719
- } = props;
846
+ scrollYStore
847
+ } = internalData;
720
848
  const {
721
- treeList
722
- } = reactData;
723
- const valueField = computeValueField.value;
724
- const childrenField = computeChildrenField.value;
725
- const mapChildrenField = computeMapChildrenField.value;
726
- const keyMaps = {};
727
- _xeUtils.default.eachTree(treeList, (item, itemIndex, items, path, parent, nodes) => {
728
- let nodeid = getNodeId(item);
729
- if (!nodeid) {
730
- nodeid = getNodeUniqueId();
731
- _xeUtils.default.set(item, valueField, nodeid);
849
+ rowHeight
850
+ } = scrollYStore;
851
+ const el = refElem.value;
852
+ if (el && el.clientWidth && el.clientHeight) {
853
+ const parentEl = getParentElem();
854
+ const headerWrapperEl = refHeaderWrapperElem.value;
855
+ const footerWrapperEl = refFooterWrapperElem.value;
856
+ const headHeight = headerWrapperEl ? headerWrapperEl.clientHeight : 0;
857
+ const footHeight = footerWrapperEl ? footerWrapperEl.clientHeight : 0;
858
+ if (parentEl) {
859
+ const parentPaddingSize = (0, _dom.getPaddingTopBottomSize)(parentEl);
860
+ reactData.parentHeight = Math.max(headHeight + footHeight + rowHeight, parentEl.clientHeight - parentPaddingSize - headHeight - footHeight);
732
861
  }
733
- keyMaps[nodeid] = {
734
- item,
735
- itemIndex,
736
- items,
737
- parent,
738
- nodes,
739
- level: nodes.length,
740
- lineCount: 0,
741
- treeLoaded: false
742
- };
743
- }, {
744
- children: transform ? mapChildrenField : childrenField
745
- });
746
- internalData.nodeMaps = keyMaps;
862
+ updateHeight();
863
+ return computeScrollLoad().then(() => {
864
+ updateHeight();
865
+ updateYSpace();
866
+ });
867
+ }
868
+ return (0, _vue.nextTick)();
747
869
  };
748
- const loadTreeData = list => {
749
- const {
750
- expandAll,
751
- transform
752
- } = props;
870
+ const loadYData = evnt => {
753
871
  const {
754
- initialized
872
+ scrollYStore
755
873
  } = internalData;
756
- const keyField = computeKeyField.value;
757
- const parentField = computeParentField.value;
758
- const mapChildrenField = computeMapChildrenField.value;
759
- if (transform) {
760
- reactData.treeList = _xeUtils.default.toArrayTree(list, {
761
- key: keyField,
762
- parentKey: parentField,
763
- mapChildren: mapChildrenField
764
- });
765
- } else {
766
- reactData.treeList = list ? list.slice(0) : [];
767
- }
768
- cacheNodeMap();
769
- if (!initialized) {
770
- if (list && list.length) {
771
- internalData.initialized = true;
772
- if (expandAll) {
773
- $xeTree.setAllExpandNode(true);
774
- }
775
- $xeTree.setCheckboxByNodeId(props.checkNodeKeys || [], true);
874
+ const {
875
+ startIndex,
876
+ endIndex,
877
+ visibleSize,
878
+ offsetSize,
879
+ rowHeight
880
+ } = scrollYStore;
881
+ const scrollBodyElem = evnt.target;
882
+ const scrollTop = scrollBodyElem.scrollTop;
883
+ const toVisibleIndex = Math.floor(scrollTop / rowHeight);
884
+ const offsetStartIndex = Math.max(0, toVisibleIndex - 1 - offsetSize);
885
+ const offsetEndIndex = toVisibleIndex + visibleSize + offsetSize;
886
+ if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
887
+ if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
888
+ scrollYStore.startIndex = offsetStartIndex;
889
+ scrollYStore.endIndex = offsetEndIndex;
890
+ updateYData();
776
891
  }
777
892
  }
778
893
  };
779
- const handleCountLine = (item, isRoot, nodeItem) => {
780
- const {
781
- treeExpandedMaps
782
- } = internalData;
783
- const childrenField = computeChildrenField.value;
784
- const nodeid = getNodeId(item);
785
- nodeItem.lineCount++;
786
- if (treeExpandedMaps[nodeid]) {
787
- _xeUtils.default.arrayEach(item[childrenField], (childItem, childIndex, childList) => {
788
- if (!isRoot || childIndex < childList.length - 1) {
789
- handleCountLine(childItem, false, nodeItem);
790
- }
791
- });
894
+ const scrollEvent = evnt => {
895
+ const scrollBodyElem = evnt.target;
896
+ const scrollTop = scrollBodyElem.scrollTop;
897
+ const scrollLeft = scrollBodyElem.scrollLeft;
898
+ const isX = scrollLeft !== internalData.lastScrollLeft;
899
+ const isY = scrollTop !== internalData.lastScrollTop;
900
+ internalData.lastScrollTop = scrollTop;
901
+ internalData.lastScrollLeft = scrollLeft;
902
+ if (reactData.scrollYLoad) {
903
+ loadYData(evnt);
792
904
  }
905
+ internalData.lastScrollTime = Date.now();
906
+ dispatchEvent('scroll', {
907
+ scrollLeft,
908
+ scrollTop,
909
+ isX,
910
+ isY
911
+ }, evnt);
793
912
  };
794
- const updateNodeLine = node => {
795
- const {
796
- nodeMaps
797
- } = internalData;
798
- if (node) {
799
- const nodeid = getNodeId(node);
800
- const nodeItem = nodeMaps[nodeid];
801
- if (nodeItem) {
802
- _xeUtils.default.lastArrayEach(nodeItem.nodes, childItem => {
803
- const nodeid = getNodeId(childItem);
804
- const nodeItem = nodeMaps[nodeid];
805
- if (nodeItem) {
806
- nodeItem.lineCount = 0;
807
- handleCountLine(childItem, true, nodeItem);
808
- }
809
- });
810
- }
913
+ const clearScroll = () => {
914
+ const scrollBodyElem = refVirtualWrapper.value;
915
+ if (scrollBodyElem) {
916
+ scrollBodyElem.scrollTop = 0;
917
+ scrollBodyElem.scrollLeft = 0;
811
918
  }
919
+ internalData.lastScrollTop = 0;
920
+ internalData.lastScrollLeft = 0;
921
+ return (0, _vue.nextTick)();
812
922
  };
813
923
  const handleNodeClickEvent = (evnt, node) => {
814
924
  const {
@@ -897,7 +1007,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
897
1007
  if (!checkStrictly && $xeTree.isCheckedByCheckboxNodeId(nodeid)) {
898
1008
  handleCheckedCheckboxNode(childRows, true);
899
1009
  }
900
- updateNodeLine(node);
901
1010
  dispatchEvent('load-success', {
902
1011
  node,
903
1012
  data: childRecords
@@ -905,7 +1014,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
905
1014
  return (0, _vue.nextTick)();
906
1015
  });
907
1016
  } else {
908
- updateNodeLine(node);
909
1017
  dispatchEvent('load-success', {
910
1018
  node,
911
1019
  data: childRecords
@@ -919,13 +1027,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
919
1027
  if (treeExpandLazyLoadedMaps[nodeid]) {
920
1028
  treeExpandLazyLoadedMaps[nodeid] = false;
921
1029
  }
922
- updateNodeLine(node);
923
1030
  dispatchEvent('load-error', {
924
1031
  node,
925
1032
  data: e
926
1033
  }, new Event('load-error'));
927
1034
  }).finally(() => {
928
- return (0, _vue.nextTick)();
1035
+ handleTreeToList();
1036
+ handleData();
1037
+ return recalculate();
929
1038
  });
930
1039
  } else {
931
1040
  resolve();
@@ -1001,8 +1110,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1001
1110
  });
1002
1111
  }
1003
1112
  reactData.updateExpandedFlag++;
1004
- expandNodes.forEach(updateNodeLine);
1005
- return Promise.all(result);
1113
+ handleTreeToList();
1114
+ handleData();
1115
+ return Promise.all(result).then(() => recalculate());
1006
1116
  };
1007
1117
  const toggleExpandEvent = (evnt, node) => {
1008
1118
  const {
@@ -1023,12 +1133,10 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1023
1133
  const {
1024
1134
  transform
1025
1135
  } = props;
1026
- const {
1027
- treeList
1028
- } = reactData;
1029
1136
  const {
1030
1137
  selectCheckboxMaps,
1031
- indeterminateRowMaps
1138
+ indeterminateRowMaps,
1139
+ afterTreeList
1032
1140
  } = internalData;
1033
1141
  const childrenField = computeChildrenField.value;
1034
1142
  const mapChildrenField = computeMapChildrenField.value;
@@ -1040,7 +1148,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1040
1148
  if (!checkStrictly) {
1041
1149
  const childRowMaps = {};
1042
1150
  const childRowList = [];
1043
- _xeUtils.default.eachTree(treeList, node => {
1151
+ _xeUtils.default.eachTree(afterTreeList, node => {
1044
1152
  const nodeid = getNodeId(node);
1045
1153
  const childList = node[childrenField];
1046
1154
  if (childList && childList.length && !childRowMaps[nodeid]) {
@@ -1056,11 +1164,13 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1056
1164
  const childList = vals[2];
1057
1165
  let sLen = 0; // 已选
1058
1166
  let hLen = 0; // 半选
1059
- let vLen = 0; // 有效行
1167
+ let vLen = 0; // 有效子行
1168
+ const cLen = childList.length; // 子行
1060
1169
  childList.forEach(checkMethod ? item => {
1061
1170
  const childNodeid = getNodeId(item);
1062
1171
  const isSelect = selectCheckboxMaps[childNodeid];
1063
1172
  if (checkMethod({
1173
+ $tree: $xeTree,
1064
1174
  node: item
1065
1175
  })) {
1066
1176
  if (isSelect) {
@@ -1086,8 +1196,25 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1086
1196
  }
1087
1197
  vLen++;
1088
1198
  });
1089
- const isSelected = sLen >= vLen;
1090
- const halfSelect = !isSelected && (sLen >= 1 || hLen >= 1);
1199
+ let isSelected = false;
1200
+ if (cLen > 0) {
1201
+ if (vLen > 0) {
1202
+ isSelected = (sLen > 0 || hLen > 0) && sLen >= vLen;
1203
+ } else {
1204
+ // 如果存在子项禁用
1205
+ if (sLen > 0 && sLen >= vLen) {
1206
+ isSelected = true;
1207
+ } else if (selectCheckboxMaps[nodeid]) {
1208
+ isSelected = true;
1209
+ } else {
1210
+ isSelected = false;
1211
+ }
1212
+ }
1213
+ } else {
1214
+ // 如果无子项
1215
+ isSelected = selectCheckboxMaps[nodeid];
1216
+ }
1217
+ const halfSelect = !isSelected && (sLen > 0 || hLen > 0);
1091
1218
  if (isSelected) {
1092
1219
  selectCheckboxMaps[nodeid] = node;
1093
1220
  if (indeterminateRowMaps[nodeid]) {
@@ -1106,128 +1233,500 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1106
1233
  }
1107
1234
  }
1108
1235
  });
1109
- reactData.updateCheckboxFlag++;
1236
+ reactData.updateCheckboxFlag++;
1237
+ }
1238
+ };
1239
+ const changeCheckboxEvent = (evnt, node) => {
1240
+ evnt.preventDefault();
1241
+ evnt.stopPropagation();
1242
+ const {
1243
+ transform
1244
+ } = props;
1245
+ const {
1246
+ selectCheckboxMaps
1247
+ } = internalData;
1248
+ const childrenField = computeChildrenField.value;
1249
+ const mapChildrenField = computeMapChildrenField.value;
1250
+ const checkboxOpts = computeCheckboxOpts.value;
1251
+ const {
1252
+ checkStrictly,
1253
+ checkMethod
1254
+ } = checkboxOpts;
1255
+ let isDisabled = !!checkMethod;
1256
+ if (checkMethod) {
1257
+ isDisabled = !checkMethod({
1258
+ $tree: $xeTree,
1259
+ node
1260
+ });
1261
+ }
1262
+ if (isDisabled) {
1263
+ return;
1264
+ }
1265
+ const nodeid = getNodeId(node);
1266
+ let isChecked = false;
1267
+ if (selectCheckboxMaps[nodeid]) {
1268
+ delete selectCheckboxMaps[nodeid];
1269
+ } else {
1270
+ isChecked = true;
1271
+ selectCheckboxMaps[nodeid] = node;
1272
+ }
1273
+ if (!checkStrictly) {
1274
+ _xeUtils.default.eachTree(_xeUtils.default.get(node, transform ? mapChildrenField : childrenField), childNode => {
1275
+ const childNodeid = getNodeId(childNode);
1276
+ if (isChecked) {
1277
+ if (!selectCheckboxMaps[childNodeid]) {
1278
+ selectCheckboxMaps[childNodeid] = true;
1279
+ }
1280
+ } else {
1281
+ if (selectCheckboxMaps[childNodeid]) {
1282
+ delete selectCheckboxMaps[childNodeid];
1283
+ }
1284
+ }
1285
+ }, {
1286
+ children: transform ? mapChildrenField : childrenField
1287
+ });
1288
+ }
1289
+ reactData.updateCheckboxFlag++;
1290
+ updateCheckboxStatus();
1291
+ const value = _xeUtils.default.keys(selectCheckboxMaps);
1292
+ emitCheckboxMode(value);
1293
+ dispatchEvent('checkbox-change', {
1294
+ node,
1295
+ value,
1296
+ checked: isChecked
1297
+ }, evnt);
1298
+ };
1299
+ const changeCurrentEvent = (evnt, node) => {
1300
+ evnt.preventDefault();
1301
+ const nodeOpts = computeNodeOpts.value;
1302
+ const {
1303
+ currentMethod,
1304
+ trigger
1305
+ } = nodeOpts;
1306
+ const childrenField = computeChildrenField.value;
1307
+ const childList = _xeUtils.default.get(node, childrenField);
1308
+ const hasChild = childList && childList.length;
1309
+ let isDisabled = !!currentMethod;
1310
+ if (trigger === 'child') {
1311
+ if (hasChild) {
1312
+ return;
1313
+ }
1314
+ } else if (trigger === 'parent') {
1315
+ if (!hasChild) {
1316
+ return;
1317
+ }
1318
+ }
1319
+ if (currentMethod) {
1320
+ isDisabled = !currentMethod({
1321
+ node
1322
+ });
1110
1323
  }
1324
+ if (isDisabled) {
1325
+ return;
1326
+ }
1327
+ const isChecked = true;
1328
+ reactData.currentNode = node;
1329
+ dispatchEvent('current-change', {
1330
+ node,
1331
+ checked: isChecked
1332
+ }, evnt);
1111
1333
  };
1112
- const changeCheckboxEvent = (evnt, node) => {
1334
+ const changeRadioEvent = (evnt, node) => {
1113
1335
  evnt.preventDefault();
1114
1336
  evnt.stopPropagation();
1337
+ const radioOpts = computeRadioOpts.value;
1115
1338
  const {
1116
- transform
1117
- } = props;
1118
- const {
1119
- selectCheckboxMaps
1120
- } = internalData;
1121
- const childrenField = computeChildrenField.value;
1122
- const mapChildrenField = computeMapChildrenField.value;
1123
- const checkboxOpts = computeCheckboxOpts.value;
1124
- const {
1125
- checkStrictly,
1126
1339
  checkMethod
1127
- } = checkboxOpts;
1340
+ } = radioOpts;
1128
1341
  let isDisabled = !!checkMethod;
1129
1342
  if (checkMethod) {
1130
1343
  isDisabled = !checkMethod({
1344
+ $tree: $xeTree,
1131
1345
  node
1132
1346
  });
1133
1347
  }
1134
1348
  if (isDisabled) {
1135
1349
  return;
1136
1350
  }
1137
- const nodeid = getNodeId(node);
1138
- let isChecked = false;
1139
- if (selectCheckboxMaps[nodeid]) {
1140
- delete selectCheckboxMaps[nodeid];
1141
- } else {
1142
- isChecked = true;
1143
- selectCheckboxMaps[nodeid] = node;
1351
+ const isChecked = true;
1352
+ const value = getNodeId(node);
1353
+ reactData.selectRadioKey = value;
1354
+ emitRadioMode(value);
1355
+ dispatchEvent('radio-change', {
1356
+ node,
1357
+ value,
1358
+ checked: isChecked
1359
+ }, evnt);
1360
+ };
1361
+ const handleGlobalResizeEvent = () => {
1362
+ const el = refElem.value;
1363
+ if (!el || !el.clientWidth) {
1364
+ return;
1144
1365
  }
1145
- if (!checkStrictly) {
1146
- _xeUtils.default.eachTree(_xeUtils.default.get(node, childrenField), childNode => {
1147
- const childNodeid = getNodeId(childNode);
1148
- if (isChecked) {
1149
- if (!selectCheckboxMaps[childNodeid]) {
1150
- selectCheckboxMaps[childNodeid] = true;
1151
- }
1152
- } else {
1153
- if (selectCheckboxMaps[childNodeid]) {
1154
- delete selectCheckboxMaps[childNodeid];
1366
+ recalculate();
1367
+ };
1368
+ const treeMethods = {
1369
+ dispatchEvent,
1370
+ getNodeId,
1371
+ loadData(data) {
1372
+ return loadData(data || []);
1373
+ },
1374
+ reloadData(data) {
1375
+ return loadData(data || []);
1376
+ },
1377
+ clearCurrentNode() {
1378
+ reactData.currentNode = null;
1379
+ return (0, _vue.nextTick)();
1380
+ },
1381
+ getCurrentNodeId() {
1382
+ const {
1383
+ currentNode
1384
+ } = reactData;
1385
+ if (currentNode) {
1386
+ return getNodeId(currentNode);
1387
+ }
1388
+ return null;
1389
+ },
1390
+ getCurrentNode() {
1391
+ const {
1392
+ currentNode
1393
+ } = reactData;
1394
+ const {
1395
+ nodeMaps
1396
+ } = internalData;
1397
+ if (currentNode) {
1398
+ const nodeItem = nodeMaps[getNodeId(currentNode)];
1399
+ if (nodeItem) {
1400
+ return nodeItem.item;
1401
+ }
1402
+ }
1403
+ return null;
1404
+ },
1405
+ setCurrentNodeId(nodeKey) {
1406
+ const {
1407
+ nodeMaps
1408
+ } = internalData;
1409
+ const nodeItem = nodeMaps[nodeKey];
1410
+ reactData.currentNode = nodeItem ? nodeItem.item : null;
1411
+ return (0, _vue.nextTick)();
1412
+ },
1413
+ setCurrentNode(node) {
1414
+ reactData.currentNode = node;
1415
+ return (0, _vue.nextTick)();
1416
+ },
1417
+ clearRadioNode() {
1418
+ reactData.selectRadioKey = null;
1419
+ return (0, _vue.nextTick)();
1420
+ },
1421
+ getRadioNodeId() {
1422
+ return reactData.selectRadioKey || null;
1423
+ },
1424
+ getRadioNode() {
1425
+ const {
1426
+ selectRadioKey
1427
+ } = reactData;
1428
+ const {
1429
+ nodeMaps
1430
+ } = internalData;
1431
+ if (selectRadioKey) {
1432
+ const nodeItem = nodeMaps[selectRadioKey];
1433
+ if (nodeItem) {
1434
+ return nodeItem.item;
1435
+ }
1436
+ }
1437
+ return null;
1438
+ },
1439
+ setRadioNodeId(nodeKey) {
1440
+ reactData.selectRadioKey = nodeKey;
1441
+ return (0, _vue.nextTick)();
1442
+ },
1443
+ setRadioNode,
1444
+ setCheckboxNode,
1445
+ setCheckboxByNodeId,
1446
+ getCheckboxNodeIds() {
1447
+ const {
1448
+ selectCheckboxMaps
1449
+ } = internalData;
1450
+ return Object.keys(selectCheckboxMaps);
1451
+ },
1452
+ getCheckboxNodes() {
1453
+ const {
1454
+ nodeMaps,
1455
+ selectCheckboxMaps
1456
+ } = internalData;
1457
+ const list = [];
1458
+ _xeUtils.default.each(selectCheckboxMaps, (item, nodeid) => {
1459
+ const nodeItem = nodeMaps[nodeid];
1460
+ if (nodeItem) {
1461
+ list.push(nodeItem.item);
1462
+ }
1463
+ });
1464
+ return list;
1465
+ },
1466
+ clearCheckboxNode() {
1467
+ internalData.selectCheckboxMaps = {};
1468
+ reactData.updateCheckboxFlag++;
1469
+ return (0, _vue.nextTick)().then(() => {
1470
+ return {
1471
+ checkNodeKeys: []
1472
+ };
1473
+ });
1474
+ },
1475
+ setAllCheckboxNode(checked) {
1476
+ const {
1477
+ transform
1478
+ } = props;
1479
+ const selectMaps = {};
1480
+ const childrenField = computeChildrenField.value;
1481
+ const mapChildrenField = computeMapChildrenField.value;
1482
+ const checkKeys = [];
1483
+ if (checked) {
1484
+ _xeUtils.default.eachTree(internalData.afterTreeList, node => {
1485
+ const nodeid = getNodeId(node);
1486
+ checkKeys.push(nodeid);
1487
+ selectMaps[nodeid] = true;
1488
+ }, {
1489
+ children: transform ? mapChildrenField : childrenField
1490
+ });
1491
+ }
1492
+ internalData.selectCheckboxMaps = selectMaps;
1493
+ reactData.updateCheckboxFlag++;
1494
+ return (0, _vue.nextTick)().then(() => {
1495
+ return {
1496
+ checkNodeKeys: checkKeys
1497
+ };
1498
+ });
1499
+ },
1500
+ clearExpandNode() {
1501
+ return treeMethods.clearAllExpandNode();
1502
+ },
1503
+ clearAllExpandNode() {
1504
+ const {
1505
+ nodeMaps,
1506
+ scrollYStore
1507
+ } = internalData;
1508
+ _xeUtils.default.each(nodeMaps, nodeItem => {
1509
+ nodeItem.treeLoaded = false;
1510
+ });
1511
+ internalData.treeExpandedMaps = {};
1512
+ reactData.updateExpandedFlag++;
1513
+ reactData.topSpaceHeight = 0;
1514
+ scrollYStore.startIndex = 0;
1515
+ scrollYStore.endIndex = 1;
1516
+ handleTreeToList();
1517
+ handleData();
1518
+ return recalculate();
1519
+ },
1520
+ setExpandByNodeId(nodeids, expanded) {
1521
+ const {
1522
+ treeExpandedMaps
1523
+ } = internalData;
1524
+ if (nodeids) {
1525
+ if (!_xeUtils.default.isArray(nodeids)) {
1526
+ nodeids = [nodeids];
1527
+ }
1528
+ nodeids.forEach(nodeid => {
1529
+ handleSetExpand(nodeid, expanded, treeExpandedMaps);
1530
+ });
1531
+ reactData.updateExpandedFlag++;
1532
+ }
1533
+ handleTreeToList();
1534
+ handleData();
1535
+ return recalculate();
1536
+ },
1537
+ getExpandNodeIds() {
1538
+ const {
1539
+ treeExpandedMaps
1540
+ } = internalData;
1541
+ return _xeUtils.default.keys(treeExpandedMaps);
1542
+ },
1543
+ getExpandNodes() {
1544
+ const {
1545
+ nodeMaps,
1546
+ treeExpandedMaps
1547
+ } = internalData;
1548
+ const list = [];
1549
+ _xeUtils.default.each(treeExpandedMaps, (item, nodeid) => {
1550
+ const nodeItem = nodeMaps[nodeid];
1551
+ if (nodeItem) {
1552
+ list.push(nodeItem.item);
1553
+ }
1554
+ });
1555
+ return list;
1556
+ },
1557
+ setExpandNode(nodes, expanded) {
1558
+ const {
1559
+ treeExpandedMaps
1560
+ } = internalData;
1561
+ if (nodes) {
1562
+ if (!_xeUtils.default.isArray(nodes)) {
1563
+ nodes = [nodes];
1564
+ }
1565
+ nodes.forEach(node => {
1566
+ const nodeid = getNodeId(node);
1567
+ handleSetExpand(nodeid, expanded, treeExpandedMaps);
1568
+ });
1569
+ reactData.updateExpandedFlag++;
1570
+ }
1571
+ handleTreeToList();
1572
+ handleData();
1573
+ return recalculate();
1574
+ },
1575
+ toggleExpandByNodeId(nodeids) {
1576
+ const {
1577
+ treeExpandedMaps
1578
+ } = internalData;
1579
+ if (nodeids) {
1580
+ if (!_xeUtils.default.isArray(nodeids)) {
1581
+ nodeids = [nodeids];
1582
+ }
1583
+ nodeids.forEach(nodeid => {
1584
+ handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
1585
+ });
1586
+ reactData.updateExpandedFlag++;
1587
+ }
1588
+ handleTreeToList();
1589
+ handleData();
1590
+ return recalculate();
1591
+ },
1592
+ toggleExpandNode(nodes) {
1593
+ const {
1594
+ treeExpandedMaps
1595
+ } = internalData;
1596
+ if (nodes) {
1597
+ if (!_xeUtils.default.isArray(nodes)) {
1598
+ nodes = [nodes];
1599
+ }
1600
+ nodes.forEach(node => {
1601
+ const nodeid = getNodeId(node);
1602
+ handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
1603
+ });
1604
+ reactData.updateExpandedFlag++;
1605
+ }
1606
+ handleTreeToList();
1607
+ handleData();
1608
+ return recalculate();
1609
+ },
1610
+ setAllExpandNode(expanded) {
1611
+ const {
1612
+ transform
1613
+ } = props;
1614
+ const {
1615
+ treeExpandedMaps
1616
+ } = internalData;
1617
+ const childrenField = computeChildrenField.value;
1618
+ const mapChildrenField = computeMapChildrenField.value;
1619
+ if (expanded) {
1620
+ _xeUtils.default.eachTree(internalData.afterTreeList, node => {
1621
+ const childList = _xeUtils.default.get(node, childrenField);
1622
+ const hasChild = childList && childList.length;
1623
+ if (hasChild) {
1624
+ const nodeid = getNodeId(node);
1625
+ treeExpandedMaps[nodeid] = true;
1155
1626
  }
1627
+ }, {
1628
+ children: transform ? mapChildrenField : childrenField
1629
+ });
1630
+ } else {
1631
+ internalData.treeExpandedMaps = {};
1632
+ }
1633
+ reactData.updateExpandedFlag++;
1634
+ handleTreeToList();
1635
+ handleData();
1636
+ return recalculate();
1637
+ },
1638
+ reloadExpandNode(node) {
1639
+ const {
1640
+ lazy
1641
+ } = props;
1642
+ if (lazy) {
1643
+ treeMethods.clearExpandLoaded(node);
1644
+ return handleAsyncTreeExpandChilds(node);
1645
+ }
1646
+ return recalculate();
1647
+ },
1648
+ clearExpandLoaded(node) {
1649
+ const {
1650
+ lazy
1651
+ } = props;
1652
+ const {
1653
+ nodeMaps
1654
+ } = internalData;
1655
+ if (lazy) {
1656
+ const nodeItem = nodeMaps[getNodeId(node)];
1657
+ if (nodeItem) {
1658
+ nodeItem.treeLoaded = false;
1156
1659
  }
1157
- }, {
1158
- children: transform ? mapChildrenField : childrenField
1159
- });
1160
- }
1161
- reactData.updateCheckboxFlag++;
1162
- updateCheckboxStatus();
1163
- const value = _xeUtils.default.keys(selectCheckboxMaps);
1164
- emitCheckboxMode(value);
1165
- dispatchEvent('checkbox-change', {
1166
- node,
1167
- value,
1168
- checked: isChecked
1169
- }, evnt);
1170
- };
1171
- const changeCurrentEvent = (evnt, node) => {
1172
- evnt.preventDefault();
1173
- const nodeOpts = computeNodeOpts.value;
1174
- const {
1175
- currentMethod,
1176
- trigger
1177
- } = nodeOpts;
1178
- const childrenField = computeChildrenField.value;
1179
- const childList = _xeUtils.default.get(node, childrenField);
1180
- const hasChild = childList && childList.length;
1181
- let isDisabled = !!currentMethod;
1182
- if (trigger === 'child') {
1183
- if (hasChild) {
1184
- return;
1185
1660
  }
1186
- } else if (trigger === 'parent') {
1187
- if (!hasChild) {
1188
- return;
1661
+ return recalculate();
1662
+ },
1663
+ /**
1664
+ * 用于树结构,给行数据加载子节点
1665
+ */
1666
+ loadChildrenNode(node, childRecords) {
1667
+ const {
1668
+ lazy,
1669
+ transform
1670
+ } = props;
1671
+ const {
1672
+ nodeMaps
1673
+ } = internalData;
1674
+ if (!lazy) {
1675
+ return Promise.resolve([]);
1189
1676
  }
1190
- }
1191
- if (currentMethod) {
1192
- isDisabled = !currentMethod({
1193
- node
1677
+ const childrenField = computeChildrenField.value;
1678
+ const mapChildrenField = computeMapChildrenField.value;
1679
+ const parentNodeItem = nodeMaps[getNodeId(node)];
1680
+ const parentLevel = parentNodeItem ? parentNodeItem.level : 0;
1681
+ const parentNodes = parentNodeItem ? parentNodeItem.nodes : [];
1682
+ return createNode(childRecords).then(nodeList => {
1683
+ _xeUtils.default.eachTree(nodeList, (childRow, index, items, path, parent, nodes) => {
1684
+ const itemNodeId = getNodeId(childRow);
1685
+ nodeMaps[itemNodeId] = {
1686
+ item: node,
1687
+ index: -1,
1688
+ items,
1689
+ parent: parent || parentNodeItem.item,
1690
+ nodes: parentNodes.concat(nodes),
1691
+ level: parentLevel + nodes.length,
1692
+ treeIndex: -1,
1693
+ lineCount: 0,
1694
+ treeLoaded: false
1695
+ };
1696
+ }, {
1697
+ children: childrenField
1698
+ });
1699
+ node[childrenField] = nodeList;
1700
+ if (transform) {
1701
+ node[mapChildrenField] = nodeList;
1702
+ }
1703
+ updateAfterDataIndex();
1704
+ return nodeList;
1194
1705
  });
1195
- }
1196
- if (isDisabled) {
1197
- return;
1198
- }
1199
- const isChecked = true;
1200
- reactData.currentNode = node;
1201
- dispatchEvent('current-change', {
1202
- node,
1203
- checked: isChecked
1204
- }, evnt);
1205
- };
1206
- const changeRadioEvent = (evnt, node) => {
1207
- evnt.preventDefault();
1208
- evnt.stopPropagation();
1209
- const radioOpts = computeRadioOpts.value;
1210
- const {
1211
- checkMethod
1212
- } = radioOpts;
1213
- let isDisabled = !!checkMethod;
1214
- if (checkMethod) {
1215
- isDisabled = !checkMethod({
1216
- node
1706
+ },
1707
+ isExpandByNode,
1708
+ isCheckedByRadioNodeId,
1709
+ isCheckedByRadioNode,
1710
+ isCheckedByCheckboxNodeId,
1711
+ isIndeterminateByCheckboxNode,
1712
+ isCheckedByCheckboxNode,
1713
+ getCheckboxIndeterminateNodes() {
1714
+ const {
1715
+ nodeMaps,
1716
+ indeterminateRowMaps
1717
+ } = internalData;
1718
+ const list = [];
1719
+ _xeUtils.default.each(indeterminateRowMaps, (item, nodeid) => {
1720
+ const nodeItem = nodeMaps[nodeid];
1721
+ if (nodeItem) {
1722
+ list.push(nodeItem.item);
1723
+ }
1217
1724
  });
1218
- }
1219
- if (isDisabled) {
1220
- return;
1221
- }
1222
- const isChecked = true;
1223
- const value = getNodeId(node);
1224
- reactData.selectRadioKey = value;
1225
- emitRadioMode(value);
1226
- dispatchEvent('radio-change', {
1227
- node,
1228
- value,
1229
- checked: isChecked
1230
- }, evnt);
1725
+ return list;
1726
+ },
1727
+ recalculate,
1728
+ scrollTo,
1729
+ clearScroll
1231
1730
  };
1232
1731
  const treePrivateMethods = {};
1233
1732
  Object.assign($xeTree, treeMethods, treePrivateMethods);
@@ -1242,12 +1741,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1242
1741
  visibleMethod
1243
1742
  } = radioOpts;
1244
1743
  const isVisible = !visibleMethod || visibleMethod({
1744
+ $tree: $xeTree,
1245
1745
  node
1246
1746
  });
1247
1747
  let isDisabled = !!checkMethod;
1248
1748
  if (showRadio && showIcon && isVisible) {
1249
1749
  if (checkMethod) {
1250
1750
  isDisabled = !checkMethod({
1751
+ $tree: $xeTree,
1251
1752
  node
1252
1753
  });
1253
1754
  }
@@ -1279,12 +1780,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1279
1780
  } = checkboxOpts;
1280
1781
  const isIndeterminate = isIndeterminateByCheckboxNodeid(nodeid);
1281
1782
  const isVisible = !visibleMethod || visibleMethod({
1783
+ $tree: $xeTree,
1282
1784
  node
1283
1785
  });
1284
1786
  let isDisabled = !!checkMethod;
1285
1787
  if (showCheckbox && showIcon && isVisible) {
1286
1788
  if (checkMethod) {
1287
1789
  isDisabled = !checkMethod({
1790
+ $tree: $xeTree,
1288
1791
  node
1289
1792
  });
1290
1793
  }
@@ -1305,7 +1808,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1305
1808
  }
1306
1809
  return (0, _ui.renderEmptyElement)($xeTree);
1307
1810
  };
1308
- const renderNode = node => {
1811
+ const renderNode = (node, nodeid) => {
1309
1812
  const {
1310
1813
  lazy,
1311
1814
  showRadio,
@@ -1323,6 +1826,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1323
1826
  updateExpandedFlag
1324
1827
  } = reactData;
1325
1828
  const {
1829
+ afterTreeList,
1326
1830
  nodeMaps,
1327
1831
  treeExpandedMaps,
1328
1832
  treeExpandLazyLoadedMaps
@@ -1335,30 +1839,13 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1335
1839
  const iconSlot = slots.icon;
1336
1840
  const titleSlot = slots.title;
1337
1841
  const extraSlot = slots.extra;
1338
- const nodeid = getNodeId(node);
1339
1842
  const isExpand = updateExpandedFlag && treeExpandedMaps[nodeid];
1340
1843
  const nodeItem = nodeMaps[nodeid];
1341
1844
  const nodeValue = _xeUtils.default.get(node, titleField);
1342
- const childVns = [];
1343
- if (hasChild && treeExpandedMaps[nodeid]) {
1344
- if (showLine) {
1345
- childVns.push((0, _vue.h)('div', {
1346
- key: 'line',
1347
- class: 'vxe-tree--node-child-line',
1348
- style: {
1349
- height: `calc(${nodeItem.lineCount} * var(--vxe-ui-tree-node-height) - var(--vxe-ui-tree-node-height) / 2)`,
1350
- left: `${(nodeItem.level + 1) * (indent || 1)}px`
1351
- }
1352
- }));
1353
- }
1354
- childList.forEach(childItem => {
1355
- childVns.push(renderNode(childItem));
1356
- });
1357
- }
1845
+ const nLevel = nodeItem.level;
1358
1846
  let isRadioChecked = false;
1359
1847
  if (showRadio) {
1360
- // eslint-disable-next-line eqeqeq
1361
- isRadioChecked = nodeid == selectRadioKey;
1848
+ isRadioChecked = nodeid === String(selectRadioKey);
1362
1849
  }
1363
1850
  let isCheckboxChecked = false;
1364
1851
  if (showCheckbox) {
@@ -1372,8 +1859,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1372
1859
  hasLazyChilds = node[hasChildField];
1373
1860
  isLazyLoaded = !!nodeItem.treeLoaded;
1374
1861
  }
1862
+ const prevNode = nodeItem.items[nodeItem.treeIndex - 1];
1863
+ const nParams = {
1864
+ node,
1865
+ isExpand
1866
+ };
1375
1867
  return (0, _vue.h)('div', {
1376
- class: ['vxe-tree--node-wrapper', `node--level-${nodeItem.level}`],
1868
+ key: nodeid,
1869
+ class: ['vxe-tree--node-wrapper', `node--level-${nLevel}`],
1377
1870
  nodeid
1378
1871
  }, [(0, _vue.h)('div', {
1379
1872
  class: ['vxe-tree--node-item', {
@@ -1382,7 +1875,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1382
1875
  'is-checkbox--checked': isCheckboxChecked
1383
1876
  }],
1384
1877
  style: {
1385
- paddingLeft: `${(nodeItem.level - 1) * (indent || 1)}px`
1878
+ paddingLeft: `${(nLevel - 1) * (indent || 1)}px`
1386
1879
  },
1387
1880
  onClick(evnt) {
1388
1881
  handleNodeClickEvent(evnt, node);
@@ -1390,41 +1883,57 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1390
1883
  onDblclick(evnt) {
1391
1884
  handleNodeDblclickEvent(evnt, node);
1392
1885
  }
1393
- }, [showIcon || showLine ? (0, _vue.h)('div', {
1886
+ }, [showLine ? (0, _vue.h)('div', {
1887
+ class: 'vxe-tree--node-line-wrapper'
1888
+ }, [(0, _vue.h)('div', {
1889
+ class: 'vxe-tree--node-line',
1890
+ style: {
1891
+ height: `${getNodeId(afterTreeList[0]) === nodeid ? 1 : (0, _util.calcTreeLine)($xeTree, node, prevNode)}px`
1892
+ }
1893
+ })]) : (0, _ui.renderEmptyElement)($xeTree), (0, _vue.h)('div', {
1394
1894
  class: 'vxe-tree--node-item-switcher'
1395
1895
  }, showIcon && (lazy ? isLazyLoaded ? hasChild : hasLazyChilds : hasChild) ? [(0, _vue.h)('div', {
1396
1896
  class: 'vxe-tree--node-item-icon',
1397
1897
  onClick(evnt) {
1398
1898
  toggleExpandEvent(evnt, node);
1399
1899
  }
1400
- }, iconSlot ? iconSlot({
1401
- node,
1402
- isExpand
1403
- }) : [(0, _vue.h)('i', {
1900
+ }, iconSlot ? (0, _vn.getSlotVNs)(iconSlot(nParams)) : [(0, _vue.h)('i', {
1404
1901
  class: isLazyLoading ? iconLoaded || (0, _ui.getIcon)().TREE_NODE_LOADED : isExpand ? iconOpen || (0, _ui.getIcon)().TREE_NODE_OPEN : iconClose || (0, _ui.getIcon)().TREE_NODE_CLOSE
1405
- })])] : []) : (0, _ui.renderEmptyElement)($xeTree), renderRadio(node, nodeid, isRadioChecked), renderCheckbox(node, nodeid, isCheckboxChecked), (0, _vue.h)('div', {
1902
+ })])] : []), renderRadio(node, nodeid, isRadioChecked), renderCheckbox(node, nodeid, isCheckboxChecked), (0, _vue.h)('div', {
1406
1903
  class: 'vxe-tree--node-item-inner'
1407
1904
  }, [(0, _vue.h)('div', {
1408
1905
  class: 'vxe-tree--node-item-title'
1409
- }, titleSlot ? (0, _vn.getSlotVNs)(titleSlot({
1410
- node,
1411
- isExpand
1412
- })) : `${nodeValue}`), extraSlot ? (0, _vue.h)('div', {
1906
+ }, titleSlot ? (0, _vn.getSlotVNs)(titleSlot(nParams)) : `${nodeValue}`), extraSlot ? (0, _vue.h)('div', {
1413
1907
  class: 'vxe-tree--node-item-extra'
1414
- }, (0, _vn.getSlotVNs)(extraSlot({
1415
- node,
1416
- isExpand
1417
- }))) : (0, _ui.renderEmptyElement)($xeTree)])]), hasChild && treeExpandedMaps[nodeid] ? (0, _vue.h)('div', {
1418
- class: 'vxe-tree--node-child-wrapper'
1419
- }, childVns) : (0, _ui.renderEmptyElement)($xeTree)]);
1908
+ }, (0, _vn.getSlotVNs)(extraSlot(nParams))) : (0, _ui.renderEmptyElement)($xeTree)])])]);
1420
1909
  };
1421
- const renderNodeList = () => {
1910
+ const renderList = treeList => {
1422
1911
  const {
1423
- treeList
1424
- } = reactData;
1425
- return (0, _vue.h)('div', {
1426
- class: 'vxe-tree--node-list-wrapper'
1427
- }, treeList.map(node => renderNode(node)));
1912
+ transform
1913
+ } = props;
1914
+ const {
1915
+ treeExpandedMaps
1916
+ } = internalData;
1917
+ const childrenField = computeChildrenField.value;
1918
+ if (!treeList.length) {
1919
+ return [(0, _vue.h)('div', {
1920
+ class: 'vxe-tree--empty-placeholder'
1921
+ }, (0, _ui.getI18n)('vxe.tree.searchEmpty'))];
1922
+ }
1923
+ const nodeVNs = [];
1924
+ treeList.forEach(transform ? node => {
1925
+ const nodeid = getNodeId(node);
1926
+ nodeVNs.push(renderNode(node, nodeid));
1927
+ } : node => {
1928
+ const nodeid = getNodeId(node);
1929
+ nodeVNs.push(renderNode(node, nodeid));
1930
+ const childList = _xeUtils.default.get(node, childrenField);
1931
+ const hasChild = childList && childList.length;
1932
+ if (hasChild && treeExpandedMaps[nodeid]) {
1933
+ nodeVNs.push(...renderList(childList));
1934
+ }
1935
+ });
1936
+ return nodeVNs;
1428
1937
  };
1429
1938
  const renderVN = () => {
1430
1939
  const {
@@ -1432,13 +1941,20 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1432
1941
  trigger,
1433
1942
  showLine
1434
1943
  } = props;
1944
+ const {
1945
+ bodyHeight,
1946
+ topSpaceHeight,
1947
+ treeList
1948
+ } = reactData;
1435
1949
  const vSize = computeSize.value;
1436
1950
  const radioOpts = computeRadioOpts.value;
1437
1951
  const checkboxOpts = computeCheckboxOpts.value;
1438
- const treeStyle = computeTreeStyle.value;
1439
1952
  const loadingOpts = computeLoadingOpts.value;
1440
1953
  const isRowHover = computeIsRowHover.value;
1954
+ const treeStyle = computeTreeStyle.value;
1441
1955
  const loadingSlot = slots.loading;
1956
+ const headerSlot = slots.header;
1957
+ const footerSlot = slots.footer;
1442
1958
  return (0, _vue.h)('div', {
1443
1959
  ref: refElem,
1444
1960
  class: ['vxe-tree', {
@@ -1449,9 +1965,34 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1449
1965
  'node--hover': isRowHover,
1450
1966
  'node--trigger': trigger === 'node',
1451
1967
  'is--loading': loading
1452
- }],
1453
- style: treeStyle
1454
- }, [renderNodeList(),
1968
+ }]
1969
+ }, [headerSlot ? (0, _vue.h)('div', {
1970
+ ref: refHeaderWrapperElem,
1971
+ class: 'vxe-tree--header-wrapper'
1972
+ }, headerSlot({
1973
+ $tree: $xeTree
1974
+ })) : (0, _ui.renderEmptyElement)($xeTree), (0, _vue.h)('div', {
1975
+ ref: refVirtualWrapper,
1976
+ class: 'vxe-tree--node-list-wrapper',
1977
+ style: treeStyle,
1978
+ onScroll: scrollEvent
1979
+ }, [(0, _vue.h)('div', {
1980
+ class: 'vxe-tree--y-space',
1981
+ style: {
1982
+ height: bodyHeight ? `${bodyHeight}px` : ''
1983
+ }
1984
+ }), (0, _vue.h)('div', {
1985
+ ref: refVirtualBody,
1986
+ class: 'vxe-tree--node-list-body',
1987
+ style: {
1988
+ transform: `translateY(${topSpaceHeight}px)`
1989
+ }
1990
+ }, renderList(treeList))]), footerSlot ? (0, _vue.h)('div', {
1991
+ ref: refFooterWrapperElem,
1992
+ class: 'vxe-tree--footer-wrapper'
1993
+ }, footerSlot({
1994
+ $tree: $xeTree
1995
+ })) : (0, _ui.renderEmptyElement)($xeTree),
1455
1996
  /**
1456
1997
  * 加载中
1457
1998
  */
@@ -1474,7 +2015,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1474
2015
  dataFlag.value++;
1475
2016
  });
1476
2017
  (0, _vue.watch)(dataFlag, () => {
1477
- loadTreeData(props.data || []);
2018
+ loadData(props.data || []);
1478
2019
  });
1479
2020
  (0, _vue.watch)(() => props.checkNodeKey, val => {
1480
2021
  reactData.selectRadioKey = val;
@@ -1489,13 +2030,54 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1489
2030
  (0, _vue.watch)(checkboxFlag, () => {
1490
2031
  updateCheckboxChecked(props.checkNodeKeys || []);
1491
2032
  });
2033
+ (0, _vue.watch)(() => props.filterValue, () => {
2034
+ triggerSearchEvent(new Event('filter'));
2035
+ });
2036
+ const hFlag = (0, _vue.ref)(0);
2037
+ (0, _vue.watch)(() => props.height, () => {
2038
+ hFlag.value++;
2039
+ });
2040
+ (0, _vue.watch)(() => props.minHeight, () => {
2041
+ hFlag.value++;
2042
+ });
2043
+ (0, _vue.watch)(() => props.maxHeight, () => {
2044
+ hFlag.value++;
2045
+ });
2046
+ (0, _vue.watch)(hFlag, () => {
2047
+ recalculate();
2048
+ });
2049
+ (0, _vue.onMounted)(() => {
2050
+ if (props.autoResize) {
2051
+ const el = refElem.value;
2052
+ const parentEl = getParentElem();
2053
+ const resizeObserver = _ui.globalResize.create(() => {
2054
+ if (props.autoResize) {
2055
+ recalculate();
2056
+ }
2057
+ });
2058
+ if (el) {
2059
+ resizeObserver.observe(el);
2060
+ }
2061
+ if (parentEl) {
2062
+ resizeObserver.observe(parentEl);
2063
+ }
2064
+ internalData.resizeObserver = resizeObserver;
2065
+ }
2066
+ _ui.globalEvents.on($xeTree, 'resize', handleGlobalResizeEvent);
2067
+ });
1492
2068
  (0, _vue.onUnmounted)(() => {
1493
- reactData.treeList = [];
2069
+ const {
2070
+ resizeObserver
2071
+ } = internalData;
2072
+ if (resizeObserver) {
2073
+ resizeObserver.disconnect();
2074
+ }
1494
2075
  internalData.treeExpandedMaps = {};
1495
2076
  internalData.indeterminateRowMaps = {};
1496
2077
  internalData.nodeMaps = {};
2078
+ _ui.globalEvents.off($xeTree, 'resize');
1497
2079
  });
1498
- loadTreeData(props.data || []);
2080
+ loadData(props.data || []);
1499
2081
  $xeTree.renderVN = renderVN;
1500
2082
  return $xeTree;
1501
2083
  },