rsuite 5.48.1 → 5.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/Cascader/styles/index.less +5 -4
- package/DatePicker/styles/index.less +18 -11
- package/DateRangeInput/package.json +7 -0
- package/DateRangePicker/styles/index.less +20 -0
- package/Dropdown/styles/index.less +5 -4
- package/Dropdown/styles/mixin.less +0 -11
- package/InputGroup/styles/index.less +1 -0
- package/Picker/styles/index.less +51 -24
- package/Picker/styles/mixin.less +17 -13
- package/README.md +34 -24
- package/Sidenav/styles/index.less +2 -0
- package/TagInput/styles/index.less +1 -1
- package/cjs/AutoComplete/AutoComplete.js +25 -26
- package/cjs/Calendar/Calendar.d.ts +5 -1
- package/cjs/Calendar/CalendarContainer.d.ts +7 -1
- package/cjs/Calendar/CalendarContainer.js +11 -4
- package/cjs/Calendar/CalendarHeader.js +2 -0
- package/cjs/Calendar/MonthDropdown.js +7 -2
- package/cjs/Calendar/MonthDropdownItem.js +2 -2
- package/cjs/Calendar/Table.js +6 -1
- package/cjs/Calendar/TimeDropdown.js +17 -10
- package/cjs/Calendar/types.d.ts +1 -0
- package/cjs/Cascader/Cascader.js +46 -48
- package/cjs/CheckPicker/CheckPicker.d.ts +2 -2
- package/cjs/CheckPicker/CheckPicker.js +33 -36
- package/cjs/CheckTreePicker/CheckTreePicker.js +61 -64
- package/cjs/CustomProvider/CustomProvider.d.ts +13 -0
- package/cjs/CustomProvider/CustomProvider.js +2 -2
- package/cjs/DateInput/DateField.d.ts +9 -31
- package/cjs/DateInput/DateField.js +61 -12
- package/cjs/DateInput/DateInput.d.ts +7 -2
- package/cjs/DateInput/DateInput.js +74 -92
- package/cjs/DateInput/index.d.ts +4 -0
- package/cjs/DateInput/index.js +19 -1
- package/cjs/DateInput/useDateInputState.d.ts +7 -31
- package/cjs/DateInput/useDateInputState.js +39 -15
- package/cjs/DateInput/useIsFocused.d.ts +7 -0
- package/cjs/DateInput/useIsFocused.js +28 -0
- package/cjs/DateInput/useKeyboardInputEvent.d.ts +10 -0
- package/cjs/DateInput/useKeyboardInputEvent.js +44 -0
- package/cjs/DateInput/utils.d.ts +23 -1
- package/cjs/DateInput/utils.js +155 -51
- package/cjs/DatePicker/DatePicker.d.ts +25 -8
- package/cjs/DatePicker/DatePicker.js +208 -241
- package/cjs/DatePicker/Toolbar.js +5 -22
- package/cjs/DatePicker/utils.d.ts +5 -1
- package/cjs/DatePicker/utils.js +17 -1
- package/cjs/DateRangeInput/DateRangeInput.d.ts +29 -0
- package/cjs/DateRangeInput/DateRangeInput.js +244 -0
- package/cjs/DateRangeInput/index.d.ts +3 -0
- package/cjs/DateRangeInput/index.js +9 -0
- package/cjs/DateRangeInput/utils.d.ts +61 -0
- package/cjs/DateRangeInput/utils.js +146 -0
- package/cjs/DateRangePicker/Calendar.js +24 -23
- package/cjs/DateRangePicker/DateRangePicker.d.ts +18 -4
- package/cjs/DateRangePicker/DateRangePicker.js +251 -203
- package/cjs/DateRangePicker/types.d.ts +11 -3
- package/cjs/DateRangePicker/utils.d.ts +2 -1
- package/cjs/DateRangePicker/utils.js +7 -5
- package/cjs/FormControl/FormControl.d.ts +11 -1
- package/cjs/FormControl/FormControl.js +6 -5
- package/cjs/Input/Input.d.ts +11 -0
- package/cjs/Input/Input.js +11 -8
- package/cjs/InputPicker/InputPicker.js +62 -63
- package/cjs/MultiCascader/MultiCascader.js +40 -42
- package/cjs/Overlay/OverlayTrigger.d.ts +3 -0
- package/cjs/Overlay/OverlayTrigger.js +5 -0
- package/cjs/Picker/PickerIndicator.d.ts +10 -0
- package/cjs/Picker/PickerIndicator.js +49 -0
- package/cjs/Picker/PickerLabel.d.ts +9 -0
- package/cjs/Picker/PickerLabel.js +23 -0
- package/cjs/Picker/PickerToggle.d.ts +17 -22
- package/cjs/Picker/PickerToggle.js +52 -177
- package/cjs/Picker/index.d.ts +3 -0
- package/cjs/Picker/index.js +10 -1
- package/cjs/Picker/usePickerRef.d.ts +19 -0
- package/cjs/Picker/usePickerRef.js +88 -0
- package/cjs/Picker/utils.d.ts +5 -9
- package/cjs/Picker/utils.js +22 -89
- package/cjs/SelectPicker/SelectPicker.d.ts +2 -2
- package/cjs/SelectPicker/SelectPicker.js +39 -42
- package/cjs/TreePicker/TreePicker.js +72 -75
- package/cjs/index.d.ts +2 -0
- package/cjs/index.js +3 -1
- package/cjs/locales/index.d.ts +2 -2
- package/cjs/utils/constants.d.ts +2 -1
- package/cjs/utils/constants.js +1 -0
- package/cjs/utils/dateUtils.d.ts +0 -1
- package/cjs/utils/dateUtils.js +0 -6
- package/cjs/utils/getStringLength.d.ts +2 -0
- package/cjs/utils/getStringLength.js +18 -0
- package/cjs/utils/index.d.ts +3 -0
- package/cjs/utils/index.js +11 -2
- package/cjs/utils/useCustom.js +1 -1
- package/cjs/utils/useIsomorphicLayoutEffect.d.ts +3 -0
- package/cjs/utils/useIsomorphicLayoutEffect.js +9 -0
- package/dist/rsuite-no-reset-rtl.css +140 -207
- package/dist/rsuite-no-reset-rtl.min.css +1 -1
- package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
- package/dist/rsuite-no-reset.css +140 -207
- package/dist/rsuite-no-reset.min.css +1 -1
- package/dist/rsuite-no-reset.min.css.map +1 -1
- package/dist/rsuite-rtl.css +140 -75
- package/dist/rsuite-rtl.min.css +1 -1
- package/dist/rsuite-rtl.min.css.map +1 -1
- package/dist/rsuite.css +140 -75
- package/dist/rsuite.js +4833 -258
- package/dist/rsuite.js.map +1 -1
- package/dist/rsuite.min.css +1 -1
- package/dist/rsuite.min.css.map +1 -1
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.map +1 -1
- package/esm/AutoComplete/AutoComplete.js +28 -29
- package/esm/Calendar/Calendar.d.ts +5 -1
- package/esm/Calendar/CalendarContainer.d.ts +7 -1
- package/esm/Calendar/CalendarContainer.js +12 -5
- package/esm/Calendar/CalendarHeader.js +2 -0
- package/esm/Calendar/MonthDropdown.js +7 -2
- package/esm/Calendar/MonthDropdownItem.js +2 -2
- package/esm/Calendar/Table.js +6 -1
- package/esm/Calendar/TimeDropdown.js +17 -10
- package/esm/Calendar/types.d.ts +1 -0
- package/esm/Cascader/Cascader.js +49 -51
- package/esm/CheckPicker/CheckPicker.d.ts +2 -2
- package/esm/CheckPicker/CheckPicker.js +36 -39
- package/esm/CheckTreePicker/CheckTreePicker.js +64 -67
- package/esm/CustomProvider/CustomProvider.d.ts +13 -0
- package/esm/CustomProvider/CustomProvider.js +3 -3
- package/esm/DateInput/DateField.d.ts +9 -31
- package/esm/DateInput/DateField.js +61 -12
- package/esm/DateInput/DateInput.d.ts +7 -2
- package/esm/DateInput/DateInput.js +77 -95
- package/esm/DateInput/index.d.ts +4 -0
- package/esm/DateInput/index.js +4 -0
- package/esm/DateInput/useDateInputState.d.ts +7 -31
- package/esm/DateInput/useDateInputState.js +41 -18
- package/esm/DateInput/useIsFocused.d.ts +7 -0
- package/esm/DateInput/useIsFocused.js +22 -0
- package/esm/DateInput/useKeyboardInputEvent.d.ts +10 -0
- package/esm/DateInput/useKeyboardInputEvent.js +38 -0
- package/esm/DateInput/utils.d.ts +23 -1
- package/esm/DateInput/utils.js +150 -51
- package/esm/DatePicker/DatePicker.d.ts +25 -8
- package/esm/DatePicker/DatePicker.js +211 -244
- package/esm/DatePicker/Toolbar.js +5 -22
- package/esm/DatePicker/utils.d.ts +5 -1
- package/esm/DatePicker/utils.js +16 -1
- package/esm/DateRangeInput/DateRangeInput.d.ts +29 -0
- package/esm/DateRangeInput/DateRangeInput.js +237 -0
- package/esm/DateRangeInput/index.d.ts +3 -0
- package/esm/DateRangeInput/index.js +3 -0
- package/esm/DateRangeInput/utils.d.ts +61 -0
- package/esm/DateRangeInput/utils.js +137 -0
- package/esm/DateRangePicker/Calendar.js +25 -23
- package/esm/DateRangePicker/DateRangePicker.d.ts +18 -4
- package/esm/DateRangePicker/DateRangePicker.js +253 -205
- package/esm/DateRangePicker/types.d.ts +11 -3
- package/esm/DateRangePicker/utils.d.ts +2 -1
- package/esm/DateRangePicker/utils.js +7 -5
- package/esm/FormControl/FormControl.d.ts +11 -1
- package/esm/FormControl/FormControl.js +4 -3
- package/esm/Input/Input.d.ts +11 -0
- package/esm/Input/Input.js +12 -9
- package/esm/InputPicker/InputPicker.js +64 -65
- package/esm/MultiCascader/MultiCascader.js +43 -45
- package/esm/Overlay/OverlayTrigger.d.ts +3 -0
- package/esm/Overlay/OverlayTrigger.js +5 -0
- package/esm/Picker/PickerIndicator.d.ts +10 -0
- package/esm/Picker/PickerIndicator.js +43 -0
- package/esm/Picker/PickerLabel.d.ts +9 -0
- package/esm/Picker/PickerLabel.js +17 -0
- package/esm/Picker/PickerToggle.d.ts +17 -22
- package/esm/Picker/PickerToggle.js +54 -179
- package/esm/Picker/index.d.ts +3 -0
- package/esm/Picker/index.js +3 -0
- package/esm/Picker/usePickerRef.d.ts +19 -0
- package/esm/Picker/usePickerRef.js +82 -0
- package/esm/Picker/utils.d.ts +5 -9
- package/esm/Picker/utils.js +24 -90
- package/esm/SelectPicker/SelectPicker.d.ts +2 -2
- package/esm/SelectPicker/SelectPicker.js +42 -45
- package/esm/TreePicker/TreePicker.js +75 -78
- package/esm/index.d.ts +2 -0
- package/esm/index.js +1 -0
- package/esm/locales/index.d.ts +2 -2
- package/esm/utils/constants.d.ts +2 -1
- package/esm/utils/constants.js +1 -0
- package/esm/utils/dateUtils.d.ts +0 -1
- package/esm/utils/dateUtils.js +0 -5
- package/esm/utils/getStringLength.d.ts +2 -0
- package/esm/utils/getStringLength.js +13 -0
- package/esm/utils/index.d.ts +3 -0
- package/esm/utils/index.js +4 -1
- package/esm/utils/useCustom.js +2 -2
- package/esm/utils/useIsomorphicLayoutEffect.d.ts +3 -0
- package/esm/utils/useIsomorphicLayoutEffect.js +4 -0
- package/package.json +1 -1
- package/styles/color-modes/dark.less +1 -0
- package/styles/color-modes/high-contrast.less +1 -0
- package/styles/color-modes/light.less +1 -0
- package/styles/mixins/combobox.less +10 -0
- package/styles/normalize.less +230 -231
|
@@ -9,12 +9,20 @@ export interface RangeType<T = DateRange> {
|
|
|
9
9
|
placement?: 'bottom' | 'left';
|
|
10
10
|
}
|
|
11
11
|
export declare type DisabledDateFunction = (
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* Date used to determine if disabling is required.
|
|
14
|
+
*/
|
|
13
15
|
date: Date,
|
|
14
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Date selected.
|
|
18
|
+
*/
|
|
15
19
|
selectDate?: ValueType,
|
|
16
20
|
/**
|
|
17
21
|
* Whether to choose to finish now.
|
|
18
22
|
* If `false`, only the start date is selected, waiting for the selection end date.
|
|
19
23
|
*/
|
|
20
|
-
selectedDone?: boolean,
|
|
24
|
+
selectedDone?: boolean,
|
|
25
|
+
/**
|
|
26
|
+
* Call the target of the `shouldDisableDate` function.
|
|
27
|
+
*/
|
|
28
|
+
target?: DATERANGE_DISABLED_TARGET) => boolean;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { DateRange } from './types';
|
|
2
|
-
export declare function getSafeCalendarDate({ value, calendarKey }: {
|
|
2
|
+
export declare function getSafeCalendarDate({ value, calendarKey, allowAameMonth }: {
|
|
3
3
|
value: [] | [Date] | [Date, Date] | null;
|
|
4
4
|
calendarKey?: 'start' | 'end';
|
|
5
|
+
allowAameMonth?: boolean;
|
|
5
6
|
}): DateRange;
|
|
6
7
|
export declare const isSameRange: (source: DateRange | null, dest: DateRange | null, format: string) => boolean;
|
|
7
8
|
export declare const getMonthHoverRange: (date: Date) => DateRange;
|
|
@@ -4,29 +4,31 @@ export function getSafeCalendarDate(_ref) {
|
|
|
4
4
|
var _value;
|
|
5
5
|
var value = _ref.value,
|
|
6
6
|
_ref$calendarKey = _ref.calendarKey,
|
|
7
|
-
calendarKey = _ref$calendarKey === void 0 ? 'start' : _ref$calendarKey
|
|
7
|
+
calendarKey = _ref$calendarKey === void 0 ? 'start' : _ref$calendarKey,
|
|
8
|
+
allowAameMonth = _ref.allowAameMonth;
|
|
8
9
|
// Update calendarDate if the value is not null
|
|
9
10
|
value = (_value = value) !== null && _value !== void 0 ? _value : [];
|
|
11
|
+
var gap = allowAameMonth ? 0 : 1;
|
|
10
12
|
if (value[0] && value[1]) {
|
|
11
13
|
var diffMonth = differenceInCalendarMonths(value[1], value[0]);
|
|
12
14
|
if (calendarKey === 'start') {
|
|
13
15
|
return [value[0], diffMonth <= 0 ? copyTime({
|
|
14
16
|
from: value[1],
|
|
15
|
-
to: addMonths(value[0],
|
|
17
|
+
to: addMonths(value[0], gap)
|
|
16
18
|
}) : value[1]];
|
|
17
19
|
} else if (calendarKey === 'end') {
|
|
18
20
|
return [diffMonth <= 0 ? copyTime({
|
|
19
21
|
from: value[0],
|
|
20
|
-
to: addMonths(value[1], -
|
|
22
|
+
to: addMonths(value[1], -gap)
|
|
21
23
|
}) : value[0], value[1]];
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
// If only the start date
|
|
25
27
|
} else if (value[0]) {
|
|
26
|
-
return [value[0], addMonths(value[0],
|
|
28
|
+
return [value[0], addMonths(value[0], gap)];
|
|
27
29
|
}
|
|
28
30
|
var todayDate = new Date();
|
|
29
|
-
return [todayDate, addMonths(todayDate,
|
|
31
|
+
return [todayDate, addMonths(todayDate, gap)];
|
|
30
32
|
}
|
|
31
33
|
export var isSameRange = function isSameRange(source, dest, format) {
|
|
32
34
|
// If both are null, reguard as same
|
|
@@ -9,7 +9,17 @@ export declare type FormControlAccepterProps<ValueType = any> = FormControlBaseP
|
|
|
9
9
|
export interface FormControlProps<P = any, ValueType = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLFormElement>, 'value' | 'onChange'> {
|
|
10
10
|
/** Proxied components */
|
|
11
11
|
accepter?: React.ElementType<P & FormControlBaseProps<ValueType>>;
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* The name of form-control, support nested path. such as `address.city`.
|
|
14
|
+
* The path will be used to get and set form values.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```js
|
|
18
|
+
* <Form formValue={{ address: { city: 'Shanghai' } }}>
|
|
19
|
+
* <FormControl name="address.city" />
|
|
20
|
+
* </Form>
|
|
21
|
+
* ```
|
|
22
|
+
**/
|
|
13
23
|
name: string;
|
|
14
24
|
/** Value */
|
|
15
25
|
value?: ValueType;
|
|
@@ -6,6 +6,8 @@ var _templateObject;
|
|
|
6
6
|
import React, { useContext } from 'react';
|
|
7
7
|
import PropTypes from 'prop-types';
|
|
8
8
|
import isUndefined from 'lodash/isUndefined';
|
|
9
|
+
import get from 'lodash/get';
|
|
10
|
+
import set from 'lodash/set';
|
|
9
11
|
import Input from '../Input';
|
|
10
12
|
import FormErrorMessage from '../FormErrorMessage';
|
|
11
13
|
import { useClassNames } from '../utils';
|
|
@@ -80,7 +82,7 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
80
82
|
});
|
|
81
83
|
var trigger = checkTrigger || contextCheckTrigger;
|
|
82
84
|
var formValue = useContext(FormValueContext);
|
|
83
|
-
var val = isUndefined(value) ? formValue
|
|
85
|
+
var val = isUndefined(value) ? get(formValue, name) : value;
|
|
84
86
|
var _useClassNames = useClassNames(classPrefix),
|
|
85
87
|
withClassPrefix = _useClassNames.withClassPrefix,
|
|
86
88
|
prefix = _useClassNames.prefix;
|
|
@@ -95,7 +97,6 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
95
97
|
onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
|
|
96
98
|
};
|
|
97
99
|
var handleFieldCheck = function handleFieldCheck(value, isCheckTrigger) {
|
|
98
|
-
var _extends2;
|
|
99
100
|
var callbackEvents = function callbackEvents(checkResult) {
|
|
100
101
|
// The relevant event is triggered only when the inspection is allowed.
|
|
101
102
|
if (isCheckTrigger) {
|
|
@@ -107,7 +108,7 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
107
108
|
}
|
|
108
109
|
return checkResult;
|
|
109
110
|
};
|
|
110
|
-
var nextFormValue =
|
|
111
|
+
var nextFormValue = set(formValue || {}, name, value);
|
|
111
112
|
var model = getCombinedModel();
|
|
112
113
|
if (checkAsync) {
|
|
113
114
|
return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(name, nextFormValue).then(function (checkResult) {
|
package/esm/Input/Input.d.ts
CHANGED
|
@@ -13,12 +13,23 @@ export interface InputProps extends WithAsProps, Omit<React.InputHTMLAttributes<
|
|
|
13
13
|
size?: TypeAttributes.Size;
|
|
14
14
|
/** Ref of input element */
|
|
15
15
|
inputRef?: React.Ref<any>;
|
|
16
|
+
/**
|
|
17
|
+
* The htmlSize attribute defines the width of the <input> element.
|
|
18
|
+
*
|
|
19
|
+
* @see MDN https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/size
|
|
20
|
+
* @version 5.49.0
|
|
21
|
+
*/
|
|
22
|
+
htmlSize?: number;
|
|
23
|
+
/**
|
|
24
|
+
* The callback function in which value is changed.
|
|
25
|
+
*/
|
|
16
26
|
onChange?: PrependParameters<React.ChangeEventHandler<HTMLInputElement>, [value: string]>;
|
|
17
27
|
/** Called on press enter */
|
|
18
28
|
onPressEnter?: React.KeyboardEventHandler<HTMLInputElement>;
|
|
19
29
|
}
|
|
20
30
|
/**
|
|
21
31
|
* The `<Input>` component is used to get user input in a text field.
|
|
32
|
+
*
|
|
22
33
|
* @see https://rsuitejs.com/components/input
|
|
23
34
|
*/
|
|
24
35
|
declare const Input: RsRefForwardingComponent<'input', InputProps>;
|
package/esm/Input/Input.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
3
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
4
|
-
import React, {
|
|
4
|
+
import React, { useContext } from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import { FormGroupContext } from '../FormGroup/FormGroup';
|
|
7
7
|
import { InputGroupContext } from '../InputGroup/InputGroup';
|
|
@@ -9,6 +9,7 @@ import Plaintext from '../Plaintext';
|
|
|
9
9
|
import { createChainedFunction, TypeChecker, mergeRefs, useClassNames, KEY_VALUES } from '../utils';
|
|
10
10
|
/**
|
|
11
11
|
* The `<Input>` component is used to get user input in a text field.
|
|
12
|
+
*
|
|
12
13
|
* @see https://rsuitejs.com/components/input
|
|
13
14
|
*/
|
|
14
15
|
var Input = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
@@ -25,6 +26,7 @@ var Input = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
25
26
|
inputRef = props.inputRef,
|
|
26
27
|
id = props.id,
|
|
27
28
|
size = props.size,
|
|
29
|
+
htmlSize = props.htmlSize,
|
|
28
30
|
plaintext = props.plaintext,
|
|
29
31
|
readOnly = props.readOnly,
|
|
30
32
|
onPressEnter = props.onPressEnter,
|
|
@@ -32,17 +34,17 @@ var Input = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
32
34
|
onBlur = props.onBlur,
|
|
33
35
|
onKeyDown = props.onKeyDown,
|
|
34
36
|
onChange = props.onChange,
|
|
35
|
-
rest = _objectWithoutPropertiesLoose(props, ["className", "classPrefix", "as", "type", "disabled", "value", "defaultValue", "inputRef", "id", "size", "plaintext", "readOnly", "onPressEnter", "onFocus", "onBlur", "onKeyDown", "onChange"]);
|
|
36
|
-
var handleKeyDown =
|
|
37
|
+
rest = _objectWithoutPropertiesLoose(props, ["className", "classPrefix", "as", "type", "disabled", "value", "defaultValue", "inputRef", "id", "size", "htmlSize", "plaintext", "readOnly", "onPressEnter", "onFocus", "onBlur", "onKeyDown", "onChange"]);
|
|
38
|
+
var handleKeyDown = function handleKeyDown(event) {
|
|
37
39
|
if (event.key === KEY_VALUES.ENTER) {
|
|
38
40
|
onPressEnter === null || onPressEnter === void 0 ? void 0 : onPressEnter(event);
|
|
39
41
|
}
|
|
40
42
|
onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
|
|
41
|
-
}
|
|
42
|
-
var handleChange =
|
|
43
|
+
};
|
|
44
|
+
var handleChange = function handleChange(event) {
|
|
43
45
|
var _event$target;
|
|
44
46
|
onChange === null || onChange === void 0 ? void 0 : onChange((_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.value, event);
|
|
45
|
-
}
|
|
47
|
+
};
|
|
46
48
|
var _useClassNames = useClassNames(classPrefix),
|
|
47
49
|
withClassPrefix = _useClassNames.withClassPrefix,
|
|
48
50
|
merge = _useClassNames.merge;
|
|
@@ -60,9 +62,9 @@ var Input = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
60
62
|
localeKey: "unfilled"
|
|
61
63
|
}, typeof value === 'undefined' ? defaultValue : value);
|
|
62
64
|
}
|
|
63
|
-
var
|
|
65
|
+
var inputable = !disabled && !readOnly;
|
|
64
66
|
var eventProps = {};
|
|
65
|
-
if (
|
|
67
|
+
if (inputable) {
|
|
66
68
|
eventProps.onChange = handleChange;
|
|
67
69
|
eventProps.onKeyDown = handleKeyDown;
|
|
68
70
|
eventProps.onFocus = createChainedFunction(onFocus, inputGroupContext === null || inputGroupContext === void 0 ? void 0 : inputGroupContext.onFocus);
|
|
@@ -76,7 +78,8 @@ var Input = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
76
78
|
value: value,
|
|
77
79
|
defaultValue: defaultValue,
|
|
78
80
|
disabled: disabled,
|
|
79
|
-
readOnly: readOnly
|
|
81
|
+
readOnly: readOnly,
|
|
82
|
+
size: htmlSize
|
|
80
83
|
}));
|
|
81
84
|
});
|
|
82
85
|
Input.displayName = 'Input';
|
|
@@ -17,9 +17,9 @@ import getWidth from 'dom-lib/getWidth';
|
|
|
17
17
|
import shallowEqual from '../utils/shallowEqual';
|
|
18
18
|
import { filterNodesOfTree } from '../utils/treeUtils';
|
|
19
19
|
import Plaintext from '../Plaintext';
|
|
20
|
-
import { createChainedFunction, tplTransform, useClassNames, useCustom, useControlled, mergeRefs, isOneOf, KEY_VALUES } from '../utils';
|
|
20
|
+
import { createChainedFunction, tplTransform, useClassNames, useCustom, useControlled, useEventCallback, mergeRefs, isOneOf, KEY_VALUES } from '../utils';
|
|
21
21
|
import { getDataGroupBy } from '../utils/getDataGroupBy';
|
|
22
|
-
import { DropdownMenu, DropdownMenuItem, DropdownMenuCheckItem, PickerToggle, PickerOverlay, PickerToggleTrigger, useFocusItemValue, usePickerClassName, useSearch,
|
|
22
|
+
import { DropdownMenu, DropdownMenuItem, DropdownMenuCheckItem, PickerToggle, PickerOverlay, PickerToggleTrigger, useFocusItemValue, usePickerClassName, useSearch, usePickerRef, useToggleKeyDownEvent, pickTriggerPropKeys, omitTriggerPropKeys, listPickerPropTypes } from '../Picker';
|
|
23
23
|
import Tag from '../Tag';
|
|
24
24
|
import InputAutosize from './InputAutosize';
|
|
25
25
|
import InputSearch from './InputSearch';
|
|
@@ -109,11 +109,13 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
109
109
|
if (groupBy === valueKey || groupBy === labelKey) {
|
|
110
110
|
throw Error('`groupBy` can not be equal to `valueKey` and `labelKey`');
|
|
111
111
|
}
|
|
112
|
-
var overlayRef = useRef(null);
|
|
113
|
-
var targetRef = useRef(null);
|
|
114
|
-
var triggerRef = useRef(null);
|
|
115
112
|
var inputRef = useRef();
|
|
116
|
-
var
|
|
113
|
+
var _usePickerRef = usePickerRef(ref),
|
|
114
|
+
triggerRef = _usePickerRef.trigger,
|
|
115
|
+
root = _usePickerRef.root,
|
|
116
|
+
target = _usePickerRef.target,
|
|
117
|
+
overlay = _usePickerRef.overlay,
|
|
118
|
+
list = _usePickerRef.list;
|
|
117
119
|
var _useCustom = useCustom(['Picker', 'InputPicker'], overrideLocale),
|
|
118
120
|
locale = _useCustom.locale;
|
|
119
121
|
var _useClassNames = useClassNames(classPrefix),
|
|
@@ -142,34 +144,34 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
142
144
|
value = _useControlled[0],
|
|
143
145
|
setValue = _useControlled[1],
|
|
144
146
|
isControlled = _useControlled[2];
|
|
145
|
-
var cloneValue =
|
|
147
|
+
var cloneValue = function cloneValue() {
|
|
146
148
|
return multi ? clone(value) || [] : value;
|
|
147
|
-
}
|
|
148
|
-
var handleClose =
|
|
149
|
-
var _triggerRef$current,
|
|
149
|
+
};
|
|
150
|
+
var handleClose = useEventCallback(function () {
|
|
151
|
+
var _triggerRef$current, _target$current, _target$current$focus;
|
|
150
152
|
triggerRef === null || triggerRef === void 0 ? void 0 : (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : _triggerRef$current.close();
|
|
151
153
|
|
|
152
154
|
// The focus is on the trigger button after closing
|
|
153
|
-
(
|
|
154
|
-
}
|
|
155
|
+
(_target$current = target.current) === null || _target$current === void 0 ? void 0 : (_target$current$focus = _target$current.focus) === null || _target$current$focus === void 0 ? void 0 : _target$current$focus.call(_target$current);
|
|
156
|
+
});
|
|
155
157
|
|
|
156
158
|
// Used to hover the focuse item when trigger `onKeydown`
|
|
157
159
|
var _useFocusItemValue = useFocusItemValue(multi ? value === null || value === void 0 ? void 0 : value[0] : value, {
|
|
158
160
|
data: getAllDataAndCache(),
|
|
159
161
|
valueKey: valueKey,
|
|
160
162
|
target: function target() {
|
|
161
|
-
return
|
|
163
|
+
return overlay.current;
|
|
162
164
|
}
|
|
163
165
|
}),
|
|
164
166
|
focusItemValue = _useFocusItemValue.focusItemValue,
|
|
165
167
|
setFocusItemValue = _useFocusItemValue.setFocusItemValue,
|
|
166
168
|
onKeyDown = _useFocusItemValue.onKeyDown;
|
|
167
|
-
var handleSearchCallback =
|
|
169
|
+
var handleSearchCallback = useEventCallback(function (searchKeyword, filteredData, event) {
|
|
168
170
|
var _filteredData$;
|
|
169
171
|
// The first option after filtering is the focus.
|
|
170
172
|
setFocusItemValue(disabledOptions ? searchKeyword : (filteredData === null || filteredData === void 0 ? void 0 : (_filteredData$ = filteredData[0]) === null || _filteredData$ === void 0 ? void 0 : _filteredData$[valueKey]) || searchKeyword);
|
|
171
173
|
onSearch === null || onSearch === void 0 ? void 0 : onSearch(searchKeyword, event);
|
|
172
|
-
}
|
|
174
|
+
});
|
|
173
175
|
|
|
174
176
|
// Use search keywords to filter options.
|
|
175
177
|
var _useSearch = useSearch(getAllData(), {
|
|
@@ -195,12 +197,14 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
195
197
|
if ((_triggerRef$current2 = triggerRef.current) !== null && _triggerRef$current2 !== void 0 && _triggerRef$current2.root) {
|
|
196
198
|
setMaxWidth(getWidth(triggerRef.current.root));
|
|
197
199
|
}
|
|
200
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
198
201
|
}, []);
|
|
199
202
|
|
|
200
203
|
// Update the position of the menu when the search keyword and value change
|
|
201
204
|
useEffect(function () {
|
|
202
205
|
var _triggerRef$current3, _triggerRef$current3$;
|
|
203
206
|
(_triggerRef$current3 = triggerRef.current) === null || _triggerRef$current3 === void 0 ? void 0 : (_triggerRef$current3$ = _triggerRef$current3.updatePosition) === null || _triggerRef$current3$ === void 0 ? void 0 : _triggerRef$current3$.call(_triggerRef$current3);
|
|
207
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
204
208
|
}, [searchKeyword, value]);
|
|
205
209
|
var getDateItem = function getDateItem(value) {
|
|
206
210
|
// Find active `MenuItem` by `value`
|
|
@@ -218,23 +222,23 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
218
222
|
itemNode: itemNode
|
|
219
223
|
};
|
|
220
224
|
};
|
|
221
|
-
var getInput =
|
|
225
|
+
var getInput = function getInput() {
|
|
222
226
|
var _inputRef$current;
|
|
223
227
|
return multi ? (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.input : inputRef.current;
|
|
224
|
-
}
|
|
225
|
-
var focusInput =
|
|
228
|
+
};
|
|
229
|
+
var focusInput = function focusInput() {
|
|
226
230
|
var _getInput;
|
|
227
231
|
return (_getInput = getInput()) === null || _getInput === void 0 ? void 0 : _getInput.focus();
|
|
228
|
-
}
|
|
229
|
-
var blurInput =
|
|
232
|
+
};
|
|
233
|
+
var blurInput = function blurInput() {
|
|
230
234
|
var _getInput2;
|
|
231
235
|
return (_getInput2 = getInput()) === null || _getInput2 === void 0 ? void 0 : _getInput2.blur();
|
|
232
|
-
}
|
|
236
|
+
};
|
|
233
237
|
|
|
234
238
|
/**
|
|
235
239
|
* Convert the string of the newly created option into an object.
|
|
236
240
|
*/
|
|
237
|
-
var createOption =
|
|
241
|
+
var createOption = function createOption(value) {
|
|
238
242
|
var _ref2;
|
|
239
243
|
if (groupBy) {
|
|
240
244
|
var _ref;
|
|
@@ -245,11 +249,11 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
245
249
|
return _ref2 = {
|
|
246
250
|
create: true
|
|
247
251
|
}, _ref2[valueKey] = value, _ref2[labelKey] = value, _ref2;
|
|
248
|
-
}
|
|
249
|
-
var handleChange =
|
|
252
|
+
};
|
|
253
|
+
var handleChange = useEventCallback(function (value, event) {
|
|
250
254
|
onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
|
|
251
|
-
}
|
|
252
|
-
var handleRemoveItemByTag =
|
|
255
|
+
});
|
|
256
|
+
var handleRemoveItemByTag = useEventCallback(function (tag, event) {
|
|
253
257
|
event.stopPropagation();
|
|
254
258
|
var val = cloneValue();
|
|
255
259
|
remove(val, function (itemVal) {
|
|
@@ -258,15 +262,15 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
258
262
|
setValue(val);
|
|
259
263
|
handleChange(val, event);
|
|
260
264
|
onTagRemove === null || onTagRemove === void 0 ? void 0 : onTagRemove(tag, event);
|
|
261
|
-
}
|
|
262
|
-
var handleSelect =
|
|
265
|
+
});
|
|
266
|
+
var handleSelect = useEventCallback(function (value, item, event) {
|
|
263
267
|
onSelect === null || onSelect === void 0 ? void 0 : onSelect(value, item, event);
|
|
264
268
|
if (creatable && item.create) {
|
|
265
269
|
delete item.create;
|
|
266
270
|
onCreate === null || onCreate === void 0 ? void 0 : onCreate(value, item, event);
|
|
267
271
|
setNewData(newData.concat(item));
|
|
268
272
|
}
|
|
269
|
-
}
|
|
273
|
+
});
|
|
270
274
|
|
|
271
275
|
/**
|
|
272
276
|
* Callback triggered by single selection
|
|
@@ -274,14 +278,14 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
274
278
|
* @param item
|
|
275
279
|
* @param event
|
|
276
280
|
*/
|
|
277
|
-
var handleSelectItem = function
|
|
281
|
+
var handleSelectItem = useEventCallback(function (value, item, event) {
|
|
278
282
|
setValue(value);
|
|
279
283
|
setFocusItemValue(value);
|
|
280
284
|
resetSearch();
|
|
281
285
|
handleSelect(value, item, event);
|
|
282
286
|
handleChange(value, event);
|
|
283
287
|
handleClose();
|
|
284
|
-
};
|
|
288
|
+
});
|
|
285
289
|
|
|
286
290
|
/**
|
|
287
291
|
* Callback triggered by multiple selection
|
|
@@ -290,7 +294,7 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
290
294
|
* @param event
|
|
291
295
|
* @param checked
|
|
292
296
|
*/
|
|
293
|
-
var handleCheckTag = function
|
|
297
|
+
var handleCheckTag = useEventCallback(function (nextItemValue, item, event, checked) {
|
|
294
298
|
var val = cloneValue();
|
|
295
299
|
if (checked) {
|
|
296
300
|
val.push(nextItemValue);
|
|
@@ -305,8 +309,8 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
305
309
|
handleSelect(val, item, event);
|
|
306
310
|
handleChange(val, event);
|
|
307
311
|
focusInput();
|
|
308
|
-
};
|
|
309
|
-
var handleTagKeyPress =
|
|
312
|
+
});
|
|
313
|
+
var handleTagKeyPress = useEventCallback(function (event) {
|
|
310
314
|
// When composing, ignore the keypress event.
|
|
311
315
|
if (event.nativeEvent.isComposing) {
|
|
312
316
|
return;
|
|
@@ -342,8 +346,8 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
342
346
|
resetSearch();
|
|
343
347
|
handleSelect(val, focusItem, event);
|
|
344
348
|
handleChange(val, event);
|
|
345
|
-
}
|
|
346
|
-
var handleMenuItemKeyPress =
|
|
349
|
+
});
|
|
350
|
+
var handleMenuItemKeyPress = useEventCallback(function (event) {
|
|
347
351
|
if (!focusItemValue || !controlledData) {
|
|
348
352
|
return;
|
|
349
353
|
}
|
|
@@ -372,19 +376,13 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
372
376
|
}
|
|
373
377
|
handleChange(focusItemValue, event);
|
|
374
378
|
handleClose();
|
|
375
|
-
}, [setValue, disabledItemValues, controlledData, focusItemValue, valueKey, searchKeyword, handleClose, resetSearch, createOption, getAllData, handleChange, handleSelect]);
|
|
376
|
-
usePublicMethods(ref, {
|
|
377
|
-
triggerRef: triggerRef,
|
|
378
|
-
overlayRef: overlayRef,
|
|
379
|
-
targetRef: targetRef,
|
|
380
|
-
listRef: listRef
|
|
381
379
|
});
|
|
382
380
|
|
|
383
381
|
/**
|
|
384
382
|
* Remove the last item, after pressing the back key on the keyboard.
|
|
385
383
|
* @param event
|
|
386
384
|
*/
|
|
387
|
-
var removeLastItem =
|
|
385
|
+
var removeLastItem = useEventCallback(function (event) {
|
|
388
386
|
var target = event === null || event === void 0 ? void 0 : event.target;
|
|
389
387
|
if ((target === null || target === void 0 ? void 0 : target.tagName) !== 'INPUT') {
|
|
390
388
|
focusInput();
|
|
@@ -397,8 +395,8 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
397
395
|
val.pop();
|
|
398
396
|
setValue(val);
|
|
399
397
|
handleChange(val, event);
|
|
400
|
-
}
|
|
401
|
-
var handleClean =
|
|
398
|
+
});
|
|
399
|
+
var handleClean = useEventCallback(function (event) {
|
|
402
400
|
if (disabled || searchKeyword !== '') {
|
|
403
401
|
return;
|
|
404
402
|
}
|
|
@@ -411,14 +409,14 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
411
409
|
handleChange(null, event);
|
|
412
410
|
}
|
|
413
411
|
onClean === null || onClean === void 0 ? void 0 : onClean(event);
|
|
414
|
-
}
|
|
412
|
+
});
|
|
415
413
|
var events = {
|
|
416
414
|
onMenuPressBackspace: multi ? removeLastItem : handleClean,
|
|
417
415
|
onMenuKeyDown: onKeyDown,
|
|
418
416
|
onMenuPressEnter: undefined,
|
|
419
417
|
onKeyDown: undefined
|
|
420
418
|
};
|
|
421
|
-
var handleKeyPress =
|
|
419
|
+
var handleKeyPress = useEventCallback(function (event) {
|
|
422
420
|
// When typing a space, create a tag.
|
|
423
421
|
if (isOneOf('Space', trigger) && event.key === KEY_VALUES.SPACE) {
|
|
424
422
|
handleTagKeyPress(event);
|
|
@@ -430,7 +428,7 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
430
428
|
handleTagKeyPress(event);
|
|
431
429
|
event.preventDefault();
|
|
432
430
|
}
|
|
433
|
-
}
|
|
431
|
+
});
|
|
434
432
|
if (multi) {
|
|
435
433
|
if (isOneOf('Enter', trigger)) {
|
|
436
434
|
events.onMenuPressEnter = handleTagKeyPress;
|
|
@@ -442,30 +440,30 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
442
440
|
events.onMenuPressEnter = handleMenuItemKeyPress;
|
|
443
441
|
}
|
|
444
442
|
var onPickerKeyDown = useToggleKeyDownEvent(_extends({
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
443
|
+
trigger: triggerRef,
|
|
444
|
+
target: target,
|
|
445
|
+
overlay: overlay
|
|
448
446
|
}, events, rest));
|
|
449
|
-
var handleExited =
|
|
447
|
+
var handleExited = useEventCallback(function () {
|
|
450
448
|
setFocusItemValue(multi ? value === null || value === void 0 ? void 0 : value[0] : value);
|
|
451
449
|
resetSearch();
|
|
452
450
|
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
453
|
-
}
|
|
454
|
-
var handleFocus =
|
|
451
|
+
});
|
|
452
|
+
var handleFocus = useEventCallback(function () {
|
|
455
453
|
if (!readOnly) {
|
|
456
454
|
var _triggerRef$current4;
|
|
457
455
|
setOpen(true);
|
|
458
456
|
(_triggerRef$current4 = triggerRef.current) === null || _triggerRef$current4 === void 0 ? void 0 : _triggerRef$current4.open();
|
|
459
457
|
}
|
|
460
|
-
}
|
|
461
|
-
var handleEnter =
|
|
458
|
+
});
|
|
459
|
+
var handleEnter = useEventCallback(function () {
|
|
462
460
|
focusInput();
|
|
463
461
|
setOpen(true);
|
|
464
|
-
}
|
|
465
|
-
var handleExit =
|
|
462
|
+
});
|
|
463
|
+
var handleExit = useEventCallback(function () {
|
|
466
464
|
blurInput();
|
|
467
465
|
setOpen(false);
|
|
468
|
-
}
|
|
466
|
+
});
|
|
469
467
|
var renderDropdownMenuItem = function renderDropdownMenuItem(label, item) {
|
|
470
468
|
// 'Create option "{0}"' => Create option "xxxxx"
|
|
471
469
|
var newLabel = item.create ? /*#__PURE__*/React.createElement("span", null, tplTransform(locale.createOption, label)) : label;
|
|
@@ -547,13 +545,13 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
547
545
|
}
|
|
548
546
|
if (disabledOptions) {
|
|
549
547
|
return /*#__PURE__*/React.createElement(PickerOverlay, {
|
|
550
|
-
ref: mergeRefs(
|
|
548
|
+
ref: mergeRefs(overlay, speakerRef)
|
|
551
549
|
});
|
|
552
550
|
}
|
|
553
551
|
var menu = items.length ? /*#__PURE__*/React.createElement(DropdownMenu, {
|
|
554
552
|
id: id ? id + "-listbox" : undefined,
|
|
555
553
|
listProps: listProps,
|
|
556
|
-
listRef:
|
|
554
|
+
listRef: list,
|
|
557
555
|
disabledItemValues: disabledItemValues,
|
|
558
556
|
valueKey: valueKey,
|
|
559
557
|
labelKey: labelKey,
|
|
@@ -581,7 +579,7 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
581
579
|
className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["none"])))
|
|
582
580
|
}, locale === null || locale === void 0 ? void 0 : locale.noResultsText);
|
|
583
581
|
return /*#__PURE__*/React.createElement(PickerOverlay, {
|
|
584
|
-
ref: mergeRefs(
|
|
582
|
+
ref: mergeRefs(overlay, speakerRef),
|
|
585
583
|
autoWidth: menuAutoWidth,
|
|
586
584
|
className: classes,
|
|
587
585
|
style: styles,
|
|
@@ -634,7 +632,7 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
634
632
|
}
|
|
635
633
|
return /*#__PURE__*/React.createElement(Plaintext, _extends({
|
|
636
634
|
localeKey: "notSelected",
|
|
637
|
-
ref:
|
|
635
|
+
ref: target
|
|
638
636
|
}, plaintextProps), itemNode || (tagElements !== null && tagElements !== void 0 && tagElements.length ? tagElements : null) || placeholder);
|
|
639
637
|
}
|
|
640
638
|
var placeholderNode = placeholder || (disabledOptions ? null : locale === null || locale === void 0 ? void 0 : locale.placeholder);
|
|
@@ -652,13 +650,14 @@ var InputPicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
652
650
|
className: classes,
|
|
653
651
|
style: style,
|
|
654
652
|
onClick: focusInput,
|
|
655
|
-
onKeyDown: onPickerKeyDown
|
|
653
|
+
onKeyDown: onPickerKeyDown,
|
|
654
|
+
ref: root
|
|
656
655
|
}, /*#__PURE__*/React.createElement(PickerToggle, _extends({}, omit(rest, [].concat(omitTriggerPropKeys, usedClassNamePropKeys)), {
|
|
657
656
|
id: id,
|
|
658
657
|
appearance: appearance,
|
|
659
658
|
readOnly: readOnly,
|
|
660
659
|
plaintext: plaintext,
|
|
661
|
-
ref:
|
|
660
|
+
ref: target,
|
|
662
661
|
as: toggleAs,
|
|
663
662
|
tabIndex: tabIndex,
|
|
664
663
|
onClean: handleClean,
|