@hi-ui/check-tree-select 4.0.0-beta.4 → 4.0.0-beta.40

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.
@@ -35,7 +35,7 @@ var treeUtils = require('@hi-ui/tree-utils');
35
35
 
36
36
  var typeAssertion = require('@hi-ui/type-assertion');
37
37
 
38
- var lodash = require('lodash');
38
+ var arrayUtils = require('@hi-ui/array-utils');
39
39
 
40
40
  var highlighter = require('@hi-ui/highlighter');
41
41
 
@@ -45,8 +45,12 @@ var icons = require('@hi-ui/icons');
45
45
 
46
46
  var localeContext = require('@hi-ui/locale-context');
47
47
 
48
+ var funcUtils = require('@hi-ui/func-utils');
49
+
48
50
  var useSearchMode = require('@hi-ui/use-search-mode');
49
51
 
52
+ var useCheck = require('./hooks/use-check.js');
53
+
50
54
  function _interopDefaultLegacy(e) {
51
55
  return e && _typeof(e) === 'object' && 'default' in e ? e : {
52
56
  'default': e
@@ -73,9 +77,12 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
73
77
  dataSource = _a.dataSource,
74
78
  _a$disabled = _a.disabled,
75
79
  disabled = _a$disabled === void 0 ? false : _a$disabled,
80
+ onOpen = _a.onOpen,
81
+ onClose = _a.onClose,
76
82
  _a$fieldNames = _a.fieldNames,
77
83
  fieldNames = _a$fieldNames === void 0 ? DEFAULT_FIELD_NAMES : _a$fieldNames,
78
- checkedMode = _a.checkedMode,
84
+ _a$checkedMode = _a.checkedMode,
85
+ checkedMode = _a$checkedMode === void 0 ? 'ALL' : _a$checkedMode,
79
86
  _a$defaultExpandAll = _a.defaultExpandAll,
80
87
  defaultExpandAll = _a$defaultExpandAll === void 0 ? false : _a$defaultExpandAll,
81
88
  expandedIdsProp = _a.expandedIds,
@@ -91,20 +98,27 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
91
98
  onLoadChildren = _a.onLoadChildren,
92
99
  titleRender = _a.render,
93
100
  filterOption = _a.filterOption,
101
+ onSearchProp = _a.onSearch,
94
102
  clearable = _a.clearable,
95
103
  invalid = _a.invalid,
96
104
  displayRender = _a.displayRender,
97
105
  placeholderProp = _a.placeholder,
98
106
  appearance = _a.appearance,
99
- rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "dataSource", "disabled", "fieldNames", "checkedMode", "defaultExpandAll", "expandedIds", "defaultExpandedIds", "onExpand", "defaultValue", "value", "onChange", "searchable", "searchMode", "onLoadChildren", "render", "filterOption", "clearable", "invalid", "displayRender", "placeholder", "appearance"]);
107
+ virtual = _a.virtual,
108
+ itemHeight = _a.itemHeight,
109
+ height = _a.height,
110
+ rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "dataSource", "disabled", "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"]);
100
111
 
101
112
  var i18n = localeContext.useLocaleContext();
102
113
  var placeholder = typeAssertion.isUndef(placeholderProp) ? i18n.get('checkTreeSelect.placeholder') : placeholderProp;
103
114
 
104
- var _useToggle = useToggle.useToggle(),
105
- menuVisible = _useToggle[0],
106
- menuVisibleAction = _useToggle[1]; // const [viewSelected, setViewSelected] = useState(false)
107
-
115
+ var _useUncontrolledToggl = useToggle.useUncontrolledToggle({
116
+ disabled: disabled,
117
+ onOpen: onOpen,
118
+ onClose: onClose
119
+ }),
120
+ menuVisible = _useUncontrolledToggl[0],
121
+ menuVisibleAction = _useUncontrolledToggl[1];
108
122
  /**
109
123
  * 转换对象
110
124
  */
@@ -114,11 +128,22 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
114
128
  return node[fieldNames[key] || key];
115
129
  }, [fieldNames]);
116
130
  var flattedData = React.useMemo(function () {
117
- return treeUtils.flattenTree(data, function (node) {
118
- node.id = getKeyFields(node.raw, 'id'); // @ts-ignore
119
-
120
- node.title = getKeyFields(node.raw, 'title');
121
- return node;
131
+ return treeUtils.baseFlattenTree({
132
+ tree: data,
133
+ childrenFieldName: function childrenFieldName(node) {
134
+ return getKeyFields(node, 'children');
135
+ },
136
+ transform: function transform(node) {
137
+ var _a, _b;
138
+
139
+ var flattedNode = node;
140
+ var raw = node.raw;
141
+ flattedNode.id = getKeyFields(raw, 'id');
142
+ flattedNode.title = getKeyFields(raw, 'title');
143
+ flattedNode.disabled = (_a = getKeyFields(raw, 'disabled')) !== null && _a !== void 0 ? _a : false;
144
+ flattedNode.isLeaf = (_b = getKeyFields(raw, 'isLeaf')) !== null && _b !== void 0 ? _b : false;
145
+ return flattedNode;
146
+ }
122
147
  });
123
148
  }, [data, getKeyFields]); // TODO: 抽离展开hook
124
149
  // TODO: onLoadChildren 和 defaultExpandAll 共存时
@@ -136,34 +161,27 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
136
161
  expandedIds = _useUncontrolledState[0],
137
162
  tryChangeExpandedIds = _useUncontrolledState[1];
138
163
 
139
- var _useUncontrolledState2 = useUncontrolledState.useUncontrolledState(defaultValue, valueProp, onChange),
140
- value = _useUncontrolledState2[0],
141
- tryChangeValue = _useUncontrolledState2[1]; // 搜索时临时选中缓存数据
142
-
143
-
144
- var _useState = React.useState([]),
145
- selectedItems = _useState[0],
146
- setSelectedItems = _useState[1];
147
-
148
- var onSelect = React.useCallback(function (checkedIds, option) {
149
- tryChangeValue(checkedIds, option); // 存取异步选中数据
150
-
151
- setSelectedItems(function (prev) {
152
- var next = [].concat(prev);
153
- var targetNode = option.targetNode,
154
- checked = option.checked;
155
-
156
- if (checked) {
157
- next.push(targetNode);
158
- } else {
159
- next.filter(function (item) {
160
- return item.id !== targetNode.id;
161
- });
162
- }
163
-
164
- return next;
165
- });
166
- }, [tryChangeValue]); // ************************** 异步搜索 ************************* //
164
+ var _useCheck = useCheck.useCheck(checkedMode, disabled, flattedData, defaultValue, valueProp, onChange),
165
+ value = _useCheck[0],
166
+ tryChangeValue = _useCheck[1],
167
+ onNodeCheck = _useCheck[2],
168
+ checkedNodes = _useCheck[3],
169
+ parsedCheckedIds = _useCheck[4];
170
+
171
+ var onCheck = React.useCallback(function (checkedIds, option) {
172
+ var targetNode = option.targetNode,
173
+ checked = option.checked;
174
+ onNodeCheck(targetNode, checked);
175
+ }, [onNodeCheck]);
176
+ var onValueChange = React.useCallback(function (values, targetItem, shouldChecked) {
177
+ // 清空
178
+ if (values.length === 0) {
179
+ tryChangeValue([], null, shouldChecked, []);
180
+ } else {
181
+ // 操作单个
182
+ onNodeCheck(targetItem[0], shouldChecked);
183
+ }
184
+ }, [tryChangeValue, onNodeCheck]); // ************************** 异步搜索 ************************* //
167
185
  // const { loading, hasError, loadRemoteData } = useDataSource({ dataSource, validate: isArray })
168
186
 
169
187
  var _b = useSearchMode.useAsyncSearch({
@@ -209,7 +227,7 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
209
227
 
210
228
 
211
229
  var highlight = !!searchValue && (searchMode === 'highlight' || searchMode === 'filter');
212
- var ret = highlight ? /*#__PURE__*/React__default['default'].createElement(highlighter.Highlighter, {
230
+ var ret = highlight ? /*#__PURE__*/React__default["default"].createElement(highlighter.Highlighter, {
213
231
  keyword: searchValue
214
232
  }, node.title) : true;
215
233
  return ret;
@@ -229,9 +247,9 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
229
247
  }; // 下拉菜单不能合并(因为树形数据,不知道是第几级)
230
248
 
231
249
  var mergedData = React.useMemo(function () {
232
- var nextData = selectedItems.concat(flattedData);
233
- return lodash.uniqBy(nextData, 'id');
234
- }, [selectedItems, flattedData]);
250
+ var nextData = checkedNodes.concat(flattedData);
251
+ return arrayUtils.uniqBy(nextData, 'id');
252
+ }, [checkedNodes, flattedData]);
235
253
  var cls = classname.cx(prefixCls, className); // 过滤掉未选中的数据
236
254
  // const tagList = useMemo(() => {
237
255
  // // @ts-ignore
@@ -240,7 +258,7 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
240
258
  // return flattedData.filter((item) => ids.includes(item.id))
241
259
  // }, [value, flattedData])
242
260
 
243
- return /*#__PURE__*/React__default['default'].createElement(picker.Picker, Object.assign({
261
+ return /*#__PURE__*/React__default["default"].createElement(picker.Picker, Object.assign({
244
262
  ref: ref,
245
263
  className: cls
246
264
  }, rest, {
@@ -255,9 +273,9 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
255
273
  // onChange={tryChangeValue}
256
274
  // data={mergedData}
257
275
  searchable: searchable,
258
- onSearch: onSearch,
276
+ onSearch: funcUtils.callAllFuncs(onSearchProp, onSearch),
259
277
  loading: loading,
260
- trigger: /*#__PURE__*/React__default['default'].createElement(tagInput.TagInputMock // ref={targetElementRef}
278
+ trigger: /*#__PURE__*/React__default["default"].createElement(tagInput.TagInputMock // ref={targetElementRef}
261
279
  // onClick={openMenu}
262
280
  // disabled={disabled}
263
281
  , {
@@ -268,30 +286,33 @@ var CheckTreeSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
268
286
  placeholder: placeholder,
269
287
  // @ts-ignore
270
288
  displayRender: displayRender,
271
- suffix: menuVisible ? /*#__PURE__*/React__default['default'].createElement(icons.UpOutlined, null) : /*#__PURE__*/React__default['default'].createElement(icons.DownOutlined, null),
289
+ suffix: menuVisible ? /*#__PURE__*/React__default["default"].createElement(icons.UpOutlined, null) : /*#__PURE__*/React__default["default"].createElement(icons.DownOutlined, null),
272
290
  focused: menuVisible,
273
291
  appearance: appearance,
274
292
  value: value,
275
- onChange: tryChangeValue,
293
+ onChange: onValueChange,
276
294
  data: mergedData,
277
295
  // @ts-ignore
278
- invalid: invalid,
279
- onExpand: function onExpand() {
280
- // setViewSelected(true)
281
- menuVisibleAction.on();
282
- }
296
+ invalid: invalid
283
297
  })
284
- }), typeAssertion.isArrayNonEmpty(treeProps.data) ? /*#__PURE__*/React__default['default'].createElement(tree.Tree, Object.assign({
298
+ }), typeAssertion.isArrayNonEmpty(treeProps.data) ?
299
+ /*#__PURE__*/
300
+ // 只做渲染,不做逻辑处理(比如搜索过滤后,check操作的是对过滤后的data操作,这是不符合预期的)
301
+ React__default["default"].createElement(tree.Tree, Object.assign({
285
302
  className: prefixCls + "__tree",
286
303
  selectable: false,
287
304
  checkable: true,
288
305
  checkOnSelect: true,
289
- checkedMode: checkedMode,
290
- checkedIds: value,
291
- onCheck: onSelect,
306
+ checkedMode: checkedMode === 'SEPARATE' ? 'SEPARATE' : 'ALL',
307
+ checkedIds: parsedCheckedIds,
308
+ onCheck: onCheck,
292
309
  // TODO: 支持 fieldNames
293
- // 禁用时被选中的样式处理
294
- onLoadChildren: onLoadChildren
310
+ // @ts-ignore
311
+ onLoadChildren: onLoadChildren,
312
+ fieldNames: fieldNames,
313
+ virtual: virtual,
314
+ itemHeight: itemHeight,
315
+ height: height
295
316
  }, treeProps)) : null);
296
317
  });
297
318
 
@@ -353,4 +374,3 @@ var getSemiCheckedIdsWithSet = function getSemiCheckedIdsWithSet(flattedData, is
353
374
 
354
375
  exports.CheckTreeSelect = CheckTreeSelect;
355
376
  exports.getSemiCheckedIdsWithSet = getSemiCheckedIdsWithSet;
356
- //# 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
@@ -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
@@ -12,11 +12,10 @@
12
12
  Object.defineProperty(exports, '__esModule', {
13
13
  value: true
14
14
  });
15
- var css_248z = "@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n";
15
+ var css_248z = "";
16
16
 
17
- var __styleInject__ = require('style-inject/dist/style-inject.es.js')["default"];
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;