@hi-ui/check-tree-select 4.3.0 → 4.3.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/CHANGELOG.md +53 -0
- package/lib/cjs/CheckTreeSelect.js +110 -165
- package/lib/cjs/hooks/use-check.js +31 -44
- package/lib/cjs/index.js +0 -3
- package/lib/cjs/styles/index.scss.js +0 -3
- package/lib/cjs/utils/index.js +10 -36
- package/lib/esm/CheckTreeSelect.js +107 -137
- package/lib/esm/hooks/use-check.js +31 -39
- package/lib/esm/styles/index.scss.js +0 -2
- package/lib/esm/utils/index.js +10 -33
- package/package.json +22 -22
package/lib/cjs/utils/index.js
CHANGED
@@ -12,10 +12,9 @@
|
|
12
12
|
Object.defineProperty(exports, '__esModule', {
|
13
13
|
value: true
|
14
14
|
});
|
15
|
-
|
16
15
|
var treeUtils = require('@hi-ui/tree-utils');
|
17
|
-
|
18
16
|
var typeAssertion = require('@hi-ui/type-assertion');
|
17
|
+
|
19
18
|
/**
|
20
19
|
* 处理选中的回显数据
|
21
20
|
*
|
@@ -23,19 +22,14 @@ var typeAssertion = require('@hi-ui/type-assertion');
|
|
23
22
|
* @param nodeEntries 所有数据的Map 集合
|
24
23
|
* @param type 数据回显方式
|
25
24
|
*/
|
26
|
-
|
27
|
-
|
28
25
|
var processCheckedIds = function processCheckedIds(type, checkedIds, flattenData, allowCheck) {
|
29
26
|
var keySet = new Set(checkedIds);
|
30
|
-
|
31
27
|
switch (type) {
|
32
28
|
case 'CHILD':
|
33
29
|
return checkedIds.filter(function (id) {
|
34
30
|
var node = treeUtils.fFindNodeById(flattenData, id);
|
35
|
-
|
36
31
|
if (node) {
|
37
32
|
var children = node.children;
|
38
|
-
|
39
33
|
if (typeAssertion.isArrayNonEmpty(children)) {
|
40
34
|
if (children.filter(allowCheck).every(function (node) {
|
41
35
|
return keySet.has(node.id);
|
@@ -43,48 +37,38 @@ var processCheckedIds = function processCheckedIds(type, checkedIds, flattenData
|
|
43
37
|
return false;
|
44
38
|
}
|
45
39
|
}
|
46
|
-
}
|
47
|
-
|
48
|
-
|
40
|
+
}
|
41
|
+
// 没有孩子节点,保留
|
49
42
|
return true;
|
50
43
|
});
|
51
|
-
|
52
44
|
case 'PARENT':
|
53
45
|
return checkedIds.filter(function (id) {
|
54
46
|
var node = treeUtils.fFindNodeById(flattenData, id);
|
55
|
-
|
56
47
|
if (node) {
|
57
48
|
// 向上递归遍历是否被勾选
|
58
49
|
var ancestors = treeUtils.getNodeAncestors(node);
|
59
|
-
|
60
50
|
if (ancestors.some(function (parent) {
|
61
51
|
return keySet.has(parent.id);
|
62
52
|
})) {
|
63
53
|
return false;
|
64
54
|
}
|
65
55
|
}
|
66
|
-
|
67
56
|
return true;
|
68
57
|
});
|
69
58
|
}
|
70
|
-
|
71
59
|
return checkedIds;
|
72
60
|
};
|
73
61
|
/**
|
74
62
|
* 根据传入的 checkedIds 解析全选/半选数据
|
75
63
|
*/
|
76
|
-
|
77
|
-
|
78
64
|
var parseCheckDataDirty = function parseCheckDataDirty(type, checkedIds, flattenData, allowCheck) {
|
79
65
|
switch (type) {
|
80
66
|
case 'CHILD':
|
81
67
|
case 'PARENT':
|
82
68
|
return dirtyCheck(checkedIds, flattenData, allowCheck);
|
83
69
|
}
|
84
|
-
|
85
70
|
return checkedIds;
|
86
71
|
};
|
87
|
-
|
88
72
|
function dirtyCheck(checkedIds, flattenData, allowCheck) {
|
89
73
|
var nodeEntities = flattenData.reduce(function (prev, cur) {
|
90
74
|
prev[cur.id] = cur;
|
@@ -94,18 +78,16 @@ function dirtyCheck(checkedIds, flattenData, allowCheck) {
|
|
94
78
|
return !!nodeEntities[id];
|
95
79
|
}));
|
96
80
|
var depthEntities = new Map();
|
97
|
-
var maxDepth = 0;
|
98
|
-
|
81
|
+
var maxDepth = 0;
|
82
|
+
// Convert entities by depth for calculation
|
99
83
|
Object.keys(nodeEntities).forEach(function (id) {
|
100
84
|
var entity = nodeEntities[id];
|
101
85
|
var depth = entity.depth;
|
102
86
|
var depthSet = depthEntities.get(depth);
|
103
|
-
|
104
87
|
if (!depthSet) {
|
105
88
|
depthSet = new Set();
|
106
89
|
depthEntities.set(depth, depthSet);
|
107
90
|
}
|
108
|
-
|
109
91
|
depthSet.add(entity);
|
110
92
|
maxDepth = Math.max(maxDepth, depth);
|
111
93
|
});
|
@@ -117,8 +99,6 @@ function dirtyCheck(checkedIds, flattenData, allowCheck) {
|
|
117
99
|
* 1. 把所有嵌套孩子节点 allowCheck 的都标记为 checked
|
118
100
|
* 2. 祖先节点从下至上维护 checked 状态
|
119
101
|
*/
|
120
|
-
|
121
|
-
|
122
102
|
function fillCheck(checkedIds, depthEntities, nodeEntities, maxDepth, allowCheck) {
|
123
103
|
var checkedIdsSet = new Set(checkedIds);
|
124
104
|
checkedIdsSet.forEach(function (id) {
|
@@ -127,37 +107,31 @@ function fillCheck(checkedIds, depthEntities, nodeEntities, maxDepth, allowCheck
|
|
127
107
|
nestedChildren.forEach(function (child) {
|
128
108
|
checkedIdsSet.add(child.id);
|
129
109
|
});
|
130
|
-
});
|
131
|
-
|
110
|
+
});
|
111
|
+
// 缓存中间结果,优化查询
|
132
112
|
var visitedIds = new Map();
|
133
|
-
|
134
113
|
for (var depth = maxDepth - 1; depth >= 0; --depth) {
|
135
114
|
var entities = depthEntities.get(depth);
|
136
115
|
entities === null || entities === void 0 ? void 0 : entities.forEach(function (entity) {
|
137
116
|
var id = entity.id,
|
138
|
-
|
117
|
+
children = entity.children;
|
139
118
|
if (visitedIds.has(id)) return;
|
140
|
-
|
141
119
|
if (typeAssertion.isArrayNonEmpty(children)) {
|
142
120
|
var shouldChecked = !children.some(function (child) {
|
143
121
|
if (visitedIds.has(child.id)) {
|
144
122
|
return !visitedIds.get(child.id);
|
145
123
|
}
|
146
|
-
|
147
124
|
return !checkedIdsSet.has(child.id);
|
148
125
|
});
|
149
126
|
visitedIds.set(id, shouldChecked);
|
150
|
-
|
151
127
|
if (shouldChecked && allowCheck(entity)) {
|
152
128
|
checkedIdsSet.add(id);
|
153
129
|
}
|
154
130
|
}
|
155
131
|
});
|
156
132
|
}
|
157
|
-
|
158
133
|
return Array.from(checkedIdsSet);
|
159
134
|
}
|
160
|
-
|
161
135
|
var getAllCheckedStatus = function getAllCheckedStatus(flattedData, values) {
|
162
136
|
var treeIds = flattedData.map(function (_ref) {
|
163
137
|
var id = _ref.id;
|
@@ -171,13 +145,13 @@ var getAllCheckedStatus = function getAllCheckedStatus(flattedData, values) {
|
|
171
145
|
treeIdsSet["delete"](id);
|
172
146
|
}
|
173
147
|
});
|
174
|
-
return [hasValue && treeIdsSet.size === 0, hasValue && treeIdsSet.size > 0,
|
148
|
+
return [hasValue && treeIdsSet.size === 0, hasValue && treeIdsSet.size > 0,
|
149
|
+
// 该值用来判断剩余未选中的节点是否都是 disabled 的
|
175
150
|
// 如果为 true 则表示可选值都已选中
|
176
151
|
treeIdsSet.size === flattedData.filter(function (item) {
|
177
152
|
return item.disabled;
|
178
153
|
}).length];
|
179
154
|
};
|
180
|
-
|
181
155
|
exports.getAllCheckedStatus = getAllCheckedStatus;
|
182
156
|
exports.parseCheckDataDirty = parseCheckDataDirty;
|
183
157
|
exports.processCheckedIds = processCheckedIds;
|
@@ -35,69 +35,64 @@ var DEFAULT_EXPANDED_IDS = [];
|
|
35
35
|
/**
|
36
36
|
* 多项树形选择器
|
37
37
|
*/
|
38
|
-
|
39
38
|
var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
40
39
|
var _a$prefixCls = _a.prefixCls,
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
40
|
+
prefixCls = _a$prefixCls === void 0 ? TREE_SELECT_PREFIX : _a$prefixCls,
|
41
|
+
className = _a.className,
|
42
|
+
_a$data = _a.data,
|
43
|
+
data = _a$data === void 0 ? DEFAULT_DATA : _a$data,
|
44
|
+
dataSource = _a.dataSource,
|
45
|
+
_a$disabled = _a.disabled,
|
46
|
+
disabled = _a$disabled === void 0 ? false : _a$disabled,
|
47
|
+
visible = _a.visible,
|
48
|
+
onOpen = _a.onOpen,
|
49
|
+
onClose = _a.onClose,
|
50
|
+
_a$fieldNames = _a.fieldNames,
|
51
|
+
fieldNames = _a$fieldNames === void 0 ? DEFAULT_FIELD_NAMES : _a$fieldNames,
|
52
|
+
_a$checkedMode = _a.checkedMode,
|
53
|
+
checkedMode = _a$checkedMode === void 0 ? 'ALL' : _a$checkedMode,
|
54
|
+
_a$defaultExpandAll = _a.defaultExpandAll,
|
55
|
+
defaultExpandAll = _a$defaultExpandAll === void 0 ? false : _a$defaultExpandAll,
|
56
|
+
expandedIdsProp = _a.expandedIds,
|
57
|
+
_a$defaultExpandedIds = _a.defaultExpandedIds,
|
58
|
+
defaultExpandedIds = _a$defaultExpandedIds === void 0 ? DEFAULT_EXPANDED_IDS : _a$defaultExpandedIds,
|
59
|
+
onExpand = _a.onExpand,
|
60
|
+
_a$defaultValue = _a.defaultValue,
|
61
|
+
defaultValue = _a$defaultValue === void 0 ? DEFAULT_VALUE : _a$defaultValue,
|
62
|
+
valueProp = _a.value,
|
63
|
+
onChange = _a.onChange,
|
64
|
+
searchableProp = _a.searchable,
|
65
|
+
searchModeProp = _a.searchMode,
|
66
|
+
onLoadChildren = _a.onLoadChildren,
|
67
|
+
titleRender = _a.render,
|
68
|
+
filterOption = _a.filterOption,
|
69
|
+
onSearchProp = _a.onSearch,
|
70
|
+
clearable = _a.clearable,
|
71
|
+
invalid = _a.invalid,
|
72
|
+
displayRender = _a.displayRender,
|
73
|
+
placeholderProp = _a.placeholder,
|
74
|
+
appearance = _a.appearance,
|
75
|
+
virtual = _a.virtual,
|
76
|
+
itemHeight = _a.itemHeight,
|
77
|
+
height = _a.height,
|
78
|
+
showCheckAll = _a.showCheckAll,
|
79
|
+
tagInputProps = _a.tagInputProps,
|
80
|
+
_a$size = _a.size,
|
81
|
+
size = _a$size === void 0 ? 'md' : _a$size,
|
82
|
+
rest = __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", "showCheckAll", "tagInputProps", "size"]);
|
85
83
|
var i18n = useLocaleContext();
|
86
84
|
var placeholder = isUndef(placeholderProp) ? i18n.get('checkTreeSelect.placeholder') : placeholderProp;
|
87
|
-
|
88
85
|
var _useUncontrolledToggl = useUncontrolledToggle({
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
86
|
+
visible: visible,
|
87
|
+
disabled: disabled,
|
88
|
+
onOpen: onOpen,
|
89
|
+
onClose: onClose
|
90
|
+
}),
|
91
|
+
menuVisible = _useUncontrolledToggl[0],
|
92
|
+
menuVisibleAction = _useUncontrolledToggl[1];
|
96
93
|
/**
|
97
94
|
* 转换对象
|
98
95
|
*/
|
99
|
-
|
100
|
-
|
101
96
|
var getKeyFields = useCallback(function (node, key) {
|
102
97
|
return node[fieldNames[key] || key];
|
103
98
|
}, [fieldNames]);
|
@@ -109,7 +104,6 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
109
104
|
},
|
110
105
|
transform: function transform(node) {
|
111
106
|
var _a, _b;
|
112
|
-
|
113
107
|
var flattedNode = node;
|
114
108
|
var raw = node.raw;
|
115
109
|
flattedNode.id = getKeyFields(raw, 'id');
|
@@ -119,32 +113,29 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
119
113
|
return flattedNode;
|
120
114
|
}
|
121
115
|
});
|
122
|
-
}, [data, getKeyFields]);
|
116
|
+
}, [data, getKeyFields]);
|
117
|
+
// TODO: 抽离展开hook
|
123
118
|
// TODO: onLoadChildren 和 defaultExpandAll 共存时
|
124
|
-
|
125
119
|
var _useUncontrolledState = useUncontrolledState(function getDefaultExpandedIds() {
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
tryChangeExpandedIds = _useUncontrolledState[1];
|
137
|
-
|
120
|
+
// 开启默认展开全部
|
121
|
+
if (defaultExpandAll) {
|
122
|
+
return flattedData.map(function (node) {
|
123
|
+
return node.id;
|
124
|
+
});
|
125
|
+
}
|
126
|
+
return defaultExpandedIds;
|
127
|
+
}, expandedIdsProp, onExpand),
|
128
|
+
expandedIds = _useUncontrolledState[0],
|
129
|
+
tryChangeExpandedIds = _useUncontrolledState[1];
|
138
130
|
var _useCheck = useCheck(checkedMode, disabled, flattedData, defaultValue, valueProp, onChange),
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
131
|
+
value = _useCheck[0],
|
132
|
+
tryChangeValue = _useCheck[1],
|
133
|
+
onNodeCheck = _useCheck[2],
|
134
|
+
checkedNodes = _useCheck[3],
|
135
|
+
parsedCheckedIds = _useCheck[4];
|
145
136
|
var onCheck = useCallback(function (checkedIds, option) {
|
146
137
|
var targetNode = option.targetNode,
|
147
|
-
|
138
|
+
checked = option.checked;
|
148
139
|
onNodeCheck(targetNode, checked);
|
149
140
|
}, [onNodeCheck]);
|
150
141
|
var onValueChange = useCallback(function (values, targetItem, shouldChecked) {
|
@@ -155,16 +146,15 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
155
146
|
// 操作单个
|
156
147
|
onNodeCheck(targetItem[0], shouldChecked);
|
157
148
|
}
|
158
|
-
}, [tryChangeValue, onNodeCheck]);
|
149
|
+
}, [tryChangeValue, onNodeCheck]);
|
150
|
+
// ************************** 异步搜索 ************************* //
|
159
151
|
// const { loading, hasError, loadRemoteData } = useDataSource({ dataSource, validate: isArray })
|
160
|
-
|
161
152
|
var _b = useAsyncSearch({
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
153
|
+
dataSource: dataSource
|
154
|
+
}),
|
155
|
+
loading = _b.loading,
|
156
|
+
hasError = _b.hasError,
|
157
|
+
dataSourceStrategy = __rest(_b, ["loading", "hasError"]);
|
168
158
|
var customSearchStrategy = useTreeCustomSearch({
|
169
159
|
data: data,
|
170
160
|
filterOption: filterOption
|
@@ -180,27 +170,23 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
180
170
|
flattedData: flattedData,
|
181
171
|
searchMode: searchModeProp
|
182
172
|
});
|
183
|
-
|
184
173
|
var _useSearchMode = useSearchMode({
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
174
|
+
searchable: searchableProp,
|
175
|
+
strategies: [dataSourceStrategy, customSearchStrategy, filterSearchStrategy, highlightSearchStrategy]
|
176
|
+
}),
|
177
|
+
stateInSearch = _useSearchMode.state,
|
178
|
+
setStateInSearch = _useSearchMode.setStateInSearch,
|
179
|
+
searchable = _useSearchMode.searchable,
|
180
|
+
searchMode = _useSearchMode.searchMode,
|
181
|
+
onSearch = _useSearchMode.onSearch,
|
182
|
+
searchValue = _useSearchMode.keyword;
|
183
|
+
// 拦截 titleRender,自定义高亮展示
|
196
184
|
var proxyTitleRender = useCallback(function (node) {
|
197
185
|
if (titleRender) {
|
198
186
|
var _ret = titleRender(node);
|
199
|
-
|
200
187
|
if (_ret && _ret !== true) return _ret;
|
201
|
-
}
|
202
|
-
|
203
|
-
|
188
|
+
}
|
189
|
+
// 本地搜索执行默认高亮规则
|
204
190
|
var highlight = !!searchValue && (searchMode === 'highlight' || searchMode === 'filter');
|
205
191
|
var ret = highlight ? /*#__PURE__*/React.createElement(Highlighter, {
|
206
192
|
keyword: searchValue
|
@@ -219,19 +205,18 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
219
205
|
});
|
220
206
|
} : tryChangeExpandedIds,
|
221
207
|
render: proxyTitleRender
|
222
|
-
};
|
223
|
-
|
208
|
+
};
|
209
|
+
// 下拉菜单不能合并(因为树形数据,不知道是第几级)
|
224
210
|
var mergedData = useMemo(function () {
|
225
211
|
var nextData = checkedNodes.concat(flattedData);
|
226
212
|
return uniqBy(nextData, 'id');
|
227
213
|
}, [checkedNodes, flattedData]);
|
228
214
|
var toggleCheckAll = useCallback(function () {
|
229
215
|
var _getAllCheckedStatus = getAllCheckedStatus(flattedData, parsedCheckedIds),
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
216
|
+
currentAllChecked = _getAllCheckedStatus[0],
|
217
|
+
hasCheckedAll = _getAllCheckedStatus[2];
|
218
|
+
var shouldChecked = !currentAllChecked;
|
219
|
+
// 全选操作
|
235
220
|
if (!currentAllChecked && !hasCheckedAll) {
|
236
221
|
tryChangeValue(flattedData.filter(function (item) {
|
237
222
|
if (!item.disabled) {
|
@@ -239,14 +224,11 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
239
224
|
if (checkedMode === 'CHILD') {
|
240
225
|
return !item.children;
|
241
226
|
}
|
242
|
-
|
243
227
|
if (checkedMode === 'PARENT') {
|
244
228
|
return item.depth === 0;
|
245
229
|
}
|
246
|
-
|
247
230
|
return true;
|
248
231
|
}
|
249
|
-
|
250
232
|
return false;
|
251
233
|
}).map(function (_ref) {
|
252
234
|
var id = _ref.id;
|
@@ -256,13 +238,11 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
256
238
|
tryChangeValue([], null, shouldChecked, []);
|
257
239
|
}
|
258
240
|
}, [checkedMode, flattedData, parsedCheckedIds, tryChangeValue]);
|
259
|
-
|
260
241
|
var _useMemo = useMemo(function () {
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
242
|
+
return getAllCheckedStatus(flattedData, parsedCheckedIds);
|
243
|
+
}, [flattedData, parsedCheckedIds]),
|
244
|
+
showAllChecked = _useMemo[0],
|
245
|
+
showIndeterminate = _useMemo[1];
|
266
246
|
var renderDefaultFooter = function renderDefaultFooter() {
|
267
247
|
if (showCheckAll) {
|
268
248
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Checkbox, {
|
@@ -272,15 +252,14 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
272
252
|
}, i18n.get('checkSelect.checkAll')));
|
273
253
|
}
|
274
254
|
};
|
275
|
-
|
276
|
-
|
255
|
+
var cls = cx(prefixCls, className);
|
256
|
+
// 过滤掉未选中的数据
|
277
257
|
// const tagList = useMemo(() => {
|
278
258
|
// // @ts-ignore
|
279
259
|
// const [semiCheckedIds] = getSemiCheckedIdsWithSet(flattedData, (id) => value.includes(id))
|
280
260
|
// const ids = Array.from(new Set([...semiCheckedIds, ...value]))
|
281
261
|
// return flattedData.filter((item) => ids.includes(item.id))
|
282
262
|
// }, [value, flattedData])
|
283
|
-
|
284
263
|
return /*#__PURE__*/React.createElement(Picker, Object.assign({
|
285
264
|
ref: ref,
|
286
265
|
className: cls
|
@@ -317,8 +296,7 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
317
296
|
// @ts-ignore
|
318
297
|
invalid: invalid
|
319
298
|
}))
|
320
|
-
}), isArrayNonEmpty(treeProps.data) ?
|
321
|
-
/*#__PURE__*/
|
299
|
+
}), isArrayNonEmpty(treeProps.data) ? ( /*#__PURE__*/
|
322
300
|
// 只做渲染,不做逻辑处理(比如搜索过滤后,check操作的是对过滤后的data操作,这是不符合预期的)
|
323
301
|
React.createElement(Tree, Object.assign({
|
324
302
|
size: 'md',
|
@@ -335,13 +313,11 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
335
313
|
virtual: virtual,
|
336
314
|
itemHeight: itemHeight,
|
337
315
|
height: height
|
338
|
-
}, treeProps)) : null);
|
316
|
+
}, treeProps))) : null);
|
339
317
|
});
|
340
|
-
|
341
318
|
if (__DEV__) {
|
342
319
|
CheckTreeSelect.displayName = 'CheckTreeSelect';
|
343
320
|
}
|
344
|
-
|
345
321
|
var ALWAYS_ALLOW = function ALWAYS_ALLOW() {
|
346
322
|
return true;
|
347
323
|
};
|
@@ -352,39 +328,34 @@ var ALWAYS_ALLOW = function ALWAYS_ALLOW() {
|
|
352
328
|
* @param flattedData
|
353
329
|
* @returns
|
354
330
|
*/
|
355
|
-
|
356
|
-
|
357
331
|
var getSemiCheckedIdsWithSet = function getSemiCheckedIdsWithSet(flattedData, isChecked, allowCheck) {
|
358
332
|
if (allowCheck === void 0) {
|
359
333
|
allowCheck = ALWAYS_ALLOW;
|
360
334
|
}
|
361
|
-
|
362
335
|
var semiCheckedNodes = [];
|
363
336
|
var semiCheckedIdsSet = new Set();
|
364
337
|
var parentId;
|
365
338
|
var parent;
|
366
339
|
flattedData.forEach(function (node) {
|
367
340
|
parent = node.parent;
|
368
|
-
|
369
341
|
if (parent && parent.id !== undefined) {
|
370
342
|
if (!allowCheck(parent)) return;
|
371
343
|
parentId = parent.id;
|
372
|
-
if (semiCheckedIdsSet.has(parentId)) return;
|
373
|
-
|
344
|
+
if (semiCheckedIdsSet.has(parentId)) return;
|
345
|
+
// 父节点没选中,但是当前节点被选中,则视为半选
|
374
346
|
if (!isChecked(parentId) && isChecked(node.id)) {
|
375
347
|
semiCheckedIdsSet.add(parentId);
|
376
348
|
semiCheckedNodes.push(parent);
|
377
349
|
}
|
378
350
|
}
|
379
|
-
});
|
380
|
-
|
351
|
+
});
|
352
|
+
// 自下而上设置半选态
|
381
353
|
semiCheckedNodes.forEach(function (node) {
|
382
354
|
parent = node.parent;
|
383
|
-
|
384
355
|
while (parent && parent.id !== undefined) {
|
385
356
|
if (!allowCheck(parent)) return;
|
386
|
-
parentId = parent.id;
|
387
|
-
|
357
|
+
parentId = parent.id;
|
358
|
+
// 可能存在兄弟节点,共同祖先需要去重,避免重复计算
|
388
359
|
if (semiCheckedIdsSet.has(parentId)) return;
|
389
360
|
semiCheckedIdsSet.add(parentId);
|
390
361
|
parent = parent.parent;
|
@@ -393,5 +364,4 @@ var getSemiCheckedIdsWithSet = function getSemiCheckedIdsWithSet(flattedData, is
|
|
393
364
|
var semiCheckedIds = Array.from(semiCheckedIdsSet);
|
394
365
|
return [semiCheckedIds, semiCheckedIdsSet];
|
395
366
|
};
|
396
|
-
|
397
367
|
export { CheckTreeSelect, getSemiCheckedIdsWithSet };
|
@@ -11,72 +11,64 @@ import { useState, useMemo, useCallback } from 'react';
|
|
11
11
|
import { useUncontrolledState } from '@hi-ui/use-uncontrolled-state';
|
12
12
|
import { useCascadeCheck } from '@hi-ui/use-check';
|
13
13
|
import { parseCheckDataDirty, processCheckedIds } from '../utils/index.js';
|
14
|
+
|
14
15
|
/**
|
15
16
|
* 用于 tree 组件复选的 hook
|
16
17
|
*/
|
17
|
-
|
18
18
|
var useCheck = function useCheck(checkedMode, disabled, flattedData, defaultCheckedIds, checkedIdsProp, onCheck) {
|
19
19
|
// 搜索时临时选中缓存数据
|
20
20
|
var _useState = useState([]),
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
checkedNodes = _useState[0],
|
22
|
+
setCheckedNodes = _useState[1];
|
24
23
|
var _useUncontrolledState = useUncontrolledState(defaultCheckedIds, checkedIdsProp, function (checkedIds, checkedNode, checked, semiCheckedIds) {
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
24
|
+
var nextCheckedNodes = flattedData.filter(function (item) {
|
25
|
+
return checkedIds.includes(item.id);
|
26
|
+
});
|
27
|
+
setCheckedNodes(nextCheckedNodes);
|
28
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(checkedIds, {
|
29
|
+
checkedNodes: nextCheckedNodes.map(function (item) {
|
30
|
+
return item.raw;
|
31
|
+
}),
|
32
|
+
targetNode: checkedNode,
|
33
|
+
semiCheckedIds: semiCheckedIds,
|
34
|
+
checked: checked
|
35
|
+
});
|
36
|
+
}),
|
37
|
+
checkedIds = _useUncontrolledState[0],
|
38
|
+
trySetCheckedIds = _useUncontrolledState[1];
|
39
|
+
// 入口数据处理
|
42
40
|
var parsedCheckedIds = useMemo(function () {
|
43
41
|
return parseCheckDataDirty(checkedMode, checkedIds, flattedData, allowCheck);
|
44
42
|
}, [checkedMode, checkedIds, flattedData]);
|
45
43
|
var cascaded = checkedMode !== 'SEPARATE';
|
46
|
-
|
47
44
|
var _useCascadeCheck = useCascadeCheck({
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
45
|
+
cascaded: cascaded,
|
46
|
+
disabled: disabled,
|
47
|
+
flattedData: flattedData,
|
48
|
+
checkedIds: parsedCheckedIds,
|
49
|
+
onCheck: function onCheck(checkedIds, checkedNode, checked, semiCheckedIds) {
|
50
|
+
// 出口数据处理
|
51
|
+
var processedIds = processCheckedIds(checkedMode, checkedIds, flattedData, allowCheck);
|
52
|
+
trySetCheckedIds(processedIds, checkedNode, checked, semiCheckedIds);
|
53
|
+
},
|
54
|
+
allowCheck: allowCheck
|
55
|
+
}),
|
56
|
+
onNodeCheck = _useCascadeCheck[0];
|
61
57
|
var proxyOnNodeCheck = useCallback(function (target, shouldChecked) {
|
62
58
|
// 保证 target 来源于原数据自身,而不是tree内部
|
63
59
|
var targetNode = flattedData.find(function (item) {
|
64
60
|
return item.id === target.id;
|
65
61
|
});
|
66
|
-
|
67
62
|
if (targetNode) {
|
68
63
|
onNodeCheck(targetNode, shouldChecked);
|
69
64
|
}
|
70
65
|
}, [onNodeCheck, flattedData]);
|
71
66
|
return [checkedIds, trySetCheckedIds, proxyOnNodeCheck, checkedNodes, parsedCheckedIds];
|
72
67
|
};
|
73
|
-
|
74
68
|
var allowCheck = function allowCheck(targetItem) {
|
75
69
|
if (targetItem.disabled) {
|
76
70
|
return false;
|
77
71
|
}
|
78
|
-
|
79
72
|
return true;
|
80
73
|
};
|
81
|
-
|
82
74
|
export { useCheck };
|