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.
- package/es/icon/style.css +1 -1
- package/es/language/ar-EG.js +19 -1
- package/es/language/de-DE.js +19 -1
- package/es/language/en-US.js +20 -2
- package/es/language/es-ES.js +19 -1
- package/es/language/fr-FR.js +19 -1
- package/es/language/hu-HU.js +19 -1
- package/es/language/hy-AM.js +18 -0
- package/es/language/id-ID.js +19 -1
- package/es/language/it-IT.js +19 -1
- package/es/language/ja-JP.js +19 -1
- package/es/language/ko-KR.js +19 -1
- package/es/language/ms-MY.js +19 -1
- package/es/language/nb-NO.js +19 -1
- package/es/language/pt-BR.js +19 -1
- package/es/language/ru-RU.js +19 -1
- package/es/language/th-TH.js +19 -1
- package/es/language/ug-CN.js +19 -1
- package/es/language/uk-UA.js +19 -1
- package/es/language/uz-UZ.js +19 -1
- package/es/language/vi-VN.js +19 -1
- package/es/language/zh-CHT.js +19 -1
- package/es/language/zh-CN.js +18 -0
- package/es/list/src/list.js +1 -1
- package/es/select/src/select.js +138 -41
- package/es/select/style.css +21 -0
- package/es/select/style.min.css +1 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/tree/src/tree.js +1160 -601
- package/es/tree/src/util.js +31 -0
- package/es/tree/style.css +23 -26
- package/es/tree/style.min.css +1 -1
- package/es/tree-select/src/tree-select.js +258 -24
- package/es/tree-select/style.css +36 -1
- package/es/tree-select/style.min.css +1 -1
- package/es/ui/index.js +20 -4
- package/es/ui/src/dom.js +9 -0
- package/es/ui/src/log.js +1 -1
- package/es/vxe-select/style.css +21 -0
- package/es/vxe-select/style.min.css +1 -1
- package/es/vxe-tree/style.css +23 -26
- package/es/vxe-tree/style.min.css +1 -1
- package/es/vxe-tree-select/style.css +36 -1
- package/es/vxe-tree-select/style.min.css +1 -1
- package/lib/icon/style/style.css +1 -1
- package/lib/icon/style/style.min.css +1 -1
- package/lib/index.umd.js +1541 -532
- package/lib/index.umd.min.js +1 -1
- package/lib/language/ar-EG.js +19 -1
- package/lib/language/ar-EG.min.js +1 -1
- package/lib/language/ar-EG.umd.js +19 -1
- package/lib/language/de-DE.js +19 -1
- package/lib/language/de-DE.min.js +1 -1
- package/lib/language/de-DE.umd.js +19 -1
- package/lib/language/en-US.js +20 -2
- package/lib/language/en-US.min.js +1 -1
- package/lib/language/en-US.umd.js +20 -2
- package/lib/language/es-ES.js +19 -1
- package/lib/language/es-ES.min.js +1 -1
- package/lib/language/es-ES.umd.js +19 -1
- package/lib/language/fr-FR.js +19 -1
- package/lib/language/fr-FR.min.js +1 -1
- package/lib/language/fr-FR.umd.js +19 -1
- package/lib/language/hu-HU.js +19 -1
- package/lib/language/hu-HU.min.js +1 -1
- package/lib/language/hu-HU.umd.js +19 -1
- package/lib/language/hy-AM.js +18 -0
- package/lib/language/hy-AM.min.js +1 -1
- package/lib/language/hy-AM.umd.js +18 -0
- package/lib/language/id-ID.js +19 -1
- package/lib/language/id-ID.min.js +1 -1
- package/lib/language/id-ID.umd.js +19 -1
- package/lib/language/it-IT.js +19 -1
- package/lib/language/it-IT.min.js +1 -1
- package/lib/language/it-IT.umd.js +19 -1
- package/lib/language/ja-JP.js +19 -1
- package/lib/language/ja-JP.min.js +1 -1
- package/lib/language/ja-JP.umd.js +19 -1
- package/lib/language/ko-KR.js +19 -1
- package/lib/language/ko-KR.min.js +1 -1
- package/lib/language/ko-KR.umd.js +19 -1
- package/lib/language/ms-MY.js +19 -1
- package/lib/language/ms-MY.min.js +1 -1
- package/lib/language/ms-MY.umd.js +19 -1
- package/lib/language/nb-NO.js +19 -1
- package/lib/language/nb-NO.min.js +1 -1
- package/lib/language/nb-NO.umd.js +19 -1
- package/lib/language/pt-BR.js +19 -1
- package/lib/language/pt-BR.min.js +1 -1
- package/lib/language/pt-BR.umd.js +19 -1
- package/lib/language/ru-RU.js +19 -1
- package/lib/language/ru-RU.min.js +1 -1
- package/lib/language/ru-RU.umd.js +19 -1
- package/lib/language/th-TH.js +19 -1
- package/lib/language/th-TH.min.js +1 -1
- package/lib/language/th-TH.umd.js +19 -1
- package/lib/language/ug-CN.js +19 -1
- package/lib/language/ug-CN.min.js +1 -1
- package/lib/language/ug-CN.umd.js +19 -1
- package/lib/language/uk-UA.js +19 -1
- package/lib/language/uk-UA.min.js +1 -1
- package/lib/language/uk-UA.umd.js +19 -1
- package/lib/language/uz-UZ.js +19 -1
- package/lib/language/uz-UZ.min.js +1 -1
- package/lib/language/uz-UZ.umd.js +19 -1
- package/lib/language/vi-VN.js +19 -1
- package/lib/language/vi-VN.min.js +1 -1
- package/lib/language/vi-VN.umd.js +19 -1
- package/lib/language/zh-CHT.js +19 -1
- package/lib/language/zh-CHT.min.js +1 -1
- package/lib/language/zh-CHT.umd.js +19 -1
- package/lib/language/zh-CN.js +18 -0
- package/lib/language/zh-CN.min.js +1 -1
- package/lib/language/zh-CN.umd.js +18 -0
- package/lib/list/src/list.js +1 -1
- package/lib/list/src/list.min.js +1 -1
- package/lib/select/src/select.js +145 -45
- package/lib/select/src/select.min.js +1 -1
- package/lib/select/style/style.css +21 -0
- package/lib/select/style/style.min.css +1 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/tree/src/tree.js +1223 -626
- package/lib/tree/src/tree.min.js +1 -1
- package/lib/tree/src/util.js +37 -0
- package/lib/tree/src/util.min.js +1 -0
- package/lib/tree/style/style.css +23 -26
- package/lib/tree/style/style.min.css +1 -1
- package/lib/tree-select/src/tree-select.js +265 -26
- package/lib/tree-select/src/tree-select.min.js +1 -1
- package/lib/tree-select/style/style.css +36 -1
- package/lib/tree-select/style/style.min.css +1 -1
- package/lib/ui/index.js +20 -4
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/dom.js +10 -0
- package/lib/ui/src/dom.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/vxe-select/style/style.css +21 -0
- package/lib/vxe-select/style/style.min.css +1 -1
- package/lib/vxe-tree/style/style.css +23 -26
- package/lib/vxe-tree/style/style.min.css +1 -1
- package/lib/vxe-tree-select/style/style.css +36 -1
- package/lib/vxe-tree-select/style/style.min.css +1 -1
- package/package.json +1 -1
- package/packages/language/ar-EG.ts +19 -1
- package/packages/language/de-DE.ts +19 -1
- package/packages/language/en-US.ts +20 -2
- package/packages/language/es-ES.ts +19 -1
- package/packages/language/fr-FR.ts +19 -1
- package/packages/language/hu-HU.ts +19 -1
- package/packages/language/hy-AM.ts +18 -0
- package/packages/language/id-ID.ts +19 -1
- package/packages/language/it-IT.ts +19 -1
- package/packages/language/ja-JP.ts +19 -1
- package/packages/language/ko-KR.ts +19 -1
- package/packages/language/ms-MY.ts +19 -1
- package/packages/language/nb-NO.ts +19 -1
- package/packages/language/pt-BR.ts +19 -1
- package/packages/language/ru-RU.ts +19 -1
- package/packages/language/th-TH.ts +19 -1
- package/packages/language/ug-CN.ts +19 -1
- package/packages/language/uk-UA.ts +19 -1
- package/packages/language/uz-UZ.ts +19 -1
- package/packages/language/vi-VN.ts +19 -1
- package/packages/language/zh-CHT.ts +19 -1
- package/packages/language/zh-CN.ts +18 -0
- package/packages/list/src/list.ts +1 -1
- package/packages/select/src/select.ts +144 -44
- package/packages/tree/src/tree.ts +1206 -626
- package/packages/tree/src/util.ts +34 -0
- package/packages/tree-select/src/tree-select.ts +272 -26
- package/packages/ui/index.ts +19 -3
- package/packages/ui/src/dom.ts +10 -0
- package/styles/components/select.scss +19 -0
- package/styles/components/tree-select.scss +36 -1
- package/styles/components/tree.scss +28 -31
- package/types/components/button.d.ts +11 -1
- package/types/components/grid.d.ts +5 -0
- package/types/components/icon-picker.d.ts +11 -1
- package/types/components/input.d.ts +2 -2
- package/types/components/select.d.ts +29 -40
- package/types/components/table.d.ts +2 -4
- package/types/components/tree-select.d.ts +72 -12
- package/types/components/tree.d.ts +129 -8
- /package/es/icon/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
- /package/es/icon/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
- /package/es/icon/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
- /package/es/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
- /package/es/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
- /package/es/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
- /package/lib/icon/style/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
- /package/lib/icon/style/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
- /package/lib/icon/style/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
- /package/lib/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
- /package/lib/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
- /package/lib/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
package/es/tree/src/tree.js
CHANGED
|
@@ -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
|
|
231
|
-
const {
|
|
270
|
+
const reactData = $xeTree.reactData;
|
|
271
|
+
const { customHeight, customMinHeight, customMaxHeight } = reactData;
|
|
232
272
|
const stys = {};
|
|
233
|
-
if (
|
|
234
|
-
stys.height = toCssUnit(
|
|
273
|
+
if (customHeight) {
|
|
274
|
+
stys.height = toCssUnit(customHeight);
|
|
275
|
+
}
|
|
276
|
+
if (customMinHeight) {
|
|
277
|
+
stys.minHeight = toCssUnit(customMinHeight);
|
|
235
278
|
}
|
|
236
|
-
if (
|
|
237
|
-
stys.
|
|
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
|
-
|
|
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
|
|
258
|
-
const
|
|
259
|
-
|
|
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
|
-
|
|
303
|
+
isExpandByNode(node) {
|
|
265
304
|
const $xeTree = this;
|
|
266
305
|
const reactData = $xeTree.reactData;
|
|
267
306
|
const internalData = $xeTree.internalData;
|
|
268
|
-
const {
|
|
269
|
-
const {
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
312
|
+
isCheckedByRadioNodeId(nodeid) {
|
|
279
313
|
const $xeTree = this;
|
|
280
314
|
const reactData = $xeTree.reactData;
|
|
281
|
-
const
|
|
282
|
-
|
|
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
|
-
|
|
318
|
+
isCheckedByRadioNode(node) {
|
|
288
319
|
const $xeTree = this;
|
|
289
|
-
|
|
290
|
-
reactData.currentNode = node;
|
|
291
|
-
return $xeTree.$nextTick();
|
|
320
|
+
return $xeTree.isCheckedByRadioNodeId($xeTree.getNodeId(node));
|
|
292
321
|
},
|
|
293
|
-
|
|
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
|
|
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
|
-
|
|
330
|
+
isCheckedByCheckboxNode(node) {
|
|
346
331
|
const $xeTree = this;
|
|
347
|
-
return $xeTree.
|
|
332
|
+
return $xeTree.isCheckedByCheckboxNodeId($xeTree.getNodeId(node));
|
|
348
333
|
},
|
|
349
|
-
|
|
334
|
+
isIndeterminateByCheckboxNodeid(nodeid) {
|
|
350
335
|
const $xeTree = this;
|
|
351
336
|
const reactData = $xeTree.reactData;
|
|
352
337
|
const internalData = $xeTree.internalData;
|
|
353
|
-
const {
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
|
|
342
|
+
isIndeterminateByCheckboxNode(node) {
|
|
362
343
|
const $xeTree = this;
|
|
363
|
-
|
|
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
|
-
|
|
346
|
+
emitCheckboxMode(value) {
|
|
378
347
|
const $xeTree = this;
|
|
379
|
-
|
|
380
|
-
const { treeExpandedMaps } = internalData;
|
|
381
|
-
return XEUtils.keys(treeExpandedMaps);
|
|
348
|
+
$xeTree.$emit('update:checkNodeKeys', value);
|
|
382
349
|
},
|
|
383
|
-
|
|
350
|
+
emitRadioMode(value) {
|
|
384
351
|
const $xeTree = this;
|
|
385
|
-
|
|
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
|
-
|
|
354
|
+
setRadioNode(node) {
|
|
397
355
|
const $xeTree = this;
|
|
398
356
|
const reactData = $xeTree.reactData;
|
|
399
|
-
|
|
400
|
-
|
|
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
|
-
|
|
362
|
+
setCheckboxNode(nodeList, checked) {
|
|
414
363
|
const $xeTree = this;
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
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
|
-
|
|
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
|
-
|
|
372
|
+
setCheckboxByNodeId(nodeIds, checked) {
|
|
430
373
|
const $xeTree = this;
|
|
431
|
-
const reactData = $xeTree.reactData;
|
|
432
374
|
const internalData = $xeTree.internalData;
|
|
433
|
-
const {
|
|
434
|
-
if (
|
|
435
|
-
if (!XEUtils.isArray(
|
|
436
|
-
|
|
375
|
+
const { nodeMaps } = internalData;
|
|
376
|
+
if (nodeIds) {
|
|
377
|
+
if (!XEUtils.isArray(nodeIds)) {
|
|
378
|
+
nodeIds = [nodeIds];
|
|
437
379
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
380
|
+
const nodeList = [];
|
|
381
|
+
nodeIds.forEach((nodeid) => {
|
|
382
|
+
const nodeItem = nodeMaps[nodeid];
|
|
383
|
+
if (nodeItem) {
|
|
384
|
+
nodeList.push(nodeItem.item);
|
|
385
|
+
}
|
|
441
386
|
});
|
|
442
|
-
|
|
387
|
+
$xeTree.handleCheckedCheckboxNode(nodeList, checked);
|
|
443
388
|
}
|
|
444
389
|
return $xeTree.$nextTick();
|
|
445
390
|
},
|
|
446
|
-
|
|
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 {
|
|
453
|
-
const childrenField = $xeTree.computeChildrenField;
|
|
397
|
+
const { selectCheckboxMaps } = internalData;
|
|
454
398
|
const mapChildrenField = $xeTree.computeMapChildrenField;
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
419
|
+
XEUtils.eachTree(nodeList, handleSelect, { children: transform ? mapChildrenField : childrenField });
|
|
467
420
|
}
|
|
468
|
-
reactData.
|
|
469
|
-
|
|
421
|
+
reactData.updateCheckboxFlag++;
|
|
422
|
+
$xeTree.updateCheckboxStatus();
|
|
470
423
|
},
|
|
471
|
-
|
|
424
|
+
updateCheckboxChecked(nodeIds) {
|
|
472
425
|
const $xeTree = this;
|
|
473
|
-
|
|
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
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
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
|
-
|
|
627
|
-
|
|
628
|
-
|
|
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
|
-
|
|
440
|
+
getParentElem() {
|
|
647
441
|
const $xeTree = this;
|
|
648
|
-
const
|
|
649
|
-
|
|
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
|
-
|
|
445
|
+
calcTableHeight(key) {
|
|
666
446
|
const $xeTree = this;
|
|
667
447
|
const props = $xeTree;
|
|
668
448
|
const reactData = $xeTree.reactData;
|
|
669
|
-
const
|
|
670
|
-
const
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
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 (
|
|
685
|
-
|
|
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
|
-
|
|
696
|
-
$xeTree.updateCheckboxStatus();
|
|
466
|
+
return num;
|
|
697
467
|
},
|
|
698
|
-
|
|
468
|
+
updateHeight() {
|
|
699
469
|
const $xeTree = this;
|
|
700
|
-
$xeTree.
|
|
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 {
|
|
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(
|
|
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
|
-
|
|
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:
|
|
516
|
+
}, { children: childrenField });
|
|
743
517
|
internalData.nodeMaps = keyMaps;
|
|
744
518
|
},
|
|
745
|
-
|
|
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 {
|
|
751
|
-
const {
|
|
752
|
-
const
|
|
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
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
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
|
-
|
|
550
|
+
updateAfterFullData() {
|
|
773
551
|
const $xeTree = this;
|
|
552
|
+
const props = $xeTree;
|
|
774
553
|
const internalData = $xeTree.internalData;
|
|
775
|
-
const {
|
|
554
|
+
const { transform, filterValue } = props;
|
|
555
|
+
const { treeFullData, lastFilterValue } = internalData;
|
|
556
|
+
const titleField = $xeTree.computeTitleField;
|
|
776
557
|
const childrenField = $xeTree.computeChildrenField;
|
|
777
|
-
const
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
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
|
-
|
|
788
|
-
|
|
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 {
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
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
|
-
|
|
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
|
-
|
|
966
|
-
|
|
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 {
|
|
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(
|
|
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
|
-
|
|
1045
|
-
|
|
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
|
-
|
|
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 {
|
|
1540
|
+
const { treeExpandedMaps } = internalData;
|
|
1078
1541
|
const childrenField = $xeTree.computeChildrenField;
|
|
1079
1542
|
const mapChildrenField = $xeTree.computeMapChildrenField;
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
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
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
$xeTree.
|
|
1553
|
+
else {
|
|
1554
|
+
internalData.treeExpandedMaps = {};
|
|
1555
|
+
}
|
|
1556
|
+
reactData.updateExpandedFlag++;
|
|
1557
|
+
$xeTree.handleTreeToList();
|
|
1558
|
+
$xeTree.handleData();
|
|
1559
|
+
return $xeTree.recalculate();
|
|
1118
1560
|
},
|
|
1119
|
-
|
|
1561
|
+
reloadExpandNode(node) {
|
|
1120
1562
|
const $xeTree = this;
|
|
1121
|
-
const
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
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
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1585
|
+
/**
|
|
1586
|
+
* 用于树结构,给行数据加载子节点
|
|
1587
|
+
*/
|
|
1588
|
+
loadChildrenNode(node, childRecords) {
|
|
1150
1589
|
const $xeTree = this;
|
|
1151
|
-
const
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
const
|
|
1155
|
-
|
|
1156
|
-
|
|
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
|
|
1164
|
-
const
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
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
|
-
|
|
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
|
|
1277
|
-
|
|
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
|
-
|
|
1770
|
+
showLine
|
|
1317
1771
|
? h('div', {
|
|
1318
|
-
class: 'vxe-tree--node-
|
|
1319
|
-
},
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
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(
|
|
1809
|
+
}, titleSlot ? getSlotVNs(titleSlot(nParams)) : `${nodeValue}`),
|
|
1346
1810
|
extraSlot
|
|
1347
1811
|
? h('div', {
|
|
1348
1812
|
class: 'vxe-tree--node-item-extra'
|
|
1349
|
-
}, getSlotVNs(extraSlot(
|
|
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
|
-
|
|
1819
|
+
renderList(h, treeList) {
|
|
1361
1820
|
const $xeTree = this;
|
|
1362
|
-
const
|
|
1363
|
-
const
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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);
|