@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.
Files changed (70) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +3 -20
  3. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  4. package/dist/cjs/components/CustomSelect/CustomSelect.js +16 -2
  5. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  6. package/dist/cjs/components/CustomSelectOption/CustomSelectOption.d.ts +1 -1
  7. package/dist/cjs/components/CustomSelectOption/CustomSelectOption.js +4 -2
  8. package/dist/cjs/components/CustomSelectOption/CustomSelectOption.js.map +1 -1
  9. package/dist/cjs/components/ModalRoot/ModalRoot.js +25 -1
  10. package/dist/cjs/components/ModalRoot/ModalRoot.js.map +1 -1
  11. package/dist/cjs/components/NativeSelect/NativeSelect.js +2 -1
  12. package/dist/cjs/components/NativeSelect/NativeSelect.js.map +1 -1
  13. package/dist/cjs/components/Panel/Panel.js +4 -4
  14. package/dist/cjs/components/Panel/Panel.js.map +1 -1
  15. package/dist/cjs/components/PanelHeader/PanelHeader.js +1 -1
  16. package/dist/cjs/components/PanelHeader/PanelHeader.js.map +1 -1
  17. package/dist/cjs/components/WriteBar/WriteBar.js +14 -2
  18. package/dist/cjs/components/WriteBar/WriteBar.js.map +1 -1
  19. package/dist/cjs/hooks/useTodayDate.js +30 -7
  20. package/dist/cjs/hooks/useTodayDate.js.map +1 -1
  21. package/dist/components/ChipsSelect/ChipsSelect.js +3 -20
  22. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  23. package/dist/components/CustomSelect/CustomSelect.js +16 -2
  24. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  25. package/dist/components/CustomSelectOption/CustomSelectOption.d.ts +1 -1
  26. package/dist/components/CustomSelectOption/CustomSelectOption.js +4 -2
  27. package/dist/components/CustomSelectOption/CustomSelectOption.js.map +1 -1
  28. package/dist/components/ModalRoot/ModalRoot.js +25 -1
  29. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  30. package/dist/components/NativeSelect/NativeSelect.js +2 -1
  31. package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
  32. package/dist/components/Panel/Panel.js +4 -4
  33. package/dist/components/Panel/Panel.js.map +1 -1
  34. package/dist/components/PanelHeader/PanelHeader.js +1 -1
  35. package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
  36. package/dist/components/WriteBar/WriteBar.js +14 -2
  37. package/dist/components/WriteBar/WriteBar.js.map +1 -1
  38. package/dist/components.css +3 -3
  39. package/dist/components.css.map +1 -1
  40. package/dist/components.js.tmp +133 -48
  41. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +3 -17
  42. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  43. package/dist/cssm/components/CustomSelect/CustomSelect.js +15 -2
  44. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  45. package/dist/cssm/components/CustomSelectOption/CustomSelectOption.d.ts +1 -1
  46. package/dist/cssm/components/CustomSelectOption/CustomSelectOption.js +2 -1
  47. package/dist/cssm/components/CustomSelectOption/CustomSelectOption.js.map +1 -1
  48. package/dist/cssm/components/ModalRoot/ModalRoot.js +22 -1
  49. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  50. package/dist/cssm/components/NativeSelect/NativeSelect.js +2 -1
  51. package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
  52. package/dist/cssm/components/Panel/Panel.js +4 -4
  53. package/dist/cssm/components/Panel/Panel.js.map +1 -1
  54. package/dist/cssm/components/PanelHeader/PanelHeader.js +1 -1
  55. package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
  56. package/dist/cssm/components/PanelHeaderContent/PanelHeaderContent.module.css +1 -1
  57. package/dist/cssm/components/WriteBar/WriteBar.js +15 -2
  58. package/dist/cssm/components/WriteBar/WriteBar.js.map +1 -1
  59. package/dist/cssm/components/WriteBar/WriteBar.module.css +13 -7
  60. package/dist/cssm/components/WriteBarIcon/WriteBarIcon.module.css +9 -1
  61. package/dist/cssm/hooks/useTodayDate.js +31 -8
  62. package/dist/cssm/hooks/useTodayDate.js.map +1 -1
  63. package/dist/hooks/useTodayDate.js +31 -8
  64. package/dist/hooks/useTodayDate.js.map +1 -1
  65. package/dist/vkui.css +3 -3
  66. package/dist/vkui.css.map +1 -1
  67. package/dist/vkui.js.tmp +133 -48
  68. package/package.json +3 -5
  69. package/docs/assets/assets/vkui-logo-dark.svg +0 -5
  70. 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(0);
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 = typeof nextIndex !== "number" ? -1 : nextIndex;
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
- if (focusedOptionIndex != null) {
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 clearButtonShown = allowClearButton && !opened && nativeSelectValue !== "";
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,iBAaH;QAZ7BO,kBAAAA,oCACAC,WAAAA,0CAAY,sBACZC,iBAAAA,SACAC,kBAAAA,UACAC,gBAAAA,QACAC,eAAAA,OACAC,gBAAAA,QACAC,qBAAAA,aACAC,kBAAAA,UACAC,AAAOC,mBAAPD,OACAE,mBAAAA,WACGC;QAXHZ;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAE;;IAGA,IAAME,QAAQ,OAAOb,aAAa,WAAWA,WAAWc,SAAS;IACjE,IAA2BC,kBAAAA,IAAAA,4BAAa,4BAAbA,gBAAnBC,OAAAA,0CAAQ;IAChB,IAAMP,QAAQQ,OAAMC,OAAO,CACzB;eACEjB,YAAY,IACR;YACE,yDAAyDA;WACtDS,aAELA,SAAS;OACf;QAACT;QAAWS;KAAU;IAGxB,IAAI,CAAC,CAACJ,UAAUa,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QACtD,qCAAqC;QACrCvB,KAAK;IACP,CAAC;IAED,qBACE,qBAACwB,oBAAS,uCACJV;QACJW,WAAU;QACVC,MAAK;QACLX,OAAOA;QACPY,iBAAejB;QACfkB,iBAAevB;QACfQ,WAAWgB,IAAAA,gBAAU,4BAEnBX,UAAUpB,oBAAQ,CAACgC,OAAO,IAAIlC,eAAe,CAACsB,MAAM,EACpDd,WAAW,CAACM,6CACZA,gDACAP,YAAY,0CACZU;QAEFF,OAAOA;QAENoB,IAAAA,kBAAY,EAACzB,yBAAW,qBAAC0B;QAAInB,SAAS;OAAyCP,uBAChF,qBAAC0B;QAAInB,SAAS;qBACZ,qBAACmB;QAAInB,SAAS;OAA2CX,WACxD6B,IAAAA,kBAAY,EAACtB,8BACZ,qBAACwB,kBAAQ;QAACpB,SAAS;OAA8CJ,6BAGrE,qBAACuB;QAAInB,SAAS;OACXkB,IAAAA,kBAAY,EAACxB,wBAAU,qBAACyB,aAAKzB,QAC7BF,0BAAY,qBAAC6B,iBAAU;QAACrB,SAAS;;AAI1C"}
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
  },