@hi-ui/check-select 4.0.0-alpha.10
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/LICENSE +21 -0
- package/README.md +11 -0
- package/lib/cjs/CheckSelect.js +309 -0
- package/lib/cjs/CheckSelect.js.map +1 -0
- package/lib/cjs/context.js +33 -0
- package/lib/cjs/context.js.map +1 -0
- package/lib/cjs/hooks/use-search.js +154 -0
- package/lib/cjs/hooks/use-search.js.map +1 -0
- package/lib/cjs/index.js +25 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/styles/index.scss.js +22 -0
- package/lib/cjs/styles/index.scss.js.map +1 -0
- package/lib/cjs/use-check-select.js +167 -0
- package/lib/cjs/use-check-select.js.map +1 -0
- package/lib/cjs/utils/type-assertion/lib/esm/index.js +42 -0
- package/lib/cjs/utils/type-assertion/lib/esm/index.js.map +1 -0
- package/lib/esm/CheckSelect.js +268 -0
- package/lib/esm/CheckSelect.js.map +1 -0
- package/lib/esm/context.js +25 -0
- package/lib/esm/context.js.map +1 -0
- package/lib/esm/hooks/use-search.js +144 -0
- package/lib/esm/hooks/use-search.js.map +1 -0
- package/lib/esm/index.js +12 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/styles/index.scss.js +17 -0
- package/lib/esm/styles/index.scss.js.map +1 -0
- package/lib/esm/use-check-select.js +144 -0
- package/lib/esm/use-check-select.js.map +1 -0
- package/lib/esm/utils/type-assertion/lib/esm/index.js +33 -0
- package/lib/esm/utils/type-assertion/lib/esm/index.js.map +1 -0
- package/lib/types/CheckSelect.d.ts +80 -0
- package/lib/types/context.d.ts +41 -0
- package/lib/types/hooks/index.d.ts +1 -0
- package/lib/types/hooks/use-search.d.ts +9 -0
- package/lib/types/index.d.ts +3 -0
- package/lib/types/types.d.ts +26 -0
- package/lib/types/use-check-select.d.ts +83 -0
- package/package.json +72 -0
@@ -0,0 +1,144 @@
|
|
1
|
+
/** @LICENSE
|
2
|
+
* @hi-ui/check-select
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-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
|
+
import { useState, useCallback, useMemo } from 'react';
|
11
|
+
import { useLatestRef } from '@hi-ui/use-latest';
|
12
|
+
import { __DEV__ } from '@hi-ui/env';
|
13
|
+
import { isArrayNonEmpty, isFunction } from '../utils/type-assertion/lib/esm/index.js';
|
14
|
+
/**
|
15
|
+
* 支持搜索功能的 hook
|
16
|
+
*/
|
17
|
+
|
18
|
+
var useSearch = function useSearch(flattedData, filter) {
|
19
|
+
var _useState = useState(''),
|
20
|
+
searchValue = _useState[0],
|
21
|
+
setSearchValue = _useState[1];
|
22
|
+
|
23
|
+
var _useState2 = useState([]),
|
24
|
+
matchedNodes = _useState2[0],
|
25
|
+
setMatchedNodes = _useState2[1];
|
26
|
+
|
27
|
+
var flattedDataRef = useLatestRef(flattedData);
|
28
|
+
var handleChange = useCallback(function (evt) {
|
29
|
+
var nextSearchValue = evt.target.value;
|
30
|
+
setSearchValue(nextSearchValue); // 匹配到搜索的节点,将这些节点进行展开显示,其它均隐藏
|
31
|
+
|
32
|
+
var matchedNodes = getMatchedNodes(flattedDataRef.current, nextSearchValue, filter);
|
33
|
+
setMatchedNodes(matchedNodes);
|
34
|
+
}, [flattedDataRef, filter]);
|
35
|
+
var inputProps = useMemo(function () {
|
36
|
+
return {
|
37
|
+
value: searchValue,
|
38
|
+
onChange: handleChange
|
39
|
+
};
|
40
|
+
}, [searchValue, handleChange]);
|
41
|
+
var resetSearch = useCallback(function () {
|
42
|
+
setSearchValue('');
|
43
|
+
}, []);
|
44
|
+
var isSearch = !!searchValue;
|
45
|
+
var isEmpty = isSearch && matchedNodes.length === 0;
|
46
|
+
return [isSearch, matchedNodes, inputProps, isEmpty, resetSearch];
|
47
|
+
};
|
48
|
+
/**
|
49
|
+
* 从 value 中 找到指定的 options(逐层查找)
|
50
|
+
*/
|
51
|
+
|
52
|
+
|
53
|
+
var getMatchedNodes = function getMatchedNodes(flattedData, searchValue, filter) {
|
54
|
+
if (!searchValue) return [];
|
55
|
+
var matchedResult = [];
|
56
|
+
var shouldFilter = isFunction(filter); // 1. 先对于 groupTitle 匹配
|
57
|
+
// 2. 若未匹配到。再对其 children 进行 title 匹配
|
58
|
+
|
59
|
+
var _loop = function _loop(i) {
|
60
|
+
var optionOrGroup = flattedData[i];
|
61
|
+
|
62
|
+
if ('groupTitle' in optionOrGroup) {
|
63
|
+
// search for OptionGroup
|
64
|
+
// @ts-ignore
|
65
|
+
var shouldReserved = shouldFilter && filter(searchValue, optionOrGroup) === true;
|
66
|
+
|
67
|
+
if (shouldReserved) {
|
68
|
+
matchedResult.push(optionOrGroup);
|
69
|
+
return "continue";
|
70
|
+
}
|
71
|
+
|
72
|
+
if (typeof optionOrGroup.groupTitle === 'string') {
|
73
|
+
// 匹配策略:`String.include`
|
74
|
+
if (optionOrGroup.groupTitle.includes(searchValue)) {
|
75
|
+
matchedResult.push(optionOrGroup);
|
76
|
+
return "continue";
|
77
|
+
}
|
78
|
+
} else {
|
79
|
+
if (__DEV__) {
|
80
|
+
console.info('WARNING: The `optionGroup.groupTitle` should be `string` when searchable is enabled.');
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
if (isArrayNonEmpty(optionOrGroup.children)) {
|
85
|
+
var matchedChildren = optionOrGroup.children.filter(function (node) {
|
86
|
+
var _a, _b;
|
87
|
+
|
88
|
+
if (shouldFilter) {
|
89
|
+
// @ts-ignore
|
90
|
+
return filter(searchValue, optionOrGroup);
|
91
|
+
}
|
92
|
+
|
93
|
+
if (typeof node.title !== 'string') {
|
94
|
+
if (__DEV__) {
|
95
|
+
console.info('WARNING: The `option.title` should be `string` when searchable is enabled.');
|
96
|
+
}
|
97
|
+
|
98
|
+
return false;
|
99
|
+
}
|
100
|
+
|
101
|
+
return (_b = (_a = node.title).includes) === null || _b === void 0 ? void 0 : _b.call(_a, searchValue);
|
102
|
+
});
|
103
|
+
|
104
|
+
if (isArrayNonEmpty(matchedChildren)) {
|
105
|
+
var matchedOptionOrGroup = Object.assign(Object.assign({}, optionOrGroup), {
|
106
|
+
children: matchedChildren
|
107
|
+
});
|
108
|
+
matchedResult.push(matchedOptionOrGroup);
|
109
|
+
}
|
110
|
+
}
|
111
|
+
} else {
|
112
|
+
// search for Option
|
113
|
+
// @ts-ignore
|
114
|
+
var _shouldReserved = shouldFilter && filter(searchValue, optionOrGroup) === true;
|
115
|
+
|
116
|
+
if (_shouldReserved) {
|
117
|
+
matchedResult.push(optionOrGroup);
|
118
|
+
return "continue";
|
119
|
+
}
|
120
|
+
|
121
|
+
if (typeof optionOrGroup.title === 'string') {
|
122
|
+
// 匹配策略:`String.include`
|
123
|
+
if (optionOrGroup.title.includes(searchValue)) {
|
124
|
+
matchedResult.push(optionOrGroup);
|
125
|
+
}
|
126
|
+
} else {
|
127
|
+
if (__DEV__) {
|
128
|
+
console.info('WARNING: The `option.title` should be `string` when searchable is enabled.');
|
129
|
+
}
|
130
|
+
}
|
131
|
+
}
|
132
|
+
};
|
133
|
+
|
134
|
+
for (var i = 0; i < flattedData.length; i++) {
|
135
|
+
var _ret = _loop(i);
|
136
|
+
|
137
|
+
if (_ret === "continue") continue;
|
138
|
+
}
|
139
|
+
|
140
|
+
return matchedResult;
|
141
|
+
};
|
142
|
+
|
143
|
+
export { useSearch };
|
144
|
+
//# sourceMappingURL=use-search.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-search.js","sources":["../../../src/hooks/use-search.ts"],"sourcesContent":[null],"names":["useSearch","flattedData","filter","useState","searchValue","setSearchValue","matchedNodes","setMatchedNodes","flattedDataRef","useLatestRef","handleChange","useCallback","evt","nextSearchValue","target","value","getMatchedNodes","current","inputProps","useMemo","onChange","resetSearch","isSearch","isEmpty","length","matchedResult","shouldFilter","isFunction","i","optionOrGroup","shouldReserved","push","groupTitle","includes","__DEV__","console","info","isArrayNonEmpty","children","matchedChildren","node","title","matchedOptionOrGroup"],"mappings":"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"}
|
package/lib/esm/index.js
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
/** @LICENSE
|
2
|
+
* @hi-ui/check-select
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-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
|
+
import './styles/index.scss.js';
|
11
|
+
export { CheckSelect, CheckSelectOption, CheckSelectOptionGroup, CheckSelectSearch, CheckSelect as default } from './CheckSelect.js';
|
12
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
/** @LICENSE
|
2
|
+
* @hi-ui/check-select
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-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
|
+
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.hi-v4-check-select {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: none;\n outline: none;\n font-size: 0.875rem;\n font-size: var(--hi-v4-text-size-normal, 0.875rem);\n vertical-align: middle;\n list-style: none;\n width: auto;\n box-sizing: border-box;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n display: inline-block;\n min-width: 160px;\n max-height: 260px;\n overflow: auto;\n padding-bottom: 10px; }\n.hi-v4-check-select--open .hi-v4-tag-input,\n .hi-v4-check-select--open .hi-v4-tag-input-mock {\n border-color: #4387f4;\n border-color: var(--hi-v4-color-brandblue-500, #4387f4); }\n.hi-v4-check-select-item {\n width: 100%;\n padding: 4px 0;\n padding: var(--hi-v4-spacing-2, 4px) 0;\n position: relative;\n cursor: pointer;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex; }\n.hi-v4-check-select-option {\n padding: 0 8px2px;\n padding: 0 var(--hi-v4-spacing-4, 8px)2px;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n min-height: 32px;\n width: 100%;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n position: relative;\n -webkit-box-pack: justify;\n -ms-flex-pack: justify;\n justify-content: space-between; }\n.hi-v4-check-select-option:hover {\n background-color: #f0f5fe;\n background-color: var(--hi-v4-color-brandblue-100, #f0f5fe); }\n.hi-v4-check-select-option--selected {\n background-color: #f0f5fe;\n background-color: var(--hi-v4-color-brandblue-100, #f0f5fe);\n font-weight: 700;\n color: #4387f4;\n color: var(--hi-v4-color-brandblue-500, #4387f4); }\n.hi-v4-check-select-option--focused {\n background-color: #f7faff;\n background-color: var(--hi-v4-color-brandblue-50, #f7faff); }\n.hi-v4-check-select-option--disabled {\n cursor: not-allowed;\n color: #6b7280;\n color: var(--hi-v4-color-gray-500, #6b7280);\n font-weight: 400; }\n.hi-v4-check-select .title__text {\n -webkit-box-flex: 1;\n -ms-flex: 1 1;\n flex: 1 1; }\n.hi-v4-check-select-panel {\n white-space: nowrap;\n -webkit-box-sizing: border-box;\n box-sizing: border-box; }\n.hi-v4-check-select-search {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n padding: 10px 10px 6px;\n position: relative; }\n.hi-v4-check-select-search .hi-v4-input__prefix {\n font-size: 16px;\n padding-left: 0; }\n.hi-v4-check-select-search__empty {\n display: inline-block;\n margin-top: 20px;\n font-size: 14px;\n font-weight: 400;\n color: #999;\n line-height: 20px; }\n";
|
11
|
+
|
12
|
+
var __styleInject__ = require('style-inject/dist/style-inject.es.js')["default"];
|
13
|
+
|
14
|
+
__styleInject__(css_248z);
|
15
|
+
|
16
|
+
export default css_248z;
|
17
|
+
//# sourceMappingURL=index.scss.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
|
@@ -0,0 +1,144 @@
|
|
1
|
+
/** @LICENSE
|
2
|
+
* @hi-ui/check-select
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-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
|
+
import { __rest } from 'tslib';
|
11
|
+
import React, { useMemo, useCallback } from 'react';
|
12
|
+
import { useUncontrolledState } from '@hi-ui/use-uncontrolled-state';
|
13
|
+
import { useSearch } from './hooks/use-search.js';
|
14
|
+
import { useCheck } from '@hi-ui/use-check';
|
15
|
+
import { useLatestCallback } from '@hi-ui/use-latest';
|
16
|
+
import { toArray } from '@hi-ui/use-children';
|
17
|
+
var NOOP_ARRAY = [];
|
18
|
+
var NOOP_VALUE = [];
|
19
|
+
|
20
|
+
var useCheckSelect = function useCheckSelect(_a) {
|
21
|
+
var _a$data = _a.data,
|
22
|
+
dataProp = _a$data === void 0 ? NOOP_ARRAY : _a$data,
|
23
|
+
children = _a.children,
|
24
|
+
_a$disabled = _a.disabled,
|
25
|
+
disabled = _a$disabled === void 0 ? false : _a$disabled,
|
26
|
+
valueProp = _a.value,
|
27
|
+
_a$defaultValue = _a.defaultValue,
|
28
|
+
defaultValue = _a$defaultValue === void 0 ? NOOP_VALUE : _a$defaultValue,
|
29
|
+
onChangeProp = _a.onChange,
|
30
|
+
onSelect = _a.onSelect,
|
31
|
+
_a$emptyContent = _a.emptyContent,
|
32
|
+
emptyContent = _a$emptyContent === void 0 ? '无匹配选项' : _a$emptyContent,
|
33
|
+
searchPlaceholder = _a.searchPlaceholder,
|
34
|
+
filter = _a.filter,
|
35
|
+
titleRender = _a.titleRender,
|
36
|
+
rest = __rest(_a, ["data", "children", "disabled", "value", "defaultValue", "onChange", "onSelect", "emptyContent", "searchPlaceholder", "filter", "titleRender"]);
|
37
|
+
|
38
|
+
var data = useMemo(function () {
|
39
|
+
if (children) {
|
40
|
+
var dfs = function dfs(child) {
|
41
|
+
var list = toArray(child);
|
42
|
+
var arr = [];
|
43
|
+
list.forEach(function (item) {
|
44
|
+
if (! /*#__PURE__*/React.isValidElement(item)) return; // @ts-ignore
|
45
|
+
|
46
|
+
if (item.type.HiName === 'CheckSelectOption') {
|
47
|
+
var props = item.props;
|
48
|
+
|
49
|
+
var _value = props.value,
|
50
|
+
_children = props.children,
|
51
|
+
_disabled = props.disabled,
|
52
|
+
_rest = __rest(props, ["value", "children", "disabled", "groupTitle"]);
|
53
|
+
|
54
|
+
var option = {
|
55
|
+
id: _value,
|
56
|
+
title: _children,
|
57
|
+
disabled: _disabled,
|
58
|
+
rootProps: _rest
|
59
|
+
};
|
60
|
+
arr.push(option); // @ts-ignore
|
61
|
+
} else if (item.type.HiName === 'CheckSelectOptionGroup') {
|
62
|
+
var _props = item.props;
|
63
|
+
|
64
|
+
var label = _props.label,
|
65
|
+
_children2 = _props.children,
|
66
|
+
_rest2 = __rest(_props, ["label", "children"]);
|
67
|
+
|
68
|
+
var optGroup = {
|
69
|
+
groupTitle: label,
|
70
|
+
children: [],
|
71
|
+
rootProps: _rest2
|
72
|
+
}; // @ts-ignore
|
73
|
+
|
74
|
+
if (_children2) {
|
75
|
+
// @ts-ignore
|
76
|
+
optGroup.children = dfs(_children2);
|
77
|
+
}
|
78
|
+
|
79
|
+
arr.push(optGroup);
|
80
|
+
}
|
81
|
+
});
|
82
|
+
return arr;
|
83
|
+
};
|
84
|
+
|
85
|
+
return dfs(children);
|
86
|
+
}
|
87
|
+
|
88
|
+
return dataProp;
|
89
|
+
}, [children, dataProp]);
|
90
|
+
|
91
|
+
var _useUncontrolledState = useUncontrolledState(defaultValue, valueProp, onChangeProp),
|
92
|
+
value = _useUncontrolledState[0],
|
93
|
+
tryChangeValue = _useUncontrolledState[1];
|
94
|
+
|
95
|
+
var onSelectLatest = useLatestCallback(onSelect);
|
96
|
+
var proxyTryChangeValue = useCallback(function (value, item, shouldChecked) {
|
97
|
+
tryChangeValue(value, item, shouldChecked);
|
98
|
+
onSelectLatest(value, item, shouldChecked);
|
99
|
+
}, [tryChangeValue, onSelectLatest]);
|
100
|
+
|
101
|
+
var _useCheckDefault = useCheck({
|
102
|
+
disabled: disabled,
|
103
|
+
checkedIds: value,
|
104
|
+
onCheck: proxyTryChangeValue,
|
105
|
+
allowCheck: allowCheck
|
106
|
+
}),
|
107
|
+
onOptionCheck = _useCheckDefault[0],
|
108
|
+
isSelectedId = _useCheckDefault[1];
|
109
|
+
|
110
|
+
var _useSearch = useSearch(data, filter),
|
111
|
+
inSearch = _useSearch[0],
|
112
|
+
matchedItems = _useSearch[1],
|
113
|
+
inputProps = _useSearch[2],
|
114
|
+
isEmpty = _useSearch[3],
|
115
|
+
resetSearch = _useSearch[4];
|
116
|
+
|
117
|
+
var getSearchInputProps = useCallback(function () {
|
118
|
+
return {
|
119
|
+
placeholder: searchPlaceholder,
|
120
|
+
value: inputProps.value,
|
121
|
+
onChange: inputProps.onChange
|
122
|
+
};
|
123
|
+
}, [searchPlaceholder, inputProps]);
|
124
|
+
return {
|
125
|
+
rootProps: rest,
|
126
|
+
data: inSearch ? matchedItems : data,
|
127
|
+
value: value,
|
128
|
+
onSelect: onOptionCheck,
|
129
|
+
isSelectedId: isSelectedId,
|
130
|
+
emptyContent: emptyContent,
|
131
|
+
getSearchInputProps: getSearchInputProps,
|
132
|
+
tryChangeValue: tryChangeValue,
|
133
|
+
isEmpty: isEmpty,
|
134
|
+
resetSearch: resetSearch,
|
135
|
+
titleRender: titleRender
|
136
|
+
};
|
137
|
+
};
|
138
|
+
|
139
|
+
var allowCheck = function allowCheck(option) {
|
140
|
+
return !option.disabled;
|
141
|
+
};
|
142
|
+
|
143
|
+
export { useCheckSelect };
|
144
|
+
//# sourceMappingURL=use-check-select.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-check-select.js","sources":["../../src/use-check-select.ts"],"sourcesContent":[null],"names":["NOOP_ARRAY","NOOP_VALUE","useCheckSelect","_a","data","dataProp","children","disabled","valueProp","value","defaultValue","onChangeProp","onChange","onSelect","emptyContent","searchPlaceholder","filter","titleRender","rest","useMemo","dfs","child","list","toArray","arr","forEach","item","React","isValidElement","type","HiName","props","option","id","title","rootProps","push","label","optGroup","groupTitle","useUncontrolledState","tryChangeValue","onSelectLatest","useLatestCallback","proxyTryChangeValue","useCallback","shouldChecked","useCheckDefault","checkedIds","onCheck","allowCheck","onOptionCheck","isSelectedId","useSearch","inSearch","matchedItems","inputProps","isEmpty","resetSearch","getSearchInputProps","placeholder"],"mappings":"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"}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
/** @LICENSE
|
2
|
+
* @hi-ui/check-select
|
3
|
+
* https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-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
|
+
import '@babel/runtime/helpers/esm/typeof';
|
11
|
+
/**
|
12
|
+
* Assert is an array
|
13
|
+
*/
|
14
|
+
|
15
|
+
var isArray = Array.isArray;
|
16
|
+
/**
|
17
|
+
* Assert is an array and `array.length > 0`
|
18
|
+
*/
|
19
|
+
|
20
|
+
var isArrayNonEmpty = function isArrayNonEmpty(arg) {
|
21
|
+
return isArray(arg) && arg.length > 0;
|
22
|
+
};
|
23
|
+
/**
|
24
|
+
* Assert is function
|
25
|
+
*/
|
26
|
+
|
27
|
+
|
28
|
+
var isFunction = function isFunction(arg) {
|
29
|
+
return typeof arg === 'function';
|
30
|
+
};
|
31
|
+
|
32
|
+
export { isArray, isArrayNonEmpty, isFunction };
|
33
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../../../utils/type-assertion/lib/esm/index.js"],"sourcesContent":["import _typeof from \"@babel/runtime/helpers/esm/typeof\";\n\n/** @LICENSE\n * @hi-ui/type-assertion\n * https://github.com/XiaoMi/hiui/tree/master/packages/utils/type-assertion#readme\n *\n * Copyright (c) HIUI <mi-hiui@xiaomi.com>.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * Assert is Nullish\n */\nvar isNullish = function isNullish(arg) {\n return arg === null || arg === undefined;\n};\n/**\n * Assert is an objectLike\n * TODO: Assert the return type\n */\n\n\nvar isObjectLike = function isObjectLike(arg) {\n return !!arg && _typeof(arg) === 'object';\n};\n/**\n * Assert is an object\n */\n\n\nvar isObject = function isObject(arg) {\n return isObjectLike(arg) && arg.constructor === Object;\n};\n/**\n * Assert is a dom element\n */\n\n\nvar isElement = function isElement(arg) {\n return isObjectLike(arg) && arg.constructor !== Object && arg.nodeType === 1;\n};\n/**\n * Assert is an Promise\n */\n\n\nvar isPromise = function isPromise(arg) {\n return (isObjectLike(arg) || typeof arg === 'function') && typeof arg.then === 'function';\n};\n/**\n * Assert is an array\n */\n\n\nvar isArray = Array.isArray;\n/**\n * Assert is an array and `array.length > 0`\n */\n\nvar isArrayNonEmpty = function isArrayNonEmpty(arg) {\n return isArray(arg) && arg.length > 0;\n};\n/**\n * Assert is numeric\n */\n\n\nvar isNumeric = function isNumeric(arg) {\n return !Number.isNaN(Number(arg));\n};\n/**\n * Assert is function\n */\n\n\nvar isFunction = function isFunction(arg) {\n return typeof arg === 'function';\n};\n\nexport { isArray, isArrayNonEmpty, isElement, isFunction, isNullish, isNumeric, isObject, isPromise };\n//# sourceMappingURL=index.js.map\n"],"names":["isArray","Array","isArrayNonEmpty","arg","isFunction"],"mappings":";;;;;;;;;;AAiCA;;;;IAGaA,OAAO,GAAoCC,KAAK,CAACD;AAE9D;;;;IAGaE,eAAe,GAAG,SAAlBA,eAAkB,CAAAC,GAAA,EAAA;SAAiCH,OAAO,CAAPA,GAAO,CAAPA,IAAgBG,GAAG,CAAHA,MAAAA,GAAa;;AAO7F;;;;;IAGaC,UAAU,GAAG,SAAbA,UAAa,CAAAD,GAAA,EAAA;SACxB,OAAAA,GAAA,KAAe;;;"}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { UseSelectProps } from './use-check-select';
|
3
|
+
import type { HiBaseHTMLFieldProps, HiBaseHTMLProps } from '@hi-ui/core';
|
4
|
+
import { PopperProps } from '@hi-ui/popper';
|
5
|
+
/**
|
6
|
+
* TODO: What is CheckSelect
|
7
|
+
*/
|
8
|
+
export declare const CheckSelect: React.ForwardRefExoticComponent<CheckSelectProps & React.RefAttributes<HTMLDivElement | null>>;
|
9
|
+
export interface CheckSelectProps extends Omit<HiBaseHTMLFieldProps<'div'>, 'onChange' | 'onSelect' | 'defaultValue'>, UseSelectProps {
|
10
|
+
/**
|
11
|
+
* 自定义控制 popper 行为
|
12
|
+
*/
|
13
|
+
popper?: PopperProps;
|
14
|
+
/**
|
15
|
+
* 设置虚拟滚动容器的可视高度
|
16
|
+
*/
|
17
|
+
height?: number;
|
18
|
+
/**
|
19
|
+
* 设置虚拟列表每项的固定高度
|
20
|
+
*/
|
21
|
+
itemHeight?: number;
|
22
|
+
/**
|
23
|
+
* 设置 `true` 开启虚拟滚动
|
24
|
+
*/
|
25
|
+
virtual?: boolean;
|
26
|
+
/**
|
27
|
+
* 是否可搜索(仅在 title 为字符串时支持)
|
28
|
+
*/
|
29
|
+
searchable?: boolean;
|
30
|
+
/**
|
31
|
+
* 是否可清空
|
32
|
+
*/
|
33
|
+
clearable?: boolean;
|
34
|
+
/**
|
35
|
+
* 是否开启换行全展示
|
36
|
+
*/
|
37
|
+
wrap?: boolean;
|
38
|
+
/**
|
39
|
+
* 是否点击清理 tags
|
40
|
+
*/
|
41
|
+
onClear?: () => void;
|
42
|
+
/**
|
43
|
+
* 自定义尺寸
|
44
|
+
*/
|
45
|
+
size?: 'sm' | 'md' | 'lg';
|
46
|
+
/**
|
47
|
+
* 面板打开时回调
|
48
|
+
*/
|
49
|
+
onOpen?: () => void;
|
50
|
+
/**
|
51
|
+
* 面板关闭时回调
|
52
|
+
*/
|
53
|
+
onClose?: () => void;
|
54
|
+
/**
|
55
|
+
* 自定义 input 后缀 icon
|
56
|
+
*/
|
57
|
+
suffixIcon?: React.ReactNode;
|
58
|
+
/**
|
59
|
+
* 自定义清除 tags 的 icon
|
60
|
+
*/
|
61
|
+
clearIcon?: React.ReactNode;
|
62
|
+
}
|
63
|
+
/**
|
64
|
+
* TODO: What is CheckSelectSearch
|
65
|
+
*/
|
66
|
+
export declare const CheckSelectSearch: React.ForwardRefExoticComponent<Pick<SelectSearchProps, string | number> & React.RefAttributes<HTMLInputElement | null>>;
|
67
|
+
export interface SelectSearchProps extends HiBaseHTMLProps {
|
68
|
+
}
|
69
|
+
/**
|
70
|
+
* TODO: What is CheckSelectOption
|
71
|
+
*/
|
72
|
+
export declare const CheckSelectOption: React.ForwardRefExoticComponent<Pick<CheckSelectOptionProps, string | number> & React.RefAttributes<HTMLDivElement | null>>;
|
73
|
+
export interface CheckSelectOptionProps extends HiBaseHTMLProps {
|
74
|
+
}
|
75
|
+
/**
|
76
|
+
* TODO: What is CheckSelectOptionGroup
|
77
|
+
*/
|
78
|
+
export declare const CheckSelectOptionGroup: React.ForwardRefExoticComponent<Pick<CheckSelectOptionProps, string | number> & React.RefAttributes<HTMLDivElement | null>>;
|
79
|
+
export interface CheckSelectOptionGroupProps extends HiBaseHTMLProps {
|
80
|
+
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
/// <reference types="react" />
|
2
|
+
export declare const CheckSelectProvider: import("react").Provider<Omit<{
|
3
|
+
rootProps: {
|
4
|
+
displayRender?: ((option: import("./types").CheckSelectOptionItem) => import("react").ReactNode) | undefined;
|
5
|
+
placeholder?: string | undefined;
|
6
|
+
};
|
7
|
+
data: any[];
|
8
|
+
value: import("react").ReactText[];
|
9
|
+
onSelect: (targetItem: import("packages/hooks/use-check/lib/types").UseCheckItem, shouldChecked: boolean) => void;
|
10
|
+
isSelectedId: (id: import("react").ReactText) => boolean;
|
11
|
+
emptyContent: boolean | import("react").ReactChild | import("react").ReactFragment | import("react").ReactPortal | null;
|
12
|
+
getSearchInputProps: () => {
|
13
|
+
placeholder: string | undefined;
|
14
|
+
value: string;
|
15
|
+
onChange: (evt: import("react").ChangeEvent<HTMLInputElement>) => void;
|
16
|
+
};
|
17
|
+
tryChangeValue: (stateOrFunction: import("react").SetStateAction<import("react").ReactText[]>, ...args: any[]) => void;
|
18
|
+
isEmpty: boolean;
|
19
|
+
resetSearch: () => void;
|
20
|
+
titleRender: ((item: import("./types").CheckSelectOptionItem) => import("react").ReactNode) | undefined;
|
21
|
+
}, "rootProps"> | null>;
|
22
|
+
export declare const useCheckSelectContext: () => Omit<{
|
23
|
+
rootProps: {
|
24
|
+
displayRender?: ((option: import("./types").CheckSelectOptionItem) => import("react").ReactNode) | undefined;
|
25
|
+
placeholder?: string | undefined;
|
26
|
+
};
|
27
|
+
data: any[];
|
28
|
+
value: import("react").ReactText[];
|
29
|
+
onSelect: (targetItem: import("packages/hooks/use-check/lib/types").UseCheckItem, shouldChecked: boolean) => void;
|
30
|
+
isSelectedId: (id: import("react").ReactText) => boolean;
|
31
|
+
emptyContent: boolean | import("react").ReactChild | import("react").ReactFragment | import("react").ReactPortal | null;
|
32
|
+
getSearchInputProps: () => {
|
33
|
+
placeholder: string | undefined;
|
34
|
+
value: string;
|
35
|
+
onChange: (evt: import("react").ChangeEvent<HTMLInputElement>) => void;
|
36
|
+
};
|
37
|
+
tryChangeValue: (stateOrFunction: import("react").SetStateAction<import("react").ReactText[]>, ...args: any[]) => void;
|
38
|
+
isEmpty: boolean;
|
39
|
+
resetSearch: () => void;
|
40
|
+
titleRender: ((item: import("./types").CheckSelectOptionItem) => import("react").ReactNode) | undefined;
|
41
|
+
}, "rootProps">;
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from './use-search';
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { CheckSelectOptionOrOptionGroupItem } from '../types';
|
3
|
+
/**
|
4
|
+
* 支持搜索功能的 hook
|
5
|
+
*/
|
6
|
+
export declare const useSearch: (flattedData: CheckSelectOptionOrOptionGroupItem[], filter?: ((keyword: string, option: CheckSelectOptionOrOptionGroupItem) => boolean) | undefined) => readonly [boolean, CheckSelectOptionOrOptionGroupItem[], {
|
7
|
+
value: string;
|
8
|
+
onChange: (evt: React.ChangeEvent<HTMLInputElement>) => void;
|
9
|
+
}, boolean, () => void];
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
export interface CheckSelectOptionItem {
|
3
|
+
/**
|
4
|
+
* 节点唯一 id
|
5
|
+
*/
|
6
|
+
id: React.ReactText;
|
7
|
+
/**
|
8
|
+
* 节点标题
|
9
|
+
*/
|
10
|
+
title?: React.ReactNode;
|
11
|
+
/**
|
12
|
+
* 是否禁用该节点
|
13
|
+
*/
|
14
|
+
disabled?: boolean;
|
15
|
+
}
|
16
|
+
export interface CheckSelectOptionGroupItem {
|
17
|
+
/**
|
18
|
+
* 节点组标题
|
19
|
+
*/
|
20
|
+
groupTitle?: React.ReactNode;
|
21
|
+
/**
|
22
|
+
* 是否禁用该节点
|
23
|
+
*/
|
24
|
+
children?: CheckSelectOptionItem[];
|
25
|
+
}
|
26
|
+
export declare type CheckSelectOptionOrOptionGroupItem = CheckSelectOptionItem & CheckSelectOptionGroupItem;
|
@@ -0,0 +1,83 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { CheckSelectOptionItem, CheckSelectOptionOrOptionGroupItem } from './types';
|
3
|
+
export declare const useCheckSelect: ({ data: dataProp, children, disabled, value: valueProp, defaultValue, onChange: onChangeProp, onSelect, emptyContent, searchPlaceholder, filter, titleRender, ...rest }: UseSelectProps) => {
|
4
|
+
rootProps: {
|
5
|
+
/**
|
6
|
+
* 自定义选择后触发器所展示的内容,只在 title 为字符串时有效
|
7
|
+
*/
|
8
|
+
displayRender?: ((option: CheckSelectOptionItem) => React.ReactNode) | undefined;
|
9
|
+
/**
|
10
|
+
* 触发器输入框占位符
|
11
|
+
*/
|
12
|
+
placeholder?: string | undefined;
|
13
|
+
};
|
14
|
+
data: any[];
|
15
|
+
value: React.ReactText[];
|
16
|
+
onSelect: (targetItem: import("@hi-ui/use-check").UseCheckItem, shouldChecked: boolean) => void;
|
17
|
+
isSelectedId: (id: React.ReactText) => boolean;
|
18
|
+
emptyContent: boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null;
|
19
|
+
getSearchInputProps: () => {
|
20
|
+
placeholder: string | undefined;
|
21
|
+
value: string;
|
22
|
+
onChange: (evt: React.ChangeEvent<HTMLInputElement>) => void;
|
23
|
+
};
|
24
|
+
tryChangeValue: (stateOrFunction: React.SetStateAction<React.ReactText[]>, ...args: any[]) => void;
|
25
|
+
isEmpty: boolean;
|
26
|
+
resetSearch: () => void;
|
27
|
+
titleRender: ((item: CheckSelectOptionItem) => React.ReactNode) | undefined;
|
28
|
+
};
|
29
|
+
export interface UseSelectProps {
|
30
|
+
/**
|
31
|
+
* 设置当前选中值
|
32
|
+
*/
|
33
|
+
value?: React.ReactText[];
|
34
|
+
/**
|
35
|
+
* 设置当前选中值默认值
|
36
|
+
*/
|
37
|
+
defaultValue?: React.ReactText[];
|
38
|
+
/**
|
39
|
+
* 选中值改变时的回调
|
40
|
+
*/
|
41
|
+
onChange?: (value: React.ReactText[], targetOption?: CheckSelectOptionItem, shouldChecked?: boolean) => void;
|
42
|
+
/**
|
43
|
+
* 选中值时回调
|
44
|
+
*/
|
45
|
+
onSelect?: (value: React.ReactText[], targetOption?: CheckSelectOptionItem, shouldChecked?: boolean) => void;
|
46
|
+
/**
|
47
|
+
* 是否禁止使用
|
48
|
+
*/
|
49
|
+
disabled?: boolean;
|
50
|
+
/**
|
51
|
+
* 设置选项为空时展示的内容
|
52
|
+
*/
|
53
|
+
emptyContent?: React.ReactNode;
|
54
|
+
/**
|
55
|
+
* 自定义渲染节点的 title 内容
|
56
|
+
*/
|
57
|
+
titleRender?: (item: CheckSelectOptionItem) => React.ReactNode;
|
58
|
+
/**
|
59
|
+
* 自定义选择后触发器所展示的内容,只在 title 为字符串时有效
|
60
|
+
*/
|
61
|
+
displayRender?: (option: CheckSelectOptionItem) => React.ReactNode;
|
62
|
+
/**
|
63
|
+
* 触发器输入框占位符
|
64
|
+
*/
|
65
|
+
placeholder?: string;
|
66
|
+
/**
|
67
|
+
* 搜索输入框占位符
|
68
|
+
*/
|
69
|
+
searchPlaceholder?: string;
|
70
|
+
/**
|
71
|
+
* 启用自定义过滤函数实现根据搜索框内容,自定义搜索
|
72
|
+
*/
|
73
|
+
filter?: (keyword: string, option: CheckSelectOptionOrOptionGroupItem) => boolean;
|
74
|
+
/**
|
75
|
+
* 选项数据
|
76
|
+
*/
|
77
|
+
data?: CheckSelectOptionItem[];
|
78
|
+
/**
|
79
|
+
* JSX 子节点
|
80
|
+
*/
|
81
|
+
children?: React.ReactNode;
|
82
|
+
}
|
83
|
+
export declare type UseSelectReturn = ReturnType<typeof useCheckSelect>;
|