vxe-pc-ui 3.7.4 → 3.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 (198) 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 +138 -41
  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 +1160 -601
  31. package/es/tree/src/util.js +31 -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 +258 -24
  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 +20 -4
  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 +1541 -532
  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 +145 -45
  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 +1223 -626
  125. package/lib/tree/src/tree.min.js +1 -1
  126. package/lib/tree/src/util.js +37 -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 +265 -26
  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 +20 -4
  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 +144 -44
  171. package/packages/tree/src/tree.ts +1206 -626
  172. package/packages/tree/src/util.ts +34 -0
  173. package/packages/tree-select/src/tree-select.ts +272 -26
  174. package/packages/ui/index.ts +19 -3
  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 +29 -40
  184. package/types/components/table.d.ts +2 -4
  185. package/types/components/tree-select.d.ts +72 -12
  186. package/types/components/tree.d.ts +129 -8
  187. /package/es/icon/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
  188. /package/es/icon/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
  189. /package/es/icon/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
  190. /package/es/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
  191. /package/es/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
  192. /package/es/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
  193. /package/lib/icon/style/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
  194. /package/lib/icon/style/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
  195. /package/lib/icon/style/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
  196. /package/lib/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
  197. /package/lib/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
  198. /package/lib/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
@@ -1,8 +1,10 @@
1
1
  import { defineVxeComponent } from '../../ui/src/comp';
2
2
  import XEUtils from 'xe-utils';
3
- import { createEvent, getIcon, getConfig, renderEmptyElement, globalMixins } from '../../ui';
3
+ import { getI18n, createEvent, getIcon, getConfig, globalEvents, globalResize, renderEmptyElement, globalMixins } from '../../ui';
4
+ import { calcTreeLine } from './util';
5
+ import { errLog } from '../../ui/src/log';
4
6
  import { getSlotVNs } from '../../ui/src/vn';
5
- import { toCssUnit } from '../../ui/src/dom';
7
+ import { toCssUnit, isScale, getPaddingTopBottomSize } from '../../ui/src/dom';
6
8
  import VxeLoadingComponent from '../../loading/src/loading';
7
9
  /**
8
10
  * 生成节点的唯一主键
@@ -29,7 +31,15 @@ export default {
29
31
  ],
30
32
  props: {
31
33
  data: Array,
34
+ autoResize: {
35
+ type: Boolean,
36
+ default: () => getConfig().tree.autoResize
37
+ },
32
38
  height: [String, Number],
39
+ maxHeight: {
40
+ type: [String, Number],
41
+ default: () => getConfig().tree.maxHeight
42
+ },
33
43
  minHeight: {
34
44
  type: [String, Number],
35
45
  default: () => getConfig().tree.minHeight
@@ -121,15 +131,25 @@ export default {
121
131
  type: String,
122
132
  default: () => getConfig().tree.iconLoaded
123
133
  },
134
+ filterValue: [String, Number],
135
+ filterConfig: Object,
124
136
  size: {
125
137
  type: String,
126
138
  default: () => getConfig().tree.size || getConfig().size
127
- }
139
+ },
140
+ virtualYConfig: Object
128
141
  },
129
142
  data() {
130
143
  const xID = XEUtils.uniqueId();
131
144
  const reactData = {
145
+ parentHeight: 0,
146
+ customHeight: 0,
147
+ customMinHeight: 0,
148
+ customMaxHeight: 0,
132
149
  currentNode: null,
150
+ scrollYLoad: false,
151
+ bodyHeight: 0,
152
+ topSpaceHeight: 0,
133
153
  selectRadioKey: null,
134
154
  treeList: [],
135
155
  updateExpandedFlag: 1,
@@ -137,11 +157,26 @@ export default {
137
157
  };
138
158
  const internalData = {
139
159
  // initialized: false,
160
+ // lastFilterValue: '',
161
+ treeFullData: [],
162
+ afterTreeList: [],
163
+ afterVisibleList: [],
140
164
  nodeMaps: {},
141
165
  selectCheckboxMaps: {},
142
166
  indeterminateRowMaps: {},
143
167
  treeExpandedMaps: {},
144
- treeExpandLazyLoadedMaps: {}
168
+ treeExpandLazyLoadedMaps: {},
169
+ lastScrollLeft: 0,
170
+ lastScrollTop: 0,
171
+ scrollYStore: {
172
+ startIndex: 0,
173
+ endIndex: 0,
174
+ visibleSize: 0,
175
+ offsetSize: 0,
176
+ rowHeight: 0
177
+ },
178
+ lastScrollTime: 0
179
+ // hpTimeout: undefined
145
180
  };
146
181
  return {
147
182
  xID,
@@ -185,6 +220,11 @@ export default {
185
220
  const props = $xeTree;
186
221
  return props.hasChildField || 'hasChild';
187
222
  },
223
+ computeVirtualYOpts() {
224
+ const $xeTree = this;
225
+ const props = $xeTree;
226
+ return Object.assign({}, getConfig().tree.virtualYConfig, props.virtualYConfig);
227
+ },
188
228
  computeIsRowCurrent() {
189
229
  const $xeTree = this;
190
230
  const props = $xeTree;
@@ -227,16 +267,24 @@ export default {
227
267
  },
228
268
  computeTreeStyle() {
229
269
  const $xeTree = this;
230
- const props = $xeTree;
231
- const { height, minHeight } = props;
270
+ const reactData = $xeTree.reactData;
271
+ const { customHeight, customMinHeight, customMaxHeight } = reactData;
232
272
  const stys = {};
233
- if (height) {
234
- stys.height = toCssUnit(height);
273
+ if (customHeight) {
274
+ stys.height = toCssUnit(customHeight);
275
+ }
276
+ if (customMinHeight) {
277
+ stys.minHeight = toCssUnit(customMinHeight);
235
278
  }
236
- if (minHeight) {
237
- stys.minHeight = toCssUnit(minHeight);
279
+ if (customMaxHeight) {
280
+ stys.maxHeight = toCssUnit(customMaxHeight);
238
281
  }
239
282
  return stys;
283
+ },
284
+ computeFilterOpts() {
285
+ const $xeTree = this;
286
+ const props = $xeTree;
287
+ return Object.assign({}, getConfig().tree.filterConfig, props.filterConfig);
240
288
  } }),
241
289
  methods: {
242
290
  //
@@ -246,458 +294,187 @@ export default {
246
294
  const $xeTree = this;
247
295
  $xeTree.$emit(type, createEvent(evnt, { $tree: $xeTree }, params));
248
296
  },
249
- clearCurrentNode() {
250
- const $xeTree = this;
251
- const reactData = $xeTree.reactData;
252
- reactData.currentNode = null;
253
- return $xeTree.$nextTick();
254
- },
255
- getCurrentNodeId() {
297
+ getNodeId(node) {
256
298
  const $xeTree = this;
257
- const reactData = $xeTree.reactData;
258
- const { currentNode } = reactData;
259
- if (currentNode) {
260
- return $xeTree.getNodeId(currentNode);
261
- }
262
- return null;
299
+ const valueField = $xeTree.computeValueField;
300
+ const nodeid = XEUtils.get(node, valueField);
301
+ return XEUtils.eqNull(nodeid) ? '' : encodeURIComponent(nodeid);
263
302
  },
264
- getCurrentNode() {
303
+ isExpandByNode(node) {
265
304
  const $xeTree = this;
266
305
  const reactData = $xeTree.reactData;
267
306
  const internalData = $xeTree.internalData;
268
- const { currentNode } = reactData;
269
- const { nodeMaps } = internalData;
270
- if (currentNode) {
271
- const nodeItem = nodeMaps[$xeTree.getNodeId(currentNode)];
272
- if (nodeItem) {
273
- return nodeItem.item;
274
- }
275
- }
276
- return null;
307
+ const { updateExpandedFlag } = reactData;
308
+ const { treeExpandedMaps } = internalData;
309
+ const nodeid = $xeTree.getNodeId(node);
310
+ return !!(updateExpandedFlag && treeExpandedMaps[nodeid]);
277
311
  },
278
- setCurrentNodeId(nodeKey) {
312
+ isCheckedByRadioNodeId(nodeid) {
279
313
  const $xeTree = this;
280
314
  const reactData = $xeTree.reactData;
281
- const internalData = $xeTree.internalData;
282
- const { nodeMaps } = internalData;
283
- const nodeItem = nodeMaps[nodeKey];
284
- reactData.currentNode = nodeItem ? nodeItem.item : null;
285
- return $xeTree.$nextTick();
315
+ const { selectRadioKey } = reactData;
316
+ return selectRadioKey === nodeid;
286
317
  },
287
- setCurrentNode(node) {
318
+ isCheckedByRadioNode(node) {
288
319
  const $xeTree = this;
289
- const reactData = $xeTree.reactData;
290
- reactData.currentNode = node;
291
- return $xeTree.$nextTick();
320
+ return $xeTree.isCheckedByRadioNodeId($xeTree.getNodeId(node));
292
321
  },
293
- clearRadioNode() {
322
+ isCheckedByCheckboxNodeId(nodeid) {
294
323
  const $xeTree = this;
295
324
  const reactData = $xeTree.reactData;
296
- reactData.selectRadioKey = null;
297
- return $xeTree.$nextTick();
298
- },
299
- getCheckboxNodeIds() {
300
- const $xeTree = this;
301
325
  const internalData = $xeTree.internalData;
326
+ const { updateCheckboxFlag } = reactData;
302
327
  const { selectCheckboxMaps } = internalData;
303
- return Object.keys(selectCheckboxMaps);
304
- },
305
- getCheckboxNodes() {
306
- const $xeTree = this;
307
- const internalData = $xeTree.internalData;
308
- const { nodeMaps, selectCheckboxMaps } = internalData;
309
- const list = [];
310
- XEUtils.each(selectCheckboxMaps, (item, nodeid) => {
311
- const nodeItem = nodeMaps[nodeid];
312
- if (nodeItem) {
313
- list.push(nodeItem.item);
314
- }
315
- });
316
- return list;
317
- },
318
- clearCheckboxNode() {
319
- const $xeTree = this;
320
- const reactData = $xeTree.reactData;
321
- const internalData = $xeTree.internalData;
322
- internalData.selectCheckboxMaps = {};
323
- reactData.updateCheckboxFlag++;
324
- return $xeTree.$nextTick();
325
- },
326
- setAllCheckboxNode(checked) {
327
- const $xeTree = this;
328
- const props = $xeTree;
329
- const reactData = $xeTree.reactData;
330
- const internalData = $xeTree.internalData;
331
- const { transform } = props;
332
- const selectMaps = {};
333
- const childrenField = $xeTree.computeChildrenField;
334
- const mapChildrenField = $xeTree.computeMapChildrenField;
335
- if (checked) {
336
- XEUtils.eachTree(reactData.treeList, (node) => {
337
- const nodeid = $xeTree.getNodeId(node);
338
- selectMaps[nodeid] = true;
339
- }, { children: transform ? mapChildrenField : childrenField });
340
- }
341
- internalData.selectCheckboxMaps = selectMaps;
342
- reactData.updateCheckboxFlag++;
343
- return $xeTree.$nextTick();
328
+ return !!(updateCheckboxFlag && selectCheckboxMaps[nodeid]);
344
329
  },
345
- clearExpandNode() {
330
+ isCheckedByCheckboxNode(node) {
346
331
  const $xeTree = this;
347
- return $xeTree.clearAllExpandNode();
332
+ return $xeTree.isCheckedByCheckboxNodeId($xeTree.getNodeId(node));
348
333
  },
349
- clearAllExpandNode() {
334
+ isIndeterminateByCheckboxNodeid(nodeid) {
350
335
  const $xeTree = this;
351
336
  const reactData = $xeTree.reactData;
352
337
  const internalData = $xeTree.internalData;
353
- const { nodeMaps } = internalData;
354
- XEUtils.each(nodeMaps, (nodeItem) => {
355
- nodeItem.treeLoaded = false;
356
- });
357
- internalData.treeExpandedMaps = {};
358
- reactData.updateExpandedFlag++;
359
- return $xeTree.$nextTick();
338
+ const { updateCheckboxFlag } = reactData;
339
+ const { indeterminateRowMaps } = internalData;
340
+ return !!(updateCheckboxFlag && indeterminateRowMaps[nodeid]);
360
341
  },
361
- setExpandByNodeId(nodeids, expanded) {
342
+ isIndeterminateByCheckboxNode(node) {
362
343
  const $xeTree = this;
363
- const reactData = $xeTree.reactData;
364
- const internalData = $xeTree.internalData;
365
- const { treeExpandedMaps } = internalData;
366
- if (nodeids) {
367
- if (!XEUtils.isArray(nodeids)) {
368
- nodeids = [nodeids];
369
- }
370
- nodeids.forEach((nodeid) => {
371
- handleSetExpand(nodeid, expanded, treeExpandedMaps);
372
- });
373
- reactData.updateExpandedFlag++;
374
- }
375
- return $xeTree.$nextTick();
344
+ return $xeTree.isIndeterminateByCheckboxNodeid($xeTree.getNodeId(node));
376
345
  },
377
- getExpandNodeIds() {
346
+ emitCheckboxMode(value) {
378
347
  const $xeTree = this;
379
- const internalData = $xeTree.internalData;
380
- const { treeExpandedMaps } = internalData;
381
- return XEUtils.keys(treeExpandedMaps);
348
+ $xeTree.$emit('update:checkNodeKeys', value);
382
349
  },
383
- getExpandNodes() {
350
+ emitRadioMode(value) {
384
351
  const $xeTree = this;
385
- const internalData = $xeTree.internalData;
386
- const { nodeMaps, treeExpandedMaps } = internalData;
387
- const list = [];
388
- XEUtils.each(treeExpandedMaps, (item, nodeid) => {
389
- const nodeItem = nodeMaps[nodeid];
390
- if (nodeItem) {
391
- list.push(nodeItem.item);
392
- }
393
- });
394
- return list;
352
+ $xeTree.$emit('update:checkNodeKey', value);
395
353
  },
396
- setExpandNode(nodes, expanded) {
354
+ setRadioNode(node) {
397
355
  const $xeTree = this;
398
356
  const reactData = $xeTree.reactData;
399
- const internalData = $xeTree.internalData;
400
- const { treeExpandedMaps } = internalData;
401
- if (nodes) {
402
- if (!XEUtils.isArray(nodes)) {
403
- nodes = [nodes];
404
- }
405
- nodes.forEach((node) => {
406
- const nodeid = $xeTree.getNodeId(node);
407
- handleSetExpand(nodeid, expanded, treeExpandedMaps);
408
- });
409
- reactData.updateExpandedFlag++;
357
+ if (node) {
358
+ reactData.selectRadioKey = $xeTree.getNodeId(node);
410
359
  }
411
360
  return $xeTree.$nextTick();
412
361
  },
413
- toggleExpandByNodeId(nodeids) {
362
+ setCheckboxNode(nodeList, checked) {
414
363
  const $xeTree = this;
415
- const reactData = $xeTree.reactData;
416
- const internalData = $xeTree.internalData;
417
- const { treeExpandedMaps } = internalData;
418
- if (nodeids) {
419
- if (!XEUtils.isArray(nodeids)) {
420
- nodeids = [nodeids];
364
+ if (nodeList) {
365
+ if (!XEUtils.isArray(nodeList)) {
366
+ nodeList = [nodeList];
421
367
  }
422
- nodeids.forEach((nodeid) => {
423
- handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
424
- });
425
- reactData.updateExpandedFlag++;
368
+ $xeTree.handleCheckedCheckboxNode(nodeList, checked);
426
369
  }
427
370
  return $xeTree.$nextTick();
428
371
  },
429
- toggleExpandNode(nodes) {
372
+ setCheckboxByNodeId(nodeIds, checked) {
430
373
  const $xeTree = this;
431
- const reactData = $xeTree.reactData;
432
374
  const internalData = $xeTree.internalData;
433
- const { treeExpandedMaps } = internalData;
434
- if (nodes) {
435
- if (!XEUtils.isArray(nodes)) {
436
- nodes = [nodes];
375
+ const { nodeMaps } = internalData;
376
+ if (nodeIds) {
377
+ if (!XEUtils.isArray(nodeIds)) {
378
+ nodeIds = [nodeIds];
437
379
  }
438
- nodes.forEach((node) => {
439
- const nodeid = $xeTree.getNodeId(node);
440
- handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
380
+ const nodeList = [];
381
+ nodeIds.forEach((nodeid) => {
382
+ const nodeItem = nodeMaps[nodeid];
383
+ if (nodeItem) {
384
+ nodeList.push(nodeItem.item);
385
+ }
441
386
  });
442
- reactData.updateExpandedFlag++;
387
+ $xeTree.handleCheckedCheckboxNode(nodeList, checked);
443
388
  }
444
389
  return $xeTree.$nextTick();
445
390
  },
446
- setAllExpandNode(expanded) {
391
+ handleCheckedCheckboxNode(nodeList, checked) {
447
392
  const $xeTree = this;
448
393
  const props = $xeTree;
449
394
  const reactData = $xeTree.reactData;
450
395
  const internalData = $xeTree.internalData;
451
396
  const { transform } = props;
452
- const { treeExpandedMaps } = internalData;
453
- const childrenField = $xeTree.computeChildrenField;
397
+ const { selectCheckboxMaps } = internalData;
454
398
  const mapChildrenField = $xeTree.computeMapChildrenField;
455
- if (expanded) {
456
- XEUtils.eachTree(reactData.treeList, (node) => {
457
- const childList = XEUtils.get(node, childrenField);
458
- const hasChild = childList && childList.length;
459
- if (hasChild) {
460
- const nodeid = $xeTree.getNodeId(node);
461
- treeExpandedMaps[nodeid] = true;
399
+ const childrenField = $xeTree.computeChildrenField;
400
+ const checkboxOpts = $xeTree.computeCheckboxOpts;
401
+ const { checkStrictly } = checkboxOpts;
402
+ const handleSelect = (node) => {
403
+ const nodeid = $xeTree.getNodeId(node);
404
+ if (checked) {
405
+ if (!selectCheckboxMaps[nodeid]) {
406
+ selectCheckboxMaps[nodeid] = node;
462
407
  }
463
- }, { children: transform ? mapChildrenField : childrenField });
408
+ }
409
+ else {
410
+ if (selectCheckboxMaps[nodeid]) {
411
+ delete selectCheckboxMaps[nodeid];
412
+ }
413
+ }
414
+ };
415
+ if (checkStrictly) {
416
+ nodeList.forEach(handleSelect);
464
417
  }
465
418
  else {
466
- internalData.treeExpandedMaps = {};
419
+ XEUtils.eachTree(nodeList, handleSelect, { children: transform ? mapChildrenField : childrenField });
467
420
  }
468
- reactData.updateExpandedFlag++;
469
- return $xeTree.$nextTick();
421
+ reactData.updateCheckboxFlag++;
422
+ $xeTree.updateCheckboxStatus();
470
423
  },
471
- reloadExpandNode(node) {
424
+ updateCheckboxChecked(nodeIds) {
472
425
  const $xeTree = this;
473
- const props = $xeTree;
474
- const { lazy } = props;
475
- if (lazy) {
476
- $xeTree.clearExpandLoaded(node);
477
- return $xeTree.handleAsyncTreeExpandChilds(node);
478
- }
479
- return $xeTree.$nextTick();
480
- },
481
- clearExpandLoaded(node) {
482
- const $xeTree = this;
483
- const props = $xeTree;
484
- const internalData = $xeTree.internalData;
485
- const { lazy } = props;
486
- const { nodeMaps } = internalData;
487
- if (lazy) {
488
- const nodeItem = nodeMaps[$xeTree.getNodeId(node)];
489
- if (nodeItem) {
490
- nodeItem.treeLoaded = false;
491
- }
492
- }
493
- return $xeTree.$nextTick();
494
- },
495
- /**
496
- * 用于树结构,给行数据加载子节点
497
- */
498
- loadChildrenNode(node, childRecords) {
499
- const $xeTree = this;
500
- const props = $xeTree;
501
- const internalData = $xeTree.internalData;
502
- const { lazy, transform } = props;
503
- const { nodeMaps } = internalData;
504
- if (!lazy) {
505
- return Promise.resolve([]);
506
- }
507
- const childrenField = $xeTree.computeChildrenField;
508
- const parentNodeItem = nodeMaps[$xeTree.getNodeId(node)];
509
- const parentLevel = parentNodeItem ? parentNodeItem.level : 0;
510
- const parentNodes = parentNodeItem ? parentNodeItem.nodes : [];
511
- return $xeTree.createNode(childRecords).then((nodeList) => {
512
- XEUtils.eachTree(nodeList, (childRow, index, items, path, parent, nodes) => {
513
- const itemNodeId = $xeTree.getNodeId(childRow);
514
- nodeMaps[itemNodeId] = {
515
- item: node,
516
- itemIndex: -1,
517
- items,
518
- parent: parent || parentNodeItem.item,
519
- nodes: parentNodes.concat(nodes),
520
- level: parentLevel + nodes.length,
521
- lineCount: 0,
522
- treeLoaded: false
523
- };
524
- }, { children: childrenField });
525
- node[childrenField] = nodeList;
526
- if (transform) {
527
- node[childrenField] = nodeList;
528
- }
529
- $xeTree.updateNodeLine(node);
530
- return nodeList;
531
- });
532
- },
533
- getNodeId(node) {
534
- const $xeTree = this;
535
- const valueField = $xeTree.computeValueField;
536
- const nodeid = XEUtils.get(node, valueField);
537
- return XEUtils.eqNull(nodeid) ? '' : encodeURIComponent(nodeid);
538
- },
539
- isExpandByNode(node) {
540
- const $xeTree = this;
541
- const reactData = $xeTree.reactData;
542
- const internalData = $xeTree.internalData;
543
- const { updateExpandedFlag } = reactData;
544
- const { treeExpandedMaps } = internalData;
545
- const nodeid = $xeTree.getNodeId(node);
546
- return !!(updateExpandedFlag && treeExpandedMaps[nodeid]);
547
- },
548
- isCheckedByRadioNodeId(nodeid) {
549
- const $xeTree = this;
550
- const reactData = $xeTree.reactData;
551
- const { selectRadioKey } = reactData;
552
- return selectRadioKey === nodeid;
553
- },
554
- isCheckedByRadioNode(node) {
555
- const $xeTree = this;
556
- return $xeTree.isCheckedByRadioNodeId($xeTree.getNodeId(node));
557
- },
558
- isCheckedByCheckboxNodeId(nodeid) {
559
- const $xeTree = this;
560
- const reactData = $xeTree.reactData;
561
- const internalData = $xeTree.internalData;
562
- const { updateCheckboxFlag } = reactData;
563
- const { selectCheckboxMaps } = internalData;
564
- return !!(updateCheckboxFlag && selectCheckboxMaps[nodeid]);
565
- },
566
- isCheckedByCheckboxNode(node) {
567
- const $xeTree = this;
568
- return $xeTree.isCheckedByCheckboxNodeId($xeTree.getNodeId(node));
569
- },
570
- isIndeterminateByCheckboxNodeid(nodeid) {
571
- const $xeTree = this;
572
- const reactData = $xeTree.reactData;
573
- const internalData = $xeTree.internalData;
574
- const { updateCheckboxFlag } = reactData;
575
- const { indeterminateRowMaps } = internalData;
576
- return !!(updateCheckboxFlag && indeterminateRowMaps[nodeid]);
577
- },
578
- isIndeterminateByCheckboxNode(node) {
579
- const $xeTree = this;
580
- return $xeTree.isIndeterminateByCheckboxNodeid($xeTree.getNodeId(node));
581
- },
582
- getCheckboxIndeterminateNodes() {
583
- const $xeTree = this;
584
- const internalData = $xeTree.internalData;
585
- const { nodeMaps, indeterminateRowMaps } = internalData;
586
- const list = [];
587
- XEUtils.each(indeterminateRowMaps, (item, nodeid) => {
588
- const nodeItem = nodeMaps[nodeid];
589
- if (nodeItem) {
590
- list.push(nodeItem.item);
591
- }
592
- });
593
- return list;
594
- },
595
- emitCheckboxMode(value) {
596
- const $xeTree = this;
597
- $xeTree.$emit('update:checkNodeKeys', value);
598
- },
599
- emitRadioMode(value) {
600
- const $xeTree = this;
601
- $xeTree.$emit('update:checkNodeKey', value);
602
- },
603
- getRadioNodeId() {
604
- const $xeTree = this;
605
- const reactData = $xeTree.reactData;
606
- return reactData.selectRadioKey || null;
607
- },
608
- setRadioNodeId(nodeKey) {
609
- const $xeTree = this;
610
- const reactData = $xeTree.reactData;
611
- reactData.selectRadioKey = nodeKey;
612
- return $xeTree.$nextTick();
426
+ $xeTree.setCheckboxByNodeId(nodeIds, true);
613
427
  },
614
- getRadioNode() {
615
- const $xeTree = this;
616
- const reactData = $xeTree.reactData;
617
- const internalData = $xeTree.internalData;
618
- const { selectRadioKey } = reactData;
619
- const { nodeMaps } = internalData;
620
- if (selectRadioKey) {
621
- const nodeItem = nodeMaps[selectRadioKey];
622
- if (nodeItem) {
623
- return nodeItem.item;
428
+ handleSetExpand(nodeid, expanded, expandedMaps) {
429
+ if (expanded) {
430
+ if (!expandedMaps[nodeid]) {
431
+ expandedMaps[nodeid] = true;
624
432
  }
625
433
  }
626
- return null;
627
- },
628
- setRadioNode(node) {
629
- const $xeTree = this;
630
- const reactData = $xeTree.reactData;
631
- if (node) {
632
- reactData.selectRadioKey = $xeTree.getNodeId(node);
633
- }
634
- return $xeTree.$nextTick();
635
- },
636
- setCheckboxNode(nodeList, checked) {
637
- const $xeTree = this;
638
- if (nodeList) {
639
- if (!XEUtils.isArray(nodeList)) {
640
- nodeList = [nodeList];
434
+ else {
435
+ if (expandedMaps[nodeid]) {
436
+ delete expandedMaps[nodeid];
641
437
  }
642
- $xeTree.handleCheckedCheckboxNode(nodeList, checked);
643
438
  }
644
- return $xeTree.$nextTick();
645
439
  },
646
- setCheckboxByNodeId(nodeIds, checked) {
440
+ getParentElem() {
647
441
  const $xeTree = this;
648
- const internalData = $xeTree.internalData;
649
- const { nodeMaps } = internalData;
650
- if (nodeIds) {
651
- if (!XEUtils.isArray(nodeIds)) {
652
- nodeIds = [nodeIds];
653
- }
654
- const nodeList = [];
655
- nodeIds.forEach((nodeid) => {
656
- const nodeItem = nodeMaps[nodeid];
657
- if (nodeItem) {
658
- nodeList.push(nodeItem.item);
659
- }
660
- });
661
- $xeTree.handleCheckedCheckboxNode(nodeList, checked);
662
- }
663
- return $xeTree.$nextTick();
442
+ const el = $xeTree.$refs.refElem;
443
+ return el ? el.parentElement : null;
664
444
  },
665
- handleCheckedCheckboxNode(nodeList, checked) {
445
+ calcTableHeight(key) {
666
446
  const $xeTree = this;
667
447
  const props = $xeTree;
668
448
  const reactData = $xeTree.reactData;
669
- const internalData = $xeTree.internalData;
670
- const { transform } = props;
671
- const { selectCheckboxMaps } = internalData;
672
- const mapChildrenField = $xeTree.computeMapChildrenField;
673
- const childrenField = $xeTree.computeChildrenField;
674
- const checkboxOpts = $xeTree.computeCheckboxOpts;
675
- const { checkStrictly } = checkboxOpts;
676
- const handleSelect = (node) => {
677
- const nodeid = $xeTree.getNodeId(node);
678
- if (checked) {
679
- if (!selectCheckboxMaps[nodeid]) {
680
- selectCheckboxMaps[nodeid] = node;
681
- }
449
+ const { parentHeight } = reactData;
450
+ const val = props[key];
451
+ let num = 0;
452
+ if (val) {
453
+ if (val === '100%' || val === 'auto') {
454
+ num = parentHeight;
682
455
  }
683
456
  else {
684
- if (selectCheckboxMaps[nodeid]) {
685
- delete selectCheckboxMaps[nodeid];
457
+ if (isScale(val)) {
458
+ num = Math.floor((XEUtils.toInteger(val) || 1) / 100 * parentHeight);
686
459
  }
460
+ else {
461
+ num = XEUtils.toNumber(val);
462
+ }
463
+ num = Math.max(40, num);
687
464
  }
688
- };
689
- if (checkStrictly) {
690
- nodeList.forEach(handleSelect);
691
- }
692
- else {
693
- XEUtils.eachTree(nodeList, handleSelect, { children: transform ? mapChildrenField : childrenField });
694
465
  }
695
- reactData.updateCheckboxFlag++;
696
- $xeTree.updateCheckboxStatus();
466
+ return num;
697
467
  },
698
- updateCheckboxChecked(nodeIds) {
468
+ updateHeight() {
699
469
  const $xeTree = this;
700
- $xeTree.setCheckboxByNodeId(nodeIds, true);
470
+ const reactData = $xeTree.reactData;
471
+ reactData.customHeight = $xeTree.calcTableHeight('height');
472
+ reactData.customMinHeight = $xeTree.calcTableHeight('minHeight');
473
+ reactData.customMaxHeight = $xeTree.calcTableHeight('maxHeight');
474
+ // 如果启用虚拟滚动,默认高度
475
+ if (reactData.scrollYLoad && !(reactData.customHeight || reactData.customMinHeight)) {
476
+ reactData.customHeight = 300;
477
+ }
701
478
  },
702
479
  createNode(records) {
703
480
  const $xeTree = this;
@@ -714,16 +491,12 @@ export default {
714
491
  },
715
492
  cacheNodeMap() {
716
493
  const $xeTree = this;
717
- const props = $xeTree;
718
- const reactData = $xeTree.reactData;
719
494
  const internalData = $xeTree.internalData;
720
- const { transform } = props;
721
- const { treeList } = reactData;
495
+ const { treeFullData } = internalData;
722
496
  const valueField = $xeTree.computeValueField;
723
497
  const childrenField = $xeTree.computeChildrenField;
724
- const mapChildrenField = $xeTree.computeMapChildrenField;
725
498
  const keyMaps = {};
726
- XEUtils.eachTree(treeList, (item, itemIndex, items, path, parent, nodes) => {
499
+ XEUtils.eachTree(treeFullData, (item, index, items, path, parent, nodes) => {
727
500
  let nodeid = $xeTree.getNodeId(item);
728
501
  if (!nodeid) {
729
502
  nodeid = getNodeUniqueId();
@@ -731,78 +504,399 @@ export default {
731
504
  }
732
505
  keyMaps[nodeid] = {
733
506
  item,
734
- itemIndex,
507
+ index,
735
508
  items,
736
509
  parent,
737
510
  nodes,
738
511
  level: nodes.length,
512
+ treeIndex: index,
739
513
  lineCount: 0,
740
514
  treeLoaded: false
741
515
  };
742
- }, { children: transform ? mapChildrenField : childrenField });
516
+ }, { children: childrenField });
743
517
  internalData.nodeMaps = keyMaps;
744
518
  },
745
- loadTreeData(list) {
519
+ updateAfterDataIndex() {
746
520
  const $xeTree = this;
747
521
  const props = $xeTree;
748
- const reactData = $xeTree.reactData;
749
522
  const internalData = $xeTree.internalData;
750
- const { expandAll, transform } = props;
751
- const { initialized } = internalData;
752
- const keyField = $xeTree.computeKeyField;
753
- const parentField = $xeTree.computeParentField;
523
+ const { transform } = props;
524
+ const { afterTreeList, nodeMaps } = internalData;
525
+ const childrenField = $xeTree.computeChildrenField;
754
526
  const mapChildrenField = $xeTree.computeMapChildrenField;
755
- if (transform) {
756
- reactData.treeList = XEUtils.toArrayTree(list, { key: keyField, parentKey: parentField, mapChildren: mapChildrenField });
757
- }
758
- else {
759
- reactData.treeList = list ? list.slice(0) : [];
760
- }
761
- $xeTree.cacheNodeMap();
762
- if (!initialized) {
763
- if (list && list.length) {
764
- internalData.initialized = true;
765
- if (expandAll) {
766
- $xeTree.setAllExpandNode(true);
767
- }
768
- $xeTree.setCheckboxByNodeId(props.checkNodeKeys || [], true);
527
+ XEUtils.eachTree(afterTreeList, (item, index, items) => {
528
+ const nodeid = $xeTree.getNodeId(item);
529
+ const nodeItem = nodeMaps[nodeid];
530
+ if (nodeItem) {
531
+ nodeItem.items = items;
532
+ nodeItem.treeIndex = index;
769
533
  }
770
- }
534
+ else {
535
+ const rest = {
536
+ item,
537
+ index,
538
+ items,
539
+ parent,
540
+ nodes: [],
541
+ level: 0,
542
+ treeIndex: index,
543
+ lineCount: 0,
544
+ treeLoaded: false
545
+ };
546
+ nodeMaps[nodeid] = rest;
547
+ }
548
+ }, { children: transform ? mapChildrenField : childrenField });
771
549
  },
772
- handleCountLine(item, isRoot, nodeItem) {
550
+ updateAfterFullData() {
773
551
  const $xeTree = this;
552
+ const props = $xeTree;
774
553
  const internalData = $xeTree.internalData;
775
- const { treeExpandedMaps } = internalData;
554
+ const { transform, filterValue } = props;
555
+ const { treeFullData, lastFilterValue } = internalData;
556
+ const titleField = $xeTree.computeTitleField;
776
557
  const childrenField = $xeTree.computeChildrenField;
777
- const nodeid = $xeTree.getNodeId(item);
778
- nodeItem.lineCount++;
779
- if (treeExpandedMaps[nodeid]) {
780
- XEUtils.arrayEach(item[childrenField], (childItem, childIndex, childList) => {
781
- if (!isRoot || childIndex < childList.length - 1) {
782
- $xeTree.handleCountLine(childItem, false, nodeItem);
558
+ const mapChildrenField = $xeTree.computeMapChildrenField;
559
+ const filterOpts = $xeTree.computeFilterOpts;
560
+ const { autoExpandAll, beforeFilterMethod, filterMethod, afterFilterMethod } = filterOpts;
561
+ let fullList = treeFullData;
562
+ let treeList = fullList;
563
+ let filterStr = '';
564
+ if (filterValue || filterValue === 0) {
565
+ filterStr = `${filterValue}`;
566
+ const handleSearch = filterMethod
567
+ ? (item) => {
568
+ return filterMethod({
569
+ $tree: $xeTree,
570
+ node: item,
571
+ filterValue: filterStr
572
+ });
573
+ }
574
+ : (item) => {
575
+ return String(item[titleField]).toLowerCase().indexOf(filterStr) > -1;
576
+ };
577
+ const bafParams = { $tree: $xeTree, filterValue: filterStr };
578
+ if (beforeFilterMethod) {
579
+ beforeFilterMethod(bafParams);
580
+ }
581
+ if (transform) {
582
+ treeList = XEUtils.searchTree(treeFullData, handleSearch, { children: childrenField, mapChildren: mapChildrenField, isEvery: true });
583
+ fullList = treeList;
584
+ }
585
+ else {
586
+ fullList = treeFullData.filter(handleSearch);
587
+ }
588
+ internalData.lastFilterValue = filterStr;
589
+ $xeTree.$nextTick(() => {
590
+ // 筛选时自动展开
591
+ if (autoExpandAll) {
592
+ $xeTree.setAllExpandNode(true).then(() => {
593
+ if (afterFilterMethod) {
594
+ afterFilterMethod(bafParams);
595
+ }
596
+ });
597
+ }
598
+ else {
599
+ if (afterFilterMethod) {
600
+ afterFilterMethod(bafParams);
601
+ }
783
602
  }
784
603
  });
785
604
  }
786
- },
787
- updateNodeLine(node) {
788
- const $xeTree = this;
605
+ else {
606
+ if (transform) {
607
+ treeList = XEUtils.searchTree(treeFullData, () => true, { children: childrenField, mapChildren: mapChildrenField, isEvery: true });
608
+ fullList = treeList;
609
+ if (lastFilterValue) {
610
+ const bafParams = { $tree: $xeTree, filterValue: filterStr };
611
+ if (beforeFilterMethod) {
612
+ beforeFilterMethod(bafParams);
613
+ }
614
+ // 取消筛选时自动收起
615
+ $xeTree.$nextTick(() => {
616
+ if (autoExpandAll) {
617
+ $xeTree.clearAllExpandNode().then(() => {
618
+ if (afterFilterMethod) {
619
+ afterFilterMethod(bafParams);
620
+ }
621
+ });
622
+ }
623
+ else {
624
+ if (afterFilterMethod) {
625
+ afterFilterMethod(bafParams);
626
+ }
627
+ }
628
+ });
629
+ }
630
+ }
631
+ internalData.lastFilterValue = '';
632
+ }
633
+ internalData.afterVisibleList = fullList;
634
+ internalData.afterTreeList = treeList;
635
+ $xeTree.updateAfterDataIndex();
636
+ },
637
+ /**
638
+ * 如果为虚拟树、则将树结构拍平
639
+ */
640
+ handleTreeToList() {
641
+ const $xeTree = this;
642
+ const props = $xeTree;
789
643
  const internalData = $xeTree.internalData;
790
- const { nodeMaps } = internalData;
791
- if (node) {
792
- const nodeid = $xeTree.getNodeId(node);
793
- const nodeItem = nodeMaps[nodeid];
794
- if (nodeItem) {
795
- XEUtils.lastArrayEach(nodeItem.nodes, childItem => {
796
- const nodeid = $xeTree.getNodeId(childItem);
797
- const nodeItem = nodeMaps[nodeid];
798
- if (nodeItem) {
799
- nodeItem.lineCount = 0;
800
- $xeTree.handleCountLine(childItem, true, nodeItem);
644
+ const { transform } = props;
645
+ const { afterTreeList, treeExpandedMaps } = internalData;
646
+ const mapChildrenField = $xeTree.computeMapChildrenField;
647
+ const expandMaps = {};
648
+ if (transform) {
649
+ const fullData = [];
650
+ XEUtils.eachTree(afterTreeList, (item, index, items, path, parentRow) => {
651
+ const nodeid = $xeTree.getNodeId(item);
652
+ const parentNodeid = $xeTree.getNodeId(parentRow);
653
+ if (!parentRow || (expandMaps[parentNodeid] && treeExpandedMaps[parentNodeid])) {
654
+ expandMaps[nodeid] = 1;
655
+ fullData.push(item);
656
+ }
657
+ }, { children: mapChildrenField });
658
+ $xeTree.updateScrollYStatus(fullData);
659
+ internalData.afterVisibleList = fullData;
660
+ return fullData;
661
+ }
662
+ return internalData.afterVisibleList;
663
+ },
664
+ handleData(force) {
665
+ const $xeTree = this;
666
+ const reactData = $xeTree.reactData;
667
+ const internalData = $xeTree.internalData;
668
+ const { scrollYLoad } = reactData;
669
+ const { scrollYStore } = internalData;
670
+ let fullList = internalData.afterVisibleList;
671
+ if (force) {
672
+ // 更新数据,处理筛选和排序
673
+ $xeTree.updateAfterFullData();
674
+ // 如果为虚拟树,将树结构拍平
675
+ fullList = $xeTree.handleTreeToList();
676
+ }
677
+ const treeList = scrollYLoad ? fullList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullList.slice(0);
678
+ reactData.treeList = treeList;
679
+ },
680
+ triggerSearchEvent: XEUtils.debounce(function () {
681
+ const $xeSelect = this;
682
+ $xeSelect.handleData(true);
683
+ }, 350, { trailing: true }),
684
+ loadData(list) {
685
+ const $xeTree = this;
686
+ const props = $xeTree;
687
+ const internalData = $xeTree.internalData;
688
+ const { expandAll, transform } = props;
689
+ const { initialized, scrollYStore } = internalData;
690
+ const keyField = $xeTree.computeKeyField;
691
+ const parentField = $xeTree.computeParentField;
692
+ const childrenField = $xeTree.computeChildrenField;
693
+ const fullData = transform ? XEUtils.toArrayTree(list, { key: keyField, parentKey: parentField, mapChildren: childrenField }) : list ? list.slice(0) : [];
694
+ internalData.treeFullData = fullData;
695
+ Object.assign(scrollYStore, {
696
+ startIndex: 0,
697
+ endIndex: 1,
698
+ visibleSize: 0
699
+ });
700
+ const sYLoad = $xeTree.updateScrollYStatus(fullData);
701
+ $xeTree.cacheNodeMap();
702
+ $xeTree.handleData(true);
703
+ if (sYLoad) {
704
+ if (!(props.height || props.maxHeight)) {
705
+ errLog('vxe.error.reqProp', ['height | max-height | virtual-y-config.enabled=false']);
706
+ }
707
+ }
708
+ return $xeTree.computeScrollLoad().then(() => {
709
+ if (!initialized) {
710
+ if (list && list.length) {
711
+ internalData.initialized = true;
712
+ if (expandAll) {
713
+ $xeTree.setAllExpandNode(true);
801
714
  }
802
- });
715
+ $xeTree.setCheckboxByNodeId(props.checkNodeKeys || [], true);
716
+ }
717
+ }
718
+ $xeTree.updateHeight();
719
+ $xeTree.refreshScroll();
720
+ });
721
+ },
722
+ updateScrollYStatus(fullData) {
723
+ const $xeTree = this;
724
+ const props = $xeTree;
725
+ const reactData = $xeTree.reactData;
726
+ const internalData = $xeTree.internalData;
727
+ const { transform } = props;
728
+ const virtualYOpts = $xeTree.computeVirtualYOpts;
729
+ const allList = fullData || internalData.treeFullData;
730
+ // 如果gt为0,则总是启用
731
+ const scrollYLoad = !!transform && !!virtualYOpts.enabled && virtualYOpts.gt > -1 && (virtualYOpts.gt === 0 || virtualYOpts.gt < allList.length);
732
+ reactData.scrollYLoad = scrollYLoad;
733
+ return scrollYLoad;
734
+ },
735
+ updateYSpace() {
736
+ const $xeTree = this;
737
+ const reactData = $xeTree.reactData;
738
+ const internalData = $xeTree.internalData;
739
+ const { scrollYLoad } = reactData;
740
+ const { scrollYStore, afterVisibleList } = internalData;
741
+ reactData.bodyHeight = scrollYLoad ? afterVisibleList.length * scrollYStore.rowHeight : 0;
742
+ reactData.topSpaceHeight = scrollYLoad ? Math.max(scrollYStore.startIndex * scrollYStore.rowHeight, 0) : 0;
743
+ },
744
+ updateYData() {
745
+ const $xeTree = this;
746
+ $xeTree.handleData();
747
+ $xeTree.updateYSpace();
748
+ },
749
+ computeScrollLoad() {
750
+ const $xeTree = this;
751
+ const reactData = $xeTree.reactData;
752
+ const internalData = $xeTree.internalData;
753
+ return $xeTree.$nextTick().then(() => {
754
+ const { scrollYLoad } = reactData;
755
+ const { scrollYStore } = internalData;
756
+ const virtualBodyElem = $xeTree.$refs.refVirtualBody;
757
+ const virtualYOpts = $xeTree.computeVirtualYOpts;
758
+ let rowHeight = 0;
759
+ let firstItemElem;
760
+ if (virtualBodyElem) {
761
+ if (!firstItemElem) {
762
+ firstItemElem = virtualBodyElem.children[0];
763
+ }
764
+ }
765
+ if (firstItemElem) {
766
+ rowHeight = firstItemElem.offsetHeight;
767
+ }
768
+ rowHeight = Math.max(20, rowHeight);
769
+ scrollYStore.rowHeight = rowHeight;
770
+ // 计算 Y 逻辑
771
+ if (scrollYLoad) {
772
+ const scrollBodyElem = $xeTree.$refs.refVirtualWrapper;
773
+ const visibleYSize = Math.max(8, scrollBodyElem ? Math.ceil(scrollBodyElem.clientHeight / rowHeight) : 0);
774
+ const offsetYSize = Math.max(0, Math.min(2, XEUtils.toNumber(virtualYOpts.oSize)));
775
+ scrollYStore.offsetSize = offsetYSize;
776
+ scrollYStore.visibleSize = visibleYSize;
777
+ scrollYStore.endIndex = Math.max(scrollYStore.startIndex, visibleYSize + offsetYSize, scrollYStore.endIndex);
778
+ $xeTree.updateYData();
779
+ }
780
+ else {
781
+ $xeTree.updateYSpace();
782
+ }
783
+ });
784
+ },
785
+ /**
786
+ * 如果有滚动条,则滚动到对应的位置
787
+ * @param {Number} scrollLeft 左距离
788
+ * @param {Number} scrollTop 上距离
789
+ */
790
+ scrollTo(scrollLeft, scrollTop) {
791
+ const $xeTree = this;
792
+ const reactData = $xeTree.reactData;
793
+ const scrollBodyElem = $xeTree.$refs.refVirtualWrapper;
794
+ if (scrollBodyElem) {
795
+ if (XEUtils.isNumber(scrollLeft)) {
796
+ scrollBodyElem.scrollLeft = scrollLeft;
797
+ }
798
+ if (XEUtils.isNumber(scrollTop)) {
799
+ scrollBodyElem.scrollTop = scrollTop;
800
+ }
801
+ }
802
+ if (reactData.scrollYLoad) {
803
+ return new Promise(resolve => {
804
+ setTimeout(() => {
805
+ $xeTree.$nextTick(() => {
806
+ resolve();
807
+ });
808
+ }, 50);
809
+ });
810
+ }
811
+ return $xeTree.$nextTick();
812
+ },
813
+ /**
814
+ * 刷新滚动条
815
+ */
816
+ refreshScroll() {
817
+ const $xeTree = this;
818
+ const internalData = $xeTree.internalData;
819
+ const { lastScrollLeft, lastScrollTop } = internalData;
820
+ return $xeTree.clearScroll().then(() => {
821
+ if (lastScrollLeft || lastScrollTop) {
822
+ internalData.lastScrollLeft = 0;
823
+ internalData.lastScrollTop = 0;
824
+ return scrollTo(lastScrollLeft, lastScrollTop);
825
+ }
826
+ });
827
+ },
828
+ /**
829
+ * 重新计算列表
830
+ */
831
+ recalculate() {
832
+ const $xeTree = this;
833
+ const reactData = $xeTree.reactData;
834
+ const internalData = $xeTree.internalData;
835
+ const { scrollYStore } = internalData;
836
+ const { rowHeight } = scrollYStore;
837
+ const el = $xeTree.$refs.refElem;
838
+ if (el && el.clientWidth && el.clientHeight) {
839
+ const parentEl = $xeTree.getParentElem();
840
+ const headerWrapperEl = $xeTree.$refs.refHeaderWrapperElem;
841
+ const footerWrapperEl = $xeTree.$refs.refFooterWrapperElem;
842
+ const headHeight = headerWrapperEl ? headerWrapperEl.clientHeight : 0;
843
+ const footHeight = footerWrapperEl ? footerWrapperEl.clientHeight : 0;
844
+ if (parentEl) {
845
+ const parentPaddingSize = getPaddingTopBottomSize(parentEl);
846
+ reactData.parentHeight = Math.max(headHeight + footHeight + rowHeight, parentEl.clientHeight - parentPaddingSize - headHeight - footHeight);
847
+ }
848
+ $xeTree.updateHeight();
849
+ return $xeTree.computeScrollLoad();
850
+ }
851
+ return $xeTree.$nextTick();
852
+ },
853
+ loadYData(evnt) {
854
+ const $xeTree = this;
855
+ const internalData = $xeTree.internalData;
856
+ const { scrollYStore } = internalData;
857
+ const { startIndex, endIndex, visibleSize, offsetSize, rowHeight } = scrollYStore;
858
+ const scrollBodyElem = evnt.target;
859
+ const scrollTop = scrollBodyElem.scrollTop;
860
+ const toVisibleIndex = Math.floor(scrollTop / rowHeight);
861
+ const offsetStartIndex = Math.max(0, toVisibleIndex - 1 - offsetSize);
862
+ const offsetEndIndex = toVisibleIndex + visibleSize + offsetSize;
863
+ if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
864
+ if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
865
+ scrollYStore.startIndex = offsetStartIndex;
866
+ scrollYStore.endIndex = offsetEndIndex;
867
+ $xeTree.updateYData();
803
868
  }
804
869
  }
805
870
  },
871
+ scrollEvent(evnt) {
872
+ const $xeTree = this;
873
+ const reactData = $xeTree.reactData;
874
+ const internalData = $xeTree.internalData;
875
+ const scrollBodyElem = evnt.target;
876
+ const scrollTop = scrollBodyElem.scrollTop;
877
+ const scrollLeft = scrollBodyElem.scrollLeft;
878
+ const isX = scrollLeft !== internalData.lastScrollLeft;
879
+ const isY = scrollTop !== internalData.lastScrollTop;
880
+ internalData.lastScrollTop = scrollTop;
881
+ internalData.lastScrollLeft = scrollLeft;
882
+ if (reactData.scrollYLoad) {
883
+ $xeTree.loadYData(evnt);
884
+ }
885
+ internalData.lastScrollTime = Date.now();
886
+ $xeTree.dispatchEvent('scroll', { scrollLeft, scrollTop, isX, isY }, evnt);
887
+ },
888
+ clearScroll() {
889
+ const $xeTree = this;
890
+ const internalData = $xeTree.internalData;
891
+ const scrollBodyElem = $xeTree.$refs.refVirtualWrapper;
892
+ if (scrollBodyElem) {
893
+ scrollBodyElem.scrollTop = 0;
894
+ scrollBodyElem.scrollLeft = 0;
895
+ }
896
+ internalData.lastScrollTop = 0;
897
+ internalData.lastScrollLeft = 0;
898
+ return $xeTree.$nextTick();
899
+ },
806
900
  handleNodeClickEvent(evnt, node) {
807
901
  const $xeTree = this;
808
902
  const props = $xeTree;
@@ -874,13 +968,11 @@ export default {
874
968
  if (!checkStrictly && $xeTree.isCheckedByCheckboxNodeId(nodeid)) {
875
969
  $xeTree.handleCheckedCheckboxNode(childRows, true);
876
970
  }
877
- $xeTree.updateNodeLine(node);
878
971
  $xeTree.dispatchEvent('load-success', { node, data: childRecords }, new Event('load-success'));
879
972
  return $xeTree.$nextTick();
880
973
  });
881
974
  }
882
975
  else {
883
- $xeTree.updateNodeLine(node);
884
976
  $xeTree.dispatchEvent('load-success', { node, data: childRecords }, new Event('load-success'));
885
977
  }
886
978
  }).catch((e) => {
@@ -889,10 +981,11 @@ export default {
889
981
  if (treeExpandLazyLoadedMaps[nodeid]) {
890
982
  treeExpandLazyLoadedMaps[nodeid] = false;
891
983
  }
892
- $xeTree.updateNodeLine(node);
893
984
  $xeTree.dispatchEvent('load-error', { node, data: e }, new Event('load-error'));
894
985
  }).finally(() => {
895
- return $xeTree.$nextTick();
986
+ $xeTree.handleTreeToList();
987
+ $xeTree.handleData();
988
+ return $xeTree.recalculate();
896
989
  });
897
990
  }
898
991
  else {
@@ -962,8 +1055,9 @@ export default {
962
1055
  });
963
1056
  }
964
1057
  reactData.updateExpandedFlag++;
965
- expandNodes.forEach($xeTree.updateNodeLine);
966
- return Promise.all(result);
1058
+ $xeTree.handleTreeToList();
1059
+ $xeTree.handleData();
1060
+ return Promise.all(result).then(() => $xeTree.recalculate());
967
1061
  },
968
1062
  toggleExpandEvent(evnt, node) {
969
1063
  const $xeTree = this;
@@ -984,8 +1078,7 @@ export default {
984
1078
  const reactData = $xeTree.reactData;
985
1079
  const internalData = $xeTree.internalData;
986
1080
  const { transform } = props;
987
- const { treeList } = reactData;
988
- const { selectCheckboxMaps, indeterminateRowMaps } = internalData;
1081
+ const { selectCheckboxMaps, indeterminateRowMaps, afterTreeList } = internalData;
989
1082
  const childrenField = $xeTree.computeChildrenField;
990
1083
  const mapChildrenField = $xeTree.computeMapChildrenField;
991
1084
  const checkboxOpts = $xeTree.computeCheckboxOpts;
@@ -993,7 +1086,7 @@ export default {
993
1086
  if (!checkStrictly) {
994
1087
  const childRowMaps = {};
995
1088
  const childRowList = [];
996
- XEUtils.eachTree(treeList, (node) => {
1089
+ XEUtils.eachTree(afterTreeList, (node) => {
997
1090
  const nodeid = $xeTree.getNodeId(node);
998
1091
  const childList = node[childrenField];
999
1092
  if (childList && childList.length && !childRowMaps[nodeid]) {
@@ -1007,12 +1100,13 @@ export default {
1007
1100
  const childList = vals[2];
1008
1101
  let sLen = 0; // 已选
1009
1102
  let hLen = 0; // 半选
1010
- let vLen = 0; // 有效行
1103
+ let vLen = 0; // 有效子行
1104
+ const cLen = childList.length; // 子行
1011
1105
  childList.forEach(checkMethod
1012
1106
  ? (item) => {
1013
1107
  const childNodeid = $xeTree.getNodeId(item);
1014
1108
  const isSelect = selectCheckboxMaps[childNodeid];
1015
- if (checkMethod({ node: item })) {
1109
+ if (checkMethod({ $tree: $xeTree, node: item })) {
1016
1110
  if (isSelect) {
1017
1111
  sLen++;
1018
1112
  }
@@ -1041,8 +1135,29 @@ export default {
1041
1135
  }
1042
1136
  vLen++;
1043
1137
  });
1044
- const isSelected = sLen >= vLen;
1045
- const halfSelect = !isSelected && (sLen >= 1 || hLen >= 1);
1138
+ let isSelected = false;
1139
+ if (cLen > 0) {
1140
+ if (vLen > 0) {
1141
+ isSelected = (sLen > 0 || hLen > 0) && sLen >= vLen;
1142
+ }
1143
+ else {
1144
+ // 如果存在子项禁用
1145
+ if ((sLen > 0 && sLen >= vLen)) {
1146
+ isSelected = true;
1147
+ }
1148
+ else if (selectCheckboxMaps[nodeid]) {
1149
+ isSelected = true;
1150
+ }
1151
+ else {
1152
+ isSelected = false;
1153
+ }
1154
+ }
1155
+ }
1156
+ else {
1157
+ // 如果无子项
1158
+ isSelected = selectCheckboxMaps[nodeid];
1159
+ }
1160
+ const halfSelect = !isSelected && (sLen > 0 || hLen > 0);
1046
1161
  if (isSelected) {
1047
1162
  selectCheckboxMaps[nodeid] = node;
1048
1163
  if (indeterminateRowMaps[nodeid]) {
@@ -1063,108 +1178,462 @@ export default {
1063
1178
  }
1064
1179
  }
1065
1180
  });
1066
- reactData.updateCheckboxFlag++;
1181
+ reactData.updateCheckboxFlag++;
1182
+ }
1183
+ },
1184
+ changeCheckboxEvent(evnt, node) {
1185
+ const $xeTree = this;
1186
+ const props = $xeTree;
1187
+ const reactData = $xeTree.reactData;
1188
+ const internalData = $xeTree.internalData;
1189
+ evnt.preventDefault();
1190
+ evnt.stopPropagation();
1191
+ const { transform } = props;
1192
+ const { selectCheckboxMaps } = internalData;
1193
+ const childrenField = $xeTree.computeChildrenField;
1194
+ const mapChildrenField = $xeTree.computeMapChildrenField;
1195
+ const checkboxOpts = $xeTree.computeCheckboxOpts;
1196
+ const { checkStrictly, checkMethod } = checkboxOpts;
1197
+ let isDisabled = !!checkMethod;
1198
+ if (checkMethod) {
1199
+ isDisabled = !checkMethod({ $tree: $xeTree, node });
1200
+ }
1201
+ if (isDisabled) {
1202
+ return;
1203
+ }
1204
+ const nodeid = $xeTree.getNodeId(node);
1205
+ let isChecked = false;
1206
+ if (selectCheckboxMaps[nodeid]) {
1207
+ delete selectCheckboxMaps[nodeid];
1208
+ }
1209
+ else {
1210
+ isChecked = true;
1211
+ selectCheckboxMaps[nodeid] = node;
1212
+ }
1213
+ if (!checkStrictly) {
1214
+ XEUtils.eachTree(XEUtils.get(node, transform ? mapChildrenField : childrenField), (childNode) => {
1215
+ const childNodeid = $xeTree.getNodeId(childNode);
1216
+ if (isChecked) {
1217
+ if (!selectCheckboxMaps[childNodeid]) {
1218
+ selectCheckboxMaps[childNodeid] = true;
1219
+ }
1220
+ }
1221
+ else {
1222
+ if (selectCheckboxMaps[childNodeid]) {
1223
+ delete selectCheckboxMaps[childNodeid];
1224
+ }
1225
+ }
1226
+ }, { children: transform ? mapChildrenField : childrenField });
1227
+ }
1228
+ reactData.updateCheckboxFlag++;
1229
+ $xeTree.updateCheckboxStatus();
1230
+ const value = XEUtils.keys(selectCheckboxMaps);
1231
+ $xeTree.emitCheckboxMode(value);
1232
+ $xeTree.dispatchEvent('checkbox-change', { node, value, checked: isChecked }, evnt);
1233
+ },
1234
+ changeCurrentEvent(evnt, node) {
1235
+ const $xeTree = this;
1236
+ const reactData = $xeTree.reactData;
1237
+ evnt.preventDefault();
1238
+ const nodeOpts = $xeTree.computeNodeOpts;
1239
+ const { currentMethod, trigger } = nodeOpts;
1240
+ const childrenField = $xeTree.computeChildrenField;
1241
+ const childList = XEUtils.get(node, childrenField);
1242
+ const hasChild = childList && childList.length;
1243
+ let isDisabled = !!currentMethod;
1244
+ if (trigger === 'child') {
1245
+ if (hasChild) {
1246
+ return;
1247
+ }
1248
+ }
1249
+ else if (trigger === 'parent') {
1250
+ if (!hasChild) {
1251
+ return;
1252
+ }
1253
+ }
1254
+ if (currentMethod) {
1255
+ isDisabled = !currentMethod({ node });
1256
+ }
1257
+ if (isDisabled) {
1258
+ return;
1259
+ }
1260
+ const isChecked = true;
1261
+ reactData.currentNode = node;
1262
+ $xeTree.dispatchEvent('current-change', { node, checked: isChecked }, evnt);
1263
+ },
1264
+ changeRadioEvent(evnt, node) {
1265
+ const $xeTree = this;
1266
+ const reactData = $xeTree.reactData;
1267
+ evnt.preventDefault();
1268
+ evnt.stopPropagation();
1269
+ const radioOpts = $xeTree.computeRadioOpts;
1270
+ const { checkMethod } = radioOpts;
1271
+ let isDisabled = !!checkMethod;
1272
+ if (checkMethod) {
1273
+ isDisabled = !checkMethod({ $tree: $xeTree, node });
1274
+ }
1275
+ if (isDisabled) {
1276
+ return;
1277
+ }
1278
+ const isChecked = true;
1279
+ const value = $xeTree.getNodeId(node);
1280
+ reactData.selectRadioKey = value;
1281
+ $xeTree.emitRadioMode(value);
1282
+ $xeTree.dispatchEvent('radio-change', { node, value, checked: isChecked }, evnt);
1283
+ },
1284
+ handleGlobalResizeEvent() {
1285
+ const $xeTree = this;
1286
+ const el = $xeTree.$refs.refElem;
1287
+ if (!el || !el.clientWidth) {
1288
+ return;
1289
+ }
1290
+ $xeTree.recalculate();
1291
+ },
1292
+ reloadData(data) {
1293
+ const $xeTree = this;
1294
+ return $xeTree.loadData(data || []);
1295
+ },
1296
+ clearCurrentNode() {
1297
+ const $xeTree = this;
1298
+ const reactData = $xeTree.reactData;
1299
+ reactData.currentNode = null;
1300
+ return $xeTree.$nextTick();
1301
+ },
1302
+ getCurrentNodeId() {
1303
+ const $xeTree = this;
1304
+ const reactData = $xeTree.reactData;
1305
+ const { currentNode } = reactData;
1306
+ if (currentNode) {
1307
+ return $xeTree.getNodeId(currentNode);
1308
+ }
1309
+ return null;
1310
+ },
1311
+ getCurrentNode() {
1312
+ const $xeTree = this;
1313
+ const reactData = $xeTree.reactData;
1314
+ const internalData = $xeTree.internalData;
1315
+ const { currentNode } = reactData;
1316
+ const { nodeMaps } = internalData;
1317
+ if (currentNode) {
1318
+ const nodeItem = nodeMaps[$xeTree.getNodeId(currentNode)];
1319
+ if (nodeItem) {
1320
+ return nodeItem.item;
1321
+ }
1322
+ }
1323
+ return null;
1324
+ },
1325
+ setCurrentNodeId(nodeKey) {
1326
+ const $xeTree = this;
1327
+ const reactData = $xeTree.reactData;
1328
+ const internalData = $xeTree.internalData;
1329
+ const { nodeMaps } = internalData;
1330
+ const nodeItem = nodeMaps[nodeKey];
1331
+ reactData.currentNode = nodeItem ? nodeItem.item : null;
1332
+ return $xeTree.$nextTick();
1333
+ },
1334
+ setCurrentNode(node) {
1335
+ const $xeTree = this;
1336
+ const reactData = $xeTree.reactData;
1337
+ reactData.currentNode = node;
1338
+ return $xeTree.$nextTick();
1339
+ },
1340
+ clearRadioNode() {
1341
+ const $xeTree = this;
1342
+ const reactData = $xeTree.reactData;
1343
+ reactData.selectRadioKey = null;
1344
+ return $xeTree.$nextTick();
1345
+ },
1346
+ getRadioNodeId() {
1347
+ const $xeTree = this;
1348
+ const reactData = $xeTree.reactData;
1349
+ return reactData.selectRadioKey || null;
1350
+ },
1351
+ getRadioNode() {
1352
+ const $xeTree = this;
1353
+ const reactData = $xeTree.reactData;
1354
+ const internalData = $xeTree.internalData;
1355
+ const { selectRadioKey } = reactData;
1356
+ const { nodeMaps } = internalData;
1357
+ if (selectRadioKey) {
1358
+ const nodeItem = nodeMaps[selectRadioKey];
1359
+ if (nodeItem) {
1360
+ return nodeItem.item;
1361
+ }
1362
+ }
1363
+ return null;
1364
+ },
1365
+ setRadioNodeId(nodeKey) {
1366
+ const $xeTree = this;
1367
+ const reactData = $xeTree.reactData;
1368
+ reactData.selectRadioKey = nodeKey;
1369
+ return $xeTree.$nextTick();
1370
+ },
1371
+ getCheckboxNodeIds() {
1372
+ const $xeTree = this;
1373
+ const internalData = $xeTree.internalData;
1374
+ const { selectCheckboxMaps } = internalData;
1375
+ return Object.keys(selectCheckboxMaps);
1376
+ },
1377
+ getCheckboxNodes() {
1378
+ const $xeTree = this;
1379
+ const internalData = $xeTree.internalData;
1380
+ const { nodeMaps, selectCheckboxMaps } = internalData;
1381
+ const list = [];
1382
+ XEUtils.each(selectCheckboxMaps, (item, nodeid) => {
1383
+ const nodeItem = nodeMaps[nodeid];
1384
+ if (nodeItem) {
1385
+ list.push(nodeItem.item);
1386
+ }
1387
+ });
1388
+ return list;
1389
+ },
1390
+ clearCheckboxNode() {
1391
+ const $xeTree = this;
1392
+ const reactData = $xeTree.reactData;
1393
+ const internalData = $xeTree.internalData;
1394
+ internalData.selectCheckboxMaps = {};
1395
+ reactData.updateCheckboxFlag++;
1396
+ return $xeTree.$nextTick().then(() => {
1397
+ return { checkNodeKeys: [] };
1398
+ });
1399
+ },
1400
+ setAllCheckboxNode(checked) {
1401
+ const $xeTree = this;
1402
+ const props = $xeTree;
1403
+ const reactData = $xeTree.reactData;
1404
+ const internalData = $xeTree.internalData;
1405
+ const { transform } = props;
1406
+ const selectMaps = {};
1407
+ const childrenField = $xeTree.computeChildrenField;
1408
+ const mapChildrenField = $xeTree.computeMapChildrenField;
1409
+ const checkKeys = [];
1410
+ if (checked) {
1411
+ XEUtils.eachTree(internalData.afterTreeList, (node) => {
1412
+ const nodeid = $xeTree.getNodeId(node);
1413
+ checkKeys.push(nodeid);
1414
+ selectMaps[nodeid] = true;
1415
+ }, { children: transform ? mapChildrenField : childrenField });
1416
+ }
1417
+ internalData.selectCheckboxMaps = selectMaps;
1418
+ reactData.updateCheckboxFlag++;
1419
+ return $xeTree.$nextTick().then(() => {
1420
+ return { checkNodeKeys: checkKeys };
1421
+ });
1422
+ },
1423
+ clearExpandNode() {
1424
+ const $xeTree = this;
1425
+ return $xeTree.clearAllExpandNode();
1426
+ },
1427
+ clearAllExpandNode() {
1428
+ const $xeTree = this;
1429
+ const reactData = $xeTree.reactData;
1430
+ const internalData = $xeTree.internalData;
1431
+ const { nodeMaps } = internalData;
1432
+ XEUtils.each(nodeMaps, (nodeItem) => {
1433
+ nodeItem.treeLoaded = false;
1434
+ });
1435
+ internalData.treeExpandedMaps = {};
1436
+ reactData.updateExpandedFlag++;
1437
+ $xeTree.handleTreeToList();
1438
+ $xeTree.handleData();
1439
+ return $xeTree.recalculate();
1440
+ },
1441
+ setExpandByNodeId(nodeids, expanded) {
1442
+ const $xeTree = this;
1443
+ const reactData = $xeTree.reactData;
1444
+ const internalData = $xeTree.internalData;
1445
+ const { treeExpandedMaps } = internalData;
1446
+ if (nodeids) {
1447
+ if (!XEUtils.isArray(nodeids)) {
1448
+ nodeids = [nodeids];
1449
+ }
1450
+ nodeids.forEach((nodeid) => {
1451
+ handleSetExpand(nodeid, expanded, treeExpandedMaps);
1452
+ });
1453
+ reactData.updateExpandedFlag++;
1454
+ }
1455
+ $xeTree.handleTreeToList();
1456
+ $xeTree.handleData();
1457
+ return $xeTree.recalculate();
1458
+ },
1459
+ getExpandNodeIds() {
1460
+ const $xeTree = this;
1461
+ const internalData = $xeTree.internalData;
1462
+ const { treeExpandedMaps } = internalData;
1463
+ return XEUtils.keys(treeExpandedMaps);
1464
+ },
1465
+ getExpandNodes() {
1466
+ const $xeTree = this;
1467
+ const internalData = $xeTree.internalData;
1468
+ const { nodeMaps, treeExpandedMaps } = internalData;
1469
+ const list = [];
1470
+ XEUtils.each(treeExpandedMaps, (item, nodeid) => {
1471
+ const nodeItem = nodeMaps[nodeid];
1472
+ if (nodeItem) {
1473
+ list.push(nodeItem.item);
1474
+ }
1475
+ });
1476
+ return list;
1477
+ },
1478
+ setExpandNode(nodes, expanded) {
1479
+ const $xeTree = this;
1480
+ const reactData = $xeTree.reactData;
1481
+ const internalData = $xeTree.internalData;
1482
+ const { treeExpandedMaps } = internalData;
1483
+ if (nodes) {
1484
+ if (!XEUtils.isArray(nodes)) {
1485
+ nodes = [nodes];
1486
+ }
1487
+ nodes.forEach((node) => {
1488
+ const nodeid = $xeTree.getNodeId(node);
1489
+ handleSetExpand(nodeid, expanded, treeExpandedMaps);
1490
+ });
1491
+ reactData.updateExpandedFlag++;
1067
1492
  }
1493
+ $xeTree.handleTreeToList();
1494
+ $xeTree.handleData();
1495
+ return $xeTree.recalculate();
1068
1496
  },
1069
- changeCheckboxEvent(evnt, node) {
1497
+ toggleExpandByNodeId(nodeids) {
1498
+ const $xeTree = this;
1499
+ const reactData = $xeTree.reactData;
1500
+ const internalData = $xeTree.internalData;
1501
+ const { treeExpandedMaps } = internalData;
1502
+ if (nodeids) {
1503
+ if (!XEUtils.isArray(nodeids)) {
1504
+ nodeids = [nodeids];
1505
+ }
1506
+ nodeids.forEach((nodeid) => {
1507
+ handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
1508
+ });
1509
+ reactData.updateExpandedFlag++;
1510
+ }
1511
+ $xeTree.handleTreeToList();
1512
+ $xeTree.handleData();
1513
+ return $xeTree.recalculate();
1514
+ },
1515
+ toggleExpandNode(nodes) {
1516
+ const $xeTree = this;
1517
+ const reactData = $xeTree.reactData;
1518
+ const internalData = $xeTree.internalData;
1519
+ const { treeExpandedMaps } = internalData;
1520
+ if (nodes) {
1521
+ if (!XEUtils.isArray(nodes)) {
1522
+ nodes = [nodes];
1523
+ }
1524
+ nodes.forEach((node) => {
1525
+ const nodeid = $xeTree.getNodeId(node);
1526
+ handleSetExpand(nodeid, !treeExpandedMaps[nodeid], treeExpandedMaps);
1527
+ });
1528
+ reactData.updateExpandedFlag++;
1529
+ }
1530
+ $xeTree.handleTreeToList();
1531
+ $xeTree.handleData();
1532
+ return $xeTree.recalculate();
1533
+ },
1534
+ setAllExpandNode(expanded) {
1070
1535
  const $xeTree = this;
1071
1536
  const props = $xeTree;
1072
1537
  const reactData = $xeTree.reactData;
1073
1538
  const internalData = $xeTree.internalData;
1074
- evnt.preventDefault();
1075
- evnt.stopPropagation();
1076
1539
  const { transform } = props;
1077
- const { selectCheckboxMaps } = internalData;
1540
+ const { treeExpandedMaps } = internalData;
1078
1541
  const childrenField = $xeTree.computeChildrenField;
1079
1542
  const mapChildrenField = $xeTree.computeMapChildrenField;
1080
- const checkboxOpts = $xeTree.computeCheckboxOpts;
1081
- const { checkStrictly, checkMethod } = checkboxOpts;
1082
- let isDisabled = !!checkMethod;
1083
- if (checkMethod) {
1084
- isDisabled = !checkMethod({ node });
1085
- }
1086
- if (isDisabled) {
1087
- return;
1088
- }
1089
- const nodeid = $xeTree.getNodeId(node);
1090
- let isChecked = false;
1091
- if (selectCheckboxMaps[nodeid]) {
1092
- delete selectCheckboxMaps[nodeid];
1093
- }
1094
- else {
1095
- isChecked = true;
1096
- selectCheckboxMaps[nodeid] = node;
1097
- }
1098
- if (!checkStrictly) {
1099
- XEUtils.eachTree(XEUtils.get(node, childrenField), (childNode) => {
1100
- const childNodeid = $xeTree.getNodeId(childNode);
1101
- if (isChecked) {
1102
- if (!selectCheckboxMaps[childNodeid]) {
1103
- selectCheckboxMaps[childNodeid] = true;
1104
- }
1105
- }
1106
- else {
1107
- if (selectCheckboxMaps[childNodeid]) {
1108
- delete selectCheckboxMaps[childNodeid];
1109
- }
1543
+ if (expanded) {
1544
+ XEUtils.eachTree(internalData.afterTreeList, (node) => {
1545
+ const childList = XEUtils.get(node, childrenField);
1546
+ const hasChild = childList && childList.length;
1547
+ if (hasChild) {
1548
+ const nodeid = $xeTree.getNodeId(node);
1549
+ treeExpandedMaps[nodeid] = true;
1110
1550
  }
1111
1551
  }, { children: transform ? mapChildrenField : childrenField });
1112
1552
  }
1113
- reactData.updateCheckboxFlag++;
1114
- $xeTree.updateCheckboxStatus();
1115
- const value = XEUtils.keys(selectCheckboxMaps);
1116
- $xeTree.emitCheckboxMode(value);
1117
- $xeTree.dispatchEvent('checkbox-change', { node, value, checked: isChecked }, evnt);
1553
+ else {
1554
+ internalData.treeExpandedMaps = {};
1555
+ }
1556
+ reactData.updateExpandedFlag++;
1557
+ $xeTree.handleTreeToList();
1558
+ $xeTree.handleData();
1559
+ return $xeTree.recalculate();
1118
1560
  },
1119
- changeCurrentEvent(evnt, node) {
1561
+ reloadExpandNode(node) {
1120
1562
  const $xeTree = this;
1121
- const reactData = $xeTree.reactData;
1122
- evnt.preventDefault();
1123
- const nodeOpts = $xeTree.computeNodeOpts;
1124
- const { currentMethod, trigger } = nodeOpts;
1125
- const childrenField = $xeTree.computeChildrenField;
1126
- const childList = XEUtils.get(node, childrenField);
1127
- const hasChild = childList && childList.length;
1128
- let isDisabled = !!currentMethod;
1129
- if (trigger === 'child') {
1130
- if (hasChild) {
1131
- return;
1132
- }
1563
+ const props = $xeTree;
1564
+ const { lazy } = props;
1565
+ if (lazy) {
1566
+ $xeTree.clearExpandLoaded(node);
1567
+ return $xeTree.handleAsyncTreeExpandChilds(node);
1133
1568
  }
1134
- else if (trigger === 'parent') {
1135
- if (!hasChild) {
1136
- return;
1569
+ return $xeTree.recalculate();
1570
+ },
1571
+ clearExpandLoaded(node) {
1572
+ const $xeTree = this;
1573
+ const props = $xeTree;
1574
+ const internalData = $xeTree.internalData;
1575
+ const { lazy } = props;
1576
+ const { nodeMaps } = internalData;
1577
+ if (lazy) {
1578
+ const nodeItem = nodeMaps[$xeTree.getNodeId(node)];
1579
+ if (nodeItem) {
1580
+ nodeItem.treeLoaded = false;
1137
1581
  }
1138
1582
  }
1139
- if (currentMethod) {
1140
- isDisabled = !currentMethod({ node });
1141
- }
1142
- if (isDisabled) {
1143
- return;
1144
- }
1145
- const isChecked = true;
1146
- reactData.currentNode = node;
1147
- $xeTree.dispatchEvent('current-change', { node, checked: isChecked }, evnt);
1583
+ return $xeTree.recalculate();
1148
1584
  },
1149
- changeRadioEvent(evnt, node) {
1585
+ /**
1586
+ * 用于树结构,给行数据加载子节点
1587
+ */
1588
+ loadChildrenNode(node, childRecords) {
1150
1589
  const $xeTree = this;
1151
- const reactData = $xeTree.reactData;
1152
- evnt.preventDefault();
1153
- evnt.stopPropagation();
1154
- const radioOpts = $xeTree.computeRadioOpts;
1155
- const { checkMethod } = radioOpts;
1156
- let isDisabled = !!checkMethod;
1157
- if (checkMethod) {
1158
- isDisabled = !checkMethod({ node });
1159
- }
1160
- if (isDisabled) {
1161
- return;
1590
+ const props = $xeTree;
1591
+ const internalData = $xeTree.internalData;
1592
+ const { lazy, transform } = props;
1593
+ const { nodeMaps } = internalData;
1594
+ if (!lazy) {
1595
+ return Promise.resolve([]);
1162
1596
  }
1163
- const isChecked = true;
1164
- const value = $xeTree.getNodeId(node);
1165
- reactData.selectRadioKey = value;
1166
- $xeTree.emitRadioMode(value);
1167
- $xeTree.dispatchEvent('radio-change', { node, value, checked: isChecked }, evnt);
1597
+ const childrenField = $xeTree.computeChildrenField;
1598
+ const mapChildrenField = $xeTree.computeMapChildrenField;
1599
+ const parentNodeItem = nodeMaps[$xeTree.getNodeId(node)];
1600
+ const parentLevel = parentNodeItem ? parentNodeItem.level : 0;
1601
+ const parentNodes = parentNodeItem ? parentNodeItem.nodes : [];
1602
+ return $xeTree.createNode(childRecords).then((nodeList) => {
1603
+ XEUtils.eachTree(nodeList, (childRow, index, items, path, parent, nodes) => {
1604
+ const itemNodeId = $xeTree.getNodeId(childRow);
1605
+ nodeMaps[itemNodeId] = {
1606
+ item: node,
1607
+ index: -1,
1608
+ items,
1609
+ parent: parent || parentNodeItem.item,
1610
+ nodes: parentNodes.concat(nodes),
1611
+ level: parentLevel + nodes.length,
1612
+ treeIndex: -1,
1613
+ lineCount: 0,
1614
+ treeLoaded: false
1615
+ };
1616
+ }, { children: childrenField });
1617
+ node[childrenField] = nodeList;
1618
+ if (transform) {
1619
+ node[mapChildrenField] = nodeList;
1620
+ }
1621
+ $xeTree.updateAfterDataIndex();
1622
+ return nodeList;
1623
+ });
1624
+ },
1625
+ getCheckboxIndeterminateNodes() {
1626
+ const $xeTree = this;
1627
+ const internalData = $xeTree.internalData;
1628
+ const { nodeMaps, indeterminateRowMaps } = internalData;
1629
+ const list = [];
1630
+ XEUtils.each(indeterminateRowMaps, (item, nodeid) => {
1631
+ const nodeItem = nodeMaps[nodeid];
1632
+ if (nodeItem) {
1633
+ list.push(nodeItem.item);
1634
+ }
1635
+ });
1636
+ return list;
1168
1637
  },
1169
1638
  //
1170
1639
  // Render
@@ -1175,11 +1644,11 @@ export default {
1175
1644
  const { showRadio } = props;
1176
1645
  const radioOpts = $xeTree.computeRadioOpts;
1177
1646
  const { showIcon, checkMethod, visibleMethod } = radioOpts;
1178
- const isVisible = !visibleMethod || visibleMethod({ node });
1647
+ const isVisible = !visibleMethod || visibleMethod({ $tree: $xeTree, node });
1179
1648
  let isDisabled = !!checkMethod;
1180
1649
  if (showRadio && showIcon && isVisible) {
1181
1650
  if (checkMethod) {
1182
- isDisabled = !checkMethod({ node });
1651
+ isDisabled = !checkMethod({ $tree: $xeTree, node });
1183
1652
  }
1184
1653
  return h('div', {
1185
1654
  class: ['vxe-tree--radio-option', {
@@ -1208,11 +1677,11 @@ export default {
1208
1677
  const checkboxOpts = $xeTree.computeCheckboxOpts;
1209
1678
  const { showIcon, checkMethod, visibleMethod } = checkboxOpts;
1210
1679
  const isIndeterminate = $xeTree.isIndeterminateByCheckboxNodeid(nodeid);
1211
- const isVisible = !visibleMethod || visibleMethod({ node });
1680
+ const isVisible = !visibleMethod || visibleMethod({ $tree: $xeTree, node });
1212
1681
  let isDisabled = !!checkMethod;
1213
1682
  if (showCheckbox && showIcon && isVisible) {
1214
1683
  if (checkMethod) {
1215
- isDisabled = !checkMethod({ node });
1684
+ isDisabled = !checkMethod({ $tree: $xeTree, node });
1216
1685
  }
1217
1686
  return h('div', {
1218
1687
  class: ['vxe-tree--checkbox-option', {
@@ -1235,7 +1704,7 @@ export default {
1235
1704
  }
1236
1705
  return renderEmptyElement($xeTree);
1237
1706
  },
1238
- renderNode(h, node) {
1707
+ renderNode(h, node, nodeid) {
1239
1708
  const $xeTree = this;
1240
1709
  const props = $xeTree;
1241
1710
  const slots = $xeTree.$scopedSlots;
@@ -1243,7 +1712,7 @@ export default {
1243
1712
  const internalData = $xeTree.internalData;
1244
1713
  const { lazy, showRadio, showCheckbox, showLine, indent, iconOpen, iconClose, iconLoaded, showIcon } = props;
1245
1714
  const { currentNode, selectRadioKey, updateExpandedFlag } = reactData;
1246
- const { nodeMaps, treeExpandedMaps, treeExpandLazyLoadedMaps } = internalData;
1715
+ const { afterTreeList, nodeMaps, treeExpandedMaps, treeExpandLazyLoadedMaps } = internalData;
1247
1716
  const childrenField = $xeTree.computeChildrenField;
1248
1717
  const titleField = $xeTree.computeTitleField;
1249
1718
  const hasChildField = $xeTree.computeHasChildField;
@@ -1252,14 +1721,12 @@ export default {
1252
1721
  const iconSlot = slots.icon;
1253
1722
  const titleSlot = slots.title;
1254
1723
  const extraSlot = slots.extra;
1255
- const nodeid = $xeTree.getNodeId(node);
1256
1724
  const isExpand = updateExpandedFlag && treeExpandedMaps[nodeid];
1257
1725
  const nodeItem = nodeMaps[nodeid];
1258
1726
  const nodeValue = XEUtils.get(node, titleField);
1259
1727
  let isRadioChecked = false;
1260
1728
  if (showRadio) {
1261
- // eslint-disable-next-line eqeqeq
1262
- isRadioChecked = nodeid == selectRadioKey;
1729
+ isRadioChecked = nodeid === String(selectRadioKey);
1263
1730
  }
1264
1731
  let isCheckboxChecked = false;
1265
1732
  if (showCheckbox) {
@@ -1273,23 +1740,10 @@ export default {
1273
1740
  hasLazyChilds = node[hasChildField];
1274
1741
  isLazyLoaded = !!nodeItem.treeLoaded;
1275
1742
  }
1276
- const childVns = [];
1277
- if (hasChild && treeExpandedMaps[nodeid]) {
1278
- if (showLine) {
1279
- childVns.push(h('div', {
1280
- key: 'line',
1281
- class: 'vxe-tree--node-child-line',
1282
- style: {
1283
- height: `calc(${nodeItem.lineCount} * var(--vxe-ui-tree-node-height) - var(--vxe-ui-tree-node-height) / 2)`,
1284
- left: `${(nodeItem.level + 1) * (indent || 1)}px`
1285
- }
1286
- }));
1287
- }
1288
- childList.forEach(childItem => {
1289
- childVns.push($xeTree.renderNode(h, childItem));
1290
- });
1291
- }
1743
+ const prevNode = nodeItem.items[nodeItem.treeIndex - 1];
1744
+ const nParams = { node, isExpand };
1292
1745
  return h('div', {
1746
+ key: nodeid,
1293
1747
  class: ['vxe-tree--node-wrapper', `node--level-${nodeItem.level}`],
1294
1748
  attrs: {
1295
1749
  nodeid
@@ -1313,28 +1767,38 @@ export default {
1313
1767
  }
1314
1768
  }
1315
1769
  }, [
1316
- showIcon || showLine
1770
+ showLine
1317
1771
  ? h('div', {
1318
- class: 'vxe-tree--node-item-switcher'
1319
- }, showIcon && (lazy ? (isLazyLoaded ? hasChild : hasLazyChilds) : hasChild)
1320
- ? [
1321
- h('div', {
1322
- class: 'vxe-tree--node-item-icon',
1323
- on: {
1324
- click(evnt) {
1325
- $xeTree.toggleExpandEvent(evnt, node);
1326
- }
1327
- }
1328
- }, iconSlot
1329
- ? iconSlot({ node, isExpand })
1330
- : [
1331
- h('i', {
1332
- class: isLazyLoading ? (iconLoaded || getIcon().TREE_NODE_LOADED) : (isExpand ? (iconOpen || getIcon().TREE_NODE_OPEN) : (iconClose || getIcon().TREE_NODE_CLOSE))
1333
- })
1334
- ])
1335
- ]
1336
- : [])
1772
+ class: 'vxe-tree--node-line-wrapper'
1773
+ }, [
1774
+ h('div', {
1775
+ class: 'vxe-tree--node-line',
1776
+ style: {
1777
+ height: `${$xeTree.getNodeId(afterTreeList[0]) === nodeid ? 1 : calcTreeLine($xeTree, node, prevNode)}px`
1778
+ }
1779
+ })
1780
+ ])
1337
1781
  : renderEmptyElement($xeTree),
1782
+ h('div', {
1783
+ class: 'vxe-tree--node-item-switcher'
1784
+ }, showIcon && (lazy ? (isLazyLoaded ? hasChild : hasLazyChilds) : hasChild)
1785
+ ? [
1786
+ h('div', {
1787
+ class: 'vxe-tree--node-item-icon',
1788
+ on: {
1789
+ click(evnt) {
1790
+ $xeTree.toggleExpandEvent(evnt, node);
1791
+ }
1792
+ }
1793
+ }, iconSlot
1794
+ ? getSlotVNs(iconSlot(nParams))
1795
+ : [
1796
+ h('i', {
1797
+ class: isLazyLoading ? (iconLoaded || getIcon().TREE_NODE_LOADED) : (isExpand ? (iconOpen || getIcon().TREE_NODE_OPEN) : (iconClose || getIcon().TREE_NODE_CLOSE))
1798
+ })
1799
+ ])
1800
+ ]
1801
+ : []),
1338
1802
  $xeTree.renderRadio(h, node, nodeid, isRadioChecked),
1339
1803
  $xeTree.renderCheckbox(h, node, nodeid, isCheckboxChecked),
1340
1804
  h('div', {
@@ -1342,41 +1806,63 @@ export default {
1342
1806
  }, [
1343
1807
  h('div', {
1344
1808
  class: 'vxe-tree--node-item-title'
1345
- }, titleSlot ? getSlotVNs(titleSlot({ node, isExpand })) : `${nodeValue}`),
1809
+ }, titleSlot ? getSlotVNs(titleSlot(nParams)) : `${nodeValue}`),
1346
1810
  extraSlot
1347
1811
  ? h('div', {
1348
1812
  class: 'vxe-tree--node-item-extra'
1349
- }, getSlotVNs(extraSlot({ node, isExpand })))
1813
+ }, getSlotVNs(extraSlot(nParams)))
1350
1814
  : renderEmptyElement($xeTree)
1351
1815
  ])
1352
- ]),
1353
- hasChild && treeExpandedMaps[nodeid]
1354
- ? h('div', {
1355
- class: 'vxe-tree--node-child-wrapper'
1356
- }, childVns)
1357
- : renderEmptyElement($xeTree)
1816
+ ])
1358
1817
  ]);
1359
1818
  },
1360
- renderNodeList(h) {
1819
+ renderList(h, treeList) {
1361
1820
  const $xeTree = this;
1362
- const reactData = $xeTree.reactData;
1363
- const { treeList } = reactData;
1364
- return h('div', {
1365
- class: 'vxe-tree--node-list-wrapper'
1366
- }, treeList.map(node => $xeTree.renderNode(h, node)));
1821
+ const props = $xeTree;
1822
+ const internalData = $xeTree.internalData;
1823
+ const { transform } = props;
1824
+ const { treeExpandedMaps } = internalData;
1825
+ const childrenField = $xeTree.computeChildrenField;
1826
+ if (!treeList.length) {
1827
+ return [
1828
+ h('div', {
1829
+ class: 'vxe-tree--empty-placeholder'
1830
+ }, getI18n('vxe.tree.searchEmpty'))
1831
+ ];
1832
+ }
1833
+ const nodeVNs = [];
1834
+ treeList.forEach(transform
1835
+ ? (node) => {
1836
+ const nodeid = $xeTree.getNodeId(node);
1837
+ nodeVNs.push($xeTree.renderNode(h, node, nodeid));
1838
+ }
1839
+ : (node) => {
1840
+ const nodeid = $xeTree.getNodeId(node);
1841
+ nodeVNs.push($xeTree.renderNode(h, node, nodeid));
1842
+ const childList = XEUtils.get(node, childrenField);
1843
+ const hasChild = childList && childList.length;
1844
+ if (hasChild && treeExpandedMaps[nodeid]) {
1845
+ nodeVNs.push(...$xeTree.renderList(h, childList));
1846
+ }
1847
+ });
1848
+ return nodeVNs;
1367
1849
  },
1368
1850
  renderVN(h) {
1369
1851
  const $xeTree = this;
1370
1852
  const props = $xeTree;
1371
1853
  const slots = $xeTree.$scopedSlots;
1854
+ const reactData = $xeTree.reactData;
1372
1855
  const { loading, trigger, showLine } = props;
1856
+ const { bodyHeight, topSpaceHeight, treeList } = reactData;
1373
1857
  const vSize = $xeTree.computeSize;
1374
1858
  const radioOpts = $xeTree.computeRadioOpts;
1375
1859
  const checkboxOpts = $xeTree.computeCheckboxOpts;
1376
- const treeStyle = $xeTree.computeTreeStyle;
1377
1860
  const loadingOpts = $xeTree.computeLoadingOpts;
1378
1861
  const isRowHover = $xeTree.computeIsRowHover;
1862
+ const treeStyle = $xeTree.computeTreeStyle;
1379
1863
  const loadingSlot = slots.loading;
1864
+ const headerSlot = slots.header;
1865
+ const footerSlot = slots.footer;
1380
1866
  return h('div', {
1381
1867
  ref: 'refElem',
1382
1868
  class: ['vxe-tree', {
@@ -1387,10 +1873,42 @@ export default {
1387
1873
  'node--hover': isRowHover,
1388
1874
  'node--trigger': trigger === 'node',
1389
1875
  'is--loading': loading
1390
- }],
1391
- style: treeStyle
1876
+ }]
1392
1877
  }, [
1393
- $xeTree.renderNodeList(h),
1878
+ headerSlot
1879
+ ? h('div', {
1880
+ ref: 'refHeaderWrapperElem',
1881
+ class: 'vxe-tree--header-wrapper'
1882
+ }, headerSlot({ $tree: $xeTree }))
1883
+ : renderEmptyElement($xeTree),
1884
+ h('div', {
1885
+ ref: 'refVirtualWrapper',
1886
+ class: 'vxe-tree--node-list-wrapper',
1887
+ style: treeStyle,
1888
+ on: {
1889
+ scroll: $xeTree.scrollEvent
1890
+ }
1891
+ }, [
1892
+ h('div', {
1893
+ class: 'vxe-select--y-space',
1894
+ style: {
1895
+ height: bodyHeight ? `${bodyHeight}px` : ''
1896
+ }
1897
+ }),
1898
+ h('div', {
1899
+ ref: 'refVirtualBody',
1900
+ class: 'vxe-tree--node-list-body',
1901
+ style: {
1902
+ transform: `translateY(${topSpaceHeight}px)`
1903
+ }
1904
+ }, $xeTree.renderList(h, treeList))
1905
+ ]),
1906
+ footerSlot
1907
+ ? h('div', {
1908
+ ref: 'refFooterWrapperElem',
1909
+ class: 'vxe-tree--footer-wrapper'
1910
+ }, footerSlot({ $tree: $xeTree }))
1911
+ : renderEmptyElement($xeTree),
1394
1912
  /**
1395
1913
  * 加载中
1396
1914
  */
@@ -1413,7 +1931,7 @@ export default {
1413
1931
  watch: {
1414
1932
  data(val) {
1415
1933
  const $xeTree = this;
1416
- $xeTree.loadTreeData(val || []);
1934
+ $xeTree.loadData(val || []);
1417
1935
  },
1418
1936
  checkNodeKey(val) {
1419
1937
  const $xeTree = this;
@@ -1424,6 +1942,22 @@ export default {
1424
1942
  const $xeTree = this;
1425
1943
  const props = $xeTree;
1426
1944
  $xeTree.updateCheckboxChecked(props.checkNodeKeys || []);
1945
+ },
1946
+ filterValue() {
1947
+ const $xeTree = this;
1948
+ $xeTree.triggerSearchEvent(new Event('filter'));
1949
+ },
1950
+ height() {
1951
+ const $xeTree = this;
1952
+ $xeTree.recalculate();
1953
+ },
1954
+ minHeight() {
1955
+ const $xeTree = this;
1956
+ $xeTree.recalculate();
1957
+ },
1958
+ maxHeight() {
1959
+ const $xeTree = this;
1960
+ $xeTree.recalculate();
1427
1961
  }
1428
1962
  },
1429
1963
  created() {
@@ -1431,16 +1965,41 @@ export default {
1431
1965
  const props = $xeTree;
1432
1966
  const reactData = $xeTree.reactData;
1433
1967
  reactData.selectRadioKey = props.checkNodeKey || null;
1434
- $xeTree.loadTreeData(props.data || []);
1968
+ $xeTree.loadData(props.data || []);
1969
+ },
1970
+ mounted() {
1971
+ const $xeTree = this;
1972
+ const props = $xeTree;
1973
+ const internalData = $xeTree.internalData;
1974
+ if (props.autoResize) {
1975
+ const el = $xeTree.$refs.refElem;
1976
+ const parentEl = $xeTree.getParentElem();
1977
+ const resizeObserver = globalResize.create(() => {
1978
+ if (props.autoResize) {
1979
+ $xeTree.recalculate();
1980
+ }
1981
+ });
1982
+ if (el) {
1983
+ resizeObserver.observe(el);
1984
+ }
1985
+ if (parentEl) {
1986
+ resizeObserver.observe(parentEl);
1987
+ }
1988
+ internalData.resizeObserver = resizeObserver;
1989
+ }
1990
+ globalEvents.on($xeTree, 'resize', $xeTree.handleGlobalResizeEvent);
1435
1991
  },
1436
1992
  beforeDestroy() {
1437
1993
  const $xeTree = this;
1438
- const reactData = $xeTree.reactData;
1439
1994
  const internalData = $xeTree.internalData;
1440
- reactData.treeList = [];
1995
+ const { resizeObserver } = internalData;
1996
+ if (resizeObserver) {
1997
+ resizeObserver.disconnect();
1998
+ }
1441
1999
  internalData.treeExpandedMaps = {};
1442
2000
  internalData.indeterminateRowMaps = {};
1443
2001
  internalData.nodeMaps = {};
2002
+ globalEvents.off($xeTree, 'resize');
1444
2003
  },
1445
2004
  render(h) {
1446
2005
  return this.renderVN(h);