@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.
Files changed (38) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/lib/cjs/CheckSelect.js +309 -0
  4. package/lib/cjs/CheckSelect.js.map +1 -0
  5. package/lib/cjs/context.js +33 -0
  6. package/lib/cjs/context.js.map +1 -0
  7. package/lib/cjs/hooks/use-search.js +154 -0
  8. package/lib/cjs/hooks/use-search.js.map +1 -0
  9. package/lib/cjs/index.js +25 -0
  10. package/lib/cjs/index.js.map +1 -0
  11. package/lib/cjs/styles/index.scss.js +22 -0
  12. package/lib/cjs/styles/index.scss.js.map +1 -0
  13. package/lib/cjs/use-check-select.js +167 -0
  14. package/lib/cjs/use-check-select.js.map +1 -0
  15. package/lib/cjs/utils/type-assertion/lib/esm/index.js +42 -0
  16. package/lib/cjs/utils/type-assertion/lib/esm/index.js.map +1 -0
  17. package/lib/esm/CheckSelect.js +268 -0
  18. package/lib/esm/CheckSelect.js.map +1 -0
  19. package/lib/esm/context.js +25 -0
  20. package/lib/esm/context.js.map +1 -0
  21. package/lib/esm/hooks/use-search.js +144 -0
  22. package/lib/esm/hooks/use-search.js.map +1 -0
  23. package/lib/esm/index.js +12 -0
  24. package/lib/esm/index.js.map +1 -0
  25. package/lib/esm/styles/index.scss.js +17 -0
  26. package/lib/esm/styles/index.scss.js.map +1 -0
  27. package/lib/esm/use-check-select.js +144 -0
  28. package/lib/esm/use-check-select.js.map +1 -0
  29. package/lib/esm/utils/type-assertion/lib/esm/index.js +33 -0
  30. package/lib/esm/utils/type-assertion/lib/esm/index.js.map +1 -0
  31. package/lib/types/CheckSelect.d.ts +80 -0
  32. package/lib/types/context.d.ts +41 -0
  33. package/lib/types/hooks/index.d.ts +1 -0
  34. package/lib/types/hooks/use-search.d.ts +9 -0
  35. package/lib/types/index.d.ts +3 -0
  36. package/lib/types/types.d.ts +26 -0
  37. package/lib/types/use-check-select.d.ts +83 -0
  38. 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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"}
@@ -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,3 @@
1
+ import './styles/index.scss';
2
+ export * from './CheckSelect';
3
+ export { CheckSelect as default } from './CheckSelect';
@@ -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>;