@vkontakte/vkui 7.8.2 → 7.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Box/Box.d.ts +11 -0
- package/dist/components/Box/Box.d.ts.map +1 -0
- package/dist/components/Box/Box.js +25 -0
- package/dist/components/Box/Box.js.map +1 -0
- package/dist/components/CarouselBase/CarouselBase.d.ts +1 -1
- package/dist/components/CarouselBase/CarouselBase.d.ts.map +1 -1
- package/dist/components/CarouselBase/CarouselBase.js +6 -4
- package/dist/components/CarouselBase/CarouselBase.js.map +1 -1
- package/dist/components/CarouselBase/constants.d.ts +1 -1
- package/dist/components/CarouselBase/constants.d.ts.map +1 -1
- package/dist/components/CarouselBase/constants.js +1 -1
- package/dist/components/CarouselBase/constants.js.map +1 -1
- package/dist/components/CarouselBase/hooks.d.ts +3 -1
- package/dist/components/CarouselBase/hooks.d.ts.map +1 -1
- package/dist/components/CarouselBase/hooks.js +46 -6
- package/dist/components/CarouselBase/hooks.js.map +1 -1
- package/dist/components/CarouselBase/types.d.ts +12 -0
- package/dist/components/CarouselBase/types.d.ts.map +1 -1
- package/dist/components/CarouselBase/types.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +11 -2
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +44 -10
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Checkbox/CheckboxInput/CheckboxInput.d.ts +16 -3
- package/dist/components/Checkbox/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/components/Checkbox/CheckboxInput/CheckboxInput.js +32 -19
- package/dist/components/Checkbox/CheckboxInput/CheckboxInput.js.map +1 -1
- package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts +1 -1
- package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts.map +1 -1
- package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js +39 -10
- package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
- package/dist/components/ChipsInput/ChipsInput.d.ts +1 -1
- package/dist/components/ChipsInput/ChipsInput.d.ts.map +1 -1
- package/dist/components/ChipsInput/ChipsInput.js +32 -13
- package/dist/components/ChipsInput/ChipsInput.js.map +1 -1
- package/dist/components/ChipsInputBase/ChipsInputBase.d.ts +1 -1
- package/dist/components/ChipsInputBase/ChipsInputBase.d.ts.map +1 -1
- package/dist/components/ChipsInputBase/ChipsInputBase.js +52 -26
- package/dist/components/ChipsInputBase/ChipsInputBase.js.map +1 -1
- package/dist/components/ChipsInputBase/types.d.ts +13 -4
- package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
- package/dist/components/ChipsInputBase/types.js.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.d.ts +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.d.ts.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.js +67 -38
- package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.d.ts +16 -2
- package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +99 -50
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts +6 -2
- package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +38 -20
- package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
- package/dist/components/CustomSelect/helpers.d.ts +1 -0
- package/dist/components/CustomSelect/helpers.d.ts.map +1 -1
- package/dist/components/CustomSelect/helpers.js +11 -0
- package/dist/components/CustomSelect/helpers.js.map +1 -1
- package/dist/components/Div/Div.d.ts +3 -0
- package/dist/components/Div/Div.d.ts.map +1 -1
- package/dist/components/Div/Div.js +11 -1
- package/dist/components/Div/Div.js.map +1 -1
- package/dist/components/File/File.d.ts +16 -3
- package/dist/components/File/File.d.ts.map +1 -1
- package/dist/components/File/File.js +29 -17
- package/dist/components/File/File.js.map +1 -1
- package/dist/components/Input/Input.d.ts +16 -3
- package/dist/components/Input/Input.d.ts.map +1 -1
- package/dist/components/Input/Input.js +28 -13
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/NativeSelect/NativeSelect.d.ts +17 -3
- package/dist/components/NativeSelect/NativeSelect.d.ts.map +1 -1
- package/dist/components/NativeSelect/NativeSelect.js +37 -14
- package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/components/Radio/Radio.d.ts +18 -3
- package/dist/components/Radio/Radio.d.ts.map +1 -1
- package/dist/components/Radio/Radio.js +31 -11
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/Radio/RadioInput/RadioInput.d.ts +16 -3
- package/dist/components/Radio/RadioInput/RadioInput.d.ts.map +1 -1
- package/dist/components/Radio/RadioInput/RadioInput.js +22 -11
- package/dist/components/Radio/RadioInput/RadioInput.js.map +1 -1
- package/dist/components/Search/Search.d.ts +16 -3
- package/dist/components/Search/Search.d.ts.map +1 -1
- package/dist/components/Search/Search.js +50 -28
- package/dist/components/Search/Search.js.map +1 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +10 -4
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/SelectionControl/SelectionControl.d.ts +2 -2
- package/dist/components/SelectionControl/SelectionControl.d.ts.map +1 -1
- package/dist/components/SelectionControl/SelectionControl.js.map +1 -1
- package/dist/components/Snackbar/Snackbar.d.ts +10 -1
- package/dist/components/Snackbar/Snackbar.d.ts.map +1 -1
- package/dist/components/Snackbar/Snackbar.js +20 -6
- package/dist/components/Snackbar/Snackbar.js.map +1 -1
- package/dist/components/SplitLayout/SplitLayout.d.ts +16 -3
- package/dist/components/SplitLayout/SplitLayout.d.ts.map +1 -1
- package/dist/components/SplitLayout/SplitLayout.js +24 -9
- package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
- package/dist/components/Switch/Switch.d.ts +16 -3
- package/dist/components/Switch/Switch.d.ts.map +1 -1
- package/dist/components/Switch/Switch.js +32 -20
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Textarea/Textarea.d.ts +16 -3
- package/dist/components/Textarea/Textarea.d.ts.map +1 -1
- package/dist/components/Textarea/Textarea.js +36 -18
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/WriteBar/WriteBar.d.ts +16 -3
- package/dist/components/WriteBar/WriteBar.d.ts.map +1 -1
- package/dist/components/WriteBar/WriteBar.js +28 -11
- package/dist/components/WriteBar/WriteBar.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/Box/Box.js +19 -0
- package/dist/cssm/components/Box/Box.js.map +1 -0
- package/dist/cssm/components/CarouselBase/CarouselBase.js +4 -4
- package/dist/cssm/components/CarouselBase/CarouselBase.js.map +1 -1
- package/dist/cssm/components/CarouselBase/constants.js +1 -1
- package/dist/cssm/components/CarouselBase/constants.js.map +1 -1
- package/dist/cssm/components/CarouselBase/hooks.js +46 -6
- package/dist/cssm/components/CarouselBase/hooks.js.map +1 -1
- package/dist/cssm/components/CarouselBase/types.js.map +1 -1
- package/dist/cssm/components/Checkbox/Checkbox.js +29 -6
- package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/cssm/components/Checkbox/CheckboxInput/CheckboxInput.js +24 -13
- package/dist/cssm/components/Checkbox/CheckboxInput/CheckboxInput.js.map +1 -1
- package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js +24 -6
- package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
- package/dist/cssm/components/ChipsInput/ChipsInput.js +25 -11
- package/dist/cssm/components/ChipsInput/ChipsInput.js.map +1 -1
- package/dist/cssm/components/ChipsInputBase/ChipsInputBase.js +30 -12
- package/dist/cssm/components/ChipsInputBase/ChipsInputBase.js.map +1 -1
- package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js +49 -30
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +73 -41
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +20 -9
- package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
- package/dist/cssm/components/CustomSelect/helpers.js +11 -0
- package/dist/cssm/components/CustomSelect/helpers.js.map +1 -1
- package/dist/cssm/components/Div/Div.js +11 -1
- package/dist/cssm/components/Div/Div.js.map +1 -1
- package/dist/cssm/components/File/File.js +20 -7
- package/dist/cssm/components/File/File.js.map +1 -1
- package/dist/cssm/components/Input/Input.js +20 -7
- package/dist/cssm/components/Input/Input.js.map +1 -1
- package/dist/cssm/components/MiniInfoCell/MiniInfoCell.module.css +1 -1
- package/dist/cssm/components/NativeSelect/NativeSelect.js +25 -8
- package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/cssm/components/Radio/Radio.js +28 -8
- package/dist/cssm/components/Radio/Radio.js.map +1 -1
- package/dist/cssm/components/Radio/RadioInput/RadioInput.js +18 -6
- package/dist/cssm/components/Radio/RadioInput/RadioInput.js.map +1 -1
- package/dist/cssm/components/Search/Search.js +34 -17
- package/dist/cssm/components/Search/Search.js.map +1 -1
- package/dist/cssm/components/Select/Select.js +9 -1
- package/dist/cssm/components/Select/Select.js.map +1 -1
- package/dist/cssm/components/SelectionControl/SelectionControl.js.map +1 -1
- package/dist/cssm/components/Snackbar/Snackbar.js +11 -2
- package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
- package/dist/cssm/components/SplitLayout/SplitLayout.js +22 -8
- package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
- package/dist/cssm/components/Switch/Switch.js +29 -17
- package/dist/cssm/components/Switch/Switch.js.map +1 -1
- package/dist/cssm/components/Textarea/Textarea.js +22 -8
- package/dist/cssm/components/Textarea/Textarea.js.map +1 -1
- package/dist/cssm/components/WriteBar/WriteBar.js +24 -9
- package/dist/cssm/components/WriteBar/WriteBar.js.map +1 -1
- package/dist/cssm/hooks/useMergeProps.js +38 -0
- package/dist/cssm/hooks/useMergeProps.js.map +1 -0
- package/dist/cssm/index.js +2 -0
- package/dist/cssm/index.js.map +1 -1
- package/dist/cssm/lib/animation/useCSSTransition.js +1 -1
- package/dist/cssm/lib/animation/useCSSTransition.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/cssm/lib/fx.js +55 -8
- package/dist/cssm/lib/fx.js.map +1 -1
- package/dist/cssm/lib/layouts/gaps.js.map +1 -1
- package/dist/cssm/lib/layouts/helpers.js +21 -0
- package/dist/cssm/lib/layouts/helpers.js.map +1 -0
- package/dist/cssm/lib/layouts/index.js +1 -0
- package/dist/cssm/lib/layouts/index.js.map +1 -1
- package/dist/cssm/lib/layouts/layoutProps.js +89 -0
- package/dist/cssm/lib/layouts/layoutProps.js.map +1 -0
- package/dist/cssm/lib/layouts/resolveLayoutProps.js +36 -0
- package/dist/cssm/lib/layouts/resolveLayoutProps.js.map +1 -0
- package/dist/cssm/lib/layouts/types.js +3 -0
- package/dist/cssm/lib/layouts/types.js.map +1 -0
- package/dist/cssm/lib/warnOnce.js +1 -1
- package/dist/cssm/lib/warnOnce.js.map +1 -1
- package/dist/cssm/styles/layout.css +922 -0
- package/dist/hooks/useMergeProps.d.ts +6 -0
- package/dist/hooks/useMergeProps.d.ts.map +1 -0
- package/dist/hooks/useMergeProps.js +42 -0
- package/dist/hooks/useMergeProps.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/animation/useCSSTransition.js +1 -1
- package/dist/lib/animation/useCSSTransition.js.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/lib/fx.d.ts +8 -1
- package/dist/lib/fx.d.ts.map +1 -1
- package/dist/lib/fx.js +55 -8
- package/dist/lib/fx.js.map +1 -1
- package/dist/lib/layouts/gaps.d.ts +4 -5
- package/dist/lib/layouts/gaps.d.ts.map +1 -1
- package/dist/lib/layouts/gaps.js.map +1 -1
- package/dist/lib/layouts/helpers.d.ts +17 -0
- package/dist/lib/layouts/helpers.d.ts.map +1 -0
- package/dist/lib/layouts/helpers.js +21 -0
- package/dist/lib/layouts/helpers.js.map +1 -0
- package/dist/lib/layouts/index.d.ts +2 -0
- package/dist/lib/layouts/index.d.ts.map +1 -1
- package/dist/lib/layouts/index.js +1 -0
- package/dist/lib/layouts/index.js.map +1 -1
- package/dist/lib/layouts/layoutProps.d.ts +33 -0
- package/dist/lib/layouts/layoutProps.d.ts.map +1 -0
- package/dist/lib/layouts/layoutProps.js +89 -0
- package/dist/lib/layouts/layoutProps.js.map +1 -0
- package/dist/lib/layouts/resolveLayoutProps.d.ts +18 -0
- package/dist/lib/layouts/resolveLayoutProps.d.ts.map +1 -0
- package/dist/lib/layouts/resolveLayoutProps.js +35 -0
- package/dist/lib/layouts/resolveLayoutProps.js.map +1 -0
- package/dist/lib/layouts/types.d.ts +123 -0
- package/dist/lib/layouts/types.d.ts.map +1 -0
- package/dist/lib/layouts/types.js +3 -0
- package/dist/lib/layouts/types.js.map +1 -0
- package/dist/lib/warnOnce.js +1 -1
- package/dist/lib/warnOnce.js.map +1 -1
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +2 -2
- package/src/components/Box/Box.tsx +26 -0
- package/src/components/CarouselBase/CarouselBase.tsx +11 -4
- package/src/components/CarouselBase/constants.ts +1 -1
- package/src/components/CarouselBase/hooks.ts +31 -6
- package/src/components/CarouselBase/types.ts +13 -0
- package/src/components/Checkbox/Checkbox.tsx +57 -7
- package/src/components/Checkbox/CheckboxInput/CheckboxInput.tsx +51 -18
- package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.tsx +36 -6
- package/src/components/ChipsInput/ChipsInput.tsx +38 -11
- package/src/components/ChipsInputBase/ChipsInputBase.tsx +60 -17
- package/src/components/ChipsInputBase/types.ts +15 -4
- package/src/components/ChipsSelect/ChipsSelect.tsx +71 -33
- package/src/components/CustomSelect/CustomSelect.tsx +135 -45
- package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.tsx +48 -17
- package/src/components/CustomSelect/helpers.ts +23 -0
- package/src/components/Div/Div.tsx +13 -3
- package/src/components/File/File.tsx +48 -11
- package/src/components/Input/Input.tsx +51 -14
- package/src/components/MiniInfoCell/MiniInfoCell.module.css +1 -1
- package/src/components/NativeSelect/NativeSelect.tsx +57 -18
- package/src/components/Radio/Radio.tsx +51 -8
- package/src/components/Radio/RadioInput/RadioInput.tsx +35 -11
- package/src/components/Search/Search.tsx +80 -29
- package/src/components/Select/Select.tsx +22 -3
- package/src/components/SelectionControl/SelectionControl.tsx +2 -1
- package/src/components/Snackbar/Snackbar.tsx +35 -5
- package/src/components/SplitLayout/SplitLayout.tsx +46 -12
- package/src/components/Switch/Switch.tsx +62 -31
- package/src/components/Textarea/Textarea.tsx +58 -14
- package/src/components/WriteBar/WriteBar.tsx +59 -13
- package/src/hooks/useMergeProps.ts +66 -0
- package/src/index.ts +3 -0
- package/src/lib/animation/useCSSTransition.ts +1 -1
- package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +1 -1
- package/src/lib/fx.ts +63 -8
- package/src/lib/layouts/gaps.ts +4 -5
- package/src/lib/layouts/helpers.ts +24 -0
- package/src/lib/layouts/index.ts +13 -0
- package/src/lib/layouts/layoutProps.ts +75 -0
- package/src/lib/layouts/resolveLayoutProps.ts +51 -0
- package/src/lib/layouts/types.ts +142 -0
- package/src/lib/warnOnce.ts +1 -1
- package/src/styles/layout.css +1 -0
- package/src/styles/layout.css.d.ts.map +1 -0
|
@@ -4,6 +4,7 @@ import * as React from "react";
|
|
|
4
4
|
import { classNames } from "@vkontakte/vkjs";
|
|
5
5
|
import { useExternRef } from "../../hooks/useExternRef.js";
|
|
6
6
|
import { useGlobalOnEventOutside } from "../../hooks/useGlobalOnClickOutside.js";
|
|
7
|
+
import { useMergeProps } from "../../hooks/useMergeProps.js";
|
|
7
8
|
import { Keys } from "../../lib/accessibility.js";
|
|
8
9
|
import { defaultFilterFn } from "../../lib/select.js";
|
|
9
10
|
import { ChipsInputBase } from "../ChipsInputBase/ChipsInputBase.js";
|
|
@@ -38,10 +39,23 @@ const findIndexBefore = (options = [], endIndex = options.length)=>{
|
|
|
38
39
|
/**
|
|
39
40
|
* @see https://vkui.io/components/chips-select
|
|
40
41
|
*/ export const ChipsSelect = ({ // FormFieldProps
|
|
41
|
-
|
|
42
|
+
getRootRef, className, status = 'default', icon: dropdownIconProp, onChangeStart, // CustomSelectDropdownProps
|
|
42
43
|
options: optionsProp, placement: placementProp = 'bottom', closeAfterSelect = true, selectedBehavior = DEFAULT_SELECTED_BEHAVIOR, emptyText = DEFAULT_EMPTY_TEXT, creatable = false, fetching = false, dropdownAutoWidth, forceDropdownPortal, noMaxHeight = false, filterFn = defaultFilterFn, sortFn = false, dropdownTestId, onClose, onOpen, overscrollBehavior, renderDropdown, // ChipsInputProps
|
|
43
|
-
getRef, value: valueProp, defaultValue, inputValue: inputValueProp, defaultInputValue
|
|
44
|
-
chipsListLabel,
|
|
44
|
+
getRef, value: valueProp, defaultValue, inputValue: inputValueProp, defaultInputValue: defaultInputValueProp, getOptionValue = getOptionValueDefault, getOptionLabel = getOptionLabelDefault, getNewOptionData = getNewOptionDataDefault, renderChip = renderChipDefault, renderOption = renderOptionDefault, onChange, onInputChange: onInputChangeProp, dropdownOffsetDistance = 0, allowClearButton, clearButtonTestId, delimiter, // a11y
|
|
45
|
+
chipsListLabel, // input native props
|
|
46
|
+
disabled: disabledProp, readOnly: readOnlyProp, id: idProp, onFocus: onFocusProp, onBlur: onBlurProp, onKeyDown: onKeyDownProp, slotProps, ...restProps })=>{
|
|
47
|
+
const { getRootRef: getInputRef, value: resolvedInputValue, defaultValue: resolvedDefaultInputValue, onChange: resolvedOnInputChange, disabled, readOnly, id: labelledbyId, onFocus, onBlur, onKeyDown, ...inputRest } = useMergeProps({
|
|
48
|
+
getRootRef: getRef,
|
|
49
|
+
value: inputValueProp,
|
|
50
|
+
defaultValue: defaultInputValueProp,
|
|
51
|
+
onChange: onInputChangeProp,
|
|
52
|
+
disabled: disabledProp,
|
|
53
|
+
readOnly: readOnlyProp,
|
|
54
|
+
id: idProp,
|
|
55
|
+
onFocus: onFocusProp,
|
|
56
|
+
onBlur: onBlurProp,
|
|
57
|
+
onKeyDown: onKeyDownProp
|
|
58
|
+
}, slotProps?.input);
|
|
45
59
|
const { // Связано с ChipsInputProps
|
|
46
60
|
// option
|
|
47
61
|
value, addOptionFromInput, addOption, removeOption, clearOptions, // input
|
|
@@ -55,9 +69,9 @@ chipsListLabel, ...restProps })=>{
|
|
|
55
69
|
getOptionLabel,
|
|
56
70
|
getNewOptionData,
|
|
57
71
|
// input
|
|
58
|
-
inputValue:
|
|
59
|
-
defaultInputValue,
|
|
60
|
-
onInputChange:
|
|
72
|
+
inputValue: resolvedInputValue,
|
|
73
|
+
defaultInputValue: resolvedDefaultInputValue,
|
|
74
|
+
onInputChange: resolvedOnInputChange,
|
|
61
75
|
// dropdown
|
|
62
76
|
options: optionsProp,
|
|
63
77
|
emptyText,
|
|
@@ -73,7 +87,7 @@ chipsListLabel, ...restProps })=>{
|
|
|
73
87
|
});
|
|
74
88
|
// Связано с ChipsInputProps
|
|
75
89
|
const rootRef = useExternRef(getRootRef);
|
|
76
|
-
const inputRef = useExternRef(
|
|
90
|
+
const inputRef = useExternRef(getInputRef, inputRefHook);
|
|
77
91
|
// Связано с CustomSelectDropdownProps
|
|
78
92
|
const [dropdownVerticalPlacement, setDropdownVerticalPlacement] = React.useState(placementProp);
|
|
79
93
|
const onDropdownPlacementChange = React.useCallback((placement)=>{
|
|
@@ -87,8 +101,8 @@ chipsListLabel, ...restProps })=>{
|
|
|
87
101
|
const dropdownCurrentItemId = focusedOptionIndex !== null ? `${dropdownId}-${focusedOptionIndex}` : undefined;
|
|
88
102
|
const dropdownScrollBoxRef = React.useRef(null);
|
|
89
103
|
const handleFocus = (event)=>{
|
|
90
|
-
if (
|
|
91
|
-
|
|
104
|
+
if (onFocus) {
|
|
105
|
+
onFocus(event);
|
|
92
106
|
}
|
|
93
107
|
if (!readOnly) {
|
|
94
108
|
setOpened(true);
|
|
@@ -96,8 +110,8 @@ chipsListLabel, ...restProps })=>{
|
|
|
96
110
|
}
|
|
97
111
|
};
|
|
98
112
|
const handleBlur = (event)=>{
|
|
99
|
-
if (
|
|
100
|
-
|
|
113
|
+
if (onBlur) {
|
|
114
|
+
onBlur(event);
|
|
101
115
|
}
|
|
102
116
|
// Не добавляем значение, если его нужно выбрать строго из списка
|
|
103
117
|
if (!readOnly && !event.defaultPrevented && !creatable) {
|
|
@@ -146,8 +160,8 @@ chipsListLabel, ...restProps })=>{
|
|
|
146
160
|
focusOptionByIndex(index, focusedOptionIndex);
|
|
147
161
|
};
|
|
148
162
|
const handleKeyDown = (event)=>{
|
|
149
|
-
if (
|
|
150
|
-
|
|
163
|
+
if (onKeyDown) {
|
|
164
|
+
onKeyDown(event);
|
|
151
165
|
}
|
|
152
166
|
if (event.defaultPrevented || readOnly) {
|
|
153
167
|
return;
|
|
@@ -311,13 +325,9 @@ chipsListLabel, ...restProps })=>{
|
|
|
311
325
|
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
312
326
|
children: [
|
|
313
327
|
/*#__PURE__*/ _jsx(ChipsInputBase, {
|
|
314
|
-
...restProps,
|
|
315
|
-
disabled: disabled,
|
|
316
|
-
readOnly: readOnly,
|
|
317
328
|
clearButtonShown: clearButtonShown,
|
|
318
329
|
clearButtonTestId: clearButtonTestId,
|
|
319
330
|
// FormFieldProps
|
|
320
|
-
id: labelledbyId,
|
|
321
331
|
getRootRef: rootRef,
|
|
322
332
|
className: classNames(styles.host, openedClassNames, className),
|
|
323
333
|
status: status,
|
|
@@ -332,20 +342,29 @@ chipsListLabel, ...restProps })=>{
|
|
|
332
342
|
onRemoveChipOption: removeOption,
|
|
333
343
|
renderChip: renderChip,
|
|
334
344
|
onClear: clearOptions,
|
|
335
|
-
// input
|
|
336
|
-
getRef: inputRef,
|
|
337
|
-
inputValue: inputValue,
|
|
338
|
-
onInputChange: onInputChange,
|
|
339
|
-
onFocus: handleFocus,
|
|
340
|
-
onBlur: handleBlur,
|
|
341
|
-
onKeyDown: handleKeyDown,
|
|
342
345
|
// a11y
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
346
|
+
chipsListLabel: chipsListLabel,
|
|
347
|
+
slotProps: {
|
|
348
|
+
...slotProps,
|
|
349
|
+
input: {
|
|
350
|
+
'role': 'combobox',
|
|
351
|
+
'aria-expanded': opened,
|
|
352
|
+
'aria-autocomplete': 'list',
|
|
353
|
+
'aria-activedescendant': opened ? dropdownCurrentItemId : undefined,
|
|
354
|
+
'aria-haspopup': 'listbox',
|
|
355
|
+
'getRootRef': inputRef,
|
|
356
|
+
'value': inputValue,
|
|
357
|
+
'onChange': onInputChange,
|
|
358
|
+
disabled,
|
|
359
|
+
readOnly,
|
|
360
|
+
'id': labelledbyId,
|
|
361
|
+
'onFocus': handleFocus,
|
|
362
|
+
'onBlur': handleBlur,
|
|
363
|
+
'onKeyDown': handleKeyDown,
|
|
364
|
+
...inputRest
|
|
365
|
+
}
|
|
366
|
+
},
|
|
367
|
+
...restProps
|
|
349
368
|
}),
|
|
350
369
|
opened && /*#__PURE__*/ _jsx(CustomSelectDropdown, {
|
|
351
370
|
"data-testid": dropdownTestId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { type MouseEventHandler } from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalOnEventOutside } from '../../hooks/useGlobalOnClickOutside';\nimport { Keys } from '../../lib/accessibility';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipsInputBase } from '../ChipsInputBase/ChipsInputBase';\nimport {\n getNewOptionDataDefault,\n getOptionLabelDefault,\n getOptionValueDefault,\n renderChipDefault,\n} from '../ChipsInputBase/constants';\nimport type { ChipOption, ChipsInputBaseProps } from '../ChipsInputBase/types';\nimport {\n CustomSelectDropdown,\n type CustomSelectDropdownProps,\n} from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n type CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport type { FormFieldProps } from '../FormField/FormField';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport {\n DEFAULT_EMPTY_TEXT,\n DEFAULT_SELECTED_BEHAVIOR,\n FOCUS_ACTION_NEXT,\n FOCUS_ACTION_PREV,\n isCreateNewOptionPreset,\n isEmptyOptionPreset,\n isNotServicePreset,\n renderOptionDefault,\n} from './constants';\nimport type { FocusActionType, OptionPreset } from './types';\nimport { useChipsSelect, type UseChipsSelectProps } from './useChipsSelect';\nimport styles from './ChipsSelect.module.css';\n\nconst findIndexAfter = <O extends ChipOption>(\n options: Array<OptionPreset<O>> = [],\n startIndex = -1,\n) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex(\n (option, i) => i > startIndex && (!isNotServicePreset(option) || !option.disabled),\n );\n};\n\nconst findIndexBefore = <O extends ChipOption>(\n options: Array<OptionPreset<O>> = [],\n endIndex: number = options.length,\n) => {\n let result = -1;\n if (endIndex <= 0) {\n return result;\n }\n for (let i = endIndex - 1; i >= 0; i--) {\n let option = options[i];\n\n if (!isNotServicePreset(option) || !option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nexport interface ChipsSelectProps<O extends ChipOption>\n extends ChipsInputBaseProps<O>,\n UseChipsSelectProps<O>,\n Pick<FormFieldProps, 'status' | 'mode' | 'before'>,\n Pick<CustomSelectDropdownProps, 'overscrollBehavior'> {\n /**\n * Расположение выпадающего списка.\n */\n placement?: 'top' | 'bottom';\n /**\n * Отрисовка Spinner вместо списка опций в выпадающем списке.\n */\n fetching?: boolean;\n /**\n * Закрытие выпадающего списка после выбора элемента.\n */\n closeAfterSelect?: boolean;\n /**\n * Ширина раскрывающегося списка зависит от контента.\n */\n dropdownAutoWidth?: boolean;\n /**\n * Принудительно использовать портал.\n */\n forceDropdownPortal?: boolean;\n /**\n * Передает атрибут `data-testid` для дропдауна.\n */\n dropdownTestId?: string;\n /**\n * Иконка раскрывающегося списка.\n */\n icon?: React.ReactNode;\n /**\n * Добавляет значение в список на событие `onBlur` (использовать вместе с `creatable`).\n */\n addOnBlur?: boolean;\n /**\n * Отключает максимальную высоту по умолчанию.\n */\n noMaxHeight?: boolean;\n /**\n * Функция для отрисовки кастомной опции в выпадающем списке.\n */\n renderOption?: (props: CustomSelectOptionProps, option: O) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Событие срабатывающее перед `onChange`.\n */\n onChangeStart?: (event: React.MouseEvent | React.KeyboardEvent, option: O) => void;\n\n /**\n * Отступ от выпадающего списка.\n */\n dropdownOffsetDistance?: number;\n\n /**\n * Если `true`, то справа будет отображаться кнопка для очистки значения.\n */\n allowClearButton?: boolean;\n}\n\n/**\n * @see https://vkui.io/components/chips-select\n */\nexport const ChipsSelect = <Option extends ChipOption>({\n // FormFieldProps\n id: labelledbyId,\n getRootRef,\n className,\n status = 'default',\n icon: dropdownIconProp,\n onChangeStart,\n\n // CustomSelectDropdownProps\n options: optionsProp,\n placement: placementProp = 'bottom',\n closeAfterSelect = true,\n selectedBehavior = DEFAULT_SELECTED_BEHAVIOR,\n emptyText = DEFAULT_EMPTY_TEXT,\n creatable = false,\n fetching = false,\n dropdownAutoWidth,\n forceDropdownPortal,\n noMaxHeight = false,\n filterFn = defaultFilterFn,\n sortFn = false,\n dropdownTestId,\n onClose,\n onOpen,\n overscrollBehavior,\n renderDropdown,\n\n // ChipsInputProps\n getRef,\n value: valueProp,\n defaultValue,\n inputValue: inputValueProp,\n defaultInputValue,\n disabled,\n readOnly,\n getOptionValue = getOptionValueDefault,\n getOptionLabel = getOptionLabelDefault,\n getNewOptionData = getNewOptionDataDefault,\n renderChip = renderChipDefault,\n renderOption = renderOptionDefault,\n onChange,\n onFocus: onFocusProp,\n onInputChange: onInputChangeProp,\n onBlur: onBlurProp,\n onKeyDown: onKeyDownProp,\n dropdownOffsetDistance = 0,\n allowClearButton,\n clearButtonTestId,\n delimiter,\n\n // a11y\n chipsListLabel,\n ...restProps\n}: ChipsSelectProps<Option>): React.ReactNode => {\n const {\n // Связано с ChipsInputProps\n // option\n value,\n addOptionFromInput,\n addOption,\n removeOption,\n clearOptions,\n // input\n inputRef: inputRefHook,\n inputValue,\n clearInput,\n onInputChange,\n\n // Связано с CustomSelectDropdownProps\n options,\n opened,\n setOpened,\n focusedOption,\n focusedOptionIndex,\n setFocusedOption,\n setFocusedOptionIndex,\n } = useChipsSelect({\n // option\n value: valueProp,\n defaultValue,\n onChange,\n getOptionValue,\n getOptionLabel,\n getNewOptionData,\n\n // input\n inputValue: inputValueProp,\n defaultInputValue,\n onInputChange: onInputChangeProp,\n\n // dropdown\n options: optionsProp,\n emptyText,\n creatable,\n filterFn,\n sortFn,\n selectedBehavior,\n onClose,\n onOpen,\n\n // other\n disabled,\n delimiter,\n });\n\n // Связано с ChipsInputProps\n const rootRef = useExternRef(getRootRef);\n const inputRef = useExternRef(getRef, inputRefHook);\n\n // Связано с CustomSelectDropdownProps\n const [dropdownVerticalPlacement, setDropdownVerticalPlacement] = React.useState<\n 'top' | 'bottom'\n >(placementProp);\n\n const onDropdownPlacementChange = React.useCallback((placement: Placement) => {\n if (placement.startsWith('top')) {\n setDropdownVerticalPlacement('top');\n } else if (placement.startsWith('bottom')) {\n setDropdownVerticalPlacement('bottom');\n }\n }, []);\n\n const dropdownId = React.useId();\n const dropdownCurrentItemId =\n focusedOptionIndex !== null ? `${dropdownId}-${focusedOptionIndex}` : undefined;\n const dropdownScrollBoxRef = React.useRef<HTMLDivElement>(null);\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onFocusProp) {\n onFocusProp(event);\n }\n\n if (!readOnly) {\n setOpened(true);\n setFocusedOptionIndex(null);\n }\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onBlurProp) {\n onBlurProp(event);\n }\n\n // Не добавляем значение, если его нужно выбрать строго из списка\n if (!readOnly && !event.defaultPrevented && !creatable) {\n event.preventDefault();\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = dropdownScrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n /* istanbul ignore next: нет представления как воспроизвести */\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n };\n\n const focusOptionByIndex = (index: number, oldIndex: number | null) => {\n if (index === oldIndex) {\n /* istanbul ignore next: нет представления как воспроизвести */\n return;\n }\n\n const option = options[index];\n\n if (isNotServicePreset(option) && option.disabled) {\n return;\n }\n\n scrollToElement(index);\n setFocusedOptionIndex(index);\n };\n\n const focusOption = (nextIndex: number | null, type: FocusActionType) => {\n let index = nextIndex === null ? -1 : nextIndex;\n\n if (type === FOCUS_ACTION_NEXT) {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === FOCUS_ACTION_PREV) {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index, focusedOptionIndex);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (onKeyDownProp) {\n onKeyDownProp(event);\n }\n\n if (event.defaultPrevented || readOnly) {\n return;\n }\n\n switch (event.key) {\n case Keys.ARROW_UP:\n case Keys.ARROW_DOWN:\n event.preventDefault();\n\n if (!opened) {\n setOpened(true);\n focusOption(null, FOCUS_ACTION_NEXT);\n } else {\n focusOption(\n focusedOptionIndex,\n event.key === Keys.ARROW_UP ? FOCUS_ACTION_PREV : FOCUS_ACTION_NEXT,\n );\n }\n break;\n case Keys.ENTER: {\n if (!opened) {\n break;\n }\n if (focusedOptionIndex != null) {\n const foundOption = options[focusedOptionIndex];\n if (foundOption && isNotServicePreset(foundOption)) {\n event.preventDefault();\n\n if (onChangeStart) {\n onChangeStart(event, foundOption);\n }\n\n addOption(foundOption);\n setFocusedOptionIndex(null);\n clearInput();\n if (closeAfterSelect) {\n setOpened(false);\n }\n\n break;\n }\n }\n\n if (!creatable) {\n event.preventDefault();\n }\n break;\n }\n case Keys.ESCAPE:\n case Keys.TAB:\n if (opened) {\n setOpened(false);\n }\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex === null) {\n setFocusedOption(null);\n } else {\n const foundFocusedOptionIndex = options[focusedOptionIndex];\n\n if (foundFocusedOptionIndex && isNotServicePreset(foundFocusedOptionIndex)) {\n setFocusedOption(foundFocusedOptionIndex);\n }\n }\n }, [options, focusedOptionIndex, setFocusedOption]);\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const handleClickOutside = React.useCallback(() => {\n setOpened(false);\n }, [setOpened]);\n\n useGlobalOnEventOutside(\n 'mousedown', // см. https://github.com/VKCOM/VKUI/pull/8582\n handleClickOutside,\n opened ? rootRef : null,\n opened ? dropdownScrollBoxRef : null,\n );\n\n const onDropdownIconClick: MouseEventHandler<SVGSVGElement> = React.useCallback(\n (e) => {\n e.preventDefault();\n setOpened(!opened);\n },\n [opened, setOpened],\n );\n\n const dropdownContent = React.useMemo(() => {\n const defaultDropdownContent = options.map((option, index) => {\n const dropdownItemId = `${dropdownId}-${index}`;\n\n if (isEmptyOptionPreset(option)) {\n return (\n <Footnote key=\"empty-text\" className={styles.empty}>\n {option.placeholder}\n </Footnote>\n );\n }\n if (isCreateNewOptionPreset(option)) {\n return (\n <CustomSelectOption\n key=\"create-new-option\"\n id={dropdownItemId}\n hovered={focusedOptionIndex === index}\n onMouseDown={() => addOptionFromInput(inputValue)}\n onMouseEnter={() => setFocusedOptionIndex(index)}\n >\n {option.actionText}\n </CustomSelectOption>\n );\n }\n return (\n <React.Fragment key={`${typeof option.value}-${option.value}`}>\n {renderOption(\n {\n id: dropdownItemId,\n disabled: option.disabled,\n hovered: focusedOption\n ? getOptionValue(option) === getOptionValue(focusedOption)\n : false,\n children: option.label,\n selected: !!value.find(\n (selectedOption: Option) =>\n getOptionValue(selectedOption) === getOptionValue(option),\n ),\n getRootRef(node) {\n if (node) {\n chipsSelectOptions[index] = node;\n }\n },\n onMouseDown(event: React.MouseEvent<HTMLDivElement>) {\n if (option.disabled) {\n return;\n }\n if (onChangeStart) {\n onChangeStart(event, option);\n }\n\n if (!event.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n clearInput();\n }\n },\n onMouseEnter() {\n setFocusedOptionIndex(index);\n },\n },\n option,\n )}\n </React.Fragment>\n );\n });\n\n if (renderDropdown) {\n return renderDropdown({\n defaultDropdownContent,\n });\n }\n return defaultDropdownContent;\n }, [\n addOption,\n addOptionFromInput,\n chipsSelectOptions,\n clearInput,\n closeAfterSelect,\n dropdownId,\n focusedOption,\n focusedOptionIndex,\n getOptionValue,\n inputValue,\n onChangeStart,\n options,\n renderDropdown,\n renderOption,\n setFocusedOptionIndex,\n setOpened,\n value,\n ]);\n\n const openedClassNames = React.useMemo(\n () =>\n (opened &&\n dropdownOffsetDistance === 0 &&\n (dropdownVerticalPlacement.includes('top') ? styles.popUp : styles.popDown)) ||\n undefined,\n [dropdownOffsetDistance, opened, dropdownVerticalPlacement],\n );\n\n const clearButtonShown = allowClearButton && (!!value.length || !!inputValue.length);\n\n return (\n <>\n <ChipsInputBase\n {...restProps}\n disabled={disabled}\n readOnly={readOnly}\n clearButtonShown={clearButtonShown}\n clearButtonTestId={clearButtonTestId}\n // FormFieldProps\n id={labelledbyId}\n getRootRef={rootRef}\n className={classNames(styles.host, openedClassNames, className)}\n status={status}\n after={\n dropdownIconProp || (\n <DropdownIcon\n opened={opened}\n onClick={onDropdownIconClick}\n className={classNames(\n styles.dropdownIcon,\n clearButtonShown && styles.dropdownIconWithOffset,\n )}\n />\n )\n }\n // option\n value={value}\n onAddChipOption={addOptionFromInput}\n onRemoveChipOption={removeOption}\n renderChip={renderChip}\n onClear={clearOptions}\n // input\n getRef={inputRef}\n inputValue={inputValue}\n onInputChange={onInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n // a11y\n role=\"combobox\"\n aria-expanded={opened}\n aria-autocomplete=\"list\"\n aria-activedescendant={opened ? dropdownCurrentItemId : undefined}\n aria-haspopup=\"listbox\"\n chipsListLabel={chipsListLabel}\n />\n {opened && (\n <CustomSelectDropdown\n data-testid={dropdownTestId}\n targetRef={rootRef}\n placement={dropdownVerticalPlacement}\n scrollBoxRef={dropdownScrollBoxRef}\n onPlacementChange={onDropdownPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n autoWidth={dropdownAutoWidth}\n forcePortal={forceDropdownPortal}\n noMaxHeight={noMaxHeight}\n offsetDistance={dropdownOffsetDistance}\n overscrollBehavior={overscrollBehavior}\n // a11y\n id={dropdownId}\n role=\"listbox\"\n aria-labelledby={labelledbyId}\n >\n {dropdownContent}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["React","classNames","useExternRef","useGlobalOnEventOutside","Keys","defaultFilterFn","ChipsInputBase","getNewOptionDataDefault","getOptionLabelDefault","getOptionValueDefault","renderChipDefault","CustomSelectDropdown","CustomSelectOption","DropdownIcon","Footnote","DEFAULT_EMPTY_TEXT","DEFAULT_SELECTED_BEHAVIOR","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","isCreateNewOptionPreset","isEmptyOptionPreset","isNotServicePreset","renderOptionDefault","useChipsSelect","styles","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","ChipsSelect","id","labelledbyId","getRootRef","className","status","icon","dropdownIconProp","onChangeStart","optionsProp","placement","placementProp","closeAfterSelect","selectedBehavior","emptyText","creatable","fetching","dropdownAutoWidth","forceDropdownPortal","noMaxHeight","filterFn","sortFn","dropdownTestId","onClose","onOpen","overscrollBehavior","renderDropdown","getRef","value","valueProp","defaultValue","inputValue","inputValueProp","defaultInputValue","readOnly","getOptionValue","getOptionLabel","getNewOptionData","renderChip","renderOption","onChange","onFocus","onFocusProp","onInputChange","onInputChangeProp","onBlur","onBlurProp","onKeyDown","onKeyDownProp","dropdownOffsetDistance","allowClearButton","clearButtonTestId","delimiter","chipsListLabel","restProps","addOptionFromInput","addOption","removeOption","clearOptions","inputRef","inputRefHook","clearInput","opened","setOpened","focusedOption","focusedOptionIndex","setFocusedOption","setFocusedOptionIndex","rootRef","dropdownVerticalPlacement","setDropdownVerticalPlacement","useState","onDropdownPlacementChange","useCallback","startsWith","dropdownId","useId","dropdownCurrentItemId","undefined","dropdownScrollBoxRef","useRef","handleFocus","event","handleBlur","defaultPrevented","preventDefault","chipsSelectOptions","current","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","beforeIndex","handleKeyDown","key","ARROW_UP","ARROW_DOWN","ENTER","foundOption","ESCAPE","TAB","useEffect","foundFocusedOptionIndex","onDropdownMouseLeave","handleClickOutside","onDropdownIconClick","e","dropdownContent","useMemo","defaultDropdownContent","map","dropdownItemId","empty","placeholder","hovered","onMouseDown","onMouseEnter","actionText","Fragment","children","label","selected","find","selectedOption","node","openedClassNames","includes","popUp","popDown","clearButtonShown","host","after","onClick","dropdownIcon","dropdownIconWithOffset","onAddChipOption","onRemoveChipOption","onClear","role","aria-expanded","aria-autocomplete","aria-activedescendant","aria-haspopup","data-testid","targetRef","scrollBoxRef","onPlacementChange","onMouseLeave","autoWidth","forcePortal","offsetDistance","aria-labelledby"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { type MouseEventHandler } from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalOnEventOutside } from '../../hooks/useGlobalOnClickOutside';\nimport { useMergeProps } from '../../hooks/useMergeProps';\nimport { Keys } from '../../lib/accessibility';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipsInputBase } from '../ChipsInputBase/ChipsInputBase';\nimport {\n getNewOptionDataDefault,\n getOptionLabelDefault,\n getOptionValueDefault,\n renderChipDefault,\n} from '../ChipsInputBase/constants';\nimport type { ChipOption, ChipsInputBaseProps } from '../ChipsInputBase/types';\nimport {\n CustomSelectDropdown,\n type CustomSelectDropdownProps,\n} from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n type CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport type { FormFieldProps } from '../FormField/FormField';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport {\n DEFAULT_EMPTY_TEXT,\n DEFAULT_SELECTED_BEHAVIOR,\n FOCUS_ACTION_NEXT,\n FOCUS_ACTION_PREV,\n isCreateNewOptionPreset,\n isEmptyOptionPreset,\n isNotServicePreset,\n renderOptionDefault,\n} from './constants';\nimport type { FocusActionType, OptionPreset } from './types';\nimport { useChipsSelect, type UseChipsSelectProps } from './useChipsSelect';\nimport styles from './ChipsSelect.module.css';\n\nconst findIndexAfter = <O extends ChipOption>(\n options: Array<OptionPreset<O>> = [],\n startIndex = -1,\n) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex(\n (option, i) => i > startIndex && (!isNotServicePreset(option) || !option.disabled),\n );\n};\n\nconst findIndexBefore = <O extends ChipOption>(\n options: Array<OptionPreset<O>> = [],\n endIndex: number = options.length,\n) => {\n let result = -1;\n if (endIndex <= 0) {\n return result;\n }\n for (let i = endIndex - 1; i >= 0; i--) {\n let option = options[i];\n\n if (!isNotServicePreset(option) || !option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nexport interface ChipsSelectProps<O extends ChipOption>\n extends ChipsInputBaseProps<O>,\n UseChipsSelectProps<O>,\n Pick<FormFieldProps, 'status' | 'mode' | 'before'>,\n Pick<CustomSelectDropdownProps, 'overscrollBehavior'> {\n /**\n * Расположение выпадающего списка.\n */\n placement?: 'top' | 'bottom';\n /**\n * Отрисовка Spinner вместо списка опций в выпадающем списке.\n */\n fetching?: boolean;\n /**\n * Закрытие выпадающего списка после выбора элемента.\n */\n closeAfterSelect?: boolean;\n /**\n * Ширина раскрывающегося списка зависит от контента.\n */\n dropdownAutoWidth?: boolean;\n /**\n * Принудительно использовать портал.\n */\n forceDropdownPortal?: boolean;\n /**\n * Передает атрибут `data-testid` для дропдауна.\n */\n dropdownTestId?: string;\n /**\n * Иконка раскрывающегося списка.\n */\n icon?: React.ReactNode;\n /**\n * Добавляет значение в список на событие `onBlur` (использовать вместе с `creatable`).\n */\n addOnBlur?: boolean;\n /**\n * Отключает максимальную высоту по умолчанию.\n */\n noMaxHeight?: boolean;\n /**\n * Функция для отрисовки кастомной опции в выпадающем списке.\n */\n renderOption?: (props: CustomSelectOptionProps, option: O) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Событие срабатывающее перед `onChange`.\n */\n onChangeStart?: (event: React.MouseEvent | React.KeyboardEvent, option: O) => void;\n\n /**\n * Отступ от выпадающего списка.\n */\n dropdownOffsetDistance?: number;\n\n /**\n * Если `true`, то справа будет отображаться кнопка для очистки значения.\n */\n allowClearButton?: boolean;\n}\n\n/**\n * @see https://vkui.io/components/chips-select\n */\nexport const ChipsSelect = <Option extends ChipOption>({\n // FormFieldProps\n getRootRef,\n className,\n status = 'default',\n icon: dropdownIconProp,\n onChangeStart,\n\n // CustomSelectDropdownProps\n options: optionsProp,\n placement: placementProp = 'bottom',\n closeAfterSelect = true,\n selectedBehavior = DEFAULT_SELECTED_BEHAVIOR,\n emptyText = DEFAULT_EMPTY_TEXT,\n creatable = false,\n fetching = false,\n dropdownAutoWidth,\n forceDropdownPortal,\n noMaxHeight = false,\n filterFn = defaultFilterFn,\n sortFn = false,\n dropdownTestId,\n onClose,\n onOpen,\n overscrollBehavior,\n renderDropdown,\n\n // ChipsInputProps\n getRef,\n value: valueProp,\n defaultValue,\n inputValue: inputValueProp,\n defaultInputValue: defaultInputValueProp,\n getOptionValue = getOptionValueDefault,\n getOptionLabel = getOptionLabelDefault,\n getNewOptionData = getNewOptionDataDefault,\n renderChip = renderChipDefault,\n renderOption = renderOptionDefault,\n onChange,\n onInputChange: onInputChangeProp,\n dropdownOffsetDistance = 0,\n allowClearButton,\n clearButtonTestId,\n delimiter,\n\n // a11y\n chipsListLabel,\n\n // input native props\n disabled: disabledProp,\n readOnly: readOnlyProp,\n id: idProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n onKeyDown: onKeyDownProp,\n\n slotProps,\n ...restProps\n}: ChipsSelectProps<Option>): React.ReactNode => {\n const {\n getRootRef: getInputRef,\n value: resolvedInputValue,\n defaultValue: resolvedDefaultInputValue,\n onChange: resolvedOnInputChange,\n disabled,\n readOnly,\n id: labelledbyId,\n onFocus,\n onBlur,\n onKeyDown,\n ...inputRest\n } = useMergeProps(\n {\n getRootRef: getRef,\n value: inputValueProp,\n defaultValue: defaultInputValueProp,\n onChange: onInputChangeProp,\n disabled: disabledProp,\n readOnly: readOnlyProp,\n id: idProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n onKeyDown: onKeyDownProp,\n },\n slotProps?.input,\n );\n\n const {\n // Связано с ChipsInputProps\n // option\n value,\n addOptionFromInput,\n addOption,\n removeOption,\n clearOptions,\n // input\n inputRef: inputRefHook,\n inputValue,\n clearInput,\n onInputChange,\n\n // Связано с CustomSelectDropdownProps\n options,\n opened,\n setOpened,\n focusedOption,\n focusedOptionIndex,\n setFocusedOption,\n setFocusedOptionIndex,\n } = useChipsSelect({\n // option\n value: valueProp,\n defaultValue,\n onChange,\n getOptionValue,\n getOptionLabel,\n getNewOptionData,\n\n // input\n inputValue: resolvedInputValue as string,\n defaultInputValue: resolvedDefaultInputValue as string,\n onInputChange: resolvedOnInputChange,\n\n // dropdown\n options: optionsProp,\n emptyText,\n creatable,\n filterFn,\n sortFn,\n selectedBehavior,\n onClose,\n onOpen,\n\n // other\n disabled,\n delimiter,\n });\n\n // Связано с ChipsInputProps\n const rootRef = useExternRef(getRootRef);\n const inputRef = useExternRef(getInputRef, inputRefHook);\n\n // Связано с CustomSelectDropdownProps\n const [dropdownVerticalPlacement, setDropdownVerticalPlacement] = React.useState<\n 'top' | 'bottom'\n >(placementProp);\n\n const onDropdownPlacementChange = React.useCallback((placement: Placement) => {\n if (placement.startsWith('top')) {\n setDropdownVerticalPlacement('top');\n } else if (placement.startsWith('bottom')) {\n setDropdownVerticalPlacement('bottom');\n }\n }, []);\n\n const dropdownId = React.useId();\n const dropdownCurrentItemId =\n focusedOptionIndex !== null ? `${dropdownId}-${focusedOptionIndex}` : undefined;\n const dropdownScrollBoxRef = React.useRef<HTMLDivElement>(null);\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onFocus) {\n onFocus(event);\n }\n\n if (!readOnly) {\n setOpened(true);\n setFocusedOptionIndex(null);\n }\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onBlur) {\n onBlur(event);\n }\n\n // Не добавляем значение, если его нужно выбрать строго из списка\n if (!readOnly && !event.defaultPrevented && !creatable) {\n event.preventDefault();\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = dropdownScrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n /* istanbul ignore next: нет представления как воспроизвести */\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n };\n\n const focusOptionByIndex = (index: number, oldIndex: number | null) => {\n if (index === oldIndex) {\n /* istanbul ignore next: нет представления как воспроизвести */\n return;\n }\n\n const option = options[index];\n\n if (isNotServicePreset(option) && option.disabled) {\n return;\n }\n\n scrollToElement(index);\n setFocusedOptionIndex(index);\n };\n\n const focusOption = (nextIndex: number | null, type: FocusActionType) => {\n let index = nextIndex === null ? -1 : nextIndex;\n\n if (type === FOCUS_ACTION_NEXT) {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === FOCUS_ACTION_PREV) {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index, focusedOptionIndex);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (onKeyDown) {\n onKeyDown(event);\n }\n\n if (event.defaultPrevented || readOnly) {\n return;\n }\n\n switch (event.key) {\n case Keys.ARROW_UP:\n case Keys.ARROW_DOWN:\n event.preventDefault();\n\n if (!opened) {\n setOpened(true);\n focusOption(null, FOCUS_ACTION_NEXT);\n } else {\n focusOption(\n focusedOptionIndex,\n event.key === Keys.ARROW_UP ? FOCUS_ACTION_PREV : FOCUS_ACTION_NEXT,\n );\n }\n break;\n case Keys.ENTER: {\n if (!opened) {\n break;\n }\n if (focusedOptionIndex != null) {\n const foundOption = options[focusedOptionIndex];\n if (foundOption && isNotServicePreset(foundOption)) {\n event.preventDefault();\n\n if (onChangeStart) {\n onChangeStart(event, foundOption);\n }\n\n addOption(foundOption);\n setFocusedOptionIndex(null);\n clearInput();\n if (closeAfterSelect) {\n setOpened(false);\n }\n\n break;\n }\n }\n\n if (!creatable) {\n event.preventDefault();\n }\n break;\n }\n case Keys.ESCAPE:\n case Keys.TAB:\n if (opened) {\n setOpened(false);\n }\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex === null) {\n setFocusedOption(null);\n } else {\n const foundFocusedOptionIndex = options[focusedOptionIndex];\n\n if (foundFocusedOptionIndex && isNotServicePreset(foundFocusedOptionIndex)) {\n setFocusedOption(foundFocusedOptionIndex);\n }\n }\n }, [options, focusedOptionIndex, setFocusedOption]);\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const handleClickOutside = React.useCallback(() => {\n setOpened(false);\n }, [setOpened]);\n\n useGlobalOnEventOutside(\n 'mousedown', // см. https://github.com/VKCOM/VKUI/pull/8582\n handleClickOutside,\n opened ? rootRef : null,\n opened ? dropdownScrollBoxRef : null,\n );\n\n const onDropdownIconClick: MouseEventHandler<SVGSVGElement> = React.useCallback(\n (e) => {\n e.preventDefault();\n setOpened(!opened);\n },\n [opened, setOpened],\n );\n\n const dropdownContent = React.useMemo(() => {\n const defaultDropdownContent = options.map((option, index) => {\n const dropdownItemId = `${dropdownId}-${index}`;\n\n if (isEmptyOptionPreset(option)) {\n return (\n <Footnote key=\"empty-text\" className={styles.empty}>\n {option.placeholder}\n </Footnote>\n );\n }\n if (isCreateNewOptionPreset(option)) {\n return (\n <CustomSelectOption\n key=\"create-new-option\"\n id={dropdownItemId}\n hovered={focusedOptionIndex === index}\n onMouseDown={() => addOptionFromInput(inputValue)}\n onMouseEnter={() => setFocusedOptionIndex(index)}\n >\n {option.actionText}\n </CustomSelectOption>\n );\n }\n return (\n <React.Fragment key={`${typeof option.value}-${option.value}`}>\n {renderOption(\n {\n id: dropdownItemId,\n disabled: option.disabled,\n hovered: focusedOption\n ? getOptionValue(option) === getOptionValue(focusedOption)\n : false,\n children: option.label,\n selected: !!value.find(\n (selectedOption: Option) =>\n getOptionValue(selectedOption) === getOptionValue(option),\n ),\n getRootRef(node) {\n if (node) {\n chipsSelectOptions[index] = node;\n }\n },\n onMouseDown(event: React.MouseEvent<HTMLDivElement>) {\n if (option.disabled) {\n return;\n }\n if (onChangeStart) {\n onChangeStart(event, option);\n }\n\n if (!event.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n clearInput();\n }\n },\n onMouseEnter() {\n setFocusedOptionIndex(index);\n },\n },\n option,\n )}\n </React.Fragment>\n );\n });\n\n if (renderDropdown) {\n return renderDropdown({\n defaultDropdownContent,\n });\n }\n return defaultDropdownContent;\n }, [\n addOption,\n addOptionFromInput,\n chipsSelectOptions,\n clearInput,\n closeAfterSelect,\n dropdownId,\n focusedOption,\n focusedOptionIndex,\n getOptionValue,\n inputValue,\n onChangeStart,\n options,\n renderDropdown,\n renderOption,\n setFocusedOptionIndex,\n setOpened,\n value,\n ]);\n\n const openedClassNames = React.useMemo(\n () =>\n (opened &&\n dropdownOffsetDistance === 0 &&\n (dropdownVerticalPlacement.includes('top') ? styles.popUp : styles.popDown)) ||\n undefined,\n [dropdownOffsetDistance, opened, dropdownVerticalPlacement],\n );\n\n const clearButtonShown = allowClearButton && (!!value.length || !!inputValue.length);\n\n return (\n <>\n <ChipsInputBase\n clearButtonShown={clearButtonShown}\n clearButtonTestId={clearButtonTestId}\n // FormFieldProps\n getRootRef={rootRef}\n className={classNames(styles.host, openedClassNames, className)}\n status={status}\n after={\n dropdownIconProp || (\n <DropdownIcon\n opened={opened}\n onClick={onDropdownIconClick}\n className={classNames(\n styles.dropdownIcon,\n clearButtonShown && styles.dropdownIconWithOffset,\n )}\n />\n )\n }\n // option\n value={value}\n onAddChipOption={addOptionFromInput}\n onRemoveChipOption={removeOption}\n renderChip={renderChip}\n onClear={clearOptions}\n // a11y\n chipsListLabel={chipsListLabel}\n slotProps={{\n ...slotProps,\n input: {\n 'role': 'combobox',\n 'aria-expanded': opened,\n 'aria-autocomplete': 'list',\n 'aria-activedescendant': opened ? dropdownCurrentItemId : undefined,\n 'aria-haspopup': 'listbox',\n 'getRootRef': inputRef,\n 'value': inputValue,\n 'onChange': onInputChange,\n disabled,\n readOnly,\n 'id': labelledbyId,\n 'onFocus': handleFocus,\n 'onBlur': handleBlur,\n 'onKeyDown': handleKeyDown,\n ...inputRest,\n },\n }}\n {...restProps}\n />\n {opened && (\n <CustomSelectDropdown\n data-testid={dropdownTestId}\n targetRef={rootRef}\n placement={dropdownVerticalPlacement}\n scrollBoxRef={dropdownScrollBoxRef}\n onPlacementChange={onDropdownPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n autoWidth={dropdownAutoWidth}\n forcePortal={forceDropdownPortal}\n noMaxHeight={noMaxHeight}\n offsetDistance={dropdownOffsetDistance}\n overscrollBehavior={overscrollBehavior}\n // a11y\n id={dropdownId}\n role=\"listbox\"\n aria-labelledby={labelledbyId}\n >\n {dropdownContent}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["React","classNames","useExternRef","useGlobalOnEventOutside","useMergeProps","Keys","defaultFilterFn","ChipsInputBase","getNewOptionDataDefault","getOptionLabelDefault","getOptionValueDefault","renderChipDefault","CustomSelectDropdown","CustomSelectOption","DropdownIcon","Footnote","DEFAULT_EMPTY_TEXT","DEFAULT_SELECTED_BEHAVIOR","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","isCreateNewOptionPreset","isEmptyOptionPreset","isNotServicePreset","renderOptionDefault","useChipsSelect","styles","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","ChipsSelect","getRootRef","className","status","icon","dropdownIconProp","onChangeStart","optionsProp","placement","placementProp","closeAfterSelect","selectedBehavior","emptyText","creatable","fetching","dropdownAutoWidth","forceDropdownPortal","noMaxHeight","filterFn","sortFn","dropdownTestId","onClose","onOpen","overscrollBehavior","renderDropdown","getRef","value","valueProp","defaultValue","inputValue","inputValueProp","defaultInputValue","defaultInputValueProp","getOptionValue","getOptionLabel","getNewOptionData","renderChip","renderOption","onChange","onInputChange","onInputChangeProp","dropdownOffsetDistance","allowClearButton","clearButtonTestId","delimiter","chipsListLabel","disabledProp","readOnly","readOnlyProp","id","idProp","onFocus","onFocusProp","onBlur","onBlurProp","onKeyDown","onKeyDownProp","slotProps","restProps","getInputRef","resolvedInputValue","resolvedDefaultInputValue","resolvedOnInputChange","labelledbyId","inputRest","input","addOptionFromInput","addOption","removeOption","clearOptions","inputRef","inputRefHook","clearInput","opened","setOpened","focusedOption","focusedOptionIndex","setFocusedOption","setFocusedOptionIndex","rootRef","dropdownVerticalPlacement","setDropdownVerticalPlacement","useState","onDropdownPlacementChange","useCallback","startsWith","dropdownId","useId","dropdownCurrentItemId","undefined","dropdownScrollBoxRef","useRef","handleFocus","event","handleBlur","defaultPrevented","preventDefault","chipsSelectOptions","current","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","beforeIndex","handleKeyDown","key","ARROW_UP","ARROW_DOWN","ENTER","foundOption","ESCAPE","TAB","useEffect","foundFocusedOptionIndex","onDropdownMouseLeave","handleClickOutside","onDropdownIconClick","e","dropdownContent","useMemo","defaultDropdownContent","map","dropdownItemId","empty","placeholder","hovered","onMouseDown","onMouseEnter","actionText","Fragment","children","label","selected","find","selectedOption","node","openedClassNames","includes","popUp","popDown","clearButtonShown","host","after","onClick","dropdownIcon","dropdownIconWithOffset","onAddChipOption","onRemoveChipOption","onClear","data-testid","targetRef","scrollBoxRef","onPlacementChange","onMouseLeave","autoWidth","forcePortal","offsetDistance","role","aria-labelledby"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { classNames } from "@vkontakte/vkjs";
|
|
|
5
5
|
import { getRequiredValueByKey } from "../../helpers/getValueByKey.js";
|
|
6
6
|
import { useAdaptivity } from "../../hooks/useAdaptivity.js";
|
|
7
7
|
import { useExternRef } from "../../hooks/useExternRef.js";
|
|
8
|
+
import { useMergeProps } from "../../hooks/useMergeProps.js";
|
|
8
9
|
import { callMultiple } from "../../lib/callMultiple.js";
|
|
9
10
|
import { useDOM } from "../../lib/dom.js";
|
|
10
11
|
import { defaultFilterFn } from "../../lib/select.js";
|
|
@@ -13,10 +14,11 @@ import { preventDefault } from "../../lib/utils.js";
|
|
|
13
14
|
import { CustomSelectDropdown } from "../CustomSelectDropdown/CustomSelectDropdown.js";
|
|
14
15
|
import { CustomSelectOption } from "../CustomSelectOption/CustomSelectOption.js";
|
|
15
16
|
import { NOT_SELECTED, remapFromNativeValueToSelectValue } from "../NativeSelect/NativeSelect.js";
|
|
17
|
+
import { RootComponent } from "../RootComponent/RootComponent.js";
|
|
16
18
|
import { Footnote } from "../Typography/Footnote/Footnote.js";
|
|
17
19
|
import { VisuallyHidden } from "../VisuallyHidden/VisuallyHidden.js";
|
|
18
20
|
import { CustomSelectInput } from "./CustomSelectInput/CustomSelectInput.js";
|
|
19
|
-
import { checkMixControlledAndUncontrolledState, checkOptionsValueType, filter, findSelectedIndex, getOptionByValue } from "./helpers.js";
|
|
21
|
+
import { checkDeprecatedProps, checkMixControlledAndUncontrolledState, checkOptionsValueType, filter, findSelectedIndex, getOptionByValue } from "./helpers.js";
|
|
20
22
|
import { useAfterItems } from "./hooks/useAfterItems.js";
|
|
21
23
|
import { useDropdownOpenedController } from "./hooks/useDropdownOpenedController.js";
|
|
22
24
|
import { useFocusedOptionController } from "./hooks/useFocusedOptionController.js";
|
|
@@ -65,25 +67,44 @@ const FetchingStatus = ({ fetching = false, options, fetchingInProgressLabel = '
|
|
|
65
67
|
/**
|
|
66
68
|
* @see https://vkui.io/components/custom-select
|
|
67
69
|
*/ export function CustomSelect(props) {
|
|
68
|
-
const {
|
|
70
|
+
const { style, className, getRootRef, before, name, getRef, popupDirection = 'bottom', onChange, children, 'onInputChange': onInputChangeProp, renderDropdown, onOpen, onClose, fetching, labelTextTestId, multiline, placeholder, status, forceDropdownPortal, align, selectType = 'default', searchable = false, 'renderOption': renderOptionProp = defaultRenderOptionFn, 'options': options, emptyText = 'Ничего не найдено', filterFn = defaultFilterFn, 'icon': iconProp, ClearButton, allowClearButton = false, dropdownOffsetDistance = 0, dropdownAutoWidth = false, noMaxHeight = false, 'aria-labelledby': ariaLabelledBy, clearButtonTestId, nativeSelectTestId, defaultValue, required, getSelectInputRef, overscrollBehavior, 'onInputKeyDown': onInputKeyDownProp, accessible = false, fetchingInProgressLabel, fetchingCompletedLabel, 'value': selectValue, slotProps, ...restProps } = props;
|
|
69
71
|
if (process.env.NODE_ENV === 'development') {
|
|
70
72
|
checkOptionsValueType(options);
|
|
73
|
+
checkDeprecatedProps(props);
|
|
71
74
|
}
|
|
72
75
|
const { sizeY = 'none' } = useAdaptivity();
|
|
76
|
+
const { onClick: onRootClick, onMouseMove: onRootMouseMove, onMouseDown: onRootMouseDown, getRootRef: rootRef, ...rootRest } = useMergeProps({
|
|
77
|
+
style,
|
|
78
|
+
className,
|
|
79
|
+
getRootRef
|
|
80
|
+
}, slotProps?.root);
|
|
81
|
+
const { getRootRef: getSelectRef, ...selectRest } = useMergeProps({
|
|
82
|
+
getRootRef: getRef,
|
|
83
|
+
onBlur: props.onBlur,
|
|
84
|
+
onFocus: props.onFocus,
|
|
85
|
+
onClick: props.onClick
|
|
86
|
+
}, slotProps?.select);
|
|
87
|
+
const { getRootRef: getInputRef, onChange: onChangeInput, onFocus: onInputFocus, onBlur: onInputBlur, onKeyDown: onNativeInputKeyDown, onClick: onNativeInputClick, readOnly, ...inputRest } = useMergeProps({
|
|
88
|
+
getRootRef: getSelectInputRef,
|
|
89
|
+
onChange: onInputChangeProp,
|
|
90
|
+
// Приводим типы так как в CustomSelect типы в rest определены как React.SelectHTMLAttributes<HTMLSelectElement>
|
|
91
|
+
// Хотя эти свойства прокидываются в input
|
|
92
|
+
...restProps
|
|
93
|
+
}, slotProps?.input);
|
|
73
94
|
const containerRef = React.useRef(null);
|
|
74
|
-
const handleRootRef = useExternRef(containerRef,
|
|
75
|
-
const selectElRef = useExternRef(
|
|
76
|
-
const selectInputRef = useExternRef(
|
|
95
|
+
const handleRootRef = useExternRef(containerRef, rootRef);
|
|
96
|
+
const selectElRef = useExternRef(getSelectRef);
|
|
97
|
+
const selectInputRef = useExternRef(getInputRef);
|
|
77
98
|
const propsValue = React.useMemo(()=>{
|
|
78
|
-
if (
|
|
99
|
+
if (selectValue === undefined) {
|
|
79
100
|
return undefined;
|
|
80
101
|
}
|
|
81
|
-
return getOptionByValue(options,
|
|
102
|
+
return getOptionByValue(options, selectValue)?.value ?? null;
|
|
82
103
|
}, [
|
|
83
104
|
options,
|
|
84
|
-
|
|
105
|
+
selectValue
|
|
85
106
|
]);
|
|
86
|
-
const [isControlledOutside, setIsControlledOutside] = React.useState(
|
|
107
|
+
const [isControlledOutside, setIsControlledOutside] = React.useState(selectValue !== undefined);
|
|
87
108
|
const [popperPlacement, setPopperPlacement] = React.useState(popupDirection);
|
|
88
109
|
const { nativeSelectValue, setNativeSelectValue, selectedOptionValue, setSelectedOptionValue, onNativeSelectChange } = useSelectedOptionController({
|
|
89
110
|
value: propsValue,
|
|
@@ -100,7 +121,7 @@ const FetchingStatus = ({ fetching = false, options, fetchingInProgressLabel = '
|
|
|
100
121
|
options,
|
|
101
122
|
accessible,
|
|
102
123
|
selectedValue: selectedOptionValue,
|
|
103
|
-
onInputChange:
|
|
124
|
+
onInputChange: onChangeInput
|
|
104
125
|
});
|
|
105
126
|
const filteredOptions = React.useMemo(()=>filter(options, searchable ? inputValue : '', filterFn), [
|
|
106
127
|
filterFn,
|
|
@@ -184,7 +205,7 @@ const FetchingStatus = ({ fetching = false, options, fetchingInProgressLabel = '
|
|
|
184
205
|
focusedOptionValue,
|
|
185
206
|
selectOption
|
|
186
207
|
]);
|
|
187
|
-
const
|
|
208
|
+
const handleInputKeyDown = useInputKeyboardController({
|
|
188
209
|
opened,
|
|
189
210
|
open,
|
|
190
211
|
close,
|
|
@@ -363,41 +384,53 @@ const FetchingStatus = ({ fetching = false, options, fetchingInProgressLabel = '
|
|
|
363
384
|
}, [
|
|
364
385
|
resetFocusedOption
|
|
365
386
|
]);
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
387
|
+
const updateLastMousePosition = (e)=>{
|
|
388
|
+
lastMousePositionRef.current = {
|
|
389
|
+
x: e.clientX,
|
|
390
|
+
y: e.clientY
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
return /*#__PURE__*/ _jsxs(RootComponent, {
|
|
394
|
+
baseClassName: classNames(styles.host, sizeY !== 'regular' && sizeYClassNames[sizeY]),
|
|
395
|
+
getRootRef: handleRootRef,
|
|
396
|
+
onClick: callMultiple(onRootClick, passClickAndFocusToInputOnClick),
|
|
397
|
+
onMouseDown: callMultiple(onRootMouseDown, preventInputBlurWhenClickInsideFocusedSelectArea),
|
|
398
|
+
onMouseMove: callMultiple(onRootMouseMove, updateLastMousePosition),
|
|
399
|
+
...rootRest,
|
|
378
400
|
children: [
|
|
379
401
|
/*#__PURE__*/ _jsx(CustomSelectInput, {
|
|
380
402
|
autoComplete: "off",
|
|
381
403
|
autoCapitalize: "none",
|
|
382
404
|
autoCorrect: "off",
|
|
383
405
|
spellCheck: "false",
|
|
384
|
-
...restProps,
|
|
385
|
-
...selectInputAriaProps,
|
|
386
|
-
getRef: selectInputRef,
|
|
387
|
-
onFocus: onFocus,
|
|
388
|
-
onBlur: onBlur,
|
|
389
|
-
className: openedClassNames,
|
|
390
|
-
readOnly: readOnly || !searchable,
|
|
391
406
|
fetching: fetching,
|
|
392
407
|
searchable: searchable,
|
|
393
408
|
accessible: accessible,
|
|
394
|
-
value: inputValue,
|
|
395
|
-
onKeyDown: !readOnly ? onInputKeyDown : undefined,
|
|
396
|
-
onChange: onInputChange,
|
|
397
|
-
onClick: !readOnly ? toggleOpened : undefined,
|
|
398
409
|
before: before,
|
|
399
410
|
after: afterItems,
|
|
400
411
|
selectType: selectType,
|
|
412
|
+
align: align,
|
|
413
|
+
status: status,
|
|
414
|
+
placeholder: placeholder,
|
|
415
|
+
multiline: multiline,
|
|
416
|
+
labelTextTestId: labelTextTestId,
|
|
417
|
+
slotProps: {
|
|
418
|
+
root: {
|
|
419
|
+
className: openedClassNames
|
|
420
|
+
},
|
|
421
|
+
input: {
|
|
422
|
+
getRootRef: selectInputRef,
|
|
423
|
+
onChange: onInputChange,
|
|
424
|
+
onFocus: callMultiple(onFocus, onInputFocus),
|
|
425
|
+
onBlur: callMultiple(onBlur, onInputFocus),
|
|
426
|
+
onKeyDown: !readOnly ? callMultiple(handleInputKeyDown, onNativeInputKeyDown) : onNativeInputKeyDown,
|
|
427
|
+
onClick: !readOnly ? callMultiple(toggleOpened, onNativeInputClick) : onNativeInputClick,
|
|
428
|
+
value: inputValue,
|
|
429
|
+
readOnly: readOnly || !searchable,
|
|
430
|
+
...selectInputAriaProps,
|
|
431
|
+
...inputRest
|
|
432
|
+
}
|
|
433
|
+
},
|
|
401
434
|
children: selected?.label
|
|
402
435
|
}),
|
|
403
436
|
/*#__PURE__*/ _jsx(FetchingStatus, {
|
|
@@ -406,19 +439,18 @@ const FetchingStatus = ({ fetching = false, options, fetchingInProgressLabel = '
|
|
|
406
439
|
fetchingInProgressLabel: fetchingInProgressLabel,
|
|
407
440
|
fetchingCompletedLabel: fetchingCompletedLabel
|
|
408
441
|
}),
|
|
409
|
-
/*#__PURE__*/ _jsxs(
|
|
442
|
+
/*#__PURE__*/ _jsxs(RootComponent, {
|
|
443
|
+
Component: "select",
|
|
444
|
+
baseClassName: styles.control,
|
|
410
445
|
tabIndex: -1,
|
|
411
|
-
ref: selectElRef,
|
|
412
446
|
name: name,
|
|
413
|
-
onChange: onNativeSelectChange,
|
|
414
|
-
onBlur: props.onBlur,
|
|
415
|
-
onFocus: props.onFocus,
|
|
416
|
-
onClick: props.onClick,
|
|
417
447
|
value: nativeSelectValue,
|
|
418
448
|
"aria-hidden": true,
|
|
419
|
-
className: styles.control,
|
|
420
449
|
"data-testid": nativeSelectTestId,
|
|
421
450
|
required: required,
|
|
451
|
+
onChange: onNativeSelectChange,
|
|
452
|
+
getRootRef: selectElRef,
|
|
453
|
+
...selectRest,
|
|
422
454
|
children: [
|
|
423
455
|
(allowClearButton || nativeSelectValue === NOT_SELECTED.NATIVE) && /*#__PURE__*/ _jsx("option", {
|
|
424
456
|
value: NOT_SELECTED.NATIVE
|