@canlooks/can-ui 0.0.144 → 0.0.146
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/dist/cjs/components/app/appActionSheet.js +42 -41
- package/dist/cjs/components/app/appDialog.js +31 -32
- package/dist/cjs/components/autocomplete/autocomplete.js +10 -5
- package/dist/cjs/components/cascade/searchResult.js +2 -2
- package/dist/cjs/components/clickAway/clickAway.d.ts +11 -11
- package/dist/cjs/components/form/formItem.js +1 -1
- package/dist/cjs/components/inputBase/inputBase.style.js +1 -1
- package/dist/cjs/components/optionsBase/filterOptions.d.ts +4 -0
- package/dist/cjs/components/optionsBase/filterOptions.js +36 -0
- package/dist/cjs/components/optionsBase/optionsBase.d.ts +5 -0
- package/dist/cjs/components/optionsBase/optionsBase.js +3 -28
- package/dist/cjs/components/popper/popper.d.ts +4 -2
- package/dist/cjs/components/popper/popper.js +7 -2
- package/dist/cjs/components/popper/popper.style.js +4 -1
- package/dist/cjs/components/snackbarBase/snackbarBase.js +1 -1
- package/dist/cjs/components/upload/upload.js +1 -1
- package/dist/cjs/utils/utils.d.ts +2 -8
- package/dist/cjs/utils/utils.js +9 -23
- package/dist/esm/components/app/appActionSheet.js +38 -37
- package/dist/esm/components/app/appDialog.js +27 -28
- package/dist/esm/components/autocomplete/autocomplete.js +11 -6
- package/dist/esm/components/cascade/searchResult.js +2 -2
- package/dist/esm/components/clickAway/clickAway.d.ts +11 -11
- package/dist/esm/components/form/formItem.js +2 -2
- package/dist/esm/components/inputBase/inputBase.style.js +1 -1
- package/dist/esm/components/optionsBase/filterOptions.d.ts +4 -0
- package/dist/esm/components/optionsBase/filterOptions.js +33 -0
- package/dist/esm/components/optionsBase/optionsBase.d.ts +5 -0
- package/dist/esm/components/optionsBase/optionsBase.js +4 -29
- package/dist/esm/components/popper/popper.d.ts +4 -2
- package/dist/esm/components/popper/popper.js +7 -2
- package/dist/esm/components/popper/popper.style.js +4 -1
- package/dist/esm/components/snackbarBase/snackbarBase.js +2 -2
- package/dist/esm/components/upload/upload.js +2 -2
- package/dist/esm/utils/utils.d.ts +2 -8
- package/dist/esm/utils/utils.js +8 -21
- package/package.json +1 -4
- package/documentation/bootstrap.mjs +0 -8
- package/documentation/dist/assets/index-DyrGMYuH.js +0 -8115
- package/documentation/dist/atom-one-dark.min.css +0 -1
- package/documentation/dist/components/accordion.md +0 -38
- package/documentation/dist/components/actionSheet.md +0 -49
- package/documentation/dist/components/alert.md +0 -38
- package/documentation/dist/components/anchorList.md +0 -36
- package/documentation/dist/components/autocomplete.md +0 -68
- package/documentation/dist/components/avatar.md +0 -79
- package/documentation/dist/components/badge.md +0 -33
- package/documentation/dist/components/bottomNavigation.md +0 -39
- package/documentation/dist/components/breadcrumb.md +0 -28
- package/documentation/dist/components/bubbleConfirm.md +0 -34
- package/documentation/dist/components/button.md +0 -62
- package/documentation/dist/components/card.md +0 -30
- package/documentation/dist/components/cascade.md +0 -48
- package/documentation/dist/components/checkbox.md +0 -36
- package/documentation/dist/components/colorPicker.md +0 -27
- package/documentation/dist/components/contextMenu.md +0 -27
- package/documentation/dist/components/counter.md +0 -29
- package/documentation/dist/components/dataGrid.md +0 -112
- package/documentation/dist/components/dateTimePicker.md +0 -35
- package/documentation/dist/components/dateTimeRangePicker.md +0 -36
- package/documentation/dist/components/descriptions.md +0 -35
- package/documentation/dist/components/dialog.md +0 -56
- package/documentation/dist/components/divider.md +0 -26
- package/documentation/dist/components/drawer.md +0 -40
- package/documentation/dist/components/flex.md +0 -20
- package/documentation/dist/components/form.md +0 -131
- package/documentation/dist/components/formDialog.md +0 -36
- package/documentation/dist/components/grid.md +0 -34
- package/documentation/dist/components/highlight.md +0 -26
- package/documentation/dist/components/image.md +0 -90
- package/documentation/dist/components/input.md +0 -39
- package/documentation/dist/components/loading.md +0 -46
- package/documentation/dist/components/menu.md +0 -85
- package/documentation/dist/components/pagination.md +0 -38
- package/documentation/dist/components/pickerDialog.md +0 -56
- package/documentation/dist/components/placeholder.md +0 -30
- package/documentation/dist/components/progress.md +0 -43
- package/documentation/dist/components/radio.md +0 -37
- package/documentation/dist/components/rating.md +0 -35
- package/documentation/dist/components/resizable.md +0 -41
- package/documentation/dist/components/scrollbar.md +0 -31
- package/documentation/dist/components/segmented.md +0 -57
- package/documentation/dist/components/select.md +0 -30
- package/documentation/dist/components/skeleton.md +0 -26
- package/documentation/dist/components/slidableActions.md +0 -53
- package/documentation/dist/guide/appComponent.md +0 -30
- package/documentation/dist/guide/globalMethods.md +0 -238
- package/documentation/dist/guide/icon.md +0 -57
- package/documentation/dist/guide/introduction.md +0 -2
- package/documentation/dist/guide/overrideProps.md +0 -0
- package/documentation/dist/guide/startup.md +0 -23
- package/documentation/dist/guide/theme.md +0 -249
- package/documentation/dist/index.html +0 -13
- package/documentation/dist/logo.png +0 -0
- package/documentation/vite.config.mjs +0 -22
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AppActionSheet = exports.AppActionSheetMethods = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
|
|
5
|
-
const react_1 = require("react");
|
|
5
|
+
const react_1 = require("@emotion/react");
|
|
6
|
+
const react_2 = require("react");
|
|
6
7
|
const actionSheet_1 = require("../actionSheet");
|
|
8
|
+
const utils_1 = require("../../utils");
|
|
7
9
|
class AppActionSheetMethods {
|
|
8
10
|
async confirm() {
|
|
9
11
|
}
|
|
@@ -11,47 +13,46 @@ class AppActionSheetMethods {
|
|
|
11
13
|
}
|
|
12
14
|
}
|
|
13
15
|
exports.AppActionSheetMethods = AppActionSheetMethods;
|
|
14
|
-
exports.AppActionSheet = (0,
|
|
15
|
-
const [stacks, setStacks] = (0,
|
|
16
|
-
const defineMethods = (type) =>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
16
|
+
exports.AppActionSheet = (0, react_2.memo)(({ methods }) => {
|
|
17
|
+
const [stacks, setStacks] = (0, react_2.useState)([]);
|
|
18
|
+
const defineMethods = (type) => {
|
|
19
|
+
return (params, ...args) => {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const props = typeof params !== 'object' || (0, react_2.isValidElement)(params)
|
|
22
|
+
? { title: params }
|
|
23
|
+
: params;
|
|
24
|
+
const key = (0, utils_1.getRandomId)();
|
|
25
|
+
setStacks(o => [
|
|
26
|
+
...o,
|
|
27
|
+
{
|
|
28
|
+
...props,
|
|
29
|
+
key,
|
|
30
|
+
type,
|
|
31
|
+
onAction(action) {
|
|
32
|
+
props?.onAction?.(action, ...args);
|
|
33
|
+
resolve(action);
|
|
34
|
+
},
|
|
35
|
+
onConfirm() {
|
|
36
|
+
props?.onConfirm?.(...args);
|
|
37
|
+
resolve(void 0);
|
|
38
|
+
},
|
|
39
|
+
onCancel(e) {
|
|
40
|
+
props?.onCancel?.(e);
|
|
41
|
+
reject();
|
|
42
|
+
},
|
|
43
|
+
onClosed() {
|
|
44
|
+
props?.onClosed?.();
|
|
45
|
+
setStacks(stacks => stacks.filter(stack => stack.key !== key));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
]);
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
};
|
|
47
52
|
methods.confirm = defineMethods('confirm');
|
|
48
53
|
methods.open = defineMethods('open');
|
|
49
|
-
return stacks.map(
|
|
54
|
+
return stacks.map(p => (0, react_1.createElement)(AppActionSheetStack, { ...p, key: p.key }));
|
|
50
55
|
});
|
|
51
|
-
const AppActionSheetStack = (0,
|
|
52
|
-
|
|
53
|
-
return ((0, jsx_runtime_1.jsx)(actionSheet_1.ActionSheet, { showConfirm: type === 'confirm', ...props, open: open, onClose: reason => {
|
|
54
|
-
props.onClose?.(reason);
|
|
55
|
-
setOpen(false);
|
|
56
|
-
} }));
|
|
56
|
+
const AppActionSheetStack = (0, react_2.memo)(({ type, ...props }) => {
|
|
57
|
+
return ((0, jsx_runtime_1.jsx)(actionSheet_1.ActionSheet, { showConfirm: type === 'confirm', defaultOpen: true, ...props }));
|
|
57
58
|
});
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AppDialog = exports.AppDialogMethods = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
|
|
5
|
-
const react_1 = require("react");
|
|
5
|
+
const react_1 = require("@emotion/react");
|
|
6
|
+
const react_2 = require("react");
|
|
6
7
|
const dialog_1 = require("../dialog");
|
|
7
8
|
const status_1 = require("../status");
|
|
9
|
+
const utils_1 = require("../../utils");
|
|
8
10
|
class AppDialogMethods {
|
|
9
11
|
async info(props, ...args) {
|
|
10
12
|
}
|
|
@@ -18,33 +20,34 @@ class AppDialogMethods {
|
|
|
18
20
|
}
|
|
19
21
|
}
|
|
20
22
|
exports.AppDialogMethods = AppDialogMethods;
|
|
21
|
-
exports.AppDialog = (0,
|
|
22
|
-
const [stacks, setStacks] = (0,
|
|
23
|
+
exports.AppDialog = (0, react_2.memo)(({ methods }) => {
|
|
24
|
+
const [stacks, setStacks] = (0, react_2.useState)([]);
|
|
23
25
|
const defineMethod = (type) => {
|
|
24
26
|
return (props, ...args) => {
|
|
25
27
|
return new Promise((resolve, reject) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
...
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
28
|
+
const key = (0, utils_1.getRandomId)();
|
|
29
|
+
setStacks(o => {
|
|
30
|
+
return [
|
|
31
|
+
...o,
|
|
32
|
+
{
|
|
33
|
+
...props,
|
|
34
|
+
key,
|
|
35
|
+
type,
|
|
36
|
+
onConfirm: async () => {
|
|
37
|
+
await props.onConfirm?.(...args);
|
|
38
|
+
resolve();
|
|
39
|
+
},
|
|
40
|
+
onCancel: () => {
|
|
41
|
+
props.onCancel?.(...args);
|
|
42
|
+
reject();
|
|
43
|
+
},
|
|
44
|
+
onClosed: () => {
|
|
45
|
+
props.onClosed?.();
|
|
46
|
+
setStacks(stacks => stacks.filter(stack => stack.key !== key));
|
|
47
|
+
}
|
|
45
48
|
}
|
|
46
|
-
|
|
47
|
-
|
|
49
|
+
];
|
|
50
|
+
});
|
|
48
51
|
});
|
|
49
52
|
};
|
|
50
53
|
};
|
|
@@ -53,14 +56,10 @@ exports.AppDialog = (0, react_1.memo)(({ methods }) => {
|
|
|
53
56
|
methods.warning = defineMethod('warning');
|
|
54
57
|
methods.error = defineMethod('error');
|
|
55
58
|
methods.confirm = defineMethod('confirm');
|
|
56
|
-
return stacks.map(
|
|
57
|
-
return (0,
|
|
59
|
+
return stacks.map(p => {
|
|
60
|
+
return (0, react_1.createElement)(AppDialogStack, { ...p, key: p.key });
|
|
58
61
|
});
|
|
59
62
|
});
|
|
60
|
-
const AppDialogStack = (0,
|
|
61
|
-
|
|
62
|
-
return ((0, jsx_runtime_1.jsx)(dialog_1.Dialog, { width: 360, maskClosable: false, icon: (0, jsx_runtime_1.jsx)(status_1.StatusIcon, { status: type }), showCancel: type === 'confirm', showClose: false, confirmText: type === 'confirm' ? void 0 : '知道了', ...props, open: open, onClose: reason => {
|
|
63
|
-
props.onClose?.(reason);
|
|
64
|
-
setOpen(false);
|
|
65
|
-
}, children: content }));
|
|
63
|
+
const AppDialogStack = (0, react_2.memo)(({ type, content, ...props }) => {
|
|
64
|
+
return ((0, jsx_runtime_1.jsx)(dialog_1.Dialog, { width: 360, maskClosable: false, icon: (0, jsx_runtime_1.jsx)(status_1.StatusIcon, { status: type }), showCancel: type === 'confirm', showClose: false, confirmText: type === 'confirm' ? void 0 : '知道了', defaultOpen: true, ...props, children: content }));
|
|
66
65
|
});
|
|
@@ -9,6 +9,7 @@ const input_1 = require("../input");
|
|
|
9
9
|
const utils_1 = require("../../utils");
|
|
10
10
|
const autocomplete_style_1 = require("./autocomplete.style");
|
|
11
11
|
const popper_style_1 = require("../popper/popper.style");
|
|
12
|
+
const filterOptions_1 = require("../optionsBase/filterOptions");
|
|
12
13
|
exports.Autocomplete = (0, react_1.memo)(({ children, loading, options, loadOptions, primaryKey = 'value', labelKey = 'label', onSelect, renderInput, popperProps, popperRef, defaultValue = '', value, onChange, ...props }) => {
|
|
13
14
|
const [focused, _setFocused] = (0, react_1.useState)(false);
|
|
14
15
|
const setFocused = (focused) => {
|
|
@@ -36,7 +37,12 @@ exports.Autocomplete = (0, react_1.memo)(({ children, loading, options, loadOpti
|
|
|
36
37
|
* ------------------------------------------------------------------
|
|
37
38
|
* 合并最终选项
|
|
38
39
|
*/
|
|
39
|
-
const actualOptions =
|
|
40
|
+
const actualOptions = (0, filterOptions_1.useFilterOptions)({
|
|
41
|
+
searchValue: innerValue.current,
|
|
42
|
+
options: innerOptions || options,
|
|
43
|
+
children,
|
|
44
|
+
labelKey
|
|
45
|
+
}).map(opt => (0, react_1.isValidElement)(opt) ? opt.props : opt);
|
|
40
46
|
const optionsMap = (0, react_1.useMemo)(() => {
|
|
41
47
|
const map = new Map();
|
|
42
48
|
actualOptions?.forEach(opt => {
|
|
@@ -49,7 +55,7 @@ exports.Autocomplete = (0, react_1.memo)(({ children, loading, options, loadOpti
|
|
|
49
55
|
}, [actualOptions, primaryKey]);
|
|
50
56
|
const [open, _setOpen] = (0, utils_1.useDerivedState)(() => {
|
|
51
57
|
return focused && !!optionsMap.size;
|
|
52
|
-
}, [focused, optionsMap
|
|
58
|
+
}, [focused, optionsMap]);
|
|
53
59
|
const setOpen = (open) => {
|
|
54
60
|
if (!props.disabled && !props.readOnly && (!open || optionsMap.size)) {
|
|
55
61
|
// 必须有选项才能打开下拉框
|
|
@@ -75,8 +81,6 @@ exports.Autocomplete = (0, react_1.memo)(({ children, loading, options, loadOpti
|
|
|
75
81
|
loading: innerLoading.current,
|
|
76
82
|
value: innerValue.current,
|
|
77
83
|
onChange: changeHandler,
|
|
78
|
-
onInput: () => setOpen(true),
|
|
79
|
-
onClick: () => setOpen(true),
|
|
80
84
|
onFocus: () => setFocused(true),
|
|
81
85
|
onBlur: () => setFocused(false)
|
|
82
86
|
});
|
|
@@ -84,7 +88,8 @@ exports.Autocomplete = (0, react_1.memo)(({ children, loading, options, loadOpti
|
|
|
84
88
|
placement: 'bottom',
|
|
85
89
|
variant: 'collapse',
|
|
86
90
|
trigger: false,
|
|
87
|
-
|
|
91
|
+
animation: false,
|
|
92
|
+
content: ((0, jsx_runtime_1.jsx)(optionsBase_1.OptionsBase, { onToggleSelected: optionSelectHandler, loading: innerLoading.current, options: actualOptions, labelKey: labelKey, primaryKey: primaryKey, searchValue: innerValue.current, _optionsAlreadyFilter: true, children: children }))
|
|
88
93
|
}, popperProps, {
|
|
89
94
|
css: popper_style_1.popperStyle,
|
|
90
95
|
open: open.current,
|
|
@@ -42,9 +42,9 @@ exports.SearchResult = (0, react_1.memo)(({ primaryKey, labelKey, childrenKey, s
|
|
|
42
42
|
if (!searchValue) {
|
|
43
43
|
return flattedOptions;
|
|
44
44
|
}
|
|
45
|
-
const
|
|
45
|
+
const split = searchValue.split(' ');
|
|
46
46
|
return flattedOptions.filter(({ searchToken }) => {
|
|
47
|
-
return
|
|
47
|
+
return split.some(k => {
|
|
48
48
|
return k && searchToken.toLowerCase().includes(k.toLowerCase());
|
|
49
49
|
});
|
|
50
50
|
});
|
|
@@ -140,18 +140,18 @@ export declare function ClickAway({ ref, container, eventType, onClickAway, disa
|
|
|
140
140
|
onFocusCapture: import("react").FocusEventHandler<HTMLDivElement>;
|
|
141
141
|
onBlur: import("react").FocusEventHandler<HTMLDivElement>;
|
|
142
142
|
onBlurCapture: import("react").FocusEventHandler<HTMLDivElement>;
|
|
143
|
-
onChange: import("react").
|
|
144
|
-
onChangeCapture: import("react").
|
|
143
|
+
onChange: import("react").ChangeEventHandler<HTMLDivElement, Element>;
|
|
144
|
+
onChangeCapture: import("react").ChangeEventHandler<HTMLDivElement, Element>;
|
|
145
145
|
onBeforeInput: import("react").InputEventHandler<HTMLDivElement>;
|
|
146
|
-
onBeforeInputCapture: import("react").
|
|
147
|
-
onInput: import("react").
|
|
148
|
-
onInputCapture: import("react").
|
|
149
|
-
onReset: import("react").
|
|
150
|
-
onResetCapture: import("react").
|
|
151
|
-
onSubmit: import("react").
|
|
152
|
-
onSubmitCapture: import("react").
|
|
153
|
-
onInvalid: import("react").
|
|
154
|
-
onInvalidCapture: import("react").
|
|
146
|
+
onBeforeInputCapture: import("react").InputEventHandler<HTMLDivElement>;
|
|
147
|
+
onInput: import("react").InputEventHandler<HTMLDivElement>;
|
|
148
|
+
onInputCapture: import("react").InputEventHandler<HTMLDivElement>;
|
|
149
|
+
onReset: import("react").ReactEventHandler<HTMLDivElement>;
|
|
150
|
+
onResetCapture: import("react").ReactEventHandler<HTMLDivElement>;
|
|
151
|
+
onSubmit: import("react").SubmitEventHandler<HTMLDivElement>;
|
|
152
|
+
onSubmitCapture: import("react").SubmitEventHandler<HTMLDivElement>;
|
|
153
|
+
onInvalid: import("react").ReactEventHandler<HTMLDivElement>;
|
|
154
|
+
onInvalidCapture: import("react").ReactEventHandler<HTMLDivElement>;
|
|
155
155
|
onLoad: import("react").ReactEventHandler<HTMLDivElement>;
|
|
156
156
|
onLoadCapture: import("react").ReactEventHandler<HTMLDivElement>;
|
|
157
157
|
onError: import("react").ReactEventHandler<HTMLDivElement>;
|
|
@@ -137,7 +137,7 @@ const FormItem = ({ ref, wrapperRef, field, initialValue, label = '', rules, req
|
|
|
137
137
|
}, [rules, required]);
|
|
138
138
|
const [randomKey] = (0, utils_1.useDerivedState)(prev => {
|
|
139
139
|
// fieldValue变为undefined时,需要更新key以强制重渲染组件
|
|
140
|
-
return !prev || typeof fieldValue === 'undefined' ? (0, utils_1.
|
|
140
|
+
return !prev || typeof fieldValue === 'undefined' ? (0, utils_1.getRandomId)() : prev;
|
|
141
141
|
}, [fieldValue]);
|
|
142
142
|
const renderedChildren = (0, react_1.useMemo)(() => {
|
|
143
143
|
if (typeof children === 'function') {
|
|
@@ -78,7 +78,7 @@ function useStyle({ color }) {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
&:not(:has([data-read-only=true]))[data-focused=true],
|
|
81
|
-
&:not(:has([data-read-only=true])):
|
|
81
|
+
&:not(:has([data-read-only=true])):focus-within {
|
|
82
82
|
&::before, &::after {
|
|
83
83
|
display: block;
|
|
84
84
|
animation: ${borderAnim} .4s ${easing.easeOut} forwards;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { Id } from '../../types';
|
|
3
|
+
import { MenuOptionType, OptionsBaseProps } from './optionsBase';
|
|
4
|
+
export declare function useFilterOptions<O extends MenuOptionType<V>, V extends Id = Id>({ searchValue, options, children, filterPredicate, labelKey, searchTokenKey, _optionsAlreadyFilter }: Pick<OptionsBaseProps<O, V>, 'searchValue' | 'children' | 'options' | 'filterPredicate' | 'labelKey' | 'searchTokenKey' | '_optionsAlreadyFilter'>): (O | ReactNode)[];
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useFilterOptions = useFilterOptions;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
function useFilterOptions({ searchValue, options, children, filterPredicate, labelKey = 'label', searchTokenKey = 'searchToken', _optionsAlreadyFilter }) {
|
|
6
|
+
return (0, react_1.useMemo)(() => {
|
|
7
|
+
if (_optionsAlreadyFilter) {
|
|
8
|
+
return options || react_1.Children.toArray(children);
|
|
9
|
+
}
|
|
10
|
+
const trimmedSearchValue = searchValue?.trim();
|
|
11
|
+
if (!trimmedSearchValue) {
|
|
12
|
+
return options || react_1.Children.toArray(children);
|
|
13
|
+
}
|
|
14
|
+
const splitValue = trimmedSearchValue.split(' ');
|
|
15
|
+
const filterFn = (opt, index) => {
|
|
16
|
+
let ret = false;
|
|
17
|
+
if (filterPredicate) {
|
|
18
|
+
ret = filterPredicate(trimmedSearchValue, opt, index);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
const searchToken = typeof opt[labelKey] === 'string' ? opt[labelKey] : opt[searchTokenKey];
|
|
22
|
+
if (typeof searchToken === 'string') {
|
|
23
|
+
ret = splitValue.some(k => {
|
|
24
|
+
return k && searchToken.toLowerCase().includes(k.toLowerCase());
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return ret;
|
|
29
|
+
};
|
|
30
|
+
return options
|
|
31
|
+
? options.filter(filterFn)
|
|
32
|
+
: react_1.Children.toArray(children).filter((c, index) => {
|
|
33
|
+
return (0, react_1.isValidElement)(c) && filterFn(c.props, index);
|
|
34
|
+
});
|
|
35
|
+
}, [searchValue, filterPredicate, options, children, labelKey, searchTokenKey, _optionsAlreadyFilter]);
|
|
36
|
+
}
|
|
@@ -27,5 +27,10 @@ export interface OptionsBaseProps<O extends MenuOptionType<V>, V extends Id = Id
|
|
|
27
27
|
searchValue?: string;
|
|
28
28
|
selectedValue?: V | V[];
|
|
29
29
|
onToggleSelected?(value: V, e: KeyboardEvent | React.MouseEvent<HTMLDivElement>): void;
|
|
30
|
+
/**
|
|
31
|
+
* @private
|
|
32
|
+
* 内部使用,传入的选项是否已经经过筛选
|
|
33
|
+
*/
|
|
34
|
+
_optionsAlreadyFilter?: boolean;
|
|
30
35
|
}
|
|
31
36
|
export declare const OptionsBase: <O extends MenuOptionType<V>, V extends Id = Id>(props: OptionsBaseProps<O, V>) => ReactElement;
|
|
@@ -10,39 +10,14 @@ const utils_1 = require("../../utils");
|
|
|
10
10
|
const optionsBase_style_1 = require("./optionsBase.style");
|
|
11
11
|
const loading_1 = require("../loading");
|
|
12
12
|
const popper_1 = require("../popper");
|
|
13
|
+
const filterOptions_1 = require("./filterOptions");
|
|
13
14
|
exports.OptionsBase = (0, react_1.memo)(({
|
|
14
15
|
// 共享属性
|
|
15
16
|
showCheckbox, loading, options, children, labelKey = 'label', primaryKey = 'value', searchTokenKey = 'searchToken', filterPredicate,
|
|
16
17
|
// 以下为非共享属性
|
|
17
|
-
searchValue, selectedValue, onToggleSelected, ...props }) => {
|
|
18
|
+
searchValue, selectedValue, onToggleSelected, _optionsAlreadyFilter, ...props }) => {
|
|
18
19
|
const { open, setOpen } = (0, popper_1.usePopperContext)();
|
|
19
|
-
const filteredOptions = (0,
|
|
20
|
-
const trimmedSearchValue = searchValue?.trim();
|
|
21
|
-
if (!trimmedSearchValue) {
|
|
22
|
-
return options || react_1.Children.toArray(children);
|
|
23
|
-
}
|
|
24
|
-
const splitedValue = trimmedSearchValue.split(' ');
|
|
25
|
-
const filterFn = (opt, index) => {
|
|
26
|
-
let ret = false;
|
|
27
|
-
if (filterPredicate) {
|
|
28
|
-
ret = filterPredicate(trimmedSearchValue, opt, index);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
const searchToken = typeof opt[labelKey] === 'string' ? opt[labelKey] : opt[searchTokenKey];
|
|
32
|
-
if (typeof searchToken === 'string') {
|
|
33
|
-
ret = splitedValue.some(k => {
|
|
34
|
-
return k && searchToken.toLowerCase().includes(k.toLowerCase());
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return ret;
|
|
39
|
-
};
|
|
40
|
-
return options
|
|
41
|
-
? options.filter(filterFn)
|
|
42
|
-
: react_1.Children.toArray(children).filter((c, index) => {
|
|
43
|
-
return (0, react_1.isValidElement)(c) && filterFn(c.props, index);
|
|
44
|
-
});
|
|
45
|
-
}, [searchValue, filterPredicate, options, children, labelKey, searchTokenKey]);
|
|
20
|
+
const filteredOptions = (0, filterOptions_1.useFilterOptions)({ searchValue, filterPredicate, options, children, labelKey, searchTokenKey, _optionsAlreadyFilter });
|
|
46
21
|
/**
|
|
47
22
|
* ------------------------------------------------------------------
|
|
48
23
|
* 键盘控制
|
|
@@ -28,7 +28,7 @@ export interface PopperProps extends Omit<DivProps, 'content' | 'children'> {
|
|
|
28
28
|
sizeAdaptable?: boolean;
|
|
29
29
|
/** trigger{@link trigger}包含"hover"时,鼠标移入移的延迟时间,默认为`150(ms)` */
|
|
30
30
|
mouseEnterDelay?: number;
|
|
31
|
-
|
|
31
|
+
/** 默认为`150(ms)` */
|
|
32
32
|
mouseLeaveDelay?: number;
|
|
33
33
|
defaultOpen?: boolean;
|
|
34
34
|
open?: boolean;
|
|
@@ -43,6 +43,8 @@ export interface PopperProps extends Omit<DivProps, 'content' | 'children'> {
|
|
|
43
43
|
* @enum {undefined} 第一次打开时渲染,跟随父组件销毁。
|
|
44
44
|
*/
|
|
45
45
|
forceRender?: boolean;
|
|
46
|
+
/** 打开与关闭是否渲染过度动画,默认为`true` */
|
|
47
|
+
animation?: boolean;
|
|
46
48
|
children?: ReactElement<any>;
|
|
47
49
|
}
|
|
48
50
|
export interface PopperRef extends HTMLDivElement {
|
|
@@ -51,4 +53,4 @@ export interface PopperRef extends HTMLDivElement {
|
|
|
51
53
|
openAnimation?: boolean;
|
|
52
54
|
}, beforeOpen?: () => void): void;
|
|
53
55
|
}
|
|
54
|
-
export declare function Popper({ ref, popperRef, anchorElement, container, effectContainer, content, offset, trigger, clickToClose, placement, variant, sizeAdaptable, mouseEnterDelay, mouseLeaveDelay, defaultOpen, open, onOpenChange, onOpenChangeEnd, disabled, autoClose, forceRender, children, ...props }: PopperProps): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
56
|
+
export declare function Popper({ ref, popperRef, anchorElement, container, effectContainer, content, offset, trigger, clickToClose, placement, variant, sizeAdaptable, mouseEnterDelay, mouseLeaveDelay, defaultOpen, open, onOpenChange, onOpenChangeEnd, disabled, autoClose, forceRender, animation, children, ...props }: PopperProps): import("@emotion/react/jsx-runtime").JSX.Element;
|
|
@@ -22,7 +22,7 @@ const getAttemptOrder = (placement) => {
|
|
|
22
22
|
}
|
|
23
23
|
return order;
|
|
24
24
|
};
|
|
25
|
-
function Popper({ ref, popperRef, anchorElement, container, effectContainer, content, offset, trigger = 'hover', clickToClose, placement = 'top', variant = 'zoom', sizeAdaptable = variant === 'collapse', mouseEnterDelay = 150, mouseLeaveDelay = 150, defaultOpen = false, open, onOpenChange, onOpenChangeEnd, disabled, autoClose = false, forceRender, children, ...props }) {
|
|
25
|
+
function Popper({ ref, popperRef, anchorElement, container, effectContainer, content, offset, trigger = 'hover', clickToClose, placement = 'top', variant = 'zoom', sizeAdaptable = variant === 'collapse', mouseEnterDelay = 150, mouseLeaveDelay = 150, defaultOpen = false, open, onOpenChange, onOpenChangeEnd, disabled, autoClose = false, forceRender, animation = true, children, ...props }) {
|
|
26
26
|
const { spacing } = (0, theme_1.useTheme)();
|
|
27
27
|
offset ??= spacing[2];
|
|
28
28
|
(0, react_1.useImperativeHandle)(popperRef, () => {
|
|
@@ -55,6 +55,8 @@ function Popper({ ref, popperRef, anchorElement, container, effectContainer, con
|
|
|
55
55
|
if (newOpen || openHolding.current === 0) {
|
|
56
56
|
_setInnerOpen(newOpen);
|
|
57
57
|
}
|
|
58
|
+
// 不渲染动画时,需要手动触发onTransitionEnd
|
|
59
|
+
!animation && transitionEndHandler();
|
|
58
60
|
};
|
|
59
61
|
const { onChildrenOpenChange: tellParentOpenChange } = (0, popperContext_1.usePopperContext)();
|
|
60
62
|
(0, utils_1.useUpdateEffect)(() => {
|
|
@@ -85,6 +87,9 @@ function Popper({ ref, popperRef, anchorElement, container, effectContainer, con
|
|
|
85
87
|
const animating = (0, react_1.useRef)(false);
|
|
86
88
|
const onTransitionEnd = (e) => {
|
|
87
89
|
props.onTransitionEnd?.(e);
|
|
90
|
+
transitionEndHandler();
|
|
91
|
+
};
|
|
92
|
+
const transitionEndHandler = () => {
|
|
88
93
|
onOpenChangeEnd?.(innerOpen.current);
|
|
89
94
|
if (forceRender === false && !innerOpen.current) {
|
|
90
95
|
renderedOnce.current = false;
|
|
@@ -541,5 +546,5 @@ function Popper({ ref, popperRef, anchorElement, container, effectContainer, con
|
|
|
541
546
|
transform: 'scale(1)'
|
|
542
547
|
},
|
|
543
548
|
...props.style
|
|
544
|
-
}, "data-open": innerOpen.current, "data-variant": variant, "data-place-a": placeA.current, "data-place-b": placeB.current, onTransitionEnd: onTransitionEnd, children: (0, jsx_runtime_1.jsx)(popperContext_1.PopperContext, { value: contextValue, children: content }) }) }), containerEl.current)] }));
|
|
549
|
+
}, "data-open": innerOpen.current, "data-variant": variant, "data-place-a": placeA.current, "data-place-b": placeB.current, "data-animation": animation, onTransitionEnd: onTransitionEnd, children: (0, jsx_runtime_1.jsx)(popperContext_1.PopperContext, { value: contextValue, children: content }) }) }), containerEl.current)] }));
|
|
545
550
|
}
|
|
@@ -19,7 +19,10 @@ exports.style = (0, utils_1.defineCss)(theme => {
|
|
|
19
19
|
left: 0;
|
|
20
20
|
z-index: ${theme_1.zIndex.popper};
|
|
21
21
|
transition-property: transform, opacity;
|
|
22
|
-
|
|
22
|
+
|
|
23
|
+
&[data-animation=true] {
|
|
24
|
+
transition-duration: .25s;
|
|
25
|
+
}
|
|
23
26
|
|
|
24
27
|
&[data-open=true] {
|
|
25
28
|
transition-timing-function: ${easing.bounce}, ${easing.easeOut};
|
|
@@ -47,7 +47,7 @@ exports.SnackbarBase = (0, react_2.memo)(({ methods, useTo, max = useTo === 'mes
|
|
|
47
47
|
: { content: props };
|
|
48
48
|
const { placement = useTo === 'message' ? 'top' : 'topRight', duration = useTo === 'message' ? 3000 : 5000, ...restProps } = propsObject;
|
|
49
49
|
const index = placementToIndex[placement];
|
|
50
|
-
let id = (0, utils_1.
|
|
50
|
+
let id = (0, utils_1.getRandomId)();
|
|
51
51
|
const onCloseButtonClick = () => {
|
|
52
52
|
!isUnmounted.current && setStacks(o => {
|
|
53
53
|
o[index] = o[index].filter(s => s.id !== id);
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import { Ref, ReactNode, ElementType, ComponentProps } from 'react';
|
|
2
2
|
import { Id, Obj } from '../types';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* @param namespace
|
|
4
|
+
* 获取UUID
|
|
6
5
|
*/
|
|
7
|
-
export declare function
|
|
8
|
-
/**
|
|
9
|
-
* 获取任意长度由随机字母组成的ID
|
|
10
|
-
* @param length
|
|
11
|
-
*/
|
|
12
|
-
export declare function getShortID(length?: number): string;
|
|
6
|
+
export declare function getRandomId(): `${string}-${string}-${string}-${string}-${string}`;
|
|
13
7
|
/**
|
|
14
8
|
* 拼接元素的类名
|
|
15
9
|
* @param classes
|
package/dist/cjs/utils/utils.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.getShortID = getShortID;
|
|
3
|
+
exports.getRandomId = getRandomId;
|
|
5
4
|
exports.clsx = clsx;
|
|
6
5
|
exports.humpToSegmented = humpToSegmented;
|
|
7
6
|
exports.toArray = toArray;
|
|
@@ -26,24 +25,10 @@ exports.queryDeep = queryDeep;
|
|
|
26
25
|
exports.filterProperties = filterProperties;
|
|
27
26
|
exports.mergeComponentProps = mergeComponentProps;
|
|
28
27
|
/**
|
|
29
|
-
*
|
|
30
|
-
* @param namespace
|
|
28
|
+
* 获取UUID
|
|
31
29
|
*/
|
|
32
|
-
function
|
|
33
|
-
return
|
|
34
|
-
}
|
|
35
|
-
const randomIdAlphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';
|
|
36
|
-
/**
|
|
37
|
-
* 获取任意长度由随机字母组成的ID
|
|
38
|
-
* @param length
|
|
39
|
-
*/
|
|
40
|
-
function getShortID(length = 8) {
|
|
41
|
-
const { length: alphabetLength } = randomIdAlphabet;
|
|
42
|
-
let id = '';
|
|
43
|
-
while (length--) {
|
|
44
|
-
id += randomIdAlphabet[Math.floor(Math.random() * alphabetLength)];
|
|
45
|
-
}
|
|
46
|
-
return id;
|
|
30
|
+
function getRandomId() {
|
|
31
|
+
return crypto.randomUUID();
|
|
47
32
|
}
|
|
48
33
|
/**
|
|
49
34
|
* 拼接元素的类名
|
|
@@ -414,11 +399,12 @@ function mergeComponentProps(...props) {
|
|
|
414
399
|
target.style = { ...source.style, ...target.style };
|
|
415
400
|
continue;
|
|
416
401
|
default:
|
|
417
|
-
const
|
|
418
|
-
if (typeof
|
|
402
|
+
const sourceFn = source[p];
|
|
403
|
+
if (typeof sourceFn === 'function') {
|
|
404
|
+
const targetFn = target[p];
|
|
419
405
|
target[p] = (...args) => {
|
|
420
|
-
|
|
421
|
-
|
|
406
|
+
targetFn(...args);
|
|
407
|
+
sourceFn(...args);
|
|
422
408
|
};
|
|
423
409
|
continue;
|
|
424
410
|
}
|