@hi-ui/check-tree-select 4.3.0 → 4.3.1
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 +27 -0
- package/lib/cjs/CheckTreeSelect.js +112 -178
- package/lib/cjs/hooks/use-check.js +31 -47
- package/lib/cjs/index.js +0 -3
- package/lib/cjs/styles/index.scss.js +0 -3
- package/lib/cjs/utils/index.js +10 -39
- package/lib/esm/CheckTreeSelect.js +106 -136
- 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
@@ -9,13 +9,9 @@
|
|
9
9
|
*/
|
10
10
|
'use strict';
|
11
11
|
|
12
|
-
Object.defineProperty(exports, '__esModule', {
|
13
|
-
value: true
|
14
|
-
});
|
15
|
-
|
16
12
|
var treeUtils = require('@hi-ui/tree-utils');
|
17
|
-
|
18
13
|
var typeAssertion = require('@hi-ui/type-assertion');
|
14
|
+
|
19
15
|
/**
|
20
16
|
* 处理选中的回显数据
|
21
17
|
*
|
@@ -23,19 +19,14 @@ var typeAssertion = require('@hi-ui/type-assertion');
|
|
23
19
|
* @param nodeEntries 所有数据的Map 集合
|
24
20
|
* @param type 数据回显方式
|
25
21
|
*/
|
26
|
-
|
27
|
-
|
28
22
|
var processCheckedIds = function processCheckedIds(type, checkedIds, flattenData, allowCheck) {
|
29
23
|
var keySet = new Set(checkedIds);
|
30
|
-
|
31
24
|
switch (type) {
|
32
25
|
case 'CHILD':
|
33
26
|
return checkedIds.filter(function (id) {
|
34
27
|
var node = treeUtils.fFindNodeById(flattenData, id);
|
35
|
-
|
36
28
|
if (node) {
|
37
29
|
var children = node.children;
|
38
|
-
|
39
30
|
if (typeAssertion.isArrayNonEmpty(children)) {
|
40
31
|
if (children.filter(allowCheck).every(function (node) {
|
41
32
|
return keySet.has(node.id);
|
@@ -43,48 +34,38 @@ var processCheckedIds = function processCheckedIds(type, checkedIds, flattenData
|
|
43
34
|
return false;
|
44
35
|
}
|
45
36
|
}
|
46
|
-
}
|
47
|
-
|
48
|
-
|
37
|
+
}
|
38
|
+
// 没有孩子节点,保留
|
49
39
|
return true;
|
50
40
|
});
|
51
|
-
|
52
41
|
case 'PARENT':
|
53
42
|
return checkedIds.filter(function (id) {
|
54
43
|
var node = treeUtils.fFindNodeById(flattenData, id);
|
55
|
-
|
56
44
|
if (node) {
|
57
45
|
// 向上递归遍历是否被勾选
|
58
46
|
var ancestors = treeUtils.getNodeAncestors(node);
|
59
|
-
|
60
47
|
if (ancestors.some(function (parent) {
|
61
48
|
return keySet.has(parent.id);
|
62
49
|
})) {
|
63
50
|
return false;
|
64
51
|
}
|
65
52
|
}
|
66
|
-
|
67
53
|
return true;
|
68
54
|
});
|
69
55
|
}
|
70
|
-
|
71
56
|
return checkedIds;
|
72
57
|
};
|
73
58
|
/**
|
74
59
|
* 根据传入的 checkedIds 解析全选/半选数据
|
75
60
|
*/
|
76
|
-
|
77
|
-
|
78
61
|
var parseCheckDataDirty = function parseCheckDataDirty(type, checkedIds, flattenData, allowCheck) {
|
79
62
|
switch (type) {
|
80
63
|
case 'CHILD':
|
81
64
|
case 'PARENT':
|
82
65
|
return dirtyCheck(checkedIds, flattenData, allowCheck);
|
83
66
|
}
|
84
|
-
|
85
67
|
return checkedIds;
|
86
68
|
};
|
87
|
-
|
88
69
|
function dirtyCheck(checkedIds, flattenData, allowCheck) {
|
89
70
|
var nodeEntities = flattenData.reduce(function (prev, cur) {
|
90
71
|
prev[cur.id] = cur;
|
@@ -94,18 +75,16 @@ function dirtyCheck(checkedIds, flattenData, allowCheck) {
|
|
94
75
|
return !!nodeEntities[id];
|
95
76
|
}));
|
96
77
|
var depthEntities = new Map();
|
97
|
-
var maxDepth = 0;
|
98
|
-
|
78
|
+
var maxDepth = 0;
|
79
|
+
// Convert entities by depth for calculation
|
99
80
|
Object.keys(nodeEntities).forEach(function (id) {
|
100
81
|
var entity = nodeEntities[id];
|
101
82
|
var depth = entity.depth;
|
102
83
|
var depthSet = depthEntities.get(depth);
|
103
|
-
|
104
84
|
if (!depthSet) {
|
105
85
|
depthSet = new Set();
|
106
86
|
depthEntities.set(depth, depthSet);
|
107
87
|
}
|
108
|
-
|
109
88
|
depthSet.add(entity);
|
110
89
|
maxDepth = Math.max(maxDepth, depth);
|
111
90
|
});
|
@@ -117,8 +96,6 @@ function dirtyCheck(checkedIds, flattenData, allowCheck) {
|
|
117
96
|
* 1. 把所有嵌套孩子节点 allowCheck 的都标记为 checked
|
118
97
|
* 2. 祖先节点从下至上维护 checked 状态
|
119
98
|
*/
|
120
|
-
|
121
|
-
|
122
99
|
function fillCheck(checkedIds, depthEntities, nodeEntities, maxDepth, allowCheck) {
|
123
100
|
var checkedIdsSet = new Set(checkedIds);
|
124
101
|
checkedIdsSet.forEach(function (id) {
|
@@ -127,37 +104,31 @@ function fillCheck(checkedIds, depthEntities, nodeEntities, maxDepth, allowCheck
|
|
127
104
|
nestedChildren.forEach(function (child) {
|
128
105
|
checkedIdsSet.add(child.id);
|
129
106
|
});
|
130
|
-
});
|
131
|
-
|
107
|
+
});
|
108
|
+
// 缓存中间结果,优化查询
|
132
109
|
var visitedIds = new Map();
|
133
|
-
|
134
110
|
for (var depth = maxDepth - 1; depth >= 0; --depth) {
|
135
111
|
var entities = depthEntities.get(depth);
|
136
112
|
entities === null || entities === void 0 ? void 0 : entities.forEach(function (entity) {
|
137
113
|
var id = entity.id,
|
138
|
-
|
114
|
+
children = entity.children;
|
139
115
|
if (visitedIds.has(id)) return;
|
140
|
-
|
141
116
|
if (typeAssertion.isArrayNonEmpty(children)) {
|
142
117
|
var shouldChecked = !children.some(function (child) {
|
143
118
|
if (visitedIds.has(child.id)) {
|
144
119
|
return !visitedIds.get(child.id);
|
145
120
|
}
|
146
|
-
|
147
121
|
return !checkedIdsSet.has(child.id);
|
148
122
|
});
|
149
123
|
visitedIds.set(id, shouldChecked);
|
150
|
-
|
151
124
|
if (shouldChecked && allowCheck(entity)) {
|
152
125
|
checkedIdsSet.add(id);
|
153
126
|
}
|
154
127
|
}
|
155
128
|
});
|
156
129
|
}
|
157
|
-
|
158
130
|
return Array.from(checkedIdsSet);
|
159
131
|
}
|
160
|
-
|
161
132
|
var getAllCheckedStatus = function getAllCheckedStatus(flattedData, values) {
|
162
133
|
var treeIds = flattedData.map(function (_ref) {
|
163
134
|
var id = _ref.id;
|
@@ -171,13 +142,13 @@ var getAllCheckedStatus = function getAllCheckedStatus(flattedData, values) {
|
|
171
142
|
treeIdsSet["delete"](id);
|
172
143
|
}
|
173
144
|
});
|
174
|
-
return [hasValue && treeIdsSet.size === 0, hasValue && treeIdsSet.size > 0,
|
145
|
+
return [hasValue && treeIdsSet.size === 0, hasValue && treeIdsSet.size > 0,
|
146
|
+
// 该值用来判断剩余未选中的节点是否都是 disabled 的
|
175
147
|
// 如果为 true 则表示可选值都已选中
|
176
148
|
treeIdsSet.size === flattedData.filter(function (item) {
|
177
149
|
return item.disabled;
|
178
150
|
}).length];
|
179
151
|
};
|
180
|
-
|
181
152
|
exports.getAllCheckedStatus = getAllCheckedStatus;
|
182
153
|
exports.parseCheckDataDirty = parseCheckDataDirty;
|
183
154
|
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',
|
@@ -337,11 +315,9 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
337
315
|
height: height
|
338
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 };
|