@hi-ui/check-tree-select 4.0.0-beta.9 → 4.0.2
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/lib/cjs/CheckTreeSelect.js +81 -58
- package/lib/cjs/hooks/use-check.js +92 -0
- package/lib/cjs/index.js +1 -2
- package/lib/cjs/styles/index.scss.js +3 -4
- package/lib/cjs/utils/index.js +162 -0
- package/lib/esm/CheckTreeSelect.js +78 -56
- package/lib/esm/hooks/use-check.js +82 -0
- package/lib/esm/index.js +1 -2
- package/lib/esm/styles/index.scss.js +4 -6
- package/lib/esm/utils/index.js +153 -0
- package/lib/types/CheckTreeSelect.d.ts +29 -24
- package/lib/types/hooks/use-check.d.ts +11 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/types.d.ts +36 -13
- package/lib/types/utils/index.d.ts +13 -0
- package/package.json +24 -22
- package/lib/cjs/CheckTreeSelect.js.map +0 -1
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/styles/index.scss.js.map +0 -1
- package/lib/esm/CheckTreeSelect.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/styles/index.scss.js.map +0 -1
@@ -2,7 +2,7 @@
|
|
2
2
|
* @hi-ui/check-tree-select
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-tree-select#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
@@ -43,12 +43,14 @@ var tagInput = require('@hi-ui/tag-input');
|
|
43
43
|
|
44
44
|
var icons = require('@hi-ui/icons');
|
45
45
|
|
46
|
-
var
|
46
|
+
var core = require('@hi-ui/core');
|
47
47
|
|
48
48
|
var funcUtils = require('@hi-ui/func-utils');
|
49
49
|
|
50
50
|
var useSearchMode = require('@hi-ui/use-search-mode');
|
51
51
|
|
52
|
+
var useCheck = require('./hooks/use-check.js');
|
53
|
+
|
52
54
|
function _interopDefaultLegacy(e) {
|
53
55
|
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
54
56
|
'default': e
|
@@ -75,9 +77,13 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
75
77
|
dataSource = _a.dataSource,
|
76
78
|
_a$disabled = _a.disabled,
|
77
79
|
disabled = _a$disabled === void 0 ? false : _a$disabled,
|
80
|
+
visible = _a.visible,
|
81
|
+
onOpen = _a.onOpen,
|
82
|
+
onClose = _a.onClose,
|
78
83
|
_a$fieldNames = _a.fieldNames,
|
79
84
|
fieldNames = _a$fieldNames === void 0 ? DEFAULT_FIELD_NAMES : _a$fieldNames,
|
80
|
-
checkedMode = _a.checkedMode,
|
85
|
+
_a$checkedMode = _a.checkedMode,
|
86
|
+
checkedMode = _a$checkedMode === void 0 ? 'ALL' : _a$checkedMode,
|
81
87
|
_a$defaultExpandAll = _a.defaultExpandAll,
|
82
88
|
defaultExpandAll = _a$defaultExpandAll === void 0 ? false : _a$defaultExpandAll,
|
83
89
|
expandedIdsProp = _a.expandedIds,
|
@@ -99,15 +105,22 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
99
105
|
displayRender = _a.displayRender,
|
100
106
|
placeholderProp = _a.placeholder,
|
101
107
|
appearance = _a.appearance,
|
102
|
-
|
108
|
+
virtual = _a.virtual,
|
109
|
+
itemHeight = _a.itemHeight,
|
110
|
+
height = _a.height,
|
111
|
+
rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "dataSource", "disabled", "visible", "onOpen", "onClose", "fieldNames", "checkedMode", "defaultExpandAll", "expandedIds", "defaultExpandedIds", "onExpand", "defaultValue", "value", "onChange", "searchable", "searchMode", "onLoadChildren", "render", "filterOption", "onSearch", "clearable", "invalid", "displayRender", "placeholder", "appearance", "virtual", "itemHeight", "height"]);
|
103
112
|
|
104
|
-
var i18n =
|
113
|
+
var i18n = core.useLocaleContext();
|
105
114
|
var placeholder = typeAssertion.isUndef(placeholderProp) ? i18n.get('checkTreeSelect.placeholder') : placeholderProp;
|
106
115
|
|
107
|
-
var
|
108
|
-
|
109
|
-
|
110
|
-
|
116
|
+
var _useUncontrolledToggl = useToggle.useUncontrolledToggle({
|
117
|
+
visible: visible,
|
118
|
+
disabled: disabled,
|
119
|
+
onOpen: onOpen,
|
120
|
+
onClose: onClose
|
121
|
+
}),
|
122
|
+
menuVisible = _useUncontrolledToggl[0],
|
123
|
+
menuVisibleAction = _useUncontrolledToggl[1];
|
111
124
|
/**
|
112
125
|
* 转换对象
|
113
126
|
*/
|
@@ -117,11 +130,22 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
117
130
|
return node[fieldNames[key] || key];
|
118
131
|
}, [fieldNames]);
|
119
132
|
var flattedData = React.useMemo(function () {
|
120
|
-
return treeUtils.
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
133
|
+
return treeUtils.baseFlattenTree({
|
134
|
+
tree: data,
|
135
|
+
childrenFieldName: function childrenFieldName(node) {
|
136
|
+
return getKeyFields(node, 'children');
|
137
|
+
},
|
138
|
+
transform: function transform(node) {
|
139
|
+
var _a, _b;
|
140
|
+
|
141
|
+
var flattedNode = node;
|
142
|
+
var raw = node.raw;
|
143
|
+
flattedNode.id = getKeyFields(raw, 'id');
|
144
|
+
flattedNode.title = getKeyFields(raw, 'title');
|
145
|
+
flattedNode.disabled = (_a = getKeyFields(raw, 'disabled')) !== null && _a !== void 0 ? _a : false;
|
146
|
+
flattedNode.isLeaf = (_b = getKeyFields(raw, 'isLeaf')) !== null && _b !== void 0 ? _b : false;
|
147
|
+
return flattedNode;
|
148
|
+
}
|
125
149
|
});
|
126
150
|
}, [data, getKeyFields]); // TODO: 抽离展开hook
|
127
151
|
// TODO: onLoadChildren 和 defaultExpandAll 共存时
|
@@ -139,34 +163,27 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
139
163
|
expandedIds = _useUncontrolledState[0],
|
140
164
|
tryChangeExpandedIds = _useUncontrolledState[1];
|
141
165
|
|
142
|
-
var
|
143
|
-
value =
|
144
|
-
tryChangeValue =
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
return item.id !== targetNode.id;
|
164
|
-
});
|
165
|
-
}
|
166
|
-
|
167
|
-
return next;
|
168
|
-
});
|
169
|
-
}, [tryChangeValue]); // ************************** 异步搜索 ************************* //
|
166
|
+
var _useCheck = useCheck.useCheck(checkedMode, disabled, flattedData, defaultValue, valueProp, onChange),
|
167
|
+
value = _useCheck[0],
|
168
|
+
tryChangeValue = _useCheck[1],
|
169
|
+
onNodeCheck = _useCheck[2],
|
170
|
+
checkedNodes = _useCheck[3],
|
171
|
+
parsedCheckedIds = _useCheck[4];
|
172
|
+
|
173
|
+
var onCheck = React.useCallback(function (checkedIds, option) {
|
174
|
+
var targetNode = option.targetNode,
|
175
|
+
checked = option.checked;
|
176
|
+
onNodeCheck(targetNode, checked);
|
177
|
+
}, [onNodeCheck]);
|
178
|
+
var onValueChange = React.useCallback(function (values, targetItem, shouldChecked) {
|
179
|
+
// 清空
|
180
|
+
if (values.length === 0) {
|
181
|
+
tryChangeValue([], null, shouldChecked, []);
|
182
|
+
} else {
|
183
|
+
// 操作单个
|
184
|
+
onNodeCheck(targetItem[0], shouldChecked);
|
185
|
+
}
|
186
|
+
}, [tryChangeValue, onNodeCheck]); // ************************** 异步搜索 ************************* //
|
170
187
|
// const { loading, hasError, loadRemoteData } = useDataSource({ dataSource, validate: isArray })
|
171
188
|
|
172
189
|
var _b = useSearchMode.useAsyncSearch({
|
@@ -183,7 +200,8 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
183
200
|
var filterSearchStrategy = useSearchMode.useFilterSearch({
|
184
201
|
enabled: searchModeProp === 'filter',
|
185
202
|
data: data,
|
186
|
-
flattedData: flattedData
|
203
|
+
flattedData: flattedData,
|
204
|
+
fieldNames: fieldNames
|
187
205
|
});
|
188
206
|
var highlightSearchStrategy = useSearchMode.useHighlightSearch({
|
189
207
|
data: data,
|
@@ -212,7 +230,7 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
212
230
|
|
213
231
|
|
214
232
|
var highlight = !!searchValue && (searchMode === 'highlight' || searchMode === 'filter');
|
215
|
-
var ret = highlight ? /*#__PURE__*/React__default[
|
233
|
+
var ret = highlight ? /*#__PURE__*/React__default["default"].createElement(highlighter.Highlighter, {
|
216
234
|
keyword: searchValue
|
217
235
|
}, node.title) : true;
|
218
236
|
return ret;
|
@@ -232,9 +250,9 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
232
250
|
}; // 下拉菜单不能合并(因为树形数据,不知道是第几级)
|
233
251
|
|
234
252
|
var mergedData = React.useMemo(function () {
|
235
|
-
var nextData =
|
253
|
+
var nextData = checkedNodes.concat(flattedData);
|
236
254
|
return arrayUtils.uniqBy(nextData, 'id');
|
237
|
-
}, [
|
255
|
+
}, [checkedNodes, flattedData]);
|
238
256
|
var cls = classname.cx(prefixCls, className); // 过滤掉未选中的数据
|
239
257
|
// const tagList = useMemo(() => {
|
240
258
|
// // @ts-ignore
|
@@ -243,7 +261,7 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
243
261
|
// return flattedData.filter((item) => ids.includes(item.id))
|
244
262
|
// }, [value, flattedData])
|
245
263
|
|
246
|
-
return /*#__PURE__*/React__default[
|
264
|
+
return /*#__PURE__*/React__default["default"].createElement(picker.Picker, Object.assign({
|
247
265
|
ref: ref,
|
248
266
|
className: cls
|
249
267
|
}, rest, {
|
@@ -260,7 +278,7 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
260
278
|
searchable: searchable,
|
261
279
|
onSearch: funcUtils.callAllFuncs(onSearchProp, onSearch),
|
262
280
|
loading: loading,
|
263
|
-
trigger: /*#__PURE__*/React__default[
|
281
|
+
trigger: /*#__PURE__*/React__default["default"].createElement(tagInput.TagInputMock // ref={targetElementRef}
|
264
282
|
// onClick={openMenu}
|
265
283
|
// disabled={disabled}
|
266
284
|
, {
|
@@ -271,26 +289,32 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
271
289
|
placeholder: placeholder,
|
272
290
|
// @ts-ignore
|
273
291
|
displayRender: displayRender,
|
274
|
-
suffix: menuVisible ? /*#__PURE__*/React__default[
|
292
|
+
suffix: menuVisible ? /*#__PURE__*/React__default["default"].createElement(icons.UpOutlined, null) : /*#__PURE__*/React__default["default"].createElement(icons.DownOutlined, null),
|
275
293
|
focused: menuVisible,
|
276
294
|
appearance: appearance,
|
277
295
|
value: value,
|
278
|
-
onChange:
|
296
|
+
onChange: onValueChange,
|
279
297
|
data: mergedData,
|
280
298
|
// @ts-ignore
|
281
299
|
invalid: invalid
|
282
300
|
})
|
283
|
-
}), typeAssertion.isArrayNonEmpty(treeProps.data) ?
|
301
|
+
}), typeAssertion.isArrayNonEmpty(treeProps.data) ?
|
302
|
+
/*#__PURE__*/
|
303
|
+
// 只做渲染,不做逻辑处理(比如搜索过滤后,check操作的是对过滤后的data操作,这是不符合预期的)
|
304
|
+
React__default["default"].createElement(tree.Tree, Object.assign({
|
284
305
|
className: prefixCls + "__tree",
|
285
306
|
selectable: false,
|
286
307
|
checkable: true,
|
287
308
|
checkOnSelect: true,
|
288
|
-
checkedMode: checkedMode,
|
289
|
-
checkedIds:
|
290
|
-
onCheck:
|
291
|
-
//
|
292
|
-
|
293
|
-
|
309
|
+
checkedMode: checkedMode === 'SEPARATE' ? 'SEPARATE' : 'ALL',
|
310
|
+
checkedIds: parsedCheckedIds,
|
311
|
+
onCheck: onCheck,
|
312
|
+
// @ts-ignore
|
313
|
+
onLoadChildren: onLoadChildren,
|
314
|
+
fieldNames: fieldNames,
|
315
|
+
virtual: virtual,
|
316
|
+
itemHeight: itemHeight,
|
317
|
+
height: height
|
294
318
|
}, treeProps)) : null);
|
295
319
|
});
|
296
320
|
|
@@ -352,4 +376,3 @@ var getSemiCheckedIdsWithSet = function getSemiCheckedIdsWithSet(flattedData, is
|
|
352
376
|
|
353
377
|
exports.CheckTreeSelect = CheckTreeSelect;
|
354
378
|
exports.getSemiCheckedIdsWithSet = getSemiCheckedIdsWithSet;
|
355
|
-
//# sourceMappingURL=CheckTreeSelect.js.map
|
@@ -0,0 +1,92 @@
|
|
1
|
+
/** @LICENSE
|
2
|
+
* @hi-ui/check-tree-select
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-tree-select#readme
|
4
|
+
*
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
|
+
*
|
7
|
+
* This source code is licensed under the MIT license found in the
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
9
|
+
*/
|
10
|
+
'use strict';
|
11
|
+
|
12
|
+
Object.defineProperty(exports, '__esModule', {
|
13
|
+
value: true
|
14
|
+
});
|
15
|
+
|
16
|
+
var React = require('react');
|
17
|
+
|
18
|
+
var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
|
19
|
+
|
20
|
+
var useCheck$1 = require('@hi-ui/use-check');
|
21
|
+
|
22
|
+
var index = require('../utils/index.js');
|
23
|
+
/**
|
24
|
+
* 用于 tree 组件复选的 hook
|
25
|
+
*/
|
26
|
+
|
27
|
+
|
28
|
+
var useCheck = function useCheck(checkedMode, disabled, flattedData, defaultCheckedIds, checkedIdsProp, onCheck) {
|
29
|
+
// 搜索时临时选中缓存数据
|
30
|
+
var _useState = React.useState([]),
|
31
|
+
checkedNodes = _useState[0],
|
32
|
+
setCheckedNodes = _useState[1];
|
33
|
+
|
34
|
+
var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultCheckedIds, checkedIdsProp, function (checkedIds, checkedNode, checked, semiCheckedIds) {
|
35
|
+
var nextCheckedNodes = flattedData.filter(function (item) {
|
36
|
+
return checkedIds.includes(item.id);
|
37
|
+
});
|
38
|
+
setCheckedNodes(nextCheckedNodes);
|
39
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(checkedIds, {
|
40
|
+
checkedNodes: nextCheckedNodes.map(function (item) {
|
41
|
+
return item.raw;
|
42
|
+
}),
|
43
|
+
targetNode: checkedNode,
|
44
|
+
semiCheckedIds: semiCheckedIds,
|
45
|
+
checked: checked
|
46
|
+
});
|
47
|
+
}),
|
48
|
+
checkedIds = _useUncontrolledState[0],
|
49
|
+
trySetCheckedIds = _useUncontrolledState[1]; // 入口数据处理
|
50
|
+
|
51
|
+
|
52
|
+
var parsedCheckedIds = React.useMemo(function () {
|
53
|
+
return index.parseCheckDataDirty(checkedMode, checkedIds, flattedData, allowCheck);
|
54
|
+
}, [checkedMode, checkedIds, flattedData]);
|
55
|
+
var cascaded = checkedMode !== 'SEPARATE';
|
56
|
+
|
57
|
+
var _useCascadeCheck = useCheck$1.useCascadeCheck({
|
58
|
+
cascaded: cascaded,
|
59
|
+
disabled: disabled,
|
60
|
+
flattedData: flattedData,
|
61
|
+
checkedIds: parsedCheckedIds,
|
62
|
+
onCheck: function onCheck(checkedIds, checkedNode, checked, semiCheckedIds) {
|
63
|
+
// 出口数据处理
|
64
|
+
var processedIds = index.processCheckedIds(checkedMode, checkedIds, flattedData, allowCheck);
|
65
|
+
trySetCheckedIds(processedIds, checkedNode, checked, semiCheckedIds);
|
66
|
+
},
|
67
|
+
allowCheck: allowCheck
|
68
|
+
}),
|
69
|
+
onNodeCheck = _useCascadeCheck[0];
|
70
|
+
|
71
|
+
var proxyOnNodeCheck = React.useCallback(function (target, shouldChecked) {
|
72
|
+
// 保证 target 来源于原数据自身,而不是tree内部
|
73
|
+
var targetNode = flattedData.find(function (item) {
|
74
|
+
return item.id === target.id;
|
75
|
+
});
|
76
|
+
|
77
|
+
if (targetNode) {
|
78
|
+
onNodeCheck(targetNode, shouldChecked);
|
79
|
+
}
|
80
|
+
}, [onNodeCheck, flattedData]);
|
81
|
+
return [checkedIds, trySetCheckedIds, proxyOnNodeCheck, checkedNodes, parsedCheckedIds];
|
82
|
+
};
|
83
|
+
|
84
|
+
var allowCheck = function allowCheck(targetItem) {
|
85
|
+
if (targetItem.disabled) {
|
86
|
+
return false;
|
87
|
+
}
|
88
|
+
|
89
|
+
return true;
|
90
|
+
};
|
91
|
+
|
92
|
+
exports.useCheck = useCheck;
|
package/lib/cjs/index.js
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
* @hi-ui/check-tree-select
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-tree-select#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
@@ -20,4 +20,3 @@ var CheckTreeSelect = require('./CheckTreeSelect.js');
|
|
20
20
|
exports.CheckTreeSelect = CheckTreeSelect.CheckTreeSelect;
|
21
21
|
exports["default"] = CheckTreeSelect.CheckTreeSelect;
|
22
22
|
exports.getSemiCheckedIdsWithSet = CheckTreeSelect.getSemiCheckedIdsWithSet;
|
23
|
-
//# sourceMappingURL=index.js.map
|
@@ -2,7 +2,7 @@
|
|
2
2
|
* @hi-ui/check-tree-select
|
3
3
|
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-tree-select#readme
|
4
4
|
*
|
5
|
-
* Copyright (c)
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
6
|
*
|
7
7
|
* This source code is licensed under the MIT license found in the
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
@@ -12,11 +12,10 @@
|
|
12
12
|
Object.defineProperty(exports, '__esModule', {
|
13
13
|
value: true
|
14
14
|
});
|
15
|
-
var css_248z = "
|
15
|
+
var css_248z = "";
|
16
16
|
|
17
|
-
var __styleInject__ = require('
|
17
|
+
var __styleInject__ = require('inject-head-style')["default"];
|
18
18
|
|
19
19
|
__styleInject__(css_248z);
|
20
20
|
|
21
21
|
exports["default"] = css_248z;
|
22
|
-
//# sourceMappingURL=index.scss.js.map
|
@@ -0,0 +1,162 @@
|
|
1
|
+
/** @LICENSE
|
2
|
+
* @hi-ui/check-tree-select
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-tree-select#readme
|
4
|
+
*
|
5
|
+
* Copyright (c) HiUI <mi-hiui@xiaomi.com>.
|
6
|
+
*
|
7
|
+
* This source code is licensed under the MIT license found in the
|
8
|
+
* LICENSE file in the root directory of this source tree.
|
9
|
+
*/
|
10
|
+
'use strict';
|
11
|
+
|
12
|
+
Object.defineProperty(exports, '__esModule', {
|
13
|
+
value: true
|
14
|
+
});
|
15
|
+
|
16
|
+
var treeUtils = require('@hi-ui/tree-utils');
|
17
|
+
|
18
|
+
var typeAssertion = require('@hi-ui/type-assertion');
|
19
|
+
/**
|
20
|
+
* 处理选中的回显数据
|
21
|
+
*
|
22
|
+
* @param checkedIds 当前所有被选中的节点 ID 集合
|
23
|
+
* @param nodeEntries 所有数据的Map 集合
|
24
|
+
* @param type 数据回显方式
|
25
|
+
*/
|
26
|
+
|
27
|
+
|
28
|
+
var processCheckedIds = function processCheckedIds(type, checkedIds, flattenData, allowCheck) {
|
29
|
+
var keySet = new Set(checkedIds);
|
30
|
+
|
31
|
+
switch (type) {
|
32
|
+
case 'CHILD':
|
33
|
+
return checkedIds.filter(function (id) {
|
34
|
+
var node = treeUtils.fFindNodeById(flattenData, id);
|
35
|
+
|
36
|
+
if (node) {
|
37
|
+
var children = node.children;
|
38
|
+
|
39
|
+
if (typeAssertion.isArrayNonEmpty(children)) {
|
40
|
+
if (children.filter(allowCheck).every(function (node) {
|
41
|
+
return keySet.has(node.id);
|
42
|
+
})) {
|
43
|
+
return false;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
} // 没有孩子节点,保留
|
47
|
+
|
48
|
+
|
49
|
+
return true;
|
50
|
+
});
|
51
|
+
|
52
|
+
case 'PARENT':
|
53
|
+
return checkedIds.filter(function (id) {
|
54
|
+
var node = treeUtils.fFindNodeById(flattenData, id);
|
55
|
+
|
56
|
+
if (node) {
|
57
|
+
// 向上递归遍历是否被勾选
|
58
|
+
var ancestors = treeUtils.getNodeAncestors(node);
|
59
|
+
|
60
|
+
if (ancestors.some(function (parent) {
|
61
|
+
return keySet.has(parent.id);
|
62
|
+
})) {
|
63
|
+
return false;
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
return true;
|
68
|
+
});
|
69
|
+
}
|
70
|
+
|
71
|
+
return checkedIds;
|
72
|
+
};
|
73
|
+
/**
|
74
|
+
* 根据传入的 checkedIds 解析全选/半选数据
|
75
|
+
*/
|
76
|
+
|
77
|
+
|
78
|
+
var parseCheckDataDirty = function parseCheckDataDirty(type, checkedIds, flattenData, allowCheck) {
|
79
|
+
switch (type) {
|
80
|
+
case 'CHILD':
|
81
|
+
case 'PARENT':
|
82
|
+
return dirtyCheck(checkedIds, flattenData, allowCheck);
|
83
|
+
}
|
84
|
+
|
85
|
+
return checkedIds;
|
86
|
+
};
|
87
|
+
|
88
|
+
function dirtyCheck(checkedIds, flattenData, allowCheck) {
|
89
|
+
var nodeEntities = flattenData.reduce(function (prev, cur) {
|
90
|
+
prev[cur.id] = cur;
|
91
|
+
return prev;
|
92
|
+
}, {});
|
93
|
+
var checkedIdsSet = new Set(checkedIds.filter(function (id) {
|
94
|
+
return !!nodeEntities[id];
|
95
|
+
}));
|
96
|
+
var depthEntities = new Map();
|
97
|
+
var maxDepth = 0; // Convert entities by depth for calculation
|
98
|
+
|
99
|
+
Object.keys(nodeEntities).forEach(function (id) {
|
100
|
+
var entity = nodeEntities[id];
|
101
|
+
var depth = entity.depth;
|
102
|
+
var depthSet = depthEntities.get(depth);
|
103
|
+
|
104
|
+
if (!depthSet) {
|
105
|
+
depthSet = new Set();
|
106
|
+
depthEntities.set(depth, depthSet);
|
107
|
+
}
|
108
|
+
|
109
|
+
depthSet.add(entity);
|
110
|
+
maxDepth = Math.max(maxDepth, depth);
|
111
|
+
});
|
112
|
+
return fillCheck(checkedIdsSet, depthEntities, nodeEntities, maxDepth, allowCheck);
|
113
|
+
}
|
114
|
+
/**
|
115
|
+
* 对 checkedIds 级联遗漏选项 id 填充
|
116
|
+
*
|
117
|
+
* 1. 把所有嵌套孩子节点 allowCheck 的都标记为 checked
|
118
|
+
* 2. 祖先节点从下至上维护 checked 状态
|
119
|
+
*/
|
120
|
+
|
121
|
+
|
122
|
+
function fillCheck(checkedIds, depthEntities, nodeEntities, maxDepth, allowCheck) {
|
123
|
+
var checkedIdsSet = new Set(checkedIds);
|
124
|
+
checkedIdsSet.forEach(function (id) {
|
125
|
+
var checkedNode = nodeEntities[id];
|
126
|
+
var nestedChildren = treeUtils.findNestedChildren(checkedNode, allowCheck);
|
127
|
+
nestedChildren.forEach(function (child) {
|
128
|
+
checkedIdsSet.add(child.id);
|
129
|
+
});
|
130
|
+
}); // 缓存中间结果,优化查询
|
131
|
+
|
132
|
+
var visitedIds = new Map();
|
133
|
+
|
134
|
+
for (var depth = maxDepth - 1; depth >= 0; --depth) {
|
135
|
+
var entities = depthEntities.get(depth);
|
136
|
+
entities === null || entities === void 0 ? void 0 : entities.forEach(function (entity) {
|
137
|
+
var id = entity.id,
|
138
|
+
children = entity.children;
|
139
|
+
if (visitedIds.has(id)) return;
|
140
|
+
|
141
|
+
if (typeAssertion.isArrayNonEmpty(children)) {
|
142
|
+
var shouldChecked = !children.some(function (child) {
|
143
|
+
if (visitedIds.has(child.id)) {
|
144
|
+
return !visitedIds.get(child.id);
|
145
|
+
}
|
146
|
+
|
147
|
+
return !checkedIdsSet.has(child.id);
|
148
|
+
});
|
149
|
+
visitedIds.set(id, shouldChecked);
|
150
|
+
|
151
|
+
if (shouldChecked && allowCheck(entity)) {
|
152
|
+
checkedIdsSet.add(id);
|
153
|
+
}
|
154
|
+
}
|
155
|
+
});
|
156
|
+
}
|
157
|
+
|
158
|
+
return Array.from(checkedIdsSet);
|
159
|
+
}
|
160
|
+
|
161
|
+
exports.parseCheckDataDirty = parseCheckDataDirty;
|
162
|
+
exports.processCheckedIds = processCheckedIds;
|