@vkontakte/vkui 5.4.2 → 5.4.3
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/README.md +2 -2
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js +3 -20
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.js +16 -2
- package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cjs/components/CustomSelectOption/CustomSelectOption.d.ts +1 -1
- package/dist/cjs/components/CustomSelectOption/CustomSelectOption.js +4 -2
- package/dist/cjs/components/CustomSelectOption/CustomSelectOption.js.map +1 -1
- package/dist/cjs/components/ModalRoot/ModalRoot.js +25 -1
- package/dist/cjs/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/cjs/components/NativeSelect/NativeSelect.js +2 -1
- package/dist/cjs/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/cjs/components/Panel/Panel.js +4 -4
- package/dist/cjs/components/Panel/Panel.js.map +1 -1
- package/dist/cjs/components/PanelHeader/PanelHeader.js +1 -1
- package/dist/cjs/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/cjs/components/WriteBar/WriteBar.js +14 -2
- package/dist/cjs/components/WriteBar/WriteBar.js.map +1 -1
- package/dist/cjs/hooks/useTodayDate.js +30 -7
- package/dist/cjs/hooks/useTodayDate.js.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.js +3 -20
- package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +16 -2
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/CustomSelectOption/CustomSelectOption.d.ts +1 -1
- package/dist/components/CustomSelectOption/CustomSelectOption.js +4 -2
- package/dist/components/CustomSelectOption/CustomSelectOption.js.map +1 -1
- package/dist/components/ModalRoot/ModalRoot.js +25 -1
- package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/components/NativeSelect/NativeSelect.js +2 -1
- package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/components/Panel/Panel.js +4 -4
- package/dist/components/Panel/Panel.js.map +1 -1
- package/dist/components/PanelHeader/PanelHeader.js +1 -1
- package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/components/WriteBar/WriteBar.js +14 -2
- package/dist/components/WriteBar/WriteBar.js.map +1 -1
- package/dist/components.css +3 -3
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +133 -48
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js +3 -17
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +15 -2
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelectOption/CustomSelectOption.d.ts +1 -1
- package/dist/cssm/components/CustomSelectOption/CustomSelectOption.js +2 -1
- package/dist/cssm/components/CustomSelectOption/CustomSelectOption.js.map +1 -1
- package/dist/cssm/components/ModalRoot/ModalRoot.js +22 -1
- package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/cssm/components/NativeSelect/NativeSelect.js +2 -1
- package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/cssm/components/Panel/Panel.js +4 -4
- package/dist/cssm/components/Panel/Panel.js.map +1 -1
- package/dist/cssm/components/PanelHeader/PanelHeader.js +1 -1
- package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/cssm/components/PanelHeaderContent/PanelHeaderContent.module.css +1 -1
- package/dist/cssm/components/WriteBar/WriteBar.js +15 -2
- package/dist/cssm/components/WriteBar/WriteBar.js.map +1 -1
- package/dist/cssm/components/WriteBar/WriteBar.module.css +13 -7
- package/dist/cssm/components/WriteBarIcon/WriteBarIcon.module.css +9 -1
- package/dist/cssm/hooks/useTodayDate.js +31 -8
- package/dist/cssm/hooks/useTodayDate.js.map +1 -1
- package/dist/hooks/useTodayDate.js +31 -8
- package/dist/hooks/useTodayDate.js.map +1 -1
- package/dist/vkui.css +3 -3
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +133 -48
- package/package.json +3 -5
- package/docs/assets/assets/vkui-logo-dark.svg +0 -5
- package/docs/assets/assets/vkui-logo-light.svg +0 -5
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<h1 align="center">
|
|
2
2
|
<a href="https://vkcom.github.io/VKUI/">
|
|
3
3
|
<picture>
|
|
4
|
-
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/vkui-logo-light.svg">
|
|
5
|
-
<img src="docs/assets/vkui-logo-dark.svg" width="150" alt="VKUI logo" />
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/VKCOM/VKUI/d72dcc219bc4b441b2740b69d9343aea14d66c7f/docs/assets/vkui-logo-light.svg">
|
|
5
|
+
<img src="https://raw.githubusercontent.com/VKCOM/VKUI/d72dcc219bc4b441b2740b69d9343aea14d66c7f/docs/assets/vkui-logo-dark.svg" width="150" alt="VKUI logo" />
|
|
6
6
|
</picture>
|
|
7
7
|
</a>
|
|
8
8
|
</h1>
|
|
@@ -85,7 +85,7 @@ var ChipsSelect = function(props) {
|
|
|
85
85
|
var showCreatable = Boolean(creatable && creatableText && !filteredOptions.length && fieldValue);
|
|
86
86
|
var handleFocus = function(e) {
|
|
87
87
|
setOpened(true);
|
|
88
|
-
setFocusedOptionIndex(
|
|
88
|
+
setFocusedOptionIndex(null);
|
|
89
89
|
onFocus(e);
|
|
90
90
|
};
|
|
91
91
|
var handleClickOutside = function(e) {
|
|
@@ -128,15 +128,13 @@ var ChipsSelect = function(props) {
|
|
|
128
128
|
setFocusedOptionIndex(index);
|
|
129
129
|
};
|
|
130
130
|
var focusOption = function(nextIndex, type) {
|
|
131
|
-
var index =
|
|
131
|
+
var index = nextIndex === null ? -1 : nextIndex;
|
|
132
132
|
if (type === FOCUS_ACTION_NEXT) {
|
|
133
133
|
index = index + 1;
|
|
134
134
|
} else if (type === FOCUS_ACTION_PREV) {
|
|
135
135
|
index = index - 1;
|
|
136
136
|
}
|
|
137
|
-
|
|
138
|
-
focusOptionByIndex(index, focusedOptionIndex);
|
|
139
|
-
}
|
|
137
|
+
focusOptionByIndex(index, focusedOptionIndex);
|
|
140
138
|
};
|
|
141
139
|
var handleKeyDown = function(e) {
|
|
142
140
|
onKeyDown(e);
|
|
@@ -191,21 +189,6 @@ var ChipsSelect = function(props) {
|
|
|
191
189
|
filteredOptions,
|
|
192
190
|
setFocusedOption
|
|
193
191
|
]);
|
|
194
|
-
_react.useEffect(function() {
|
|
195
|
-
var index = focusedOption ? filteredOptions.findIndex(function(param) {
|
|
196
|
-
var value = param.value;
|
|
197
|
-
return value === focusedOption.value;
|
|
198
|
-
}) : -1;
|
|
199
|
-
if (index === -1 && !!filteredOptions.length && !showCreatable && closeAfterSelect) {
|
|
200
|
-
setFocusedOption(filteredOptions[0]);
|
|
201
|
-
}
|
|
202
|
-
}, [
|
|
203
|
-
filteredOptions,
|
|
204
|
-
focusedOption,
|
|
205
|
-
showCreatable,
|
|
206
|
-
closeAfterSelect,
|
|
207
|
-
setFocusedOption
|
|
208
|
-
]);
|
|
209
192
|
(0, _useGlobalEventListener.useGlobalEventListener)(document, "click", handleClickOutside);
|
|
210
193
|
var renderChipWrapper = function(renderChipProps) {
|
|
211
194
|
if (renderChipProps === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useChipsSelect } from '../../hooks/useChipsSelect';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { useDOM } from '../../lib/dom';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipOption, ChipValue, RenderChip } from '../Chip/Chip';\nimport { ChipsInputProps } from '../ChipsInput/ChipsInput';\nimport { ChipsInputBase, chipsInputDefaultProps } from '../ChipsInputBase/ChipsInputBase';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormField } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './ChipsSelect.module.css';\n\nexport interface ChipsSelectProps<Option extends ChipOption>\n extends Omit<ChipsInputProps<Option>, 'after'> {\n popupDirection?: 'top' | 'bottom';\n options?: Option[];\n filterFn?:\n | false\n | ((\n value?: string,\n option?: Option,\n getOptionLabel?: Pick<ChipsInputProps<Option>, 'getOptionLabel'>['getOptionLabel'],\n ) => boolean);\n /**\n * Возможность создавать чипы которых нет в списке (по enter или с помощью пункта в меню, см creatableText)\n */\n creatable?: boolean;\n /**\n * Отрисовка лоадера вместо списка опций в выпадающем списке\n */\n fetching?: boolean;\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Показывать или скрывать уже выбранные опции\n */\n showSelected?: boolean;\n /**\n * Текст для пункта создающего чипы при клике, так же отвечает за то будет ли показан этот пункт (показывается после того как в списке не отсанется опций)\n */\n creatableText?: string;\n /**\n * Текст который показывается если список опций пуст\n */\n emptyText?: string;\n /**\n * Событие срабатывающее перед onChange\n */\n onChangeStart?: (e: React.MouseEvent | React.KeyboardEvent, option: Option) => void;\n /**\n * Закрытие выпадающего списка после выбора элемента\n */\n closeAfterSelect?: boolean;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n}\n\ntype FocusActionType = 'next' | 'prev';\n\nconst FOCUS_ACTION_NEXT: FocusActionType = 'next';\nconst FOCUS_ACTION_PREV: FocusActionType = 'prev';\n\nconst chipsSelectDefaultProps: ChipsSelectProps<any> = {\n ...chipsInputDefaultProps,\n emptyText: 'Ничего не найдено',\n creatableText: 'Создать значение',\n onChangeStart: noop,\n creatable: false,\n fetching: false,\n showSelected: true,\n closeAfterSelect: true,\n options: [],\n filterFn: defaultFilterFn,\n renderOption(props) {\n return <CustomSelectOption {...props} />;\n },\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ChipsSelect\n */\nexport const ChipsSelect = <Option extends ChipOption>(props: ChipsSelectProps<Option>) => {\n const propsWithDefault = { ...chipsSelectDefaultProps, ...props };\n const {\n style,\n onFocus,\n onKeyDown,\n className,\n fetching,\n renderOption,\n emptyText,\n getRef,\n getRootRef,\n disabled,\n placeholder,\n tabIndex,\n getOptionValue,\n getOptionLabel,\n showSelected,\n getNewOptionData,\n renderChip,\n popupDirection,\n creatable,\n filterFn,\n inputValue,\n creatableText,\n closeAfterSelect,\n onChangeStart,\n before,\n icon,\n options,\n fixDropdownWidth,\n forceDropdownPortal,\n ...restProps\n } = propsWithDefault;\n\n const { document } = useDOM();\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement | undefined>(undefined);\n\n const scrollBoxRef = React.useRef<HTMLDivElement>(null);\n const rootRef = useExternRef(getRef);\n const {\n fieldValue,\n selectedOptions = [],\n opened,\n setOpened,\n addOptionFromInput,\n filteredOptions,\n addOption,\n handleInputChange,\n clearInput,\n focusedOption,\n setFocusedOption,\n focusedOptionIndex,\n setFocusedOptionIndex,\n } = useChipsSelect(propsWithDefault);\n\n const showCreatable = Boolean(\n creatable && creatableText && !filteredOptions.length && fieldValue,\n );\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setOpened(true);\n setFocusedOptionIndex(0);\n onFocus!(e);\n };\n\n const handleClickOutside = (e: MouseEvent) => {\n if (e.target !== rootRef.current && !rootRef.current?.contains(e.target as Node)) {\n setOpened(false);\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\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 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) => {\n const { length } = filteredOptions;\n\n if (index < 0) {\n index = length - 1;\n } else if (index >= length) {\n index = 0;\n }\n\n if (index === oldIndex) {\n return;\n }\n\n scrollToElement(index);\n setFocusedOptionIndex(index);\n };\n\n const focusOption = (nextIndex: number | null, type: FocusActionType) => {\n let index = typeof nextIndex !== 'number' ? -1 : nextIndex;\n\n if (type === FOCUS_ACTION_NEXT) {\n index = index + 1;\n } else if (type === FOCUS_ACTION_PREV) {\n index = index - 1;\n }\n\n if (focusedOptionIndex != null) {\n focusOptionByIndex(index, focusedOptionIndex);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown!(e);\n\n if (e.key === 'ArrowUp' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_PREV);\n }\n }\n\n if (e.key === 'ArrowDown' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_NEXT);\n }\n }\n\n if (e.key === 'Enter' && !e.defaultPrevented && opened && focusedOptionIndex != null) {\n const option = filteredOptions[focusedOptionIndex];\n\n if (option) {\n onChangeStart!(e, option);\n\n if (!e.defaultPrevented) {\n addOption(option);\n setFocusedOptionIndex(null);\n clearInput();\n closeAfterSelect && setOpened(false);\n e.preventDefault();\n }\n } else if (!creatable) {\n e.preventDefault();\n }\n }\n\n if (['Escape', 'Tab'].includes(e.key) && !e.defaultPrevented && opened) {\n setOpened(false);\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex != null && filteredOptions[focusedOptionIndex]) {\n setFocusedOption(filteredOptions[focusedOptionIndex]);\n } else if (focusedOptionIndex === null || focusedOptionIndex === 0) {\n setFocusedOption(null);\n }\n }, [focusedOptionIndex, filteredOptions, setFocusedOption]);\n\n React.useEffect(() => {\n const index = focusedOption\n ? filteredOptions.findIndex(({ value }) => value === focusedOption.value)\n : -1;\n\n if (index === -1 && !!filteredOptions.length && !showCreatable && closeAfterSelect) {\n setFocusedOption(filteredOptions[0]);\n }\n }, [filteredOptions, focusedOption, showCreatable, closeAfterSelect, setFocusedOption]);\n\n useGlobalEventListener(document, 'click', handleClickOutside);\n\n const renderChipWrapper = (renderChipProps: RenderChip<Option> | undefined) => {\n if (renderChipProps === undefined) {\n return null;\n }\n const onRemoveWrapper = (e: React.MouseEvent | undefined, value: ChipValue | undefined) => {\n e?.preventDefault();\n e?.stopPropagation();\n\n renderChipProps.onRemove?.(e, value);\n };\n\n return renderChip!({\n ...renderChipProps,\n onRemove: onRemoveWrapper,\n });\n };\n\n const isPopperDirectionTop = popperPlacement?.includes('top');\n\n const onPlacementChange = React.useCallback(\n (placement?: Placement) => {\n setPopperPlacement(placement);\n },\n [setPopperPlacement],\n );\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const toggleOpened = () => {\n setOpened((prevOpened) => !prevOpened);\n };\n\n return (\n <>\n <FormField\n getRootRef={rootRef}\n style={style}\n className={classNames(\n styles['ChipsSelect'],\n opened &&\n (isPopperDirectionTop\n ? styles['ChipsSelect--pop-up']\n : styles['ChipsSelect--pop-down']),\n className,\n )}\n disabled={disabled}\n role=\"application\"\n aria-disabled={disabled}\n aria-readonly={restProps.readOnly}\n after={\n <IconButton\n className={styles['ChipsSelect__dropdown']}\n activeMode=\"\"\n hoverMode=\"\"\n // TODO: add label customization\n aria-label={opened ? 'Скрыть' : 'Развернуть'}\n onClick={toggleOpened}\n >\n {icon ?? <DropdownIcon className={styles['ChipsSelect__icon']} opened={opened} />}\n </IconButton>\n }\n before={before}\n >\n <ChipsInputBase\n {...restProps}\n tabIndex={tabIndex}\n value={selectedOptions}\n inputValue={fieldValue}\n getNewOptionData={getNewOptionData}\n getOptionLabel={getOptionLabel}\n getOptionValue={getOptionValue}\n renderChip={renderChipWrapper}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n getRef={getRef}\n disabled={disabled}\n onInputChange={handleInputChange}\n />\n </FormField>\n {opened && (\n <CustomSelectDropdown\n targetRef={rootRef}\n placement={popupDirection}\n scrollBoxRef={scrollBoxRef}\n onPlacementChange={onPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n >\n {showCreatable && (\n <CustomSelectOption\n hovered={focusedOptionIndex === 0}\n onMouseDown={addOptionFromInput}\n onMouseEnter={() => setFocusedOptionIndex(0)}\n >\n {creatableText}\n </CustomSelectOption>\n )}\n {!filteredOptions?.length && !showCreatable && emptyText ? (\n <Footnote className={styles['ChipsSelect__empty']}>{emptyText}</Footnote>\n ) : (\n filteredOptions.map((option: Option, index: number) => {\n const label = getOptionLabel!(option);\n const hovered =\n focusedOption && getOptionValue!(option) === getOptionValue!(focusedOption);\n const selected = selectedOptions.find((selectedOption: Option) => {\n return getOptionValue!(selectedOption) === getOptionValue!(option);\n });\n const value = getOptionValue!(option);\n\n return (\n <React.Fragment key={`${typeof value}-${value}`}>\n {renderOption!({\n option,\n hovered: Boolean(hovered),\n children: label,\n selected: !!selected,\n getRootRef: (e) => {\n if (e) {\n return (chipsSelectOptions[index] = e);\n }\n return undefined;\n },\n onMouseDown: (e: React.MouseEvent<HTMLDivElement>) => {\n onChangeStart?.(e, option);\n\n if (!e.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n clearInput();\n }\n },\n onMouseEnter: () => setFocusedOptionIndex(index),\n })}\n </React.Fragment>\n );\n })\n )}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["ChipsSelect","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","chipsSelectDefaultProps","chipsInputDefaultProps","emptyText","creatableText","onChangeStart","noop","creatable","fetching","showSelected","closeAfterSelect","options","filterFn","defaultFilterFn","renderOption","props","CustomSelectOption","propsWithDefault","style","onFocus","onKeyDown","className","getRef","getRootRef","disabled","placeholder","tabIndex","getOptionValue","getOptionLabel","getNewOptionData","renderChip","popupDirection","inputValue","before","icon","fixDropdownWidth","forceDropdownPortal","restProps","document","useDOM","React","useState","undefined","popperPlacement","setPopperPlacement","scrollBoxRef","useRef","rootRef","useExternRef","useChipsSelect","fieldValue","selectedOptions","opened","setOpened","addOptionFromInput","filteredOptions","addOption","handleInputChange","clearInput","focusedOption","setFocusedOption","focusedOptionIndex","setFocusedOptionIndex","showCreatable","Boolean","length","handleFocus","e","handleClickOutside","target","current","contains","chipsSelectOptions","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","handleKeyDown","key","defaultPrevented","preventDefault","option","includes","useEffect","findIndex","value","useGlobalEventListener","renderChipWrapper","renderChipProps","onRemoveWrapper","stopPropagation","onRemove","isPopperDirectionTop","onPlacementChange","useCallback","placement","onDropdownMouseLeave","toggleOpened","prevOpened","FormField","classNames","role","aria-disabled","aria-readonly","readOnly","after","IconButton","activeMode","hoverMode","aria-label","onClick","DropdownIcon","ChipsInputBase","onInputChange","CustomSelectDropdown","targetRef","onMouseLeave","sameWidth","forcePortal","hovered","onMouseDown","onMouseEnter","Footnote","map","label","selected","find","selectedOption","Fragment","children"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useChipsSelect } from '../../hooks/useChipsSelect';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { useDOM } from '../../lib/dom';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipOption, ChipValue, RenderChip } from '../Chip/Chip';\nimport { ChipsInputProps } from '../ChipsInput/ChipsInput';\nimport { ChipsInputBase, chipsInputDefaultProps } from '../ChipsInputBase/ChipsInputBase';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormField } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './ChipsSelect.module.css';\n\nexport interface ChipsSelectProps<Option extends ChipOption>\n extends Omit<ChipsInputProps<Option>, 'after'> {\n popupDirection?: 'top' | 'bottom';\n options?: Option[];\n filterFn?:\n | false\n | ((\n value?: string,\n option?: Option,\n getOptionLabel?: Pick<ChipsInputProps<Option>, 'getOptionLabel'>['getOptionLabel'],\n ) => boolean);\n /**\n * Возможность создавать чипы которых нет в списке (по enter или с помощью пункта в меню, см creatableText)\n */\n creatable?: boolean;\n /**\n * Отрисовка лоадера вместо списка опций в выпадающем списке\n */\n fetching?: boolean;\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Показывать или скрывать уже выбранные опции\n */\n showSelected?: boolean;\n /**\n * Текст для пункта создающего чипы при клике, так же отвечает за то будет ли показан этот пункт (показывается после того как в списке не отсанется опций)\n */\n creatableText?: string;\n /**\n * Текст который показывается если список опций пуст\n */\n emptyText?: string;\n /**\n * Событие срабатывающее перед onChange\n */\n onChangeStart?: (e: React.MouseEvent | React.KeyboardEvent, option: Option) => void;\n /**\n * Закрытие выпадающего списка после выбора элемента\n */\n closeAfterSelect?: boolean;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n}\n\ntype FocusActionType = 'next' | 'prev';\n\nconst FOCUS_ACTION_NEXT: FocusActionType = 'next';\nconst FOCUS_ACTION_PREV: FocusActionType = 'prev';\n\nconst chipsSelectDefaultProps: ChipsSelectProps<any> = {\n ...chipsInputDefaultProps,\n emptyText: 'Ничего не найдено',\n creatableText: 'Создать значение',\n onChangeStart: noop,\n creatable: false,\n fetching: false,\n showSelected: true,\n closeAfterSelect: true,\n options: [],\n filterFn: defaultFilterFn,\n renderOption(props) {\n return <CustomSelectOption {...props} />;\n },\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ChipsSelect\n */\nexport const ChipsSelect = <Option extends ChipOption>(props: ChipsSelectProps<Option>) => {\n const propsWithDefault = { ...chipsSelectDefaultProps, ...props };\n const {\n style,\n onFocus,\n onKeyDown,\n className,\n fetching,\n renderOption,\n emptyText,\n getRef,\n getRootRef,\n disabled,\n placeholder,\n tabIndex,\n getOptionValue,\n getOptionLabel,\n showSelected,\n getNewOptionData,\n renderChip,\n popupDirection,\n creatable,\n filterFn,\n inputValue,\n creatableText,\n closeAfterSelect,\n onChangeStart,\n before,\n icon,\n options,\n fixDropdownWidth,\n forceDropdownPortal,\n ...restProps\n } = propsWithDefault;\n\n const { document } = useDOM();\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement | undefined>(undefined);\n\n const scrollBoxRef = React.useRef<HTMLDivElement>(null);\n const rootRef = useExternRef(getRef);\n const {\n fieldValue,\n selectedOptions = [],\n opened,\n setOpened,\n addOptionFromInput,\n filteredOptions,\n addOption,\n handleInputChange,\n clearInput,\n focusedOption,\n setFocusedOption,\n focusedOptionIndex,\n setFocusedOptionIndex,\n } = useChipsSelect(propsWithDefault);\n\n const showCreatable = Boolean(\n creatable && creatableText && !filteredOptions.length && fieldValue,\n );\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setOpened(true);\n setFocusedOptionIndex(null);\n onFocus!(e);\n };\n\n const handleClickOutside = (e: MouseEvent) => {\n if (e.target !== rootRef.current && !rootRef.current?.contains(e.target as Node)) {\n setOpened(false);\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\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 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 const { length } = filteredOptions;\n\n if (index < 0) {\n index = length - 1;\n } else if (index >= length) {\n index = 0;\n }\n\n if (index === oldIndex) {\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 index = index + 1;\n } else if (type === FOCUS_ACTION_PREV) {\n index = index - 1;\n }\n\n focusOptionByIndex(index, focusedOptionIndex);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown!(e);\n\n if (e.key === 'ArrowUp' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_PREV);\n }\n }\n\n if (e.key === 'ArrowDown' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_NEXT);\n }\n }\n\n if (e.key === 'Enter' && !e.defaultPrevented && opened && focusedOptionIndex != null) {\n const option = filteredOptions[focusedOptionIndex];\n\n if (option) {\n onChangeStart!(e, option);\n\n if (!e.defaultPrevented) {\n addOption(option);\n setFocusedOptionIndex(null);\n clearInput();\n closeAfterSelect && setOpened(false);\n e.preventDefault();\n }\n } else if (!creatable) {\n e.preventDefault();\n }\n }\n\n if (['Escape', 'Tab'].includes(e.key) && !e.defaultPrevented && opened) {\n setOpened(false);\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex != null && filteredOptions[focusedOptionIndex]) {\n setFocusedOption(filteredOptions[focusedOptionIndex]);\n } else if (focusedOptionIndex === null || focusedOptionIndex === 0) {\n setFocusedOption(null);\n }\n }, [focusedOptionIndex, filteredOptions, setFocusedOption]);\n\n useGlobalEventListener(document, 'click', handleClickOutside);\n\n const renderChipWrapper = (renderChipProps: RenderChip<Option> | undefined) => {\n if (renderChipProps === undefined) {\n return null;\n }\n const onRemoveWrapper = (e: React.MouseEvent | undefined, value: ChipValue | undefined) => {\n e?.preventDefault();\n e?.stopPropagation();\n\n renderChipProps.onRemove?.(e, value);\n };\n\n return renderChip!({\n ...renderChipProps,\n onRemove: onRemoveWrapper,\n });\n };\n\n const isPopperDirectionTop = popperPlacement?.includes('top');\n\n const onPlacementChange = React.useCallback(\n (placement?: Placement) => {\n setPopperPlacement(placement);\n },\n [setPopperPlacement],\n );\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const toggleOpened = () => {\n setOpened((prevOpened) => !prevOpened);\n };\n\n return (\n <>\n <FormField\n getRootRef={rootRef}\n style={style}\n className={classNames(\n styles['ChipsSelect'],\n opened &&\n (isPopperDirectionTop\n ? styles['ChipsSelect--pop-up']\n : styles['ChipsSelect--pop-down']),\n className,\n )}\n disabled={disabled}\n role=\"application\"\n aria-disabled={disabled}\n aria-readonly={restProps.readOnly}\n after={\n <IconButton\n className={styles['ChipsSelect__dropdown']}\n activeMode=\"\"\n hoverMode=\"\"\n // TODO: add label customization\n aria-label={opened ? 'Скрыть' : 'Развернуть'}\n onClick={toggleOpened}\n >\n {icon ?? <DropdownIcon className={styles['ChipsSelect__icon']} opened={opened} />}\n </IconButton>\n }\n before={before}\n >\n <ChipsInputBase\n {...restProps}\n tabIndex={tabIndex}\n value={selectedOptions}\n inputValue={fieldValue}\n getNewOptionData={getNewOptionData}\n getOptionLabel={getOptionLabel}\n getOptionValue={getOptionValue}\n renderChip={renderChipWrapper}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n getRef={getRef}\n disabled={disabled}\n onInputChange={handleInputChange}\n />\n </FormField>\n {opened && (\n <CustomSelectDropdown\n targetRef={rootRef}\n placement={popupDirection}\n scrollBoxRef={scrollBoxRef}\n onPlacementChange={onPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n >\n {showCreatable && (\n <CustomSelectOption\n hovered={focusedOptionIndex === 0}\n onMouseDown={addOptionFromInput}\n onMouseEnter={() => setFocusedOptionIndex(0)}\n >\n {creatableText}\n </CustomSelectOption>\n )}\n {!filteredOptions?.length && !showCreatable && emptyText ? (\n <Footnote className={styles['ChipsSelect__empty']}>{emptyText}</Footnote>\n ) : (\n filteredOptions.map((option: Option, index: number) => {\n const label = getOptionLabel!(option);\n const hovered =\n focusedOption && getOptionValue!(option) === getOptionValue!(focusedOption);\n const selected = selectedOptions.find((selectedOption: Option) => {\n return getOptionValue!(selectedOption) === getOptionValue!(option);\n });\n const value = getOptionValue!(option);\n\n return (\n <React.Fragment key={`${typeof value}-${value}`}>\n {renderOption!({\n option,\n hovered: Boolean(hovered),\n children: label,\n selected: !!selected,\n getRootRef: (e) => {\n if (e) {\n return (chipsSelectOptions[index] = e);\n }\n return undefined;\n },\n onMouseDown: (e: React.MouseEvent<HTMLDivElement>) => {\n onChangeStart?.(e, option);\n\n if (!e.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n clearInput();\n }\n },\n onMouseEnter: () => setFocusedOptionIndex(index),\n })}\n </React.Fragment>\n );\n })\n )}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["ChipsSelect","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","chipsSelectDefaultProps","chipsInputDefaultProps","emptyText","creatableText","onChangeStart","noop","creatable","fetching","showSelected","closeAfterSelect","options","filterFn","defaultFilterFn","renderOption","props","CustomSelectOption","propsWithDefault","style","onFocus","onKeyDown","className","getRef","getRootRef","disabled","placeholder","tabIndex","getOptionValue","getOptionLabel","getNewOptionData","renderChip","popupDirection","inputValue","before","icon","fixDropdownWidth","forceDropdownPortal","restProps","document","useDOM","React","useState","undefined","popperPlacement","setPopperPlacement","scrollBoxRef","useRef","rootRef","useExternRef","useChipsSelect","fieldValue","selectedOptions","opened","setOpened","addOptionFromInput","filteredOptions","addOption","handleInputChange","clearInput","focusedOption","setFocusedOption","focusedOptionIndex","setFocusedOptionIndex","showCreatable","Boolean","length","handleFocus","e","handleClickOutside","target","current","contains","chipsSelectOptions","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","handleKeyDown","key","defaultPrevented","preventDefault","option","includes","useEffect","useGlobalEventListener","renderChipWrapper","renderChipProps","onRemoveWrapper","value","stopPropagation","onRemove","isPopperDirectionTop","onPlacementChange","useCallback","placement","onDropdownMouseLeave","toggleOpened","prevOpened","FormField","classNames","role","aria-disabled","aria-readonly","readOnly","after","IconButton","activeMode","hoverMode","aria-label","onClick","DropdownIcon","ChipsInputBase","onInputChange","CustomSelectDropdown","targetRef","onMouseLeave","sameWidth","forcePortal","hovered","onMouseDown","onMouseEnter","Footnote","map","label","selected","find","selectedOption","Fragment","children"],"mappings":"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"}
|
|
@@ -278,12 +278,24 @@ function CustomSelect(props) {
|
|
|
278
278
|
var item = options[focusedOptionIndex];
|
|
279
279
|
setNativeSelectValue(item === null || item === void 0 ? void 0 : item.value);
|
|
280
280
|
close();
|
|
281
|
+
var shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync = isControlledOutside && props.value !== nativeSelectValue && nativeSelectValue === (item === null || item === void 0 ? void 0 : item.value);
|
|
282
|
+
if (shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync) {
|
|
283
|
+
var _selectElRef_current;
|
|
284
|
+
var event = new Event("change", {
|
|
285
|
+
bubbles: true
|
|
286
|
+
});
|
|
287
|
+
(_selectElRef_current = selectElRef.current) === null || _selectElRef_current === void 0 ? void 0 : _selectElRef_current.dispatchEvent(event);
|
|
288
|
+
}
|
|
281
289
|
}
|
|
282
290
|
}, [
|
|
283
291
|
close,
|
|
284
292
|
focusedOptionIndex,
|
|
285
293
|
isValidIndex,
|
|
286
|
-
options
|
|
294
|
+
options,
|
|
295
|
+
selectElRef,
|
|
296
|
+
isControlledOutside,
|
|
297
|
+
props.value,
|
|
298
|
+
nativeSelectValue
|
|
287
299
|
]);
|
|
288
300
|
var open = _react.useCallback(function() {
|
|
289
301
|
setOpened(true);
|
|
@@ -542,7 +554,9 @@ function CustomSelect(props) {
|
|
|
542
554
|
renderDropdown,
|
|
543
555
|
renderOption
|
|
544
556
|
]);
|
|
545
|
-
var
|
|
557
|
+
var controlledValueSet = isControlledOutside && props.value !== "";
|
|
558
|
+
var uncontrolledValueSet = !isControlledOutside && nativeSelectValue !== "";
|
|
559
|
+
var clearButtonShown = allowClearButton && !opened && (controlledValueSet || uncontrolledValueSet);
|
|
546
560
|
var clearButton = _react.useMemo(function() {
|
|
547
561
|
if (!clearButtonShown) {
|
|
548
562
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { SizeType } from '../../lib/adaptivity';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { defaultFilterFn, getFormFieldModeFromSelectType } from '../../lib/select';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { debounce, getTitleFromChildren } from '../../lib/utils';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { TrackerOptionsProps } from '../CustomScrollView/useTrackerVisibility';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormFieldProps } from '../FormField/FormField';\nimport { Input } from '../Input/Input';\nimport { NativeSelectProps } from '../NativeSelect/NativeSelect';\nimport { SelectType } from '../Select/Select';\nimport { SelectMimicry } from '../SelectMimicry/SelectMimicry';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { CustomSelectClearButton, CustomSelectClearButtonProps } from './CustomSelectClearButton';\nimport styles from './CustomSelect.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelect--sizeY-none'],\n [SizeType.COMPACT]: styles['CustomSelect--sizeY-compact'],\n};\n\nconst findIndexAfter = (options: CustomSelectOptionInterface[] = [], startIndex = -1) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex((option, i) => i > startIndex && !option.disabled);\n};\n\nconst findIndexBefore = (\n options: CustomSelectOptionInterface[] = [],\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 (!option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nconst warn = warnOnce('CustomSelect');\n\nconst checkOptionsValueType = (options: CustomSelectOptionInterface[]) => {\n if (new Set(options.map((item) => typeof item.value)).size > 1) {\n warn(\n 'Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.',\n 'error',\n );\n }\n};\n\nfunction defaultRenderOptionFn({ option, ...props }: CustomSelectOptionProps): React.ReactNode {\n return <CustomSelectOption {...props} />;\n}\n\nconst handleOptionDown: MouseEventHandler = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n};\n\nfunction findSelectedIndex(\n options: CustomSelectOptionInterface[],\n value: SelectValue,\n withClear: boolean,\n) {\n if (withClear && value === '') {\n return -1;\n }\n return (\n options.findIndex((item) => {\n value = typeof item.value === 'number' ? Number(value) : value;\n return item.value === value;\n }) ?? -1\n );\n}\n\nconst filter = (\n options: SelectProps['options'],\n inputValue: string,\n filterFn: SelectProps['filterFn'],\n) => {\n return typeof filterFn === 'function'\n ? options.filter((option) => filterFn(inputValue, option))\n : options;\n};\n\nconst defaultOptions: CustomSelectOptionInterface[] = [];\n\ntype SelectValue = React.SelectHTMLAttributes<HTMLSelectElement>['value'];\n\nexport interface CustomSelectOptionInterface {\n value: SelectValue;\n label: React.ReactElement | string;\n disabled?: boolean;\n [index: string]: any;\n}\n\nexport interface SelectProps extends NativeSelectProps, FormFieldProps, TrackerOptionsProps {\n /**\n * Если `true`, то при клике на селект в нём появится текстовое поле для поиска по `options`. По умолчанию поиск\n * производится по `option.label`.\n */\n searchable?: boolean;\n /**\n * Текст, который будет отображен, если приходит пустой `options`.\n */\n emptyText?: string;\n /**\n * > ⚠️ В v6 из возвращаемых типов будет удалён `CustomSelectOptionInterface[]`. Для кастомной фильтрации используйте\n * > `filterFn`.\n */\n onInputChange?: (\n e: React.ChangeEvent,\n options: CustomSelectOptionInterface[],\n ) => void | CustomSelectOptionInterface[];\n options: CustomSelectOptionInterface[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?:\n | false\n | ((\n value: string,\n option: CustomSelectOptionInterface,\n getOptionLabel?: (option: Partial<CustomSelectOptionInterface>) => string,\n ) => boolean);\n popupDirection?: 'top' | 'bottom';\n /**\n * Рендер-проп для кастомного рендера опции.\n * В объекте аргумента приходят [свойства опции](https://vkcom.github.io/VKUI/#/CustomSelectOption?id=props)\n */\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций в виде скроллящегося блока.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Если `true`, то в дропдауне вместо списка опций рисуется спиннер. При переданных `renderDropdown` и `fetching: true`\n * \"победит\" `renderDropdown`.\n */\n fetching?: boolean;\n onClose?: VoidFunction;\n onOpen?: VoidFunction;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n /**\n * Кастомная кнопка для очистки значения.\n * Должна принимать обязательное свойство `onClick`\n */\n ClearButton?: React.ComponentType<CustomSelectClearButtonProps>;\n /**\n * Если `true`, то справа будет отображаться кнопка для очистки значения\n */\n allowClearButton?: boolean;\n dropdownOffsetDistance?: number;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n selectType?: SelectType;\n}\n\ntype MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelect\n */\nexport function CustomSelect(props: SelectProps) {\n const [opened, setOpened] = React.useState(false);\n const {\n before,\n name,\n className,\n getRef,\n getRootRef,\n popupDirection,\n style,\n onChange,\n children,\n onInputChange: onInputChangeProp,\n renderDropdown,\n onOpen,\n onClose,\n fetching,\n forceDropdownPortal,\n selectType = 'default',\n autoHideScrollbar,\n autoHideScrollbarDelay,\n searchable = false,\n renderOption: renderOptionProp = defaultRenderOptionFn,\n options: optionsProp = defaultOptions,\n emptyText = 'Ничего не найдено',\n filterFn = defaultFilterFn,\n icon: iconProp,\n ClearButton = CustomSelectClearButton,\n allowClearButton = false,\n dropdownOffsetDistance = 0,\n fixDropdownWidth = true,\n ...restProps\n } = props;\n\n if (process.env.NODE_ENV === 'development') {\n checkOptionsValueType(optionsProp);\n }\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const containerRef = React.useRef<HTMLLabelElement>(null);\n const handleRootRef = useExternRef(containerRef, getRootRef);\n const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);\n const selectElRef = useExternRef(getRef);\n\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<number | undefined>(-1);\n const [isControlledOutside, setIsControlledOutside] = React.useState(props.value !== undefined);\n const [inputValue, setInputValue] = React.useState('');\n const [nativeSelectValue, setNativeSelectValue] = React.useState(\n () => props.value ?? props.defaultValue ?? (allowClearButton ? '' : undefined),\n );\n const [keyboardInput, setKeyboardInput] = React.useState('');\n const [popperPlacement, setPopperPlacement] = React.useState<PlacementWithAuto | undefined>(\n undefined,\n );\n const [options, setOptions] = React.useState(optionsProp);\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<number | undefined>(\n findSelectedIndex(optionsProp, props.value ?? props.defaultValue, allowClearButton),\n );\n\n React.useEffect(() => {\n setIsControlledOutside(props.value !== undefined);\n setNativeSelectValue((nativeSelectValue) => props.value ?? nativeSelectValue);\n }, [props.value]);\n\n useIsomorphicLayoutEffect(() => {\n if (\n options.some(({ value }) => nativeSelectValue === value) ||\n (allowClearButton && nativeSelectValue === '')\n ) {\n const event = new Event('change', { bubbles: true });\n\n selectElRef.current?.dispatchEvent(event);\n }\n }, [nativeSelectValue]);\n\n const selected = React.useMemo(() => {\n if (!options.length) {\n return null;\n }\n\n return selectedOptionIndex !== undefined ? options[selectedOptionIndex] : undefined;\n }, [options, selectedOptionIndex]);\n\n const openedClassNames = React.useMemo(\n () =>\n classNames(\n opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement?.includes('top')\n ? styles['CustomSelect--pop-up']\n : styles['CustomSelect--pop-down']),\n ),\n [dropdownOffsetDistance, opened, popperPlacement],\n );\n\n const resetKeyboardInput = React.useCallback(() => {\n setKeyboardInput('');\n }, []);\n\n const scrollToElement = React.useCallback((index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = dropdown ? (dropdown.children[index] as HTMLElement) : null;\n\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 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 isValidIndex = React.useCallback(\n (index: number) => {\n return index >= 0 && index < (options.length ?? 0);\n },\n [options.length],\n );\n\n const focusOptionByIndex = React.useCallback(\n (index: number | undefined, scrollTo = true) => {\n if (index === undefined || index < 0 || index > (options.length ?? 0) - 1) {\n return;\n }\n\n const option = options[index];\n\n if (option?.disabled) {\n return;\n }\n\n if (scrollTo) {\n scrollToElement(index);\n }\n\n // Это оптимизация, прежде всего, под `onMouseOver`\n setFocusedOptionIndex((focusedOptionIndex) =>\n focusedOptionIndex !== index ? index : focusedOptionIndex,\n );\n },\n [options, scrollToElement],\n );\n\n const areOptionsShown = React.useCallback(() => {\n return scrollBoxRef.current !== null;\n }, []);\n\n const setScrollBoxRef = React.useCallback(\n (ref: HTMLDivElement | null) => {\n scrollBoxRef.current = ref;\n\n if (ref && selectedOptionIndex !== undefined && isValidIndex(selectedOptionIndex)) {\n {\n scrollToElement(selectedOptionIndex, true);\n }\n }\n },\n [isValidIndex, scrollToElement, selectedOptionIndex],\n );\n\n const onKeyboardInput = React.useCallback(\n (key: string) => {\n const fullInput = keyboardInput + key;\n\n const optionIndex = options.findIndex((option) => {\n return getTitleFromChildren(option.label).toLowerCase().includes(fullInput);\n });\n\n if (optionIndex !== undefined && optionIndex > -1) {\n focusOptionByIndex(optionIndex);\n }\n\n setKeyboardInput(fullInput);\n },\n [focusOptionByIndex, keyboardInput, options],\n );\n\n /**\n * Note: сбрасывать `options` через `setOptions(optionsProp)` не нужно.\n * Сброс происходит в одном из эффекте `updateOptionsAndSelectedOptionIndex()`.\n */\n const close = React.useCallback(() => {\n resetKeyboardInput();\n\n setInputValue('');\n setOpened(false);\n setFocusedOptionIndex(-1);\n onClose?.();\n }, [onClose, resetKeyboardInput]);\n\n const selectFocused = React.useCallback(() => {\n if (focusedOptionIndex !== undefined && isValidIndex(focusedOptionIndex)) {\n const item = options[focusedOptionIndex];\n\n setNativeSelectValue(item?.value);\n close();\n }\n }, [close, focusedOptionIndex, isValidIndex, options]);\n\n const open = React.useCallback(() => {\n setOpened(true);\n setFocusedOptionIndex(selectedOptionIndex);\n\n if (typeof onOpen === 'function') {\n onOpen();\n }\n }, [onOpen, selectedOptionIndex]);\n\n const onBlur = React.useCallback(() => {\n close();\n const event = new Event('blur');\n selectElRef.current?.dispatchEvent(event);\n }, [close, selectElRef]);\n\n const resetFocusedOption = React.useCallback(() => {\n setFocusedOptionIndex(-1);\n }, []);\n\n const onFocus = React.useCallback(() => {\n const event = new Event('focus');\n selectElRef.current?.dispatchEvent(event);\n }, [selectElRef]);\n\n const onClick = React.useCallback(() => {\n if (opened) {\n close();\n } else {\n open();\n }\n }, [close, open, opened]);\n\n const handleKeyUp = React.useMemo(() => debounce(resetKeyboardInput, 1000), [resetKeyboardInput]);\n\n const focusOption = React.useCallback(\n (type: 'next' | 'prev') => {\n let index = focusedOptionIndex;\n\n if (type === 'next') {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === 'prev') {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index);\n },\n [focusOptionByIndex, focusedOptionIndex, options],\n );\n\n React.useEffect(\n function updateOptionsAndSelectedOptionIndex() {\n const value = props.value ?? nativeSelectValue ?? props.defaultValue;\n\n const options =\n searchable && inputValue !== undefined\n ? filter(optionsProp, inputValue, filterFn)\n : optionsProp;\n\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, value, allowClearButton));\n },\n [\n filterFn,\n inputValue,\n nativeSelectValue,\n optionsProp,\n props.defaultValue,\n props.value,\n searchable,\n allowClearButton,\n ],\n );\n\n /**\n * Нужен для правильного поведения обработчика onClick на select. Фильтрует клики, которые были сделаны по\n * выпадающему списку.\n */\n const onLabelClick = React.useCallback((e: React.MouseEvent<HTMLLabelElement>) => {\n if (scrollBoxRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }, []);\n\n const onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {\n const newSelectedOptionIndex = findSelectedIndex(\n options,\n e.currentTarget.value,\n allowClearButton,\n );\n\n if (selectedOptionIndex !== newSelectedOptionIndex) {\n if (!isControlledOutside) {\n setSelectedOptionIndex(newSelectedOptionIndex);\n }\n onChange?.(e);\n }\n };\n\n const onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> = React.useCallback(\n (event) => {\n ['ArrowUp', 'ArrowDown', 'Escape', 'Enter'].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case 'ArrowUp':\n areOptionsShown() && focusOption('prev');\n break;\n case 'ArrowDown':\n areOptionsShown() && focusOption('next');\n break;\n case 'Escape':\n close();\n break;\n case 'Enter':\n areOptionsShown() && selectFocused();\n break;\n }\n },\n [areOptionsShown, close, focusOption, selectFocused],\n );\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n // TODO [>=6]: удалить `onInputChangeProp`.\n if (onInputChangeProp) {\n const options = onInputChangeProp(e, optionsProp);\n if (options) {\n if (process.env.NODE_ENV === 'development') {\n warn(\n 'Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет ' +\n 'проигнорировано в v6.0.0. Для фильтрации обновляйте props.options самостоятельно или используйте свойство filterFn.',\n );\n }\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue, allowClearButton));\n }\n } else {\n const options = filter(optionsProp, e.target.value, filterFn);\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue, allowClearButton));\n }\n setInputValue(e.target.value);\n },\n [filterFn, nativeSelectValue, onInputChangeProp, optionsProp, allowClearButton],\n );\n\n const handleKeyDownSelect = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key.length === 1 && event.key !== ' ') {\n onKeyboardInput(event.key);\n return;\n }\n\n ['ArrowUp', 'ArrowDown', 'Escape', 'Enter'].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case 'ArrowUp':\n if (opened) {\n areOptionsShown() && focusOption('prev');\n } else {\n open();\n }\n break;\n case 'ArrowDown':\n if (opened) {\n areOptionsShown() && focusOption('next');\n } else {\n open();\n }\n break;\n case 'Escape':\n close();\n break;\n case 'Enter':\n case 'Spacebar':\n case ' ':\n if (opened) {\n areOptionsShown() && selectFocused();\n } else {\n open();\n }\n break;\n }\n },\n [areOptionsShown, close, focusOption, onKeyboardInput, open, opened, selectFocused],\n );\n\n const handleOptionClick = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n const index = Array.prototype.indexOf.call(\n e.currentTarget.parentNode?.children,\n e.currentTarget,\n );\n const option = options[index];\n\n if (option && !option.disabled) {\n selectFocused();\n }\n },\n [options, selectFocused],\n );\n\n const handleOptionHover = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n focusOptionByIndex(\n Array.prototype.indexOf.call(e.currentTarget.parentNode?.children, e.currentTarget),\n false,\n );\n },\n [focusOptionByIndex],\n );\n\n const renderOption = React.useCallback(\n (option: CustomSelectOptionInterface, index: number) => {\n const hovered = index === focusedOptionIndex;\n const selected = index === selectedOptionIndex;\n\n return (\n <React.Fragment key={`${option.value}`}>\n {renderOptionProp({\n option,\n hovered,\n children: option.label,\n selected,\n disabled: option.disabled,\n onClick: handleOptionClick,\n onMouseDown: handleOptionDown,\n // Используем `onMouseOver` вместо `onMouseEnter`.\n // При параметре `searchable`, обновляется \"ребёнок\", из-за чего `onMouseEnter` не срабатывает в следующих кейсах:\n // 1. До загрузки выпадающего списка, курсор мышки находится над произвольным элементом этого списка.\n // > Лечение: только увод курсора мыши и возвращении его обратно вызывает событие `onMouseEnter` на этот элемент.\n // 2. Если это тач-устройство.\n // > Лечение: нужно нажать на какой-нибудь произвольный элемент списка, после чего `onMouseEnter` будет работать на соседние элементы,\n // но не на тот, на который нажали в первый раз.\n // Более подробно по ссылке https://github.com/facebook/react/issues/13956#issuecomment-1082055744\n onMouseOver: handleOptionHover,\n })}\n </React.Fragment>\n );\n },\n [\n focusedOptionIndex,\n handleOptionClick,\n handleOptionHover,\n renderOptionProp,\n selectedOptionIndex,\n ],\n );\n\n const resolvedContent = React.useMemo(() => {\n const defaultDropdownContent =\n options?.length > 0 ? (\n options.map(renderOption)\n ) : (\n <Footnote className={styles['CustomSelect__empty']}>{emptyText}</Footnote>\n );\n\n if (typeof renderDropdown === 'function') {\n return renderDropdown({ defaultDropdownContent });\n } else {\n return defaultDropdownContent;\n }\n }, [emptyText, options, renderDropdown, renderOption]);\n\n const clearButtonShown = allowClearButton && !opened && nativeSelectValue !== '';\n\n const clearButton = React.useMemo(() => {\n if (!clearButtonShown) {\n return null;\n }\n\n return (\n <ClearButton\n className={iconProp === undefined ? styles['CustomSelect--clear-icon'] : undefined}\n onClick={() => setNativeSelectValue('')}\n />\n );\n }, [clearButtonShown, ClearButton, iconProp]);\n\n const icon = React.useMemo(() => {\n if (iconProp !== undefined) {\n return iconProp;\n }\n\n return (\n <DropdownIcon\n className={clearButtonShown ? styles['CustomSelect__dropdown-icon'] : undefined}\n opened={opened}\n />\n );\n }, [clearButtonShown, iconProp, opened]);\n\n const afterIcons = (icon || clearButtonShown) && (\n <React.Fragment>\n {clearButton}\n {icon}\n </React.Fragment>\n );\n\n return (\n <label\n className={classNames(\n styles['CustomSelect'],\n sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY],\n className,\n )}\n style={style}\n ref={handleRootRef}\n onClick={onLabelClick}\n >\n {opened && searchable ? (\n <Input\n {...restProps}\n autoFocus\n onBlur={onBlur}\n className={openedClassNames}\n value={inputValue}\n onKeyDown={onInputKeyDown}\n onChange={onInputChange}\n // TODO Ожидается, что клик поймает нативный select, но его перехватывает Input. К сожалению, это приводит к конфликтам типизации.\n // TODO Нужно перестать пытаться превратить CustomSelect в select. Тогда эта проблема уйдёт.\n // @ts-expect-error: TS2322 MouseEventHandler<HTMLSelectElement> !== MouseEventHandler<HTMLInputElement>\n onClick={props.onClick}\n before={before}\n after={afterIcons}\n mode={getFormFieldModeFromSelectType(selectType)}\n />\n ) : (\n <SelectMimicry\n {...restProps}\n aria-hidden\n onClick={onClick}\n onKeyDown={handleKeyDownSelect}\n onKeyUp={handleKeyUp}\n onFocus={onFocus}\n onBlur={onBlur}\n className={openedClassNames}\n before={before}\n after={afterIcons}\n selectType={selectType}\n >\n {selected?.label}\n </SelectMimicry>\n )}\n <select\n ref={selectElRef}\n name={name}\n onChange={onNativeSelectChange}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n onClick={props.onClick}\n value={nativeSelectValue}\n aria-hidden\n className={styles['CustomSelect__control']}\n >\n {allowClearButton && <option key=\"\" value=\"\" />}\n {optionsProp.map((item) => (\n <option key={`${item.value}`} value={item.value} />\n ))}\n </select>\n {opened && (\n <CustomSelectDropdown\n targetRef={containerRef}\n placement={popupDirection}\n scrollBoxRef={setScrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetFocusedOption}\n fetching={fetching}\n offsetDistance={dropdownOffsetDistance}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n autoHideScrollbar={autoHideScrollbar}\n autoHideScrollbarDelay={autoHideScrollbarDelay}\n >\n {resolvedContent}\n </CustomSelectDropdown>\n )}\n </label>\n );\n}\n"],"names":["CustomSelect","sizeYClassNames","none","SizeType","COMPACT","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","warnOnce","checkOptionsValueType","Set","map","item","value","size","defaultRenderOptionFn","props","CustomSelectOption","handleOptionDown","e","preventDefault","findSelectedIndex","withClear","Number","filter","inputValue","filterFn","defaultOptions","React","useState","opened","setOpened","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChange","onInputChangeProp","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","autoHideScrollbar","autoHideScrollbarDelay","searchable","renderOptionProp","renderOption","optionsProp","emptyText","defaultFilterFn","icon","iconProp","ClearButton","CustomSelectClearButton","allowClearButton","dropdownOffsetDistance","fixDropdownWidth","restProps","process","env","NODE_ENV","useAdaptivity","sizeY","containerRef","useRef","handleRootRef","useExternRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","undefined","isControlledOutside","setIsControlledOutside","setInputValue","defaultValue","nativeSelectValue","setNativeSelectValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","useIsomorphicLayoutEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","classNames","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","getTitleFromChildren","label","toLowerCase","close","selectFocused","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","debounce","focusOption","type","nextIndex","beforeIndex","updateOptionsAndSelectedOptionIndex","onLabelClick","contains","target","onNativeSelectChange","newSelectedOptionIndex","currentTarget","onInputKeyDown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","handleOptionHover","hovered","Fragment","onMouseDown","onMouseOver","resolvedContent","defaultDropdownContent","Footnote","clearButtonShown","clearButton","DropdownIcon","afterIcons","REGULAR","Input","autoFocus","onKeyDown","after","mode","getFormFieldModeFromSelectType","SelectMimicry","aria-hidden","onKeyUp","select","CustomSelectDropdown","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","sameWidth","forcePortal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { SizeType } from '../../lib/adaptivity';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { defaultFilterFn, getFormFieldModeFromSelectType } from '../../lib/select';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { debounce, getTitleFromChildren } from '../../lib/utils';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { TrackerOptionsProps } from '../CustomScrollView/useTrackerVisibility';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormFieldProps } from '../FormField/FormField';\nimport { Input } from '../Input/Input';\nimport { NativeSelectProps } from '../NativeSelect/NativeSelect';\nimport { SelectType } from '../Select/Select';\nimport { SelectMimicry } from '../SelectMimicry/SelectMimicry';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { CustomSelectClearButton, CustomSelectClearButtonProps } from './CustomSelectClearButton';\nimport styles from './CustomSelect.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelect--sizeY-none'],\n [SizeType.COMPACT]: styles['CustomSelect--sizeY-compact'],\n};\n\nconst findIndexAfter = (options: CustomSelectOptionInterface[] = [], startIndex = -1) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex((option, i) => i > startIndex && !option.disabled);\n};\n\nconst findIndexBefore = (\n options: CustomSelectOptionInterface[] = [],\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 (!option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nconst warn = warnOnce('CustomSelect');\n\nconst checkOptionsValueType = (options: CustomSelectOptionInterface[]) => {\n if (new Set(options.map((item) => typeof item.value)).size > 1) {\n warn(\n 'Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.',\n 'error',\n );\n }\n};\n\nfunction defaultRenderOptionFn({ option, ...props }: CustomSelectOptionProps): React.ReactNode {\n return <CustomSelectOption {...props} />;\n}\n\nconst handleOptionDown: MouseEventHandler = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n};\n\nfunction findSelectedIndex(\n options: CustomSelectOptionInterface[],\n value: SelectValue,\n withClear: boolean,\n) {\n if (withClear && value === '') {\n return -1;\n }\n return (\n options.findIndex((item) => {\n value = typeof item.value === 'number' ? Number(value) : value;\n return item.value === value;\n }) ?? -1\n );\n}\n\nconst filter = (\n options: SelectProps['options'],\n inputValue: string,\n filterFn: SelectProps['filterFn'],\n) => {\n return typeof filterFn === 'function'\n ? options.filter((option) => filterFn(inputValue, option))\n : options;\n};\n\nconst defaultOptions: CustomSelectOptionInterface[] = [];\n\ntype SelectValue = React.SelectHTMLAttributes<HTMLSelectElement>['value'];\n\nexport interface CustomSelectOptionInterface {\n value: SelectValue;\n label: React.ReactElement | string;\n disabled?: boolean;\n [index: string]: any;\n}\n\nexport interface SelectProps extends NativeSelectProps, FormFieldProps, TrackerOptionsProps {\n /**\n * Если `true`, то при клике на селект в нём появится текстовое поле для поиска по `options`. По умолчанию поиск\n * производится по `option.label`.\n */\n searchable?: boolean;\n /**\n * Текст, который будет отображен, если приходит пустой `options`.\n */\n emptyText?: string;\n /**\n * > ⚠️ В v6 из возвращаемых типов будет удалён `CustomSelectOptionInterface[]`. Для кастомной фильтрации используйте\n * > `filterFn`.\n */\n onInputChange?: (\n e: React.ChangeEvent,\n options: CustomSelectOptionInterface[],\n ) => void | CustomSelectOptionInterface[];\n options: CustomSelectOptionInterface[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?:\n | false\n | ((\n value: string,\n option: CustomSelectOptionInterface,\n getOptionLabel?: (option: Partial<CustomSelectOptionInterface>) => string,\n ) => boolean);\n popupDirection?: 'top' | 'bottom';\n /**\n * Рендер-проп для кастомного рендера опции.\n * В объекте аргумента приходят [свойства опции](https://vkcom.github.io/VKUI/#/CustomSelectOption?id=props)\n */\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций в виде скроллящегося блока.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Если `true`, то в дропдауне вместо списка опций рисуется спиннер. При переданных `renderDropdown` и `fetching: true`\n * \"победит\" `renderDropdown`.\n */\n fetching?: boolean;\n onClose?: VoidFunction;\n onOpen?: VoidFunction;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n /**\n * Кастомная кнопка для очистки значения.\n * Должна принимать обязательное свойство `onClick`\n */\n ClearButton?: React.ComponentType<CustomSelectClearButtonProps>;\n /**\n * Если `true`, то справа будет отображаться кнопка для очистки значения\n */\n allowClearButton?: boolean;\n dropdownOffsetDistance?: number;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n selectType?: SelectType;\n}\n\ntype MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelect\n */\nexport function CustomSelect(props: SelectProps) {\n const [opened, setOpened] = React.useState(false);\n const {\n before,\n name,\n className,\n getRef,\n getRootRef,\n popupDirection,\n style,\n onChange,\n children,\n onInputChange: onInputChangeProp,\n renderDropdown,\n onOpen,\n onClose,\n fetching,\n forceDropdownPortal,\n selectType = 'default',\n autoHideScrollbar,\n autoHideScrollbarDelay,\n searchable = false,\n renderOption: renderOptionProp = defaultRenderOptionFn,\n options: optionsProp = defaultOptions,\n emptyText = 'Ничего не найдено',\n filterFn = defaultFilterFn,\n icon: iconProp,\n ClearButton = CustomSelectClearButton,\n allowClearButton = false,\n dropdownOffsetDistance = 0,\n fixDropdownWidth = true,\n ...restProps\n } = props;\n\n if (process.env.NODE_ENV === 'development') {\n checkOptionsValueType(optionsProp);\n }\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const containerRef = React.useRef<HTMLLabelElement>(null);\n const handleRootRef = useExternRef(containerRef, getRootRef);\n const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);\n const selectElRef = useExternRef(getRef);\n\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<number | undefined>(-1);\n const [isControlledOutside, setIsControlledOutside] = React.useState(props.value !== undefined);\n const [inputValue, setInputValue] = React.useState('');\n const [nativeSelectValue, setNativeSelectValue] = React.useState(\n () => props.value ?? props.defaultValue ?? (allowClearButton ? '' : undefined),\n );\n const [keyboardInput, setKeyboardInput] = React.useState('');\n const [popperPlacement, setPopperPlacement] = React.useState<PlacementWithAuto | undefined>(\n undefined,\n );\n const [options, setOptions] = React.useState(optionsProp);\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<number | undefined>(\n findSelectedIndex(optionsProp, props.value ?? props.defaultValue, allowClearButton),\n );\n\n React.useEffect(() => {\n setIsControlledOutside(props.value !== undefined);\n setNativeSelectValue((nativeSelectValue) => props.value ?? nativeSelectValue);\n }, [props.value]);\n\n useIsomorphicLayoutEffect(() => {\n if (\n options.some(({ value }) => nativeSelectValue === value) ||\n (allowClearButton && nativeSelectValue === '')\n ) {\n const event = new Event('change', { bubbles: true });\n\n selectElRef.current?.dispatchEvent(event);\n }\n }, [nativeSelectValue]);\n\n const selected = React.useMemo(() => {\n if (!options.length) {\n return null;\n }\n\n return selectedOptionIndex !== undefined ? options[selectedOptionIndex] : undefined;\n }, [options, selectedOptionIndex]);\n\n const openedClassNames = React.useMemo(\n () =>\n classNames(\n opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement?.includes('top')\n ? styles['CustomSelect--pop-up']\n : styles['CustomSelect--pop-down']),\n ),\n [dropdownOffsetDistance, opened, popperPlacement],\n );\n\n const resetKeyboardInput = React.useCallback(() => {\n setKeyboardInput('');\n }, []);\n\n const scrollToElement = React.useCallback((index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = dropdown ? (dropdown.children[index] as HTMLElement) : null;\n\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 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 isValidIndex = React.useCallback(\n (index: number) => {\n return index >= 0 && index < (options.length ?? 0);\n },\n [options.length],\n );\n\n const focusOptionByIndex = React.useCallback(\n (index: number | undefined, scrollTo = true) => {\n if (index === undefined || index < 0 || index > (options.length ?? 0) - 1) {\n return;\n }\n\n const option = options[index];\n\n if (option?.disabled) {\n return;\n }\n\n if (scrollTo) {\n scrollToElement(index);\n }\n\n // Это оптимизация, прежде всего, под `onMouseOver`\n setFocusedOptionIndex((focusedOptionIndex) =>\n focusedOptionIndex !== index ? index : focusedOptionIndex,\n );\n },\n [options, scrollToElement],\n );\n\n const areOptionsShown = React.useCallback(() => {\n return scrollBoxRef.current !== null;\n }, []);\n\n const setScrollBoxRef = React.useCallback(\n (ref: HTMLDivElement | null) => {\n scrollBoxRef.current = ref;\n\n if (ref && selectedOptionIndex !== undefined && isValidIndex(selectedOptionIndex)) {\n {\n scrollToElement(selectedOptionIndex, true);\n }\n }\n },\n [isValidIndex, scrollToElement, selectedOptionIndex],\n );\n\n const onKeyboardInput = React.useCallback(\n (key: string) => {\n const fullInput = keyboardInput + key;\n\n const optionIndex = options.findIndex((option) => {\n return getTitleFromChildren(option.label).toLowerCase().includes(fullInput);\n });\n\n if (optionIndex !== undefined && optionIndex > -1) {\n focusOptionByIndex(optionIndex);\n }\n\n setKeyboardInput(fullInput);\n },\n [focusOptionByIndex, keyboardInput, options],\n );\n\n /**\n * Note: сбрасывать `options` через `setOptions(optionsProp)` не нужно.\n * Сброс происходит в одном из эффекте `updateOptionsAndSelectedOptionIndex()`.\n */\n const close = React.useCallback(() => {\n resetKeyboardInput();\n\n setInputValue('');\n setOpened(false);\n setFocusedOptionIndex(-1);\n onClose?.();\n }, [onClose, resetKeyboardInput]);\n\n const selectFocused = React.useCallback(() => {\n if (focusedOptionIndex !== undefined && isValidIndex(focusedOptionIndex)) {\n const item = options[focusedOptionIndex];\n\n setNativeSelectValue(item?.value);\n close();\n\n const shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync =\n isControlledOutside &&\n props.value !== nativeSelectValue &&\n nativeSelectValue === item?.value;\n\n if (shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync) {\n const event = new Event('change', { bubbles: true });\n selectElRef.current?.dispatchEvent(event);\n }\n }\n }, [\n close,\n focusedOptionIndex,\n isValidIndex,\n options,\n selectElRef,\n isControlledOutside,\n props.value,\n nativeSelectValue,\n ]);\n\n const open = React.useCallback(() => {\n setOpened(true);\n setFocusedOptionIndex(selectedOptionIndex);\n\n if (typeof onOpen === 'function') {\n onOpen();\n }\n }, [onOpen, selectedOptionIndex]);\n\n const onBlur = React.useCallback(() => {\n close();\n const event = new Event('blur');\n selectElRef.current?.dispatchEvent(event);\n }, [close, selectElRef]);\n\n const resetFocusedOption = React.useCallback(() => {\n setFocusedOptionIndex(-1);\n }, []);\n\n const onFocus = React.useCallback(() => {\n const event = new Event('focus');\n selectElRef.current?.dispatchEvent(event);\n }, [selectElRef]);\n\n const onClick = React.useCallback(() => {\n if (opened) {\n close();\n } else {\n open();\n }\n }, [close, open, opened]);\n\n const handleKeyUp = React.useMemo(() => debounce(resetKeyboardInput, 1000), [resetKeyboardInput]);\n\n const focusOption = React.useCallback(\n (type: 'next' | 'prev') => {\n let index = focusedOptionIndex;\n\n if (type === 'next') {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === 'prev') {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index);\n },\n [focusOptionByIndex, focusedOptionIndex, options],\n );\n\n React.useEffect(\n function updateOptionsAndSelectedOptionIndex() {\n const value = props.value ?? nativeSelectValue ?? props.defaultValue;\n\n const options =\n searchable && inputValue !== undefined\n ? filter(optionsProp, inputValue, filterFn)\n : optionsProp;\n\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, value, allowClearButton));\n },\n [\n filterFn,\n inputValue,\n nativeSelectValue,\n optionsProp,\n props.defaultValue,\n props.value,\n searchable,\n allowClearButton,\n ],\n );\n\n /**\n * Нужен для правильного поведения обработчика onClick на select. Фильтрует клики, которые были сделаны по\n * выпадающему списку.\n */\n const onLabelClick = React.useCallback((e: React.MouseEvent<HTMLLabelElement>) => {\n if (scrollBoxRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }, []);\n\n const onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {\n const newSelectedOptionIndex = findSelectedIndex(\n options,\n e.currentTarget.value,\n allowClearButton,\n );\n\n if (selectedOptionIndex !== newSelectedOptionIndex) {\n if (!isControlledOutside) {\n setSelectedOptionIndex(newSelectedOptionIndex);\n }\n onChange?.(e);\n }\n };\n\n const onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> = React.useCallback(\n (event) => {\n ['ArrowUp', 'ArrowDown', 'Escape', 'Enter'].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case 'ArrowUp':\n areOptionsShown() && focusOption('prev');\n break;\n case 'ArrowDown':\n areOptionsShown() && focusOption('next');\n break;\n case 'Escape':\n close();\n break;\n case 'Enter':\n areOptionsShown() && selectFocused();\n break;\n }\n },\n [areOptionsShown, close, focusOption, selectFocused],\n );\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n // TODO [>=6]: удалить `onInputChangeProp`.\n if (onInputChangeProp) {\n const options = onInputChangeProp(e, optionsProp);\n if (options) {\n if (process.env.NODE_ENV === 'development') {\n warn(\n 'Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет ' +\n 'проигнорировано в v6.0.0. Для фильтрации обновляйте props.options самостоятельно или используйте свойство filterFn.',\n );\n }\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue, allowClearButton));\n }\n } else {\n const options = filter(optionsProp, e.target.value, filterFn);\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue, allowClearButton));\n }\n setInputValue(e.target.value);\n },\n [filterFn, nativeSelectValue, onInputChangeProp, optionsProp, allowClearButton],\n );\n\n const handleKeyDownSelect = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key.length === 1 && event.key !== ' ') {\n onKeyboardInput(event.key);\n return;\n }\n\n ['ArrowUp', 'ArrowDown', 'Escape', 'Enter'].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case 'ArrowUp':\n if (opened) {\n areOptionsShown() && focusOption('prev');\n } else {\n open();\n }\n break;\n case 'ArrowDown':\n if (opened) {\n areOptionsShown() && focusOption('next');\n } else {\n open();\n }\n break;\n case 'Escape':\n close();\n break;\n case 'Enter':\n case 'Spacebar':\n case ' ':\n if (opened) {\n areOptionsShown() && selectFocused();\n } else {\n open();\n }\n break;\n }\n },\n [areOptionsShown, close, focusOption, onKeyboardInput, open, opened, selectFocused],\n );\n\n const handleOptionClick = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n const index = Array.prototype.indexOf.call(\n e.currentTarget.parentNode?.children,\n e.currentTarget,\n );\n const option = options[index];\n\n if (option && !option.disabled) {\n selectFocused();\n }\n },\n [options, selectFocused],\n );\n\n const handleOptionHover = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n focusOptionByIndex(\n Array.prototype.indexOf.call(e.currentTarget.parentNode?.children, e.currentTarget),\n false,\n );\n },\n [focusOptionByIndex],\n );\n\n const renderOption = React.useCallback(\n (option: CustomSelectOptionInterface, index: number) => {\n const hovered = index === focusedOptionIndex;\n const selected = index === selectedOptionIndex;\n\n return (\n <React.Fragment key={`${option.value}`}>\n {renderOptionProp({\n option,\n hovered,\n children: option.label,\n selected,\n disabled: option.disabled,\n onClick: handleOptionClick,\n onMouseDown: handleOptionDown,\n // Используем `onMouseOver` вместо `onMouseEnter`.\n // При параметре `searchable`, обновляется \"ребёнок\", из-за чего `onMouseEnter` не срабатывает в следующих кейсах:\n // 1. До загрузки выпадающего списка, курсор мышки находится над произвольным элементом этого списка.\n // > Лечение: только увод курсора мыши и возвращении его обратно вызывает событие `onMouseEnter` на этот элемент.\n // 2. Если это тач-устройство.\n // > Лечение: нужно нажать на какой-нибудь произвольный элемент списка, после чего `onMouseEnter` будет работать на соседние элементы,\n // но не на тот, на который нажали в первый раз.\n // Более подробно по ссылке https://github.com/facebook/react/issues/13956#issuecomment-1082055744\n onMouseOver: handleOptionHover,\n })}\n </React.Fragment>\n );\n },\n [\n focusedOptionIndex,\n handleOptionClick,\n handleOptionHover,\n renderOptionProp,\n selectedOptionIndex,\n ],\n );\n\n const resolvedContent = React.useMemo(() => {\n const defaultDropdownContent =\n options?.length > 0 ? (\n options.map(renderOption)\n ) : (\n <Footnote className={styles['CustomSelect__empty']}>{emptyText}</Footnote>\n );\n\n if (typeof renderDropdown === 'function') {\n return renderDropdown({ defaultDropdownContent });\n } else {\n return defaultDropdownContent;\n }\n }, [emptyText, options, renderDropdown, renderOption]);\n\n const controlledValueSet = isControlledOutside && props.value !== '';\n const uncontrolledValueSet = !isControlledOutside && nativeSelectValue !== '';\n const clearButtonShown =\n allowClearButton && !opened && (controlledValueSet || uncontrolledValueSet);\n\n const clearButton = React.useMemo(() => {\n if (!clearButtonShown) {\n return null;\n }\n\n return (\n <ClearButton\n className={iconProp === undefined ? styles['CustomSelect--clear-icon'] : undefined}\n onClick={() => setNativeSelectValue('')}\n />\n );\n }, [clearButtonShown, ClearButton, iconProp]);\n\n const icon = React.useMemo(() => {\n if (iconProp !== undefined) {\n return iconProp;\n }\n\n return (\n <DropdownIcon\n className={clearButtonShown ? styles['CustomSelect__dropdown-icon'] : undefined}\n opened={opened}\n />\n );\n }, [clearButtonShown, iconProp, opened]);\n\n const afterIcons = (icon || clearButtonShown) && (\n <React.Fragment>\n {clearButton}\n {icon}\n </React.Fragment>\n );\n\n return (\n <label\n className={classNames(\n styles['CustomSelect'],\n sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY],\n className,\n )}\n style={style}\n ref={handleRootRef}\n onClick={onLabelClick}\n >\n {opened && searchable ? (\n <Input\n {...restProps}\n autoFocus\n onBlur={onBlur}\n className={openedClassNames}\n value={inputValue}\n onKeyDown={onInputKeyDown}\n onChange={onInputChange}\n // TODO Ожидается, что клик поймает нативный select, но его перехватывает Input. К сожалению, это приводит к конфликтам типизации.\n // TODO Нужно перестать пытаться превратить CustomSelect в select. Тогда эта проблема уйдёт.\n // @ts-expect-error: TS2322 MouseEventHandler<HTMLSelectElement> !== MouseEventHandler<HTMLInputElement>\n onClick={props.onClick}\n before={before}\n after={afterIcons}\n mode={getFormFieldModeFromSelectType(selectType)}\n />\n ) : (\n <SelectMimicry\n {...restProps}\n aria-hidden\n onClick={onClick}\n onKeyDown={handleKeyDownSelect}\n onKeyUp={handleKeyUp}\n onFocus={onFocus}\n onBlur={onBlur}\n className={openedClassNames}\n before={before}\n after={afterIcons}\n selectType={selectType}\n >\n {selected?.label}\n </SelectMimicry>\n )}\n <select\n ref={selectElRef}\n name={name}\n onChange={onNativeSelectChange}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n onClick={props.onClick}\n value={nativeSelectValue}\n aria-hidden\n className={styles['CustomSelect__control']}\n >\n {allowClearButton && <option key=\"\" value=\"\" />}\n {optionsProp.map((item) => (\n <option key={`${item.value}`} value={item.value} />\n ))}\n </select>\n {opened && (\n <CustomSelectDropdown\n targetRef={containerRef}\n placement={popupDirection}\n scrollBoxRef={setScrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetFocusedOption}\n fetching={fetching}\n offsetDistance={dropdownOffsetDistance}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n autoHideScrollbar={autoHideScrollbar}\n autoHideScrollbarDelay={autoHideScrollbarDelay}\n >\n {resolvedContent}\n </CustomSelectDropdown>\n )}\n </label>\n );\n}\n"],"names":["CustomSelect","sizeYClassNames","none","SizeType","COMPACT","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","warnOnce","checkOptionsValueType","Set","map","item","value","size","defaultRenderOptionFn","props","CustomSelectOption","handleOptionDown","e","preventDefault","findSelectedIndex","withClear","Number","filter","inputValue","filterFn","defaultOptions","React","useState","opened","setOpened","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChange","onInputChangeProp","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","autoHideScrollbar","autoHideScrollbarDelay","searchable","renderOptionProp","renderOption","optionsProp","emptyText","defaultFilterFn","icon","iconProp","ClearButton","CustomSelectClearButton","allowClearButton","dropdownOffsetDistance","fixDropdownWidth","restProps","process","env","NODE_ENV","useAdaptivity","sizeY","containerRef","useRef","handleRootRef","useExternRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","undefined","isControlledOutside","setIsControlledOutside","setInputValue","defaultValue","nativeSelectValue","setNativeSelectValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","useIsomorphicLayoutEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","classNames","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","getTitleFromChildren","label","toLowerCase","close","selectFocused","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","debounce","focusOption","type","nextIndex","beforeIndex","updateOptionsAndSelectedOptionIndex","onLabelClick","contains","target","onNativeSelectChange","newSelectedOptionIndex","currentTarget","onInputKeyDown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","handleOptionHover","hovered","Fragment","onMouseDown","onMouseOver","resolvedContent","defaultDropdownContent","Footnote","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","DropdownIcon","afterIcons","REGULAR","Input","autoFocus","onKeyDown","after","mode","getFormFieldModeFromSelectType","SelectMimicry","aria-hidden","onKeyUp","select","CustomSelectDropdown","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","sameWidth","forcePortal"],"mappings":"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"}
|
|
@@ -44,4 +44,4 @@ export interface CustomSelectOptionProps extends React.HTMLAttributes<HTMLDivEle
|
|
|
44
44
|
/**
|
|
45
45
|
* @see https://vkcom.github.io/VKUI/#/CustomSelectOption
|
|
46
46
|
*/
|
|
47
|
-
export declare const CustomSelectOption: ({ children, hierarchy, hovered, selected, before, after, option, description, disabled, style: styleProp, className, ...restProps }: CustomSelectOptionProps) => JSX.Element;
|
|
47
|
+
export declare const CustomSelectOption: ({ children, hierarchy, hovered, selected, before, after, option, description, disabled, style: styleProp, className, onClick, ...restProps }: CustomSelectOptionProps) => JSX.Element;
|
|
@@ -26,7 +26,7 @@ var sizeYClassNames = _defineProperty({
|
|
|
26
26
|
}, _adaptivity.SizeType.REGULAR, "vkuiCustomSelectOption--sizeY-regular");
|
|
27
27
|
var warn = (0, _warnOnce.warnOnce)("CustomSelectOption");
|
|
28
28
|
var CustomSelectOption = function(_param) {
|
|
29
|
-
var children = _param.children, _param_hierarchy = _param.hierarchy, hierarchy = _param_hierarchy === void 0 ? 0 : _param_hierarchy, hovered = _param.hovered, selected = _param.selected, before = _param.before, after = _param.after, option = _param.option, description = _param.description, disabled = _param.disabled, styleProp = _param.style, className = _param.className, restProps = _objectWithoutProperties(_param, [
|
|
29
|
+
var children = _param.children, _param_hierarchy = _param.hierarchy, hierarchy = _param_hierarchy === void 0 ? 0 : _param_hierarchy, hovered = _param.hovered, selected = _param.selected, before = _param.before, after = _param.after, option = _param.option, description = _param.description, disabled = _param.disabled, styleProp = _param.style, className = _param.className, onClick = _param.onClick, restProps = _objectWithoutProperties(_param, [
|
|
30
30
|
"children",
|
|
31
31
|
"hierarchy",
|
|
32
32
|
"hovered",
|
|
@@ -37,7 +37,8 @@ var CustomSelectOption = function(_param) {
|
|
|
37
37
|
"description",
|
|
38
38
|
"disabled",
|
|
39
39
|
"style",
|
|
40
|
-
"className"
|
|
40
|
+
"className",
|
|
41
|
+
"onClick"
|
|
41
42
|
]);
|
|
42
43
|
var title = typeof children === "string" ? children : undefined;
|
|
43
44
|
var _useAdaptivity1 = (0, _useAdaptivity.useAdaptivity)(), _useAdaptivity_sizeY = _useAdaptivity1.sizeY, sizeY = _useAdaptivity_sizeY === void 0 ? "none" : _useAdaptivity_sizeY;
|
|
@@ -54,6 +55,7 @@ var CustomSelectOption = function(_param) {
|
|
|
54
55
|
warn("Свойство option было добавлено по ошибке и будет удалено в v6.0.0.");
|
|
55
56
|
}
|
|
56
57
|
return /*#__PURE__*/ _react.createElement(_paragraph.Paragraph, _objectSpreadProps(_objectSpread({}, restProps), {
|
|
58
|
+
onClick: disabled ? undefined : onClick,
|
|
57
59
|
Component: "div",
|
|
58
60
|
role: "option",
|
|
59
61
|
title: title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/CustomSelectOption/CustomSelectOption.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Done } from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { SizeType } from '../../lib/adaptivity';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasRootRef } from '../../types';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport styles from './CustomSelectOption.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelectOption--sizeY-none'],\n [SizeType.REGULAR]: styles['CustomSelectOption--sizeY-regular'],\n};\n\nexport interface CustomSelectOptionProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement> {\n /**\n * Вставляет основной контент.\n * @deprecated since v6.0.0\n */\n option?: any;\n /**\n * Добавляет описание под основным блоком.\n */\n description?: React.ReactNode;\n /**\n * Вставляет элемент в начало блока перед основным контентом.\n * Например, можно передать компонент `Avatar`, `Icon<Name>` или другие изображения.\n */\n before?: React.ReactNode;\n /**\n * Вставляет элемент в конец блока после основного контента.\n * Например, можно передать компонент `Avatar`, `Icon<Name>` или другие изображения.\n */\n after?: React.ReactNode;\n /**\n * Позволяет создавать вложенность.\n */\n hierarchy?: number;\n /**\n * Включает состояние выбранного элемента списка.\n */\n selected?: boolean;\n /**\n * Включает состояние наведения.\n */\n hovered?: boolean;\n /**\n * Включает состояние фокуса.\n */\n focused?: boolean;\n /**\n * Блокирует весь блок.\n */\n disabled?: boolean;\n}\n\nconst warn = warnOnce('CustomSelectOption');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelectOption\n */\nexport const CustomSelectOption = ({\n children,\n hierarchy = 0,\n hovered,\n selected,\n before,\n after,\n option,\n description,\n disabled,\n style: styleProp,\n className,\n ...restProps\n}: CustomSelectOptionProps) => {\n const title = typeof children === 'string' ? children : undefined;\n const { sizeY = 'none' } = useAdaptivity();\n const style = React.useMemo(\n () =>\n hierarchy > 0\n ? {\n '--vkui_internal--custom_select_option_hierarchy_level': hierarchy,\n ...styleProp,\n }\n : styleProp,\n [hierarchy, styleProp],\n );\n\n if (!!option && process.env.NODE_ENV === 'development') {\n // TODO [>=6]: Удалить св-во `option`\n warn('Свойство option было добавлено по ошибке и будет удалено в v6.0.0.');\n }\n\n return (\n <Paragraph\n {...restProps}\n Component=\"div\"\n role=\"option\"\n title={title}\n aria-disabled={disabled}\n aria-selected={selected}\n className={classNames(\n styles['CustomSelectOption'],\n sizeY !== SizeType.COMPACT && sizeYClassNames[sizeY],\n hovered && !disabled && styles['CustomSelectOption--hover'],\n disabled && styles['CustomSelectOption--disabled'],\n hierarchy > 0 && styles['CustomSelectOption--hierarchy'],\n className,\n )}\n style={style}\n >\n {hasReactNode(before) && <div className={styles['CustomSelectOption__before']}>{before}</div>}\n <div className={styles['CustomSelectOption__main']}>\n <div className={styles['CustomSelectOption__children']}>{children}</div>\n {hasReactNode(description) && (\n <Footnote className={styles['CustomSelectOption__description']}>{description}</Footnote>\n )}\n </div>\n <div className={styles['CustomSelectOption__after']}>\n {hasReactNode(after) && <div>{after}</div>}\n {selected && <Icon16Done className={styles['CustomSelectOption__selectedIcon']} />}\n </div>\n </Paragraph>\n );\n};\n"],"names":["CustomSelectOption","sizeYClassNames","none","SizeType","REGULAR","warn","warnOnce","children","hierarchy","hovered","selected","before","after","option","description","disabled","style","styleProp","className","restProps","title","undefined","useAdaptivity","sizeY","React","useMemo","process","env","NODE_ENV","Paragraph","Component","role","aria-disabled","aria-selected","classNames","COMPACT","hasReactNode","div","Footnote","Icon16Done"],"mappings":";;;;+BAiEaA;;;eAAAA;;;;;;;;2DAjEU;qBACI;oBACc;6BACX;0BACL;wBACA;wBAEA;yBACC;AAG1B,IAAMC;IACJC,IAAI;GACHC,oBAAQ,CAACC,OAAO;AA+CnB,IAAMC,OAAOC,IAAAA,kBAAQ,EAAC;AAKf,IAAMN,qBAAqB,
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelectOption/CustomSelectOption.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Done } from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { SizeType } from '../../lib/adaptivity';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasRootRef } from '../../types';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport styles from './CustomSelectOption.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelectOption--sizeY-none'],\n [SizeType.REGULAR]: styles['CustomSelectOption--sizeY-regular'],\n};\n\nexport interface CustomSelectOptionProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement> {\n /**\n * Вставляет основной контент.\n * @deprecated since v6.0.0\n */\n option?: any;\n /**\n * Добавляет описание под основным блоком.\n */\n description?: React.ReactNode;\n /**\n * Вставляет элемент в начало блока перед основным контентом.\n * Например, можно передать компонент `Avatar`, `Icon<Name>` или другие изображения.\n */\n before?: React.ReactNode;\n /**\n * Вставляет элемент в конец блока после основного контента.\n * Например, можно передать компонент `Avatar`, `Icon<Name>` или другие изображения.\n */\n after?: React.ReactNode;\n /**\n * Позволяет создавать вложенность.\n */\n hierarchy?: number;\n /**\n * Включает состояние выбранного элемента списка.\n */\n selected?: boolean;\n /**\n * Включает состояние наведения.\n */\n hovered?: boolean;\n /**\n * Включает состояние фокуса.\n */\n focused?: boolean;\n /**\n * Блокирует весь блок.\n */\n disabled?: boolean;\n}\n\nconst warn = warnOnce('CustomSelectOption');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelectOption\n */\nexport const CustomSelectOption = ({\n children,\n hierarchy = 0,\n hovered,\n selected,\n before,\n after,\n option,\n description,\n disabled,\n style: styleProp,\n className,\n onClick,\n ...restProps\n}: CustomSelectOptionProps) => {\n const title = typeof children === 'string' ? children : undefined;\n const { sizeY = 'none' } = useAdaptivity();\n const style = React.useMemo(\n () =>\n hierarchy > 0\n ? {\n '--vkui_internal--custom_select_option_hierarchy_level': hierarchy,\n ...styleProp,\n }\n : styleProp,\n [hierarchy, styleProp],\n );\n\n if (!!option && process.env.NODE_ENV === 'development') {\n // TODO [>=6]: Удалить св-во `option`\n warn('Свойство option было добавлено по ошибке и будет удалено в v6.0.0.');\n }\n\n return (\n <Paragraph\n {...restProps}\n onClick={disabled ? undefined : onClick}\n Component=\"div\"\n role=\"option\"\n title={title}\n aria-disabled={disabled}\n aria-selected={selected}\n className={classNames(\n styles['CustomSelectOption'],\n sizeY !== SizeType.COMPACT && sizeYClassNames[sizeY],\n hovered && !disabled && styles['CustomSelectOption--hover'],\n disabled && styles['CustomSelectOption--disabled'],\n hierarchy > 0 && styles['CustomSelectOption--hierarchy'],\n className,\n )}\n style={style}\n >\n {hasReactNode(before) && <div className={styles['CustomSelectOption__before']}>{before}</div>}\n <div className={styles['CustomSelectOption__main']}>\n <div className={styles['CustomSelectOption__children']}>{children}</div>\n {hasReactNode(description) && (\n <Footnote className={styles['CustomSelectOption__description']}>{description}</Footnote>\n )}\n </div>\n <div className={styles['CustomSelectOption__after']}>\n {hasReactNode(after) && <div>{after}</div>}\n {selected && <Icon16Done className={styles['CustomSelectOption__selectedIcon']} />}\n </div>\n </Paragraph>\n );\n};\n"],"names":["CustomSelectOption","sizeYClassNames","none","SizeType","REGULAR","warn","warnOnce","children","hierarchy","hovered","selected","before","after","option","description","disabled","style","styleProp","className","onClick","restProps","title","undefined","useAdaptivity","sizeY","React","useMemo","process","env","NODE_ENV","Paragraph","Component","role","aria-disabled","aria-selected","classNames","COMPACT","hasReactNode","div","Footnote","Icon16Done"],"mappings":";;;;+BAiEaA;;;eAAAA;;;;;;;;2DAjEU;qBACI;oBACc;6BACX;0BACL;wBACA;wBAEA;yBACC;AAG1B,IAAMC;IACJC,IAAI;GACHC,oBAAQ,CAACC,OAAO;AA+CnB,IAAMC,OAAOC,IAAAA,kBAAQ,EAAC;AAKf,IAAMN,qBAAqB,iBAcH;QAb7BO,kBAAAA,oCACAC,WAAAA,0CAAY,sBACZC,iBAAAA,SACAC,kBAAAA,UACAC,gBAAAA,QACAC,eAAAA,OACAC,gBAAAA,QACAC,qBAAAA,aACAC,kBAAAA,UACAC,AAAOC,mBAAPD,OACAE,mBAAAA,WACAC,iBAAAA,SACGC;QAZHb;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAE;QACAC;;IAGA,IAAME,QAAQ,OAAOd,aAAa,WAAWA,WAAWe,SAAS;IACjE,IAA2BC,kBAAAA,IAAAA,4BAAa,4BAAbA,gBAAnBC,OAAAA,0CAAQ;IAChB,IAAMR,QAAQS,OAAMC,OAAO,CACzB;eACElB,YAAY,IACR;YACE,yDAAyDA;WACtDS,aAELA,SAAS;OACf;QAACT;QAAWS;KAAU;IAGxB,IAAI,CAAC,CAACJ,UAAUc,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QACtD,qCAAqC;QACrCxB,KAAK;IACP,CAAC;IAED,qBACE,qBAACyB,oBAAS,uCACJV;QACJD,SAASJ,WAAWO,YAAYH,OAAO;QACvCY,WAAU;QACVC,MAAK;QACLX,OAAOA;QACPY,iBAAelB;QACfmB,iBAAexB;QACfQ,WAAWiB,IAAAA,gBAAU,4BAEnBX,UAAUrB,oBAAQ,CAACiC,OAAO,IAAInC,eAAe,CAACuB,MAAM,EACpDf,WAAW,CAACM,6CACZA,gDACAP,YAAY,0CACZU;QAEFF,OAAOA;QAENqB,IAAAA,kBAAY,EAAC1B,yBAAW,qBAAC2B;QAAIpB,SAAS;OAAyCP,uBAChF,qBAAC2B;QAAIpB,SAAS;qBACZ,qBAACoB;QAAIpB,SAAS;OAA2CX,WACxD8B,IAAAA,kBAAY,EAACvB,8BACZ,qBAACyB,kBAAQ;QAACrB,SAAS;OAA8CJ,6BAGrE,qBAACwB;QAAIpB,SAAS;OACXmB,IAAAA,kBAAY,EAACzB,wBAAU,qBAAC0B,aAAK1B,QAC7BF,0BAAY,qBAAC8B,iBAAU;QAACtB,SAAS;;AAI1C"}
|
|
@@ -17,6 +17,7 @@ var _interopRequireDefault = require("@swc/helpers/lib/_interop_require_default.
|
|
|
17
17
|
var _interopRequireWildcard = require("@swc/helpers/lib/_interop_require_wildcard.js").default;
|
|
18
18
|
var _objectSpread = require("@swc/helpers/lib/_object_spread.js").default;
|
|
19
19
|
var _objectWithoutProperties = require("@swc/helpers/lib/_object_without_properties.js").default;
|
|
20
|
+
var _toConsumableArray = require("@swc/helpers/lib/_to_consumable_array.js").default;
|
|
20
21
|
var _createSuper = require("@swc/helpers/lib/_create_super.js").default;
|
|
21
22
|
var _react = /*#__PURE__*/ _interopRequireWildcard(require("react"));
|
|
22
23
|
var _vkjs = require("@vkontakte/vkjs");
|
|
@@ -137,7 +138,8 @@ var ModalRootTouchComponent = /*#__PURE__*/ function(_React_Component) {
|
|
|
137
138
|
});
|
|
138
139
|
_this.state = {
|
|
139
140
|
touchDown: false,
|
|
140
|
-
dragging: false
|
|
141
|
+
dragging: false,
|
|
142
|
+
modalOpenedLog: []
|
|
141
143
|
};
|
|
142
144
|
_this.maskElementRef = /*#__PURE__*/ _react.createRef();
|
|
143
145
|
var _this_props_getModalState;
|
|
@@ -289,6 +291,15 @@ var ModalRootTouchComponent = /*#__PURE__*/ function(_React_Component) {
|
|
|
289
291
|
id && warn("closeActiveModal: модальное окно (страница) ".concat(id, " не существует"), "error");
|
|
290
292
|
return;
|
|
291
293
|
}
|
|
294
|
+
if (!this.state.modalOpenedLog.length) {
|
|
295
|
+
this.setState(function(prevState) {
|
|
296
|
+
return {
|
|
297
|
+
modalOpenedLog: _toConsumableArray(prevState.modalOpenedLog).concat([
|
|
298
|
+
id
|
|
299
|
+
])
|
|
300
|
+
};
|
|
301
|
+
});
|
|
302
|
+
}
|
|
292
303
|
var nextModalState = this.props.getModalState(this.props.activeModal);
|
|
293
304
|
var nextIsPage = !!nextModalState && nextModalState.type === _types.ModalType.PAGE;
|
|
294
305
|
var prevIsPage = !!prevModalState && prevModalState.type === _types.ModalType.PAGE;
|
|
@@ -301,6 +312,19 @@ var ModalRootTouchComponent = /*#__PURE__*/ function(_React_Component) {
|
|
|
301
312
|
if (!nextModalState) {
|
|
302
313
|
// NOTE: was only for clean exit
|
|
303
314
|
this.setMaskOpacity(prevModalState, 0);
|
|
315
|
+
this.setState({
|
|
316
|
+
modalOpenedLog: []
|
|
317
|
+
});
|
|
318
|
+
prevModalState.translateY = undefined;
|
|
319
|
+
} else if (nextModalState.id && !this.state.modalOpenedLog.includes(nextModalState.id)) {
|
|
320
|
+
nextModalState.translateY = undefined;
|
|
321
|
+
this.setState(function(prevState) {
|
|
322
|
+
return {
|
|
323
|
+
modalOpenedLog: _toConsumableArray(prevState.modalOpenedLog).concat([
|
|
324
|
+
nextModalState.id
|
|
325
|
+
])
|
|
326
|
+
};
|
|
327
|
+
});
|
|
304
328
|
}
|
|
305
329
|
}
|
|
306
330
|
},
|