vxe-pc-ui 4.7.5 → 4.7.6

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 +918 -407
  31. package/es/tree/src/util.js +32 -0
  32. package/es/tree/style.css +23 -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 +23 -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 +1505 -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 +1147 -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 +23 -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 +23 -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 +941 -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 +28 -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.1752416456948.ttf} +0 -0
  187. /package/es/icon/{iconfont.1752151733538.woff → iconfont.1752416456948.woff} +0 -0
  188. /package/es/icon/{iconfont.1752151733538.woff2 → iconfont.1752416456948.woff2} +0 -0
  189. /package/es/{iconfont.1752151733538.ttf → iconfont.1752416456948.ttf} +0 -0
  190. /package/es/{iconfont.1752151733538.woff → iconfont.1752416456948.woff} +0 -0
  191. /package/es/{iconfont.1752151733538.woff2 → iconfont.1752416456948.woff2} +0 -0
  192. /package/lib/icon/style/{iconfont.1752151733538.ttf → iconfont.1752416456948.ttf} +0 -0
  193. /package/lib/icon/style/{iconfont.1752151733538.woff → iconfont.1752416456948.woff} +0 -0
  194. /package/lib/icon/style/{iconfont.1752151733538.woff2 → iconfont.1752416456948.woff2} +0 -0
  195. /package/lib/{iconfont.1752151733538.ttf → iconfont.1752416456948.ttf} +0 -0
  196. /package/lib/{iconfont.1752151733538.woff → iconfont.1752416456948.woff} +0 -0
  197. /package/lib/{iconfont.1752151733538.woff2 → iconfont.1752416456948.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,450 @@ 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();
864
+ }
865
+ return (0, _vue.nextTick)();
747
866
  };
748
- const loadTreeData = list => {
749
- const {
750
- expandAll,
751
- transform
752
- } = props;
867
+ const loadYData = evnt => {
753
868
  const {
754
- initialized
869
+ scrollYStore
755
870
  } = 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);
871
+ const {
872
+ startIndex,
873
+ endIndex,
874
+ visibleSize,
875
+ offsetSize,
876
+ rowHeight
877
+ } = scrollYStore;
878
+ const scrollBodyElem = evnt.target;
879
+ const scrollTop = scrollBodyElem.scrollTop;
880
+ const toVisibleIndex = Math.floor(scrollTop / rowHeight);
881
+ const offsetStartIndex = Math.max(0, toVisibleIndex - 1 - offsetSize);
882
+ const offsetEndIndex = toVisibleIndex + visibleSize + offsetSize;
883
+ if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
884
+ if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
885
+ scrollYStore.startIndex = offsetStartIndex;
886
+ scrollYStore.endIndex = offsetEndIndex;
887
+ updateYData();
776
888
  }
777
889
  }
778
890
  };
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
- });
891
+ const scrollEvent = evnt => {
892
+ const scrollBodyElem = evnt.target;
893
+ const scrollTop = scrollBodyElem.scrollTop;
894
+ const scrollLeft = scrollBodyElem.scrollLeft;
895
+ const isX = scrollLeft !== internalData.lastScrollLeft;
896
+ const isY = scrollTop !== internalData.lastScrollTop;
897
+ internalData.lastScrollTop = scrollTop;
898
+ internalData.lastScrollLeft = scrollLeft;
899
+ if (reactData.scrollYLoad) {
900
+ loadYData(evnt);
792
901
  }
902
+ internalData.lastScrollTime = Date.now();
903
+ dispatchEvent('scroll', {
904
+ scrollLeft,
905
+ scrollTop,
906
+ isX,
907
+ isY
908
+ }, evnt);
793
909
  };
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
- }
910
+ const clearScroll = () => {
911
+ const scrollBodyElem = refVirtualWrapper.value;
912
+ if (scrollBodyElem) {
913
+ scrollBodyElem.scrollTop = 0;
914
+ scrollBodyElem.scrollLeft = 0;
811
915
  }
916
+ internalData.lastScrollTop = 0;
917
+ internalData.lastScrollLeft = 0;
918
+ return (0, _vue.nextTick)();
812
919
  };
813
920
  const handleNodeClickEvent = (evnt, node) => {
814
921
  const {
@@ -897,7 +1004,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
897
1004
  if (!checkStrictly && $xeTree.isCheckedByCheckboxNodeId(nodeid)) {
898
1005
  handleCheckedCheckboxNode(childRows, true);
899
1006
  }
900
- updateNodeLine(node);
901
1007
  dispatchEvent('load-success', {
902
1008
  node,
903
1009
  data: childRecords
@@ -905,7 +1011,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
905
1011
  return (0, _vue.nextTick)();
906
1012
  });
907
1013
  } else {
908
- updateNodeLine(node);
909
1014
  dispatchEvent('load-success', {
910
1015
  node,
911
1016
  data: childRecords
@@ -919,13 +1024,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
919
1024
  if (treeExpandLazyLoadedMaps[nodeid]) {
920
1025
  treeExpandLazyLoadedMaps[nodeid] = false;
921
1026
  }
922
- updateNodeLine(node);
923
1027
  dispatchEvent('load-error', {
924
1028
  node,
925
1029
  data: e
926
1030
  }, new Event('load-error'));
927
1031
  }).finally(() => {
928
- return (0, _vue.nextTick)();
1032
+ handleTreeToList();
1033
+ handleData();
1034
+ return recalculate();
929
1035
  });
930
1036
  } else {
931
1037
  resolve();
@@ -1001,8 +1107,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1001
1107
  });
1002
1108
  }
1003
1109
  reactData.updateExpandedFlag++;
1004
- expandNodes.forEach(updateNodeLine);
1005
- return Promise.all(result);
1110
+ handleTreeToList();
1111
+ handleData();
1112
+ return Promise.all(result).then(() => recalculate());
1006
1113
  };
1007
1114
  const toggleExpandEvent = (evnt, node) => {
1008
1115
  const {
@@ -1023,12 +1130,10 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1023
1130
  const {
1024
1131
  transform
1025
1132
  } = props;
1026
- const {
1027
- treeList
1028
- } = reactData;
1029
1133
  const {
1030
1134
  selectCheckboxMaps,
1031
- indeterminateRowMaps
1135
+ indeterminateRowMaps,
1136
+ afterTreeList
1032
1137
  } = internalData;
1033
1138
  const childrenField = computeChildrenField.value;
1034
1139
  const mapChildrenField = computeMapChildrenField.value;
@@ -1040,7 +1145,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1040
1145
  if (!checkStrictly) {
1041
1146
  const childRowMaps = {};
1042
1147
  const childRowList = [];
1043
- _xeUtils.default.eachTree(treeList, node => {
1148
+ _xeUtils.default.eachTree(afterTreeList, node => {
1044
1149
  const nodeid = getNodeId(node);
1045
1150
  const childList = node[childrenField];
1046
1151
  if (childList && childList.length && !childRowMaps[nodeid]) {
@@ -1056,11 +1161,13 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1056
1161
  const childList = vals[2];
1057
1162
  let sLen = 0; // 已选
1058
1163
  let hLen = 0; // 半选
1059
- let vLen = 0; // 有效行
1164
+ let vLen = 0; // 有效子行
1165
+ const cLen = childList.length; // 子行
1060
1166
  childList.forEach(checkMethod ? item => {
1061
1167
  const childNodeid = getNodeId(item);
1062
1168
  const isSelect = selectCheckboxMaps[childNodeid];
1063
1169
  if (checkMethod({
1170
+ $tree: $xeTree,
1064
1171
  node: item
1065
1172
  })) {
1066
1173
  if (isSelect) {
@@ -1086,8 +1193,25 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1086
1193
  }
1087
1194
  vLen++;
1088
1195
  });
1089
- const isSelected = sLen >= vLen;
1090
- const halfSelect = !isSelected && (sLen >= 1 || hLen >= 1);
1196
+ let isSelected = false;
1197
+ if (cLen > 0) {
1198
+ if (vLen > 0) {
1199
+ isSelected = (sLen > 0 || hLen > 0) && sLen >= vLen;
1200
+ } else {
1201
+ // 如果存在子项禁用
1202
+ if (sLen > 0 && sLen >= vLen) {
1203
+ isSelected = true;
1204
+ } else if (selectCheckboxMaps[nodeid]) {
1205
+ isSelected = true;
1206
+ } else {
1207
+ isSelected = false;
1208
+ }
1209
+ }
1210
+ } else {
1211
+ // 如果无子项
1212
+ isSelected = selectCheckboxMaps[nodeid];
1213
+ }
1214
+ const halfSelect = !isSelected && (sLen > 0 || hLen > 0);
1091
1215
  if (isSelected) {
1092
1216
  selectCheckboxMaps[nodeid] = node;
1093
1217
  if (indeterminateRowMaps[nodeid]) {
@@ -1106,128 +1230,496 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1106
1230
  }
1107
1231
  }
1108
1232
  });
1109
- reactData.updateCheckboxFlag++;
1233
+ reactData.updateCheckboxFlag++;
1234
+ }
1235
+ };
1236
+ const changeCheckboxEvent = (evnt, node) => {
1237
+ evnt.preventDefault();
1238
+ evnt.stopPropagation();
1239
+ const {
1240
+ transform
1241
+ } = props;
1242
+ const {
1243
+ selectCheckboxMaps
1244
+ } = internalData;
1245
+ const childrenField = computeChildrenField.value;
1246
+ const mapChildrenField = computeMapChildrenField.value;
1247
+ const checkboxOpts = computeCheckboxOpts.value;
1248
+ const {
1249
+ checkStrictly,
1250
+ checkMethod
1251
+ } = checkboxOpts;
1252
+ let isDisabled = !!checkMethod;
1253
+ if (checkMethod) {
1254
+ isDisabled = !checkMethod({
1255
+ $tree: $xeTree,
1256
+ node
1257
+ });
1258
+ }
1259
+ if (isDisabled) {
1260
+ return;
1261
+ }
1262
+ const nodeid = getNodeId(node);
1263
+ let isChecked = false;
1264
+ if (selectCheckboxMaps[nodeid]) {
1265
+ delete selectCheckboxMaps[nodeid];
1266
+ } else {
1267
+ isChecked = true;
1268
+ selectCheckboxMaps[nodeid] = node;
1269
+ }
1270
+ if (!checkStrictly) {
1271
+ _xeUtils.default.eachTree(_xeUtils.default.get(node, transform ? mapChildrenField : childrenField), childNode => {
1272
+ const childNodeid = getNodeId(childNode);
1273
+ if (isChecked) {
1274
+ if (!selectCheckboxMaps[childNodeid]) {
1275
+ selectCheckboxMaps[childNodeid] = true;
1276
+ }
1277
+ } else {
1278
+ if (selectCheckboxMaps[childNodeid]) {
1279
+ delete selectCheckboxMaps[childNodeid];
1280
+ }
1281
+ }
1282
+ }, {
1283
+ children: transform ? mapChildrenField : childrenField
1284
+ });
1285
+ }
1286
+ reactData.updateCheckboxFlag++;
1287
+ updateCheckboxStatus();
1288
+ const value = _xeUtils.default.keys(selectCheckboxMaps);
1289
+ emitCheckboxMode(value);
1290
+ dispatchEvent('checkbox-change', {
1291
+ node,
1292
+ value,
1293
+ checked: isChecked
1294
+ }, evnt);
1295
+ };
1296
+ const changeCurrentEvent = (evnt, node) => {
1297
+ evnt.preventDefault();
1298
+ const nodeOpts = computeNodeOpts.value;
1299
+ const {
1300
+ currentMethod,
1301
+ trigger
1302
+ } = nodeOpts;
1303
+ const childrenField = computeChildrenField.value;
1304
+ const childList = _xeUtils.default.get(node, childrenField);
1305
+ const hasChild = childList && childList.length;
1306
+ let isDisabled = !!currentMethod;
1307
+ if (trigger === 'child') {
1308
+ if (hasChild) {
1309
+ return;
1310
+ }
1311
+ } else if (trigger === 'parent') {
1312
+ if (!hasChild) {
1313
+ return;
1314
+ }
1315
+ }
1316
+ if (currentMethod) {
1317
+ isDisabled = !currentMethod({
1318
+ node
1319
+ });
1110
1320
  }
1321
+ if (isDisabled) {
1322
+ return;
1323
+ }
1324
+ const isChecked = true;
1325
+ reactData.currentNode = node;
1326
+ dispatchEvent('current-change', {
1327
+ node,
1328
+ checked: isChecked
1329
+ }, evnt);
1111
1330
  };
1112
- const changeCheckboxEvent = (evnt, node) => {
1331
+ const changeRadioEvent = (evnt, node) => {
1113
1332
  evnt.preventDefault();
1114
1333
  evnt.stopPropagation();
1334
+ const radioOpts = computeRadioOpts.value;
1115
1335
  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
1336
  checkMethod
1127
- } = checkboxOpts;
1337
+ } = radioOpts;
1128
1338
  let isDisabled = !!checkMethod;
1129
1339
  if (checkMethod) {
1130
1340
  isDisabled = !checkMethod({
1341
+ $tree: $xeTree,
1131
1342
  node
1132
1343
  });
1133
1344
  }
1134
1345
  if (isDisabled) {
1135
1346
  return;
1136
1347
  }
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;
1348
+ const isChecked = true;
1349
+ const value = getNodeId(node);
1350
+ reactData.selectRadioKey = value;
1351
+ emitRadioMode(value);
1352
+ dispatchEvent('radio-change', {
1353
+ node,
1354
+ value,
1355
+ checked: isChecked
1356
+ }, evnt);
1357
+ };
1358
+ const handleGlobalResizeEvent = () => {
1359
+ const el = refElem.value;
1360
+ if (!el || !el.clientWidth) {
1361
+ return;
1144
1362
  }
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];
1363
+ recalculate();
1364
+ };
1365
+ const treeMethods = {
1366
+ dispatchEvent,
1367
+ getNodeId,
1368
+ loadData(data) {
1369
+ return loadData(data || []);
1370
+ },
1371
+ reloadData(data) {
1372
+ return loadData(data || []);
1373
+ },
1374
+ clearCurrentNode() {
1375
+ reactData.currentNode = null;
1376
+ return (0, _vue.nextTick)();
1377
+ },
1378
+ getCurrentNodeId() {
1379
+ const {
1380
+ currentNode
1381
+ } = reactData;
1382
+ if (currentNode) {
1383
+ return getNodeId(currentNode);
1384
+ }
1385
+ return null;
1386
+ },
1387
+ getCurrentNode() {
1388
+ const {
1389
+ currentNode
1390
+ } = reactData;
1391
+ const {
1392
+ nodeMaps
1393
+ } = internalData;
1394
+ if (currentNode) {
1395
+ const nodeItem = nodeMaps[getNodeId(currentNode)];
1396
+ if (nodeItem) {
1397
+ return nodeItem.item;
1398
+ }
1399
+ }
1400
+ return null;
1401
+ },
1402
+ setCurrentNodeId(nodeKey) {
1403
+ const {
1404
+ nodeMaps
1405
+ } = internalData;
1406
+ const nodeItem = nodeMaps[nodeKey];
1407
+ reactData.currentNode = nodeItem ? nodeItem.item : null;
1408
+ return (0, _vue.nextTick)();
1409
+ },
1410
+ setCurrentNode(node) {
1411
+ reactData.currentNode = node;
1412
+ return (0, _vue.nextTick)();
1413
+ },
1414
+ clearRadioNode() {
1415
+ reactData.selectRadioKey = null;
1416
+ return (0, _vue.nextTick)();
1417
+ },
1418
+ getRadioNodeId() {
1419
+ return reactData.selectRadioKey || null;
1420
+ },
1421
+ getRadioNode() {
1422
+ const {
1423
+ selectRadioKey
1424
+ } = reactData;
1425
+ const {
1426
+ nodeMaps
1427
+ } = internalData;
1428
+ if (selectRadioKey) {
1429
+ const nodeItem = nodeMaps[selectRadioKey];
1430
+ if (nodeItem) {
1431
+ return nodeItem.item;
1432
+ }
1433
+ }
1434
+ return null;
1435
+ },
1436
+ setRadioNodeId(nodeKey) {
1437
+ reactData.selectRadioKey = nodeKey;
1438
+ return (0, _vue.nextTick)();
1439
+ },
1440
+ setRadioNode,
1441
+ setCheckboxNode,
1442
+ setCheckboxByNodeId,
1443
+ getCheckboxNodeIds() {
1444
+ const {
1445
+ selectCheckboxMaps
1446
+ } = internalData;
1447
+ return Object.keys(selectCheckboxMaps);
1448
+ },
1449
+ getCheckboxNodes() {
1450
+ const {
1451
+ nodeMaps,
1452
+ selectCheckboxMaps
1453
+ } = internalData;
1454
+ const list = [];
1455
+ _xeUtils.default.each(selectCheckboxMaps, (item, nodeid) => {
1456
+ const nodeItem = nodeMaps[nodeid];
1457
+ if (nodeItem) {
1458
+ list.push(nodeItem.item);
1459
+ }
1460
+ });
1461
+ return list;
1462
+ },
1463
+ clearCheckboxNode() {
1464
+ internalData.selectCheckboxMaps = {};
1465
+ reactData.updateCheckboxFlag++;
1466
+ return (0, _vue.nextTick)().then(() => {
1467
+ return {
1468
+ checkNodeKeys: []
1469
+ };
1470
+ });
1471
+ },
1472
+ setAllCheckboxNode(checked) {
1473
+ const {
1474
+ transform
1475
+ } = props;
1476
+ const selectMaps = {};
1477
+ const childrenField = computeChildrenField.value;
1478
+ const mapChildrenField = computeMapChildrenField.value;
1479
+ const checkKeys = [];
1480
+ if (checked) {
1481
+ _xeUtils.default.eachTree(internalData.afterTreeList, node => {
1482
+ const nodeid = getNodeId(node);
1483
+ checkKeys.push(nodeid);
1484
+ selectMaps[nodeid] = true;
1485
+ }, {
1486
+ children: transform ? mapChildrenField : childrenField
1487
+ });
1488
+ }
1489
+ internalData.selectCheckboxMaps = selectMaps;
1490
+ reactData.updateCheckboxFlag++;
1491
+ return (0, _vue.nextTick)().then(() => {
1492
+ return {
1493
+ checkNodeKeys: checkKeys
1494
+ };
1495
+ });
1496
+ },
1497
+ clearExpandNode() {
1498
+ return treeMethods.clearAllExpandNode();
1499
+ },
1500
+ clearAllExpandNode() {
1501
+ const {
1502
+ nodeMaps
1503
+ } = internalData;
1504
+ _xeUtils.default.each(nodeMaps, nodeItem => {
1505
+ nodeItem.treeLoaded = false;
1506
+ });
1507
+ internalData.treeExpandedMaps = {};
1508
+ reactData.updateExpandedFlag++;
1509
+ handleTreeToList();
1510
+ handleData();
1511
+ return recalculate();
1512
+ },
1513
+ setExpandByNodeId(nodeids, expanded) {
1514
+ const {
1515
+ treeExpandedMaps
1516
+ } = internalData;
1517
+ if (nodeids) {
1518
+ if (!_xeUtils.default.isArray(nodeids)) {
1519
+ nodeids = [nodeids];
1520
+ }
1521
+ nodeids.forEach(nodeid => {
1522
+ handleSetExpand(nodeid, expanded, treeExpandedMaps);
1523
+ });
1524
+ reactData.updateExpandedFlag++;
1525
+ }
1526
+ handleTreeToList();
1527
+ handleData();
1528
+ return recalculate();
1529
+ },
1530
+ getExpandNodeIds() {
1531
+ const {
1532
+ treeExpandedMaps
1533
+ } = internalData;
1534
+ return _xeUtils.default.keys(treeExpandedMaps);
1535
+ },
1536
+ getExpandNodes() {
1537
+ const {
1538
+ nodeMaps,
1539
+ treeExpandedMaps
1540
+ } = internalData;
1541
+ const list = [];
1542
+ _xeUtils.default.each(treeExpandedMaps, (item, nodeid) => {
1543
+ const nodeItem = nodeMaps[nodeid];
1544
+ if (nodeItem) {
1545
+ list.push(nodeItem.item);
1546
+ }
1547
+ });
1548
+ return list;
1549
+ },
1550
+ setExpandNode(nodes, expanded) {
1551
+ const {
1552
+ treeExpandedMaps
1553
+ } = internalData;
1554
+ if (nodes) {
1555
+ if (!_xeUtils.default.isArray(nodes)) {
1556
+ nodes = [nodes];
1557
+ }
1558
+ nodes.forEach(node => {
1559
+ const nodeid = getNodeId(node);
1560
+ handleSetExpand(nodeid, expanded, treeExpandedMaps);
1561
+ });
1562
+ reactData.updateExpandedFlag++;
1563
+ }
1564
+ handleTreeToList();
1565
+ handleData();
1566
+ return recalculate();
1567
+ },
1568
+ toggleExpandByNodeId(nodeids) {
1569
+ const {
1570
+ treeExpandedMaps
1571
+ } = internalData;
1572
+ if (nodeids) {
1573
+ if (!_xeUtils.default.isArray(nodeids)) {
1574
+ nodeids = [nodeids];
1575
+ }
1576
+ nodeids.forEach(nodeid => {
1577
+ handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
1578
+ });
1579
+ reactData.updateExpandedFlag++;
1580
+ }
1581
+ handleTreeToList();
1582
+ handleData();
1583
+ return recalculate();
1584
+ },
1585
+ toggleExpandNode(nodes) {
1586
+ const {
1587
+ treeExpandedMaps
1588
+ } = internalData;
1589
+ if (nodes) {
1590
+ if (!_xeUtils.default.isArray(nodes)) {
1591
+ nodes = [nodes];
1592
+ }
1593
+ nodes.forEach(node => {
1594
+ const nodeid = getNodeId(node);
1595
+ handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
1596
+ });
1597
+ reactData.updateExpandedFlag++;
1598
+ }
1599
+ handleTreeToList();
1600
+ handleData();
1601
+ return recalculate();
1602
+ },
1603
+ setAllExpandNode(expanded) {
1604
+ const {
1605
+ transform
1606
+ } = props;
1607
+ const {
1608
+ treeExpandedMaps
1609
+ } = internalData;
1610
+ const childrenField = computeChildrenField.value;
1611
+ const mapChildrenField = computeMapChildrenField.value;
1612
+ if (expanded) {
1613
+ _xeUtils.default.eachTree(internalData.afterTreeList, node => {
1614
+ const childList = _xeUtils.default.get(node, childrenField);
1615
+ const hasChild = childList && childList.length;
1616
+ if (hasChild) {
1617
+ const nodeid = getNodeId(node);
1618
+ treeExpandedMaps[nodeid] = true;
1155
1619
  }
1620
+ }, {
1621
+ children: transform ? mapChildrenField : childrenField
1622
+ });
1623
+ } else {
1624
+ internalData.treeExpandedMaps = {};
1625
+ }
1626
+ reactData.updateExpandedFlag++;
1627
+ handleTreeToList();
1628
+ handleData();
1629
+ return recalculate();
1630
+ },
1631
+ reloadExpandNode(node) {
1632
+ const {
1633
+ lazy
1634
+ } = props;
1635
+ if (lazy) {
1636
+ treeMethods.clearExpandLoaded(node);
1637
+ return handleAsyncTreeExpandChilds(node);
1638
+ }
1639
+ return recalculate();
1640
+ },
1641
+ clearExpandLoaded(node) {
1642
+ const {
1643
+ lazy
1644
+ } = props;
1645
+ const {
1646
+ nodeMaps
1647
+ } = internalData;
1648
+ if (lazy) {
1649
+ const nodeItem = nodeMaps[getNodeId(node)];
1650
+ if (nodeItem) {
1651
+ nodeItem.treeLoaded = false;
1156
1652
  }
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
1653
  }
1186
- } else if (trigger === 'parent') {
1187
- if (!hasChild) {
1188
- return;
1654
+ return recalculate();
1655
+ },
1656
+ /**
1657
+ * 用于树结构,给行数据加载子节点
1658
+ */
1659
+ loadChildrenNode(node, childRecords) {
1660
+ const {
1661
+ lazy,
1662
+ transform
1663
+ } = props;
1664
+ const {
1665
+ nodeMaps
1666
+ } = internalData;
1667
+ if (!lazy) {
1668
+ return Promise.resolve([]);
1189
1669
  }
1190
- }
1191
- if (currentMethod) {
1192
- isDisabled = !currentMethod({
1193
- node
1670
+ const childrenField = computeChildrenField.value;
1671
+ const mapChildrenField = computeMapChildrenField.value;
1672
+ const parentNodeItem = nodeMaps[getNodeId(node)];
1673
+ const parentLevel = parentNodeItem ? parentNodeItem.level : 0;
1674
+ const parentNodes = parentNodeItem ? parentNodeItem.nodes : [];
1675
+ return createNode(childRecords).then(nodeList => {
1676
+ _xeUtils.default.eachTree(nodeList, (childRow, index, items, path, parent, nodes) => {
1677
+ const itemNodeId = getNodeId(childRow);
1678
+ nodeMaps[itemNodeId] = {
1679
+ item: node,
1680
+ index: -1,
1681
+ items,
1682
+ parent: parent || parentNodeItem.item,
1683
+ nodes: parentNodes.concat(nodes),
1684
+ level: parentLevel + nodes.length,
1685
+ treeIndex: -1,
1686
+ lineCount: 0,
1687
+ treeLoaded: false
1688
+ };
1689
+ }, {
1690
+ children: childrenField
1691
+ });
1692
+ node[childrenField] = nodeList;
1693
+ if (transform) {
1694
+ node[mapChildrenField] = nodeList;
1695
+ }
1696
+ updateAfterDataIndex();
1697
+ return nodeList;
1194
1698
  });
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
1699
+ },
1700
+ isExpandByNode,
1701
+ isCheckedByRadioNodeId,
1702
+ isCheckedByRadioNode,
1703
+ isCheckedByCheckboxNodeId,
1704
+ isIndeterminateByCheckboxNode,
1705
+ isCheckedByCheckboxNode,
1706
+ getCheckboxIndeterminateNodes() {
1707
+ const {
1708
+ nodeMaps,
1709
+ indeterminateRowMaps
1710
+ } = internalData;
1711
+ const list = [];
1712
+ _xeUtils.default.each(indeterminateRowMaps, (item, nodeid) => {
1713
+ const nodeItem = nodeMaps[nodeid];
1714
+ if (nodeItem) {
1715
+ list.push(nodeItem.item);
1716
+ }
1217
1717
  });
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);
1718
+ return list;
1719
+ },
1720
+ recalculate,
1721
+ scrollTo,
1722
+ clearScroll
1231
1723
  };
1232
1724
  const treePrivateMethods = {};
1233
1725
  Object.assign($xeTree, treeMethods, treePrivateMethods);
@@ -1242,12 +1734,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1242
1734
  visibleMethod
1243
1735
  } = radioOpts;
1244
1736
  const isVisible = !visibleMethod || visibleMethod({
1737
+ $tree: $xeTree,
1245
1738
  node
1246
1739
  });
1247
1740
  let isDisabled = !!checkMethod;
1248
1741
  if (showRadio && showIcon && isVisible) {
1249
1742
  if (checkMethod) {
1250
1743
  isDisabled = !checkMethod({
1744
+ $tree: $xeTree,
1251
1745
  node
1252
1746
  });
1253
1747
  }
@@ -1279,12 +1773,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1279
1773
  } = checkboxOpts;
1280
1774
  const isIndeterminate = isIndeterminateByCheckboxNodeid(nodeid);
1281
1775
  const isVisible = !visibleMethod || visibleMethod({
1776
+ $tree: $xeTree,
1282
1777
  node
1283
1778
  });
1284
1779
  let isDisabled = !!checkMethod;
1285
1780
  if (showCheckbox && showIcon && isVisible) {
1286
1781
  if (checkMethod) {
1287
1782
  isDisabled = !checkMethod({
1783
+ $tree: $xeTree,
1288
1784
  node
1289
1785
  });
1290
1786
  }
@@ -1305,7 +1801,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1305
1801
  }
1306
1802
  return (0, _ui.renderEmptyElement)($xeTree);
1307
1803
  };
1308
- const renderNode = node => {
1804
+ const renderNode = (node, nodeid) => {
1309
1805
  const {
1310
1806
  lazy,
1311
1807
  showRadio,
@@ -1323,6 +1819,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1323
1819
  updateExpandedFlag
1324
1820
  } = reactData;
1325
1821
  const {
1822
+ afterTreeList,
1326
1823
  nodeMaps,
1327
1824
  treeExpandedMaps,
1328
1825
  treeExpandLazyLoadedMaps
@@ -1335,30 +1832,13 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1335
1832
  const iconSlot = slots.icon;
1336
1833
  const titleSlot = slots.title;
1337
1834
  const extraSlot = slots.extra;
1338
- const nodeid = getNodeId(node);
1339
1835
  const isExpand = updateExpandedFlag && treeExpandedMaps[nodeid];
1340
1836
  const nodeItem = nodeMaps[nodeid];
1341
1837
  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
- }
1838
+ const nLevel = nodeItem.level;
1358
1839
  let isRadioChecked = false;
1359
1840
  if (showRadio) {
1360
- // eslint-disable-next-line eqeqeq
1361
- isRadioChecked = nodeid == selectRadioKey;
1841
+ isRadioChecked = nodeid === String(selectRadioKey);
1362
1842
  }
1363
1843
  let isCheckboxChecked = false;
1364
1844
  if (showCheckbox) {
@@ -1372,8 +1852,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1372
1852
  hasLazyChilds = node[hasChildField];
1373
1853
  isLazyLoaded = !!nodeItem.treeLoaded;
1374
1854
  }
1855
+ const prevNode = nodeItem.items[nodeItem.treeIndex - 1];
1856
+ const nParams = {
1857
+ node,
1858
+ isExpand
1859
+ };
1375
1860
  return (0, _vue.h)('div', {
1376
- class: ['vxe-tree--node-wrapper', `node--level-${nodeItem.level}`],
1861
+ key: nodeid,
1862
+ class: ['vxe-tree--node-wrapper', `node--level-${nLevel}`],
1377
1863
  nodeid
1378
1864
  }, [(0, _vue.h)('div', {
1379
1865
  class: ['vxe-tree--node-item', {
@@ -1382,7 +1868,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1382
1868
  'is-checkbox--checked': isCheckboxChecked
1383
1869
  }],
1384
1870
  style: {
1385
- paddingLeft: `${(nodeItem.level - 1) * (indent || 1)}px`
1871
+ paddingLeft: `${(nLevel - 1) * (indent || 1)}px`
1386
1872
  },
1387
1873
  onClick(evnt) {
1388
1874
  handleNodeClickEvent(evnt, node);
@@ -1390,41 +1876,57 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1390
1876
  onDblclick(evnt) {
1391
1877
  handleNodeDblclickEvent(evnt, node);
1392
1878
  }
1393
- }, [showIcon || showLine ? (0, _vue.h)('div', {
1879
+ }, [showLine ? (0, _vue.h)('div', {
1880
+ class: 'vxe-tree--node-line-wrapper'
1881
+ }, [(0, _vue.h)('div', {
1882
+ class: 'vxe-tree--node-line',
1883
+ style: {
1884
+ height: `${getNodeId(afterTreeList[0]) === nodeid ? 1 : (0, _util.calcTreeLine)($xeTree, node, prevNode)}px`
1885
+ }
1886
+ })]) : (0, _ui.renderEmptyElement)($xeTree), (0, _vue.h)('div', {
1394
1887
  class: 'vxe-tree--node-item-switcher'
1395
1888
  }, showIcon && (lazy ? isLazyLoaded ? hasChild : hasLazyChilds : hasChild) ? [(0, _vue.h)('div', {
1396
1889
  class: 'vxe-tree--node-item-icon',
1397
1890
  onClick(evnt) {
1398
1891
  toggleExpandEvent(evnt, node);
1399
1892
  }
1400
- }, iconSlot ? iconSlot({
1401
- node,
1402
- isExpand
1403
- }) : [(0, _vue.h)('i', {
1893
+ }, iconSlot ? (0, _vn.getSlotVNs)(iconSlot(nParams)) : [(0, _vue.h)('i', {
1404
1894
  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', {
1895
+ })])] : []), renderRadio(node, nodeid, isRadioChecked), renderCheckbox(node, nodeid, isCheckboxChecked), (0, _vue.h)('div', {
1406
1896
  class: 'vxe-tree--node-item-inner'
1407
1897
  }, [(0, _vue.h)('div', {
1408
1898
  class: 'vxe-tree--node-item-title'
1409
- }, titleSlot ? (0, _vn.getSlotVNs)(titleSlot({
1410
- node,
1411
- isExpand
1412
- })) : `${nodeValue}`), extraSlot ? (0, _vue.h)('div', {
1899
+ }, titleSlot ? (0, _vn.getSlotVNs)(titleSlot(nParams)) : `${nodeValue}`), extraSlot ? (0, _vue.h)('div', {
1413
1900
  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)]);
1901
+ }, (0, _vn.getSlotVNs)(extraSlot(nParams))) : (0, _ui.renderEmptyElement)($xeTree)])])]);
1420
1902
  };
1421
- const renderNodeList = () => {
1903
+ const renderList = treeList => {
1422
1904
  const {
1423
- treeList
1424
- } = reactData;
1425
- return (0, _vue.h)('div', {
1426
- class: 'vxe-tree--node-list-wrapper'
1427
- }, treeList.map(node => renderNode(node)));
1905
+ transform
1906
+ } = props;
1907
+ const {
1908
+ treeExpandedMaps
1909
+ } = internalData;
1910
+ const childrenField = computeChildrenField.value;
1911
+ if (!treeList.length) {
1912
+ return [(0, _vue.h)('div', {
1913
+ class: 'vxe-tree--empty-placeholder'
1914
+ }, (0, _ui.getI18n)('vxe.tree.searchEmpty'))];
1915
+ }
1916
+ const nodeVNs = [];
1917
+ treeList.forEach(transform ? node => {
1918
+ const nodeid = getNodeId(node);
1919
+ nodeVNs.push(renderNode(node, nodeid));
1920
+ } : node => {
1921
+ const nodeid = getNodeId(node);
1922
+ nodeVNs.push(renderNode(node, nodeid));
1923
+ const childList = _xeUtils.default.get(node, childrenField);
1924
+ const hasChild = childList && childList.length;
1925
+ if (hasChild && treeExpandedMaps[nodeid]) {
1926
+ nodeVNs.push(...renderList(childList));
1927
+ }
1928
+ });
1929
+ return nodeVNs;
1428
1930
  };
1429
1931
  const renderVN = () => {
1430
1932
  const {
@@ -1432,13 +1934,20 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1432
1934
  trigger,
1433
1935
  showLine
1434
1936
  } = props;
1937
+ const {
1938
+ bodyHeight,
1939
+ topSpaceHeight,
1940
+ treeList
1941
+ } = reactData;
1435
1942
  const vSize = computeSize.value;
1436
1943
  const radioOpts = computeRadioOpts.value;
1437
1944
  const checkboxOpts = computeCheckboxOpts.value;
1438
- const treeStyle = computeTreeStyle.value;
1439
1945
  const loadingOpts = computeLoadingOpts.value;
1440
1946
  const isRowHover = computeIsRowHover.value;
1947
+ const treeStyle = computeTreeStyle.value;
1441
1948
  const loadingSlot = slots.loading;
1949
+ const headerSlot = slots.header;
1950
+ const footerSlot = slots.footer;
1442
1951
  return (0, _vue.h)('div', {
1443
1952
  ref: refElem,
1444
1953
  class: ['vxe-tree', {
@@ -1449,9 +1958,34 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1449
1958
  'node--hover': isRowHover,
1450
1959
  'node--trigger': trigger === 'node',
1451
1960
  'is--loading': loading
1452
- }],
1453
- style: treeStyle
1454
- }, [renderNodeList(),
1961
+ }]
1962
+ }, [headerSlot ? (0, _vue.h)('div', {
1963
+ ref: refHeaderWrapperElem,
1964
+ class: 'vxe-tree--header-wrapper'
1965
+ }, headerSlot({
1966
+ $tree: $xeTree
1967
+ })) : (0, _ui.renderEmptyElement)($xeTree), (0, _vue.h)('div', {
1968
+ ref: refVirtualWrapper,
1969
+ class: 'vxe-tree--node-list-wrapper',
1970
+ style: treeStyle,
1971
+ onScroll: scrollEvent
1972
+ }, [(0, _vue.h)('div', {
1973
+ class: 'vxe-select--y-space',
1974
+ style: {
1975
+ height: bodyHeight ? `${bodyHeight}px` : ''
1976
+ }
1977
+ }), (0, _vue.h)('div', {
1978
+ ref: refVirtualBody,
1979
+ class: 'vxe-tree--node-list-body',
1980
+ style: {
1981
+ transform: `translateY(${topSpaceHeight}px)`
1982
+ }
1983
+ }, renderList(treeList))]), footerSlot ? (0, _vue.h)('div', {
1984
+ ref: refFooterWrapperElem,
1985
+ class: 'vxe-tree--footer-wrapper'
1986
+ }, footerSlot({
1987
+ $tree: $xeTree
1988
+ })) : (0, _ui.renderEmptyElement)($xeTree),
1455
1989
  /**
1456
1990
  * 加载中
1457
1991
  */
@@ -1474,7 +2008,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1474
2008
  dataFlag.value++;
1475
2009
  });
1476
2010
  (0, _vue.watch)(dataFlag, () => {
1477
- loadTreeData(props.data || []);
2011
+ loadData(props.data || []);
1478
2012
  });
1479
2013
  (0, _vue.watch)(() => props.checkNodeKey, val => {
1480
2014
  reactData.selectRadioKey = val;
@@ -1489,13 +2023,54 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1489
2023
  (0, _vue.watch)(checkboxFlag, () => {
1490
2024
  updateCheckboxChecked(props.checkNodeKeys || []);
1491
2025
  });
2026
+ (0, _vue.watch)(() => props.filterValue, () => {
2027
+ triggerSearchEvent(new Event('filter'));
2028
+ });
2029
+ const hFlag = (0, _vue.ref)(0);
2030
+ (0, _vue.watch)(() => props.height, () => {
2031
+ hFlag.value++;
2032
+ });
2033
+ (0, _vue.watch)(() => props.minHeight, () => {
2034
+ hFlag.value++;
2035
+ });
2036
+ (0, _vue.watch)(() => props.maxHeight, () => {
2037
+ hFlag.value++;
2038
+ });
2039
+ (0, _vue.watch)(hFlag, () => {
2040
+ recalculate();
2041
+ });
2042
+ (0, _vue.onMounted)(() => {
2043
+ if (props.autoResize) {
2044
+ const el = refElem.value;
2045
+ const parentEl = getParentElem();
2046
+ const resizeObserver = _ui.globalResize.create(() => {
2047
+ if (props.autoResize) {
2048
+ recalculate();
2049
+ }
2050
+ });
2051
+ if (el) {
2052
+ resizeObserver.observe(el);
2053
+ }
2054
+ if (parentEl) {
2055
+ resizeObserver.observe(parentEl);
2056
+ }
2057
+ internalData.resizeObserver = resizeObserver;
2058
+ }
2059
+ _ui.globalEvents.on($xeTree, 'resize', handleGlobalResizeEvent);
2060
+ });
1492
2061
  (0, _vue.onUnmounted)(() => {
1493
- reactData.treeList = [];
2062
+ const {
2063
+ resizeObserver
2064
+ } = internalData;
2065
+ if (resizeObserver) {
2066
+ resizeObserver.disconnect();
2067
+ }
1494
2068
  internalData.treeExpandedMaps = {};
1495
2069
  internalData.indeterminateRowMaps = {};
1496
2070
  internalData.nodeMaps = {};
2071
+ _ui.globalEvents.off($xeTree, 'resize');
1497
2072
  });
1498
- loadTreeData(props.data || []);
2073
+ loadData(props.data || []);
1499
2074
  $xeTree.renderVN = renderVN;
1500
2075
  return $xeTree;
1501
2076
  },