@hi-ui/check-tree-select 4.2.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 +38 -0
- package/lib/cjs/CheckTreeSelect.js +114 -176
- 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 +108 -134
- 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/lib/types/CheckTreeSelect.d.ts +5 -0
- 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,67 +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
|
-
|
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"]);
|
83
83
|
var i18n = useLocaleContext();
|
84
84
|
var placeholder = isUndef(placeholderProp) ? i18n.get('checkTreeSelect.placeholder') : placeholderProp;
|
85
|
-
|
86
85
|
var _useUncontrolledToggl = useUncontrolledToggle({
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
86
|
+
visible: visible,
|
87
|
+
disabled: disabled,
|
88
|
+
onOpen: onOpen,
|
89
|
+
onClose: onClose
|
90
|
+
}),
|
91
|
+
menuVisible = _useUncontrolledToggl[0],
|
92
|
+
menuVisibleAction = _useUncontrolledToggl[1];
|
94
93
|
/**
|
95
94
|
* 转换对象
|
96
95
|
*/
|
97
|
-
|
98
|
-
|
99
96
|
var getKeyFields = useCallback(function (node, key) {
|
100
97
|
return node[fieldNames[key] || key];
|
101
98
|
}, [fieldNames]);
|
@@ -107,7 +104,6 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
107
104
|
},
|
108
105
|
transform: function transform(node) {
|
109
106
|
var _a, _b;
|
110
|
-
|
111
107
|
var flattedNode = node;
|
112
108
|
var raw = node.raw;
|
113
109
|
flattedNode.id = getKeyFields(raw, 'id');
|
@@ -117,32 +113,29 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
117
113
|
return flattedNode;
|
118
114
|
}
|
119
115
|
});
|
120
|
-
}, [data, getKeyFields]);
|
116
|
+
}, [data, getKeyFields]);
|
117
|
+
// TODO: 抽离展开hook
|
121
118
|
// TODO: onLoadChildren 和 defaultExpandAll 共存时
|
122
|
-
|
123
119
|
var _useUncontrolledState = useUncontrolledState(function getDefaultExpandedIds() {
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
tryChangeExpandedIds = _useUncontrolledState[1];
|
135
|
-
|
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];
|
136
130
|
var _useCheck = useCheck(checkedMode, disabled, flattedData, defaultValue, valueProp, onChange),
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
131
|
+
value = _useCheck[0],
|
132
|
+
tryChangeValue = _useCheck[1],
|
133
|
+
onNodeCheck = _useCheck[2],
|
134
|
+
checkedNodes = _useCheck[3],
|
135
|
+
parsedCheckedIds = _useCheck[4];
|
143
136
|
var onCheck = useCallback(function (checkedIds, option) {
|
144
137
|
var targetNode = option.targetNode,
|
145
|
-
|
138
|
+
checked = option.checked;
|
146
139
|
onNodeCheck(targetNode, checked);
|
147
140
|
}, [onNodeCheck]);
|
148
141
|
var onValueChange = useCallback(function (values, targetItem, shouldChecked) {
|
@@ -153,16 +146,15 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
153
146
|
// 操作单个
|
154
147
|
onNodeCheck(targetItem[0], shouldChecked);
|
155
148
|
}
|
156
|
-
}, [tryChangeValue, onNodeCheck]);
|
149
|
+
}, [tryChangeValue, onNodeCheck]);
|
150
|
+
// ************************** 异步搜索 ************************* //
|
157
151
|
// const { loading, hasError, loadRemoteData } = useDataSource({ dataSource, validate: isArray })
|
158
|
-
|
159
152
|
var _b = useAsyncSearch({
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
153
|
+
dataSource: dataSource
|
154
|
+
}),
|
155
|
+
loading = _b.loading,
|
156
|
+
hasError = _b.hasError,
|
157
|
+
dataSourceStrategy = __rest(_b, ["loading", "hasError"]);
|
166
158
|
var customSearchStrategy = useTreeCustomSearch({
|
167
159
|
data: data,
|
168
160
|
filterOption: filterOption
|
@@ -178,27 +170,23 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
178
170
|
flattedData: flattedData,
|
179
171
|
searchMode: searchModeProp
|
180
172
|
});
|
181
|
-
|
182
173
|
var _useSearchMode = useSearchMode({
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
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,自定义高亮展示
|
194
184
|
var proxyTitleRender = useCallback(function (node) {
|
195
185
|
if (titleRender) {
|
196
186
|
var _ret = titleRender(node);
|
197
|
-
|
198
187
|
if (_ret && _ret !== true) return _ret;
|
199
|
-
}
|
200
|
-
|
201
|
-
|
188
|
+
}
|
189
|
+
// 本地搜索执行默认高亮规则
|
202
190
|
var highlight = !!searchValue && (searchMode === 'highlight' || searchMode === 'filter');
|
203
191
|
var ret = highlight ? /*#__PURE__*/React.createElement(Highlighter, {
|
204
192
|
keyword: searchValue
|
@@ -217,19 +205,18 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
217
205
|
});
|
218
206
|
} : tryChangeExpandedIds,
|
219
207
|
render: proxyTitleRender
|
220
|
-
};
|
221
|
-
|
208
|
+
};
|
209
|
+
// 下拉菜单不能合并(因为树形数据,不知道是第几级)
|
222
210
|
var mergedData = useMemo(function () {
|
223
211
|
var nextData = checkedNodes.concat(flattedData);
|
224
212
|
return uniqBy(nextData, 'id');
|
225
213
|
}, [checkedNodes, flattedData]);
|
226
214
|
var toggleCheckAll = useCallback(function () {
|
227
215
|
var _getAllCheckedStatus = getAllCheckedStatus(flattedData, parsedCheckedIds),
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
216
|
+
currentAllChecked = _getAllCheckedStatus[0],
|
217
|
+
hasCheckedAll = _getAllCheckedStatus[2];
|
218
|
+
var shouldChecked = !currentAllChecked;
|
219
|
+
// 全选操作
|
233
220
|
if (!currentAllChecked && !hasCheckedAll) {
|
234
221
|
tryChangeValue(flattedData.filter(function (item) {
|
235
222
|
if (!item.disabled) {
|
@@ -237,14 +224,11 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
237
224
|
if (checkedMode === 'CHILD') {
|
238
225
|
return !item.children;
|
239
226
|
}
|
240
|
-
|
241
227
|
if (checkedMode === 'PARENT') {
|
242
228
|
return item.depth === 0;
|
243
229
|
}
|
244
|
-
|
245
230
|
return true;
|
246
231
|
}
|
247
|
-
|
248
232
|
return false;
|
249
233
|
}).map(function (_ref) {
|
250
234
|
var id = _ref.id;
|
@@ -254,13 +238,11 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
254
238
|
tryChangeValue([], null, shouldChecked, []);
|
255
239
|
}
|
256
240
|
}, [checkedMode, flattedData, parsedCheckedIds, tryChangeValue]);
|
257
|
-
|
258
241
|
var _useMemo = useMemo(function () {
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
242
|
+
return getAllCheckedStatus(flattedData, parsedCheckedIds);
|
243
|
+
}, [flattedData, parsedCheckedIds]),
|
244
|
+
showAllChecked = _useMemo[0],
|
245
|
+
showIndeterminate = _useMemo[1];
|
264
246
|
var renderDefaultFooter = function renderDefaultFooter() {
|
265
247
|
if (showCheckAll) {
|
266
248
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Checkbox, {
|
@@ -270,15 +252,14 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
270
252
|
}, i18n.get('checkSelect.checkAll')));
|
271
253
|
}
|
272
254
|
};
|
273
|
-
|
274
|
-
|
255
|
+
var cls = cx(prefixCls, className);
|
256
|
+
// 过滤掉未选中的数据
|
275
257
|
// const tagList = useMemo(() => {
|
276
258
|
// // @ts-ignore
|
277
259
|
// const [semiCheckedIds] = getSemiCheckedIdsWithSet(flattedData, (id) => value.includes(id))
|
278
260
|
// const ids = Array.from(new Set([...semiCheckedIds, ...value]))
|
279
261
|
// return flattedData.filter((item) => ids.includes(item.id))
|
280
262
|
// }, [value, flattedData])
|
281
|
-
|
282
263
|
return /*#__PURE__*/React.createElement(Picker, Object.assign({
|
283
264
|
ref: ref,
|
284
265
|
className: cls
|
@@ -298,6 +279,7 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
298
279
|
footer: renderDefaultFooter(),
|
299
280
|
loading: rest.loading !== undefined ? rest.loading : loading,
|
300
281
|
trigger: /*#__PURE__*/React.createElement(TagInputMock, Object.assign({}, tagInputProps, {
|
282
|
+
size: size,
|
301
283
|
// ref={targetElementRef}
|
302
284
|
// onClick={openMenu}
|
303
285
|
// disabled={disabled}
|
@@ -314,10 +296,10 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
314
296
|
// @ts-ignore
|
315
297
|
invalid: invalid
|
316
298
|
}))
|
317
|
-
}), isArrayNonEmpty(treeProps.data) ?
|
318
|
-
/*#__PURE__*/
|
299
|
+
}), isArrayNonEmpty(treeProps.data) ? /*#__PURE__*/
|
319
300
|
// 只做渲染,不做逻辑处理(比如搜索过滤后,check操作的是对过滤后的data操作,这是不符合预期的)
|
320
301
|
React.createElement(Tree, Object.assign({
|
302
|
+
size: 'md',
|
321
303
|
className: prefixCls + "__tree",
|
322
304
|
selectable: false,
|
323
305
|
checkable: true,
|
@@ -333,11 +315,9 @@ var CheckTreeSelect = /*#__PURE__*/forwardRef(function (_a, ref) {
|
|
333
315
|
height: height
|
334
316
|
}, treeProps)) : null);
|
335
317
|
});
|
336
|
-
|
337
318
|
if (__DEV__) {
|
338
319
|
CheckTreeSelect.displayName = 'CheckTreeSelect';
|
339
320
|
}
|
340
|
-
|
341
321
|
var ALWAYS_ALLOW = function ALWAYS_ALLOW() {
|
342
322
|
return true;
|
343
323
|
};
|
@@ -348,39 +328,34 @@ var ALWAYS_ALLOW = function ALWAYS_ALLOW() {
|
|
348
328
|
* @param flattedData
|
349
329
|
* @returns
|
350
330
|
*/
|
351
|
-
|
352
|
-
|
353
331
|
var getSemiCheckedIdsWithSet = function getSemiCheckedIdsWithSet(flattedData, isChecked, allowCheck) {
|
354
332
|
if (allowCheck === void 0) {
|
355
333
|
allowCheck = ALWAYS_ALLOW;
|
356
334
|
}
|
357
|
-
|
358
335
|
var semiCheckedNodes = [];
|
359
336
|
var semiCheckedIdsSet = new Set();
|
360
337
|
var parentId;
|
361
338
|
var parent;
|
362
339
|
flattedData.forEach(function (node) {
|
363
340
|
parent = node.parent;
|
364
|
-
|
365
341
|
if (parent && parent.id !== undefined) {
|
366
342
|
if (!allowCheck(parent)) return;
|
367
343
|
parentId = parent.id;
|
368
|
-
if (semiCheckedIdsSet.has(parentId)) return;
|
369
|
-
|
344
|
+
if (semiCheckedIdsSet.has(parentId)) return;
|
345
|
+
// 父节点没选中,但是当前节点被选中,则视为半选
|
370
346
|
if (!isChecked(parentId) && isChecked(node.id)) {
|
371
347
|
semiCheckedIdsSet.add(parentId);
|
372
348
|
semiCheckedNodes.push(parent);
|
373
349
|
}
|
374
350
|
}
|
375
|
-
});
|
376
|
-
|
351
|
+
});
|
352
|
+
// 自下而上设置半选态
|
377
353
|
semiCheckedNodes.forEach(function (node) {
|
378
354
|
parent = node.parent;
|
379
|
-
|
380
355
|
while (parent && parent.id !== undefined) {
|
381
356
|
if (!allowCheck(parent)) return;
|
382
|
-
parentId = parent.id;
|
383
|
-
|
357
|
+
parentId = parent.id;
|
358
|
+
// 可能存在兄弟节点,共同祖先需要去重,避免重复计算
|
384
359
|
if (semiCheckedIdsSet.has(parentId)) return;
|
385
360
|
semiCheckedIdsSet.add(parentId);
|
386
361
|
parent = parent.parent;
|
@@ -389,5 +364,4 @@ var getSemiCheckedIdsWithSet = function getSemiCheckedIdsWithSet(flattedData, is
|
|
389
364
|
var semiCheckedIds = Array.from(semiCheckedIdsSet);
|
390
365
|
return [semiCheckedIds, semiCheckedIdsSet];
|
391
366
|
};
|
392
|
-
|
393
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 };
|