@foxford/ui 2.76.1-beta-3d975b5-20250715 → 2.77.0-beta-90a741d-20250807
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +27 -0
- package/components/Accordion/Accordion.js +1 -1
- package/components/Accordion/Accordion.js.map +1 -1
- package/components/Accordion/Accordion.mjs +1 -1
- package/components/Accordion/Accordion.mjs.map +1 -1
- package/components/Accordion/hooks.js +1 -1
- package/components/Accordion/hooks.js.map +1 -1
- package/components/Accordion/hooks.mjs +1 -1
- package/components/Accordion/hooks.mjs.map +1 -1
- package/components/AccordionItem/AccordionItem.js +1 -1
- package/components/AccordionItem/AccordionItem.js.map +1 -1
- package/components/AccordionItem/AccordionItem.mjs +1 -1
- package/components/AccordionItem/AccordionItem.mjs.map +1 -1
- package/components/ActionBtn/ActionBtn.js +1 -1
- package/components/ActionBtn/ActionBtn.js.map +1 -1
- package/components/ActionBtn/ActionBtn.mjs +1 -1
- package/components/ActionBtn/ActionBtn.mjs.map +1 -1
- package/components/ActionBtn/style.js.map +1 -1
- package/components/ActionBtn/style.mjs.map +1 -1
- package/components/Alert/Alert.js +1 -1
- package/components/Alert/Alert.js.map +1 -1
- package/components/Alert/Alert.mjs +1 -1
- package/components/Alert/Alert.mjs.map +1 -1
- package/components/Amount/Amount.js +1 -1
- package/components/Amount/Amount.js.map +1 -1
- package/components/Amount/Amount.mjs +1 -1
- package/components/Amount/Amount.mjs.map +1 -1
- package/components/Amount/data/index.js.map +1 -1
- package/components/Amount/data/index.mjs.map +1 -1
- package/components/Amount/style.js.map +1 -1
- package/components/Amount/style.mjs.map +1 -1
- package/components/Anchor/Anchor.js +1 -1
- package/components/Anchor/Anchor.js.map +1 -1
- package/components/Anchor/Anchor.mjs +1 -1
- package/components/Anchor/Anchor.mjs.map +1 -1
- package/components/Arrow/Arrow.js.map +1 -1
- package/components/Arrow/Arrow.mjs.map +1 -1
- package/components/ArrowBadge/ArrowBadge.js.map +1 -1
- package/components/ArrowBadge/ArrowBadge.mjs.map +1 -1
- package/components/AspectRatio/style.js.map +1 -1
- package/components/AspectRatio/style.mjs.map +1 -1
- package/components/Avatar/Avatar.js +1 -1
- package/components/Avatar/Avatar.js.map +1 -1
- package/components/Avatar/Avatar.mjs +1 -1
- package/components/Avatar/Avatar.mjs.map +1 -1
- package/components/Avatar/utils.js.map +1 -1
- package/components/Avatar/utils.mjs.map +1 -1
- package/components/Badge/Badge.js +1 -1
- package/components/Badge/Badge.js.map +1 -1
- package/components/Badge/Badge.mjs +1 -1
- package/components/Badge/Badge.mjs.map +1 -1
- package/components/Button/Button.js +1 -1
- package/components/Button/Button.js.map +1 -1
- package/components/Button/Button.mjs +1 -1
- package/components/Button/Button.mjs.map +1 -1
- package/components/Button/hooks.js.map +1 -1
- package/components/Button/hooks.mjs.map +1 -1
- package/components/Button/style.js.map +1 -1
- package/components/Button/style.mjs.map +1 -1
- package/components/Checkbox/Checkbox.js +1 -1
- package/components/Checkbox/Checkbox.js.map +1 -1
- package/components/Checkbox/Checkbox.mjs +1 -1
- package/components/Checkbox/Checkbox.mjs.map +1 -1
- package/components/Chip/Chip.js +1 -1
- package/components/Chip/Chip.js.map +1 -1
- package/components/Chip/Chip.mjs +1 -1
- package/components/Chip/Chip.mjs.map +1 -1
- package/components/Container/Container.js.map +1 -1
- package/components/Container/Container.mjs.map +1 -1
- package/components/Container/style.js.map +1 -1
- package/components/Container/style.mjs.map +1 -1
- package/components/ContextMenu/ContextMenu.js +1 -1
- package/components/ContextMenu/ContextMenu.js.map +1 -1
- package/components/ContextMenu/ContextMenu.mjs +1 -1
- package/components/ContextMenu/ContextMenu.mjs.map +1 -1
- package/components/ContextMenu/Item.js.map +1 -1
- package/components/ContextMenu/Item.mjs.map +1 -1
- package/components/ContextMenu/style.js.map +1 -1
- package/components/ContextMenu/style.mjs.map +1 -1
- package/components/ContextMenu.Multilevel/ContextMenu.Multilevel.js +1 -1
- package/components/ContextMenu.Multilevel/ContextMenu.Multilevel.js.map +1 -1
- package/components/ContextMenu.Multilevel/ContextMenu.Multilevel.mjs +1 -1
- package/components/ContextMenu.Multilevel/ContextMenu.Multilevel.mjs.map +1 -1
- package/components/ContextMenu.Multilevel/Controls.js.map +1 -1
- package/components/ContextMenu.Multilevel/Controls.mjs.map +1 -1
- package/components/Dialog/Dialog.js.map +1 -1
- package/components/Dialog/Dialog.mjs.map +1 -1
- package/components/DialogComponent/DialogComponent.js +1 -1
- package/components/DialogComponent/DialogComponent.js.map +1 -1
- package/components/DialogComponent/DialogComponent.mjs +1 -1
- package/components/DialogComponent/DialogComponent.mjs.map +1 -1
- package/components/DialogComponent/style.js.map +1 -1
- package/components/DialogComponent/style.mjs.map +1 -1
- package/components/Divider/style.js.map +1 -1
- package/components/Divider/style.mjs.map +1 -1
- package/components/Dropdown/Dropdown.js +1 -1
- package/components/Dropdown/Dropdown.js.map +1 -1
- package/components/Dropdown/Dropdown.mjs +1 -1
- package/components/Dropdown/Dropdown.mjs.map +1 -1
- package/components/Dropdown/DropdownMenuNoOptions.js +1 -1
- package/components/Dropdown/DropdownMenuNoOptions.js.map +1 -1
- package/components/Dropdown/DropdownMenuNoOptions.mjs +1 -1
- package/components/Dropdown/DropdownMenuNoOptions.mjs.map +1 -1
- package/components/Dropdown/hooks.js.map +1 -1
- package/components/Dropdown/hooks.mjs.map +1 -1
- package/components/FormInput/FormInput.js.map +1 -1
- package/components/FormInput/FormInput.mjs.map +1 -1
- package/components/FormInputLabel/FormInputLabel.js +1 -1
- package/components/FormInputLabel/FormInputLabel.js.map +1 -1
- package/components/FormInputLabel/FormInputLabel.mjs +1 -1
- package/components/FormInputLabel/FormInputLabel.mjs.map +1 -1
- package/components/FormLabel/FormLabel.js +1 -1
- package/components/FormLabel/FormLabel.js.map +1 -1
- package/components/FormLabel/FormLabel.mjs +1 -1
- package/components/FormLabel/FormLabel.mjs.map +1 -1
- package/components/Icon/Icon.js +1 -1
- package/components/Icon/Icon.js.map +1 -1
- package/components/Icon/Icon.mjs +1 -1
- package/components/Icon/Icon.mjs.map +1 -1
- package/components/Icon/bg-worker.js.map +1 -1
- package/components/Icon/bg-worker.mjs.map +1 -1
- package/components/Icon/list/default.js.map +1 -1
- package/components/Icon/list/default.mjs.map +1 -1
- package/components/Icon/list/icon-pack.js.map +1 -1
- package/components/Icon/list/icon-pack.mjs.map +1 -1
- package/components/IconButton/IconButton.js.map +1 -1
- package/components/IconButton/IconButton.mjs.map +1 -1
- package/components/Indicator/Indicator.js +1 -1
- package/components/Indicator/Indicator.js.map +1 -1
- package/components/Indicator/Indicator.mjs +1 -1
- package/components/Indicator/Indicator.mjs.map +1 -1
- package/components/Input/Input.js.map +1 -1
- package/components/Input/Input.mjs.map +1 -1
- package/components/Input/helpers.js.map +1 -1
- package/components/Input/helpers.mjs.map +1 -1
- package/components/Input.Phone/Input.Phone.js.map +1 -1
- package/components/Input.Phone/Input.Phone.mjs.map +1 -1
- package/components/InputCheckbox/InputCheckbox.js.map +1 -1
- package/components/InputCheckbox/InputCheckbox.mjs.map +1 -1
- package/components/InputRadio/InputRadio.js.map +1 -1
- package/components/InputRadio/InputRadio.mjs.map +1 -1
- package/components/ListItem/ListItem.js +1 -1
- package/components/ListItem/ListItem.js.map +1 -1
- package/components/ListItem/ListItem.mjs +1 -1
- package/components/ListItem/ListItem.mjs.map +1 -1
- package/components/Menu/Menu.js.map +1 -1
- package/components/Menu/Menu.mjs.map +1 -1
- package/components/MenuComponent/MenuComponent.js.map +1 -1
- package/components/MenuComponent/MenuComponent.mjs.map +1 -1
- package/components/MenuComponent/style.js +1 -1
- package/components/MenuComponent/style.js.map +1 -1
- package/components/MenuComponent/style.mjs +1 -1
- package/components/MenuComponent/style.mjs.map +1 -1
- package/components/MenuContainer/MenuContainer.js +1 -1
- package/components/MenuContainer/MenuContainer.js.map +1 -1
- package/components/MenuContainer/MenuContainer.mjs +1 -1
- package/components/MenuContainer/MenuContainer.mjs.map +1 -1
- package/components/MenuDivider/MenuDivider.js +1 -1
- package/components/MenuDivider/MenuDivider.js.map +1 -1
- package/components/MenuDivider/MenuDivider.mjs +1 -1
- package/components/MenuDivider/MenuDivider.mjs.map +1 -1
- package/components/MenuList/MenuList.js.map +1 -1
- package/components/MenuList/MenuList.mjs.map +1 -1
- package/components/Modal/Modal.js.map +1 -1
- package/components/Modal/Modal.mjs.map +1 -1
- package/components/Modal/adapter.js.map +1 -1
- package/components/Modal/adapter.mjs.map +1 -1
- package/components/Modal/style.js +1 -1
- package/components/Modal/style.js.map +1 -1
- package/components/Modal/style.mjs +1 -1
- package/components/Modal/style.mjs.map +1 -1
- package/components/Notification/Notification.js +1 -1
- package/components/Notification/Notification.js.map +1 -1
- package/components/Notification/Notification.mjs +1 -1
- package/components/Notification/Notification.mjs.map +1 -1
- package/components/Paper/Paper.js.map +1 -1
- package/components/Paper/Paper.mjs.map +1 -1
- package/components/Paper/style.js.map +1 -1
- package/components/Paper/style.mjs.map +1 -1
- package/components/Popover/Popover.js.map +1 -1
- package/components/Popover/Popover.mjs.map +1 -1
- package/components/PopoverComponent/PopoverComponent.js +1 -1
- package/components/PopoverComponent/PopoverComponent.js.map +1 -1
- package/components/PopoverComponent/PopoverComponent.mjs +1 -1
- package/components/PopoverComponent/PopoverComponent.mjs.map +1 -1
- package/components/Progress/Progress.js.map +1 -1
- package/components/Progress/Progress.mjs.map +1 -1
- package/components/Progress/style.js +1 -1
- package/components/Progress/style.js.map +1 -1
- package/components/Progress/style.mjs +1 -1
- package/components/Progress/style.mjs.map +1 -1
- package/components/Progress.Circle/Progress.Circle.js +1 -1
- package/components/Progress.Circle/Progress.Circle.js.map +1 -1
- package/components/Progress.Circle/Progress.Circle.mjs +1 -1
- package/components/Progress.Circle/Progress.Circle.mjs.map +1 -1
- package/components/Progress.Circle/style.js +1 -1
- package/components/Progress.Circle/style.js.map +1 -1
- package/components/Progress.Circle/style.mjs +1 -1
- package/components/Progress.Circle/style.mjs.map +1 -1
- package/components/Progress.Segmented/Progress.Segmented.js.map +1 -1
- package/components/Progress.Segmented/Progress.Segmented.mjs.map +1 -1
- package/components/Progress.Segmented/style.js.map +1 -1
- package/components/Progress.Segmented/style.mjs.map +1 -1
- package/components/ProgressCircle/ProgressCircle.js +1 -1
- package/components/ProgressCircle/ProgressCircle.js.map +1 -1
- package/components/ProgressCircle/ProgressCircle.mjs +1 -1
- package/components/ProgressCircle/ProgressCircle.mjs.map +1 -1
- package/components/ProgressCircle/style.js +1 -1
- package/components/ProgressCircle/style.js.map +1 -1
- package/components/ProgressCircle/style.mjs +1 -1
- package/components/ProgressCircle/style.mjs.map +1 -1
- package/components/ProgressLine/ProgressLine.js +1 -1
- package/components/ProgressLine/ProgressLine.js.map +1 -1
- package/components/ProgressLine/ProgressLine.mjs +1 -1
- package/components/ProgressLine/ProgressLine.mjs.map +1 -1
- package/components/Radio/Group.js.map +1 -1
- package/components/Radio/Group.mjs.map +1 -1
- package/components/Radio/Radio.js +1 -1
- package/components/Radio/Radio.js.map +1 -1
- package/components/Radio/Radio.mjs +1 -1
- package/components/Radio/Radio.mjs.map +1 -1
- package/components/Radio/style.js.map +1 -1
- package/components/Radio/style.mjs.map +1 -1
- package/components/Scrollable/Scrollable.js +1 -1
- package/components/Scrollable/Scrollable.js.map +1 -1
- package/components/Scrollable/Scrollable.mjs +1 -1
- package/components/Scrollable/Scrollable.mjs.map +1 -1
- package/components/Section/Section.js.map +1 -1
- package/components/Section/Section.mjs.map +1 -1
- package/components/Section/style.js +1 -1
- package/components/Section/style.js.map +1 -1
- package/components/Section/style.mjs +1 -1
- package/components/Section/style.mjs.map +1 -1
- package/components/Select/Select.js.map +1 -1
- package/components/Select/Select.mjs.map +1 -1
- package/components/Select/style.js +1 -1
- package/components/Select/style.js.map +1 -1
- package/components/Select/style.mjs +1 -1
- package/components/Select/style.mjs.map +1 -1
- package/components/Separator/Separator.js.map +1 -1
- package/components/Separator/Separator.mjs.map +1 -1
- package/components/Separator/SeparatorText.js.map +1 -1
- package/components/Separator/SeparatorText.mjs.map +1 -1
- package/components/Separator/style.js +1 -1
- package/components/Separator/style.js.map +1 -1
- package/components/Separator/style.mjs +1 -1
- package/components/Separator/style.mjs.map +1 -1
- package/components/Spacer/Spacer.js.map +1 -1
- package/components/Spacer/Spacer.mjs.map +1 -1
- package/components/Spacer/style.js.map +1 -1
- package/components/Spacer/style.mjs.map +1 -1
- package/components/Spinner/Spinner.js.map +1 -1
- package/components/Spinner/Spinner.mjs.map +1 -1
- package/components/Spinner/style.js +1 -1
- package/components/Spinner/style.js.map +1 -1
- package/components/Spinner/style.mjs +1 -1
- package/components/Spinner/style.mjs.map +1 -1
- package/components/Switch/Switch.js.map +1 -1
- package/components/Switch/Switch.mjs.map +1 -1
- package/components/Switcher/style.js.map +1 -1
- package/components/Switcher/style.mjs.map +1 -1
- package/components/Tab/Tab.js +1 -1
- package/components/Tab/Tab.js.map +1 -1
- package/components/Tab/Tab.mjs +1 -1
- package/components/Tab/Tab.mjs.map +1 -1
- package/components/TabList/TabList.js +1 -1
- package/components/TabList/TabList.js.map +1 -1
- package/components/TabList/TabList.mjs +1 -1
- package/components/TabList/TabList.mjs.map +1 -1
- package/components/TabList/TabListMenuTab.js +1 -1
- package/components/TabList/TabListMenuTab.js.map +1 -1
- package/components/TabList/TabListMenuTab.mjs +1 -1
- package/components/TabList/TabListMenuTab.mjs.map +1 -1
- package/components/TabList/TabListPanel.js.map +1 -1
- package/components/TabList/TabListPanel.mjs.map +1 -1
- package/components/TabList/hooks.js +1 -1
- package/components/TabList/hooks.js.map +1 -1
- package/components/TabList/hooks.mjs +1 -1
- package/components/TabList/hooks.mjs.map +1 -1
- package/components/TabList/style.js +1 -1
- package/components/TabList/style.js.map +1 -1
- package/components/TabList/style.mjs +1 -1
- package/components/TabList/style.mjs.map +1 -1
- package/components/TabListTab/TabListTab.js.map +1 -1
- package/components/TabListTab/TabListTab.mjs.map +1 -1
- package/components/TabListTab/style.js +1 -1
- package/components/TabListTab/style.js.map +1 -1
- package/components/TabListTab/style.mjs +1 -1
- package/components/TabListTab/style.mjs.map +1 -1
- package/components/Tabs/Tabs.js.map +1 -1
- package/components/Tabs/Tabs.mjs.map +1 -1
- package/components/Tabs/style.js +1 -1
- package/components/Tabs/style.js.map +1 -1
- package/components/Tabs/style.mjs +1 -1
- package/components/Tabs/style.mjs.map +1 -1
- package/components/Tag/Tag.js +1 -1
- package/components/Tag/Tag.js.map +1 -1
- package/components/Tag/Tag.mjs +1 -1
- package/components/Tag/Tag.mjs.map +1 -1
- package/components/Tag/style.js +1 -1
- package/components/Tag/style.js.map +1 -1
- package/components/Tag/style.mjs +1 -1
- package/components/Tag/style.mjs.map +1 -1
- package/components/Text/Ellipsis.js +1 -1
- package/components/Text/Ellipsis.js.map +1 -1
- package/components/Text/Ellipsis.mjs +1 -1
- package/components/Text/Ellipsis.mjs.map +1 -1
- package/components/Text/Text.js.map +1 -1
- package/components/Text/Text.mjs.map +1 -1
- package/components/Text/style.js.map +1 -1
- package/components/Text/style.mjs.map +1 -1
- package/components/Text.Ellipse/Text.Ellipse.js +1 -1
- package/components/Text.Ellipse/Text.Ellipse.js.map +1 -1
- package/components/Text.Ellipse/Text.Ellipse.mjs +1 -1
- package/components/Text.Ellipse/Text.Ellipse.mjs.map +1 -1
- package/components/Textarea/Textarea.js +1 -1
- package/components/Textarea/Textarea.js.map +1 -1
- package/components/Textarea/Textarea.mjs +1 -1
- package/components/Textarea/Textarea.mjs.map +1 -1
- package/components/Tooltip/Tooltip.js.map +1 -1
- package/components/Tooltip/Tooltip.mjs.map +1 -1
- package/components/Tooltip/TooltipWrapper.js.map +1 -1
- package/components/Tooltip/TooltipWrapper.mjs.map +1 -1
- package/components/TooltipComponent/TooltipComponent.js +1 -1
- package/components/TooltipComponent/TooltipComponent.js.map +1 -1
- package/components/TooltipComponent/TooltipComponent.mjs +1 -1
- package/components/TooltipComponent/TooltipComponent.mjs.map +1 -1
- package/dts/index.d.ts +2630 -2557
- package/hocs/withMergedProps.js.map +1 -1
- package/hocs/withMergedProps.mjs.map +1 -1
- package/hocs/withTranslation.js +1 -1
- package/hocs/withTranslation.js.map +1 -1
- package/hocs/withTranslation.mjs +1 -1
- package/hocs/withTranslation.mjs.map +1 -1
- package/hooks/use-config-priority.js.map +1 -1
- package/hooks/use-config-priority.mjs +1 -1
- package/hooks/use-config-priority.mjs.map +1 -1
- package/hooks/useClickOutside.js.map +1 -1
- package/hooks/useClickOutside.mjs.map +1 -1
- package/hooks/useMergedPalette.js +1 -1
- package/hooks/useMergedPalette.js.map +1 -1
- package/hooks/useMergedPalette.mjs +1 -1
- package/hooks/useMergedPalette.mjs.map +1 -1
- package/hooks/useMergedProps.js.map +1 -1
- package/hooks/useMergedProps.mjs.map +1 -1
- package/hooks/useMergedSizes.js.map +1 -1
- package/hooks/useMergedSizes.mjs.map +1 -1
- package/hooks/useResizeObserver.js.map +1 -1
- package/hooks/useResizeObserver.mjs.map +1 -1
- package/hooks/useScrollMonitor.js +1 -1
- package/hooks/useScrollMonitor.js.map +1 -1
- package/hooks/useScrollMonitor.mjs +1 -1
- package/hooks/useScrollMonitor.mjs.map +1 -1
- package/hooks/useScrollThresholds.js.map +1 -1
- package/hooks/useScrollThresholds.mjs.map +1 -1
- package/mixins/color.js.map +1 -1
- package/mixins/color.mjs.map +1 -1
- package/mixins/create-responsive-props.js.map +1 -1
- package/mixins/create-responsive-props.mjs.map +1 -1
- package/mixins/display.js.map +1 -1
- package/mixins/display.mjs.map +1 -1
- package/mixins/responsive-margin.js.map +1 -1
- package/mixins/responsive-margin.mjs.map +1 -1
- package/mixins/responsive-property.js +1 -1
- package/mixins/responsive-property.js.map +1 -1
- package/mixins/responsive-property.mjs +1 -1
- package/mixins/responsive-property.mjs.map +1 -1
- package/mixins/screen.js +1 -1
- package/mixins/screen.js.map +1 -1
- package/mixins/screen.mjs +1 -1
- package/mixins/screen.mjs.map +1 -1
- package/mixins/shared.js +4 -4
- package/mixins/shared.js.map +1 -1
- package/mixins/shared.mjs +4 -4
- package/mixins/shared.mjs.map +1 -1
- package/mixins/vAlign.js.map +1 -1
- package/mixins/vAlign.mjs.map +1 -1
- package/package.json +7 -7
- package/shared/enums/sizeInput.js.map +1 -1
- package/shared/enums/sizeInput.mjs.map +1 -1
- package/shared/resize-observer.js.map +1 -1
- package/shared/resize-observer.mjs.map +1 -1
- package/shared/utils/colors.js.map +1 -1
- package/shared/utils/colors.mjs.map +1 -1
- package/shared/utils/dom.js.map +1 -1
- package/shared/utils/dom.mjs.map +1 -1
- package/shared/utils/react.js.map +1 -1
- package/shared/utils/react.mjs.map +1 -1
- package/shared/utils/rel-builder.js +1 -1
- package/shared/utils/rel-builder.js.map +1 -1
- package/shared/utils/rel-builder.mjs +1 -1
- package/shared/utils/rel-builder.mjs.map +1 -1
- package/theme/colors-dark.js.map +1 -1
- package/theme/colors-dark.mjs.map +1 -1
- package/theme/colors-light.js.map +1 -1
- package/theme/colors-light.mjs.map +1 -1
- package/theme/colors.js.map +1 -1
- package/theme/colors.mjs.map +1 -1
- package/theme/global-styled.js.map +1 -1
- package/theme/global-styled.mjs.map +1 -1
- package/theme/theme-provider.js.map +1 -1
- package/theme/theme-provider.mjs.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sources":["../../../../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import { forwardRef, useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react'\nimport { nanoid } from 'nanoid'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport { useScrollMonitor } from 'hooks/useScrollMonitor'\nimport { focusFirstFocusable, focusLastFocusable } from 'shared/utils/dom'\nimport { createDebouncedCallback } from 'shared/utils/misc'\nimport { keyboardKeys } from 'shared/constants'\nimport type { Nullable } from 'shared/types'\nimport { FormInput } from 'components/FormInput'\nimport { FormInputLabel } from 'components/FormInputLabel'\nimport { MenuList } from 'components/MenuList'\nimport { MenuDivider } from 'components/MenuDivider'\nimport { ListItem } from 'components/ListItem'\nimport { InputCheckbox } from 'components/InputCheckbox'\nimport { Chip } from 'components/Chip'\nimport { IconButton } from 'components/IconButton'\nimport type { IconProps } from 'components/Icon'\nimport { DropdownMenu } from './DropdownMenu'\nimport { useFilteredOptions, useLoadedOptions } from './hooks'\nimport { SIZES, SIZES_CHECKBOX, SIZES_ICON } from './constants'\nimport { getDropdownInputText, getDropdownSelectedOption, groupDropdownOptions } from './utils'\nimport * as Styled from './style'\nimport type { DropdownProps, DropdownOption } from './types'\n\nconst COMPONENT_NAME = 'Dropdown'\n\n/**\n *\n * Компонент поддерживает все атрибуты \\<div\\> элемента.\n *\n * Можно передать \"ref\", который будет ассоциирован с рутовым элементом.\n *\n * Поддерживаются пропсы определения размеров и внешних отступов в зависимости от ширины вьюпорта.\n *\n * Полный интерфейс можно посмотреть [тут](https://github.com/foxford/ui/blob/master/src/components/Dropdown/types.ts).\n */\nconst Dropdown: React.ForwardRefExoticComponent<DropdownProps> = withMergedProps<DropdownProps, HTMLDivElement>(\n forwardRef((props, ref) => {\n const {\n size = 'm',\n name = 'fox-dropdown',\n labelPosition = 'dynamic',\n searchable = true,\n primary = true,\n optionsMultiToggle = true,\n iconProps = {},\n menuProps = {},\n loadingIconProps = {},\n optionsEmptyIconProps = {},\n loading,\n autoFocus,\n disableAutoScrollToSelectedOption,\n closeMenuOnScroll,\n scrollMonitorTarget,\n contrast,\n selectedOption,\n defaultSelectedOption,\n icon,\n inputMode,\n loadingMessage,\n loadingIcon,\n maxLength,\n multiple,\n clearable,\n onChangeInput,\n onCloseMenu,\n onOpenMenu,\n onSelectOption,\n options,\n loadOptions,\n groupSelectedOptions,\n optionsMultiToggleCaption,\n optionsEmptyMessage,\n optionsEmptyIcon,\n palette,\n placeholder,\n readOnly,\n required,\n status,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n form,\n ...rootProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconBaseProps: IconProps = {\n sizes: SIZES_ICON,\n color: rootProps.disabled ? 'content-disabled' : 'content-onmain-tertiary',\n }\n\n const formInputLabelId = useMemo(() => rootProps.id ?? `${name}-${nanoid()}`, [name, rootProps.id])\n const inputLabelId = useMemo(() => nanoid(), [])\n const menuListId = useMemo(() => nanoid(), [])\n\n const [filteredOptions, getFilteredOptions] = useFilteredOptions({\n options,\n })\n\n const [loadedOptions, optionsLoading, getLoadedOptions] = useLoadedOptions({\n loadOptions,\n options,\n })\n\n const [dropdownSelectedOption, setDropdownSelectedOption] = useState<DropdownOption[]>(() =>\n getDropdownSelectedOption(selectedOption !== undefined ? selectedOption : defaultSelectedOption, multiple)\n )\n\n const [inputText, setInputText] = useState<string>(() => getDropdownInputText(dropdownSelectedOption, multiple))\n\n const [focusWithin, setFocusWithin] = useState<boolean>(false)\n\n const [menuOpenRequest, setMenuOpenRequest] = useState<boolean>(false)\n\n const menuOptions: DropdownOption[] = loadOptions ? loadedOptions : filteredOptions\n const menuOptionsLoading = loadOptions ? loading ?? optionsLoading : loading\n\n const menuOptionsGroups: ReturnType<typeof groupDropdownOptions> = useMemo(\n () => (multiple ? groupDropdownOptions(menuOptions, dropdownSelectedOption) : [[], []]),\n [multiple, menuOptions, dropdownSelectedOption]\n )\n\n const menuOpen = menuOpenRequest && !rootProps.disabled\n\n const inputRequired = required && dropdownSelectedOption.length === 0\n const inputActive = Boolean(menuOpen || inputText || focusWithin)\n\n const multiToggleChecked = menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length === 0\n const multiToggleIndeterminate = menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length > 0\n\n const inputRef = useRef<HTMLInputElement>(null)\n const [menuRef, setMenuRef] = useState<Nullable<HTMLElement>>(null)\n const menuListRef = useRef<HTMLUListElement>(null)\n const selectedOptionRef = useRef<HTMLElement>(null)\n const menuOpenPrevRef = useRef<boolean>(menuOpen)\n\n const updateInputText = useCallback(\n (inputTextValue: string) => {\n setInputText(inputTextValue)\n\n if (onChangeInput) {\n onChangeInput(inputTextValue)\n }\n },\n [onChangeInput]\n )\n\n const updateOptions = useCallback(\n (inputTextValue: string) => {\n if (loadOptions) {\n getLoadedOptions(inputTextValue)\n } else {\n getFilteredOptions(inputTextValue)\n }\n },\n [loadOptions, getLoadedOptions, getFilteredOptions]\n )\n\n const updateOptionsDebounced = useMemo(() => {\n return createDebouncedCallback(updateOptions, 150)\n }, [updateOptions])\n\n const preventBlur = (evt: React.PointerEvent<HTMLDivElement> | React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (\n evt.target !== inputRef.current &&\n evt.target instanceof Node &&\n (evt.currentTarget.contains(evt.target) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.target)))\n ) {\n evt.preventDefault()\n }\n }\n\n useScrollMonitor({\n target: scrollMonitorTarget,\n onScrollStart: () => {\n if (closeMenuOnScroll && menuOpen) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n },\n })\n\n useLayoutEffect(() => {\n if (selectedOption === undefined) return\n\n if (!multiple && !menuOpen) {\n updateInputText(getDropdownInputText(selectedOption))\n }\n setDropdownSelectedOption(getDropdownSelectedOption(selectedOption, multiple))\n }, [multiple, selectedOption, menuOpen, updateInputText])\n\n useEffect(() => {\n if (menuOpen === menuOpenPrevRef.current) return\n\n if (menuOpen && onOpenMenu) onOpenMenu()\n if (!menuOpen && onCloseMenu) onCloseMenu()\n\n menuOpenPrevRef.current = menuOpen\n }, [menuOpen, onCloseMenu, onOpenMenu])\n\n useEffect(() => {\n if (\n !multiple &&\n !disableAutoScrollToSelectedOption &&\n menuOpen &&\n !menuOptionsLoading &&\n inputText.length === 0 &&\n menuRef &&\n selectedOptionRef.current\n ) {\n const menuRect = menuRef.getBoundingClientRect()\n const selectedOptionRect = selectedOptionRef.current.getBoundingClientRect()\n\n if (selectedOptionRect.top < menuRect.top || selectedOptionRect.bottom > menuRect.bottom) {\n setTimeout(() => {\n if (menuRef && selectedOptionRef.current) {\n menuRef.scrollTo(0, selectedOptionRef.current.offsetTop)\n }\n }, 0)\n }\n }\n }, [multiple, disableAutoScrollToSelectedOption, menuOpen, menuOptionsLoading, inputText, menuRef])\n\n return (\n <FormInputLabel\n {...rootProps}\n {...sizeProps}\n ref={ref}\n id={formInputLabelId}\n labelId={inputLabelId}\n labelPosition={labelPosition}\n active={inputActive}\n onColored={contrast}\n primary={primary}\n error={status === 'error'}\n success={status === 'success'}\n focus={focusWithin}\n icon={[icon, <Styled.ChevronIcon key='chevron' up={menuOpen} />]}\n iconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...iconProps,\n }}\n palette={{\n color: rootProps.disabled ? palette.labelColorDisabled : palette.labelColor,\n backgroundColor: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColor,\n backgroundColorHover: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColorHover,\n borderColor: rootProps.disabled ? palette.borderColorDisabled : palette.borderColor,\n }}\n onClick={(evt) => {\n if (rootProps.onClick) rootProps.onClick(evt)\n\n if (rootProps.disabled) return\n\n inputRef.current?.focus()\n\n if (!menuOpen) {\n setMenuOpenRequest(true)\n\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n } else if (menuRef && evt.target instanceof Node && !menuRef.contains(evt.target)) {\n setMenuOpenRequest(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n }\n }}\n onPointerDown={(evt) => {\n if (rootProps.onPointerDown) rootProps.onPointerDown(evt)\n\n preventBlur(evt)\n }}\n onMouseDown={(evt) => {\n if (rootProps.onMouseDown) rootProps.onMouseDown(evt)\n\n if (!window.PointerEvent) preventBlur(evt)\n }}\n onFocus={(evt) => {\n if (rootProps.onFocus) rootProps.onFocus(evt)\n\n setFocusWithin(true)\n\n if (inputRef.current && evt.target === inputRef.current && searchable && !multiple && !menuOpen) {\n updateInputText('')\n }\n }}\n onBlur={(evt) => {\n if (rootProps.onBlur) rootProps.onBlur(evt)\n\n if (\n evt.currentTarget.contains(evt.relatedTarget) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.relatedTarget))\n ) {\n return\n }\n\n setFocusWithin(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }}\n input={\n <>\n {inputRequired && !searchable && !readOnly && (\n <Styled.InputMimic\n required\n type='text'\n inputMode='none'\n form={form}\n tabIndex={-1}\n onFocus={() => {\n inputRef.current?.focus()\n }}\n />\n )}\n <FormInput\n ref={inputRef}\n role='combobox'\n aria-controls={menuListId}\n aria-expanded={menuOpen}\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n type='text'\n autoComplete='off'\n autoCapitalize='off'\n autoCorrect='off'\n spellCheck='false'\n form={form}\n autoFocus={autoFocus}\n inputMode={searchable ? inputMode : 'none'}\n maxLength={maxLength}\n placeholder={placeholder}\n readOnly={readOnly || !searchable}\n required={inputRequired}\n disabled={rootProps.disabled}\n value={inputText}\n palette={{\n color: palette.color,\n colorDisabled: palette.colorDisabled,\n placeholderColor: palette.placeholderColor,\n placeholderColorDisabled: palette.placeholderColorDisabled,\n }}\n onClick={(evt) => {\n if (menuOpen && evt.currentTarget.selectionStart !== evt.currentTarget.selectionEnd) {\n evt.stopPropagation()\n }\n }}\n onChange={(evt) => {\n const inputValue = evt.currentTarget.value\n\n updateInputText(inputValue)\n updateOptionsDebounced(inputValue)\n setMenuOpenRequest(true)\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Enter.validate(evt.key)) {\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Space.validate(evt.key) && (!menuOpen || evt.currentTarget.selectionStart === 0)) {\n evt.preventDefault()\n\n if (!menuOpen) {\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n }\n\n setMenuOpenRequest((prev) => !prev)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Tab.validate(evt.key) && menuOpen) {\n evt.preventDefault()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.ArrowDown.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx + 1] ?? menuItems[0]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusFirstFocusable(menuListRef.current)\n }\n }\n\n if (keyboardKeys.ArrowUp.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx - 1] ?? menuItems[menuItems.length - 1]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusLastFocusable(menuListRef.current)\n }\n }\n }}\n />\n {dropdownSelectedOption.map((item) => (\n <input\n key={item.value}\n type='hidden'\n name={name}\n value={item.value}\n form={form}\n disabled={rootProps.disabled}\n />\n ))}\n </>\n }\n addon={\n <>\n {multiple && dropdownSelectedOption.length > 0 && (\n <Chip\n size='xs'\n active\n black\n marginLeft={12}\n disabled={rootProps.disabled}\n cursor={rootProps.disabled ? 'not-allowed' : undefined}\n text={dropdownSelectedOption.length}\n textProps={{\n appearance: 'caption',\n size: 'xs',\n }}\n palette={\n rootProps.disabled\n ? {\n color: 'content-disabled',\n colorHover: 'content-disabled',\n backgroundColor: 'bg-disabled-small',\n backgroundColorHover: 'bg-disabled-small',\n }\n : undefined\n }\n onPointerDown={(evt) => {\n evt.preventDefault()\n }}\n onMouseDown={(evt) => {\n if (!window.PointerEvent) evt.preventDefault()\n }}\n discardButtonProps={{\n square: true,\n contrast: !rootProps.disabled,\n onClick: (evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption([])\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n },\n }}\n />\n )}\n {!multiple && clearable && dropdownSelectedOption.length > 0 && (\n <IconButton\n icon='close'\n size='l'\n square\n marginLeft={12}\n disabled={rootProps.disabled}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(null)\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n }}\n />\n )}\n </>\n }\n dropdown={\n <DropdownMenu\n {...menuProps}\n setRef={setMenuRef}\n open={menuOpen}\n popperReferenceId={formInputLabelId}\n secondary={!contrast}\n elevated={contrast}\n disableAutoFocus\n palette={{\n backgroundColor: palette.menuBackgroundColor,\n borderColor: palette.menuBorderColor,\n }}\n empty={menuOptions.length === 0}\n loading={menuOptionsLoading}\n loadingMessage={loadingMessage}\n loadingIcon={loadingIcon}\n loadingIconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...loadingIconProps,\n }}\n emptyMessage={optionsEmptyMessage}\n emptyIcon={optionsEmptyIcon}\n emptyIconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...optionsEmptyIconProps,\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Tab.validate(evt.key)) {\n evt.preventDefault()\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Enter.validate(evt.key)) {\n inputRef.current?.focus()\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Backspace.validate(evt.key) && !readOnly && (multiple || (!multiple && clearable))) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(multiple ? [] : null)\n\n updateInputText('')\n updateOptions('')\n }\n }}\n >\n {multiple ? (\n <MenuList\n ref={menuListRef}\n id={menuListId}\n role='listbox'\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n aria-multiselectable\n >\n {inputText.length === 0 ? (\n <>\n {optionsMultiToggle && (\n <ListItem\n {...sizeProps}\n text={optionsMultiToggleCaption}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n name={name}\n checked={multiToggleChecked}\n indeterminate={multiToggleIndeterminate}\n error={(multiToggleChecked || multiToggleIndeterminate) && status === 'error'}\n success={(multiToggleChecked || multiToggleIndeterminate) && status === 'success'}\n onChange={() => {\n if (!readOnly) {\n const update = multiToggleChecked || multiToggleIndeterminate ? [] : [...menuOptions]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )}\n {optionsMultiToggle && <MenuDivider />}\n {groupSelectedOptions &&\n menuOptionsGroups[0].map((option) => {\n const optionStatus = option.status ?? status\n const optionErrorStatus = optionStatus === 'error'\n const optionSuccessStatus = optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n active\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n inputRef.current?.focus()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected\n name={name}\n value={option.value}\n checked\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = dropdownSelectedOption.filter(\n (item) => item.value !== evt.currentTarget.value\n )\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n {groupSelectedOptions && menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length > 0 && (\n <MenuDivider />\n )}\n {groupSelectedOptions &&\n menuOptionsGroups[1].map((option) => (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n inputRef.current?.focus()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={false}\n name={name}\n value={option.value}\n checked={false}\n onChange={() => {\n if (!readOnly) {\n const update = [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n ))}\n {!groupSelectedOptions &&\n menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n const optionStatus = option.status ?? status\n const optionErrorStatus = selected && optionStatus === 'error'\n const optionSuccessStatus = selected && optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n active={selected}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={selected}\n name={name}\n value={option.value}\n checked={selected}\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = selected\n ? dropdownSelectedOption.filter((item) => item.value !== evt.currentTarget.value)\n : [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n </>\n ) : (\n <>\n {menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n const optionStatus = option.status ?? status\n const optionErrorStatus = selected && optionStatus === 'error'\n const optionSuccessStatus = selected && optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n active={selected}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={selected}\n name={name}\n value={option.value}\n checked={selected}\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = selected\n ? dropdownSelectedOption.filter((item) => item.value !== evt.currentTarget.value)\n : [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n </>\n )}\n </MenuList>\n ) : (\n <MenuList\n ref={menuListRef}\n id={menuListId}\n role='listbox'\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n >\n {menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n return (\n <ListItem\n {...sizeProps}\n role='option'\n aria-selected={selected}\n ref={selected ? selectedOptionRef : undefined}\n key={option.value}\n text={option.text}\n active={selected}\n danger={selected && status === 'error'}\n success={selected && status === 'success'}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n const update = { ...option }\n\n if (selectedOption === undefined) {\n updateInputText(getDropdownInputText(update))\n setDropdownSelectedOption(getDropdownSelectedOption(update))\n }\n\n if (onSelectOption) onSelectOption(update)\n\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n }}\n />\n )\n })}\n </MenuList>\n )}\n </DropdownMenu>\n }\n />\n )\n }),\n {\n sizes: SIZES,\n displayName: COMPONENT_NAME,\n }\n)\n\nexport { Dropdown, COMPONENT_NAME }\n"],"names":["Dropdown","withMergedProps","forwardRef","props","ref","size","name","labelPosition","searchable","primary","optionsMultiToggle","iconProps","menuProps","loadingIconProps","optionsEmptyIconProps","loading","autoFocus","disableAutoScrollToSelectedOption","closeMenuOnScroll","scrollMonitorTarget","contrast","selectedOption","defaultSelectedOption","icon","inputMode","loadingMessage","loadingIcon","maxLength","multiple","clearable","onChangeInput","onCloseMenu","onOpenMenu","onSelectOption","options","loadOptions","groupSelectedOptions","optionsMultiToggleCaption","optionsEmptyMessage","optionsEmptyIcon","palette","placeholder","readOnly","required","status","sizeXXS","sizeXS","sizeS","sizeM","sizeL","sizeXL","form","rootProps","sizeProps","iconBaseProps","sizes","SIZES_ICON","color","disabled","formInputLabelId","useMemo","id","nanoid","inputLabelId","menuListId","filteredOptions","getFilteredOptions","useFilteredOptions","loadedOptions","optionsLoading","getLoadedOptions","useLoadedOptions","dropdownSelectedOption","setDropdownSelectedOption","useState","getDropdownSelectedOption","undefined","inputText","setInputText","getDropdownInputText","focusWithin","setFocusWithin","menuOpenRequest","setMenuOpenRequest","menuOptions","menuOptionsLoading","menuOptionsGroups","groupDropdownOptions","menuOpen","inputRequired","length","inputActive","Boolean","multiToggleChecked","multiToggleIndeterminate","inputRef","useRef","menuRef","setMenuRef","menuListRef","selectedOptionRef","menuOpenPrevRef","updateInputText","useCallback","inputTextValue","updateOptions","updateOptionsDebounced","createDebouncedCallback","preventBlur","evt","target","current","Node","currentTarget","contains","renderInPortal","preventDefault","useScrollMonitor","onScrollStart","focus","useLayoutEffect","useEffect","menuRect","getBoundingClientRect","selectedOptionRect","top","bottom","setTimeout","scrollTo","offsetTop","_jsx","FormInputLabel","labelId","active","onColored","error","success","jsx","Styled","up","labelColorDisabled","labelColor","backgroundColor","backgroundColorDisabled","backgroundColorHover","borderColor","borderColorDisabled","onClick","onPointerDown","onMouseDown","window","PointerEvent","onFocus","onBlur","relatedTarget","input","_jsxs","jsxs","_Fragment","children","type","tabIndex","FormInput","role","label","autoComplete","autoCapitalize","autoCorrect","spellCheck","value","colorDisabled","placeholderColor","placeholderColorDisabled","selectionStart","selectionEnd","stopPropagation","onChange","inputValue","onKeyDown","keyboardKeys","Enter","validate","key","Space","prev","Esc","Tab","ArrowDown","menuItems","idx","findIndex","item","focusTarget","HTMLElement","focusFirstFocusable","ArrowUp","focusLastFocusable","map","addon","Chip","black","marginLeft","cursor","text","textProps","appearance","colorHover","discardButtonProps","square","IconButton","dropdown","DropdownMenu","setRef","open","popperReferenceId","secondary","elevated","disableAutoFocus","menuBackgroundColor","menuBorderColor","empty","emptyMessage","emptyIcon","emptyIconProps","Backspace","MenuList","ListItem","borderRadius","ellipsis","wordBreak","control","InputCheckbox","SIZES_CHECKBOX","checked","indeterminate","update","MenuDivider","option","optionStatus","optionErrorStatus","optionSuccessStatus","_createElement","danger","filter","createElement","selected","SIZES","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sources":["../../../../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import { forwardRef, useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react'\nimport { nanoid } from 'nanoid'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport type { MergedProps } from 'hocs/withMergedProps'\nimport { useScrollMonitor } from 'hooks/useScrollMonitor'\nimport { focusFirstFocusable, focusLastFocusable } from 'shared/utils/dom'\nimport { createDebouncedCallback } from 'shared/utils/misc'\nimport { keyboardKeys } from 'shared/constants'\nimport type { Nullable } from 'shared/types'\nimport { FormInput } from 'components/FormInput'\nimport { FormInputLabel } from 'components/FormInputLabel'\nimport { MenuList } from 'components/MenuList'\nimport { MenuDivider } from 'components/MenuDivider'\nimport { ListItem } from 'components/ListItem'\nimport { InputCheckbox } from 'components/InputCheckbox'\nimport { Chip } from 'components/Chip'\nimport { IconButton } from 'components/IconButton'\nimport type { IconProps } from 'components/Icon'\nimport { DropdownMenu } from './DropdownMenu'\nimport { useFilteredOptions, useLoadedOptions } from './hooks'\nimport { SIZES, SIZES_CHECKBOX, SIZES_ICON } from './constants'\nimport { getDropdownInputText, getDropdownSelectedOption, groupDropdownOptions } from './utils'\nimport * as Styled from './style'\nimport type { DropdownProps, DropdownOption } from './types'\n\nconst COMPONENT_NAME = 'Dropdown'\n\n/**\n *\n * Компонент поддерживает все атрибуты \\<div\\> элемента.\n *\n * Можно передать \"ref\", который будет ассоциирован с рутовым элементом.\n *\n * Поддерживаются пропсы определения размеров и внешних отступов в зависимости от ширины вьюпорта.\n *\n * Полный интерфейс можно посмотреть [тут](https://github.com/foxford/ui/blob/master/src/components/Dropdown/types.ts).\n */\nconst Dropdown: React.ForwardRefExoticComponent<DropdownProps> = withMergedProps<DropdownProps, HTMLDivElement>(\n forwardRef<HTMLDivElement, MergedProps<DropdownProps>>((props, ref) => {\n const {\n size = 'm',\n name = 'fox-dropdown',\n labelPosition = 'dynamic',\n searchable = true,\n primary = true,\n optionsMultiToggle = true,\n iconProps = {},\n menuProps = {},\n loadingIconProps = {},\n optionsEmptyIconProps = {},\n loading,\n autoFocus,\n disableAutoScrollToSelectedOption,\n closeMenuOnScroll,\n scrollMonitorTarget,\n contrast,\n selectedOption,\n defaultSelectedOption,\n icon,\n inputMode,\n loadingMessage,\n loadingIcon,\n maxLength,\n multiple,\n clearable,\n onChangeInput,\n onCloseMenu,\n onOpenMenu,\n onSelectOption,\n options,\n loadOptions,\n groupSelectedOptions,\n optionsMultiToggleCaption,\n optionsEmptyMessage,\n optionsEmptyIcon,\n palette,\n placeholder,\n readOnly,\n required,\n status,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n form,\n ...rootProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconBaseProps: IconProps = {\n sizes: SIZES_ICON,\n color: rootProps.disabled ? 'content-disabled' : 'content-onmain-tertiary',\n }\n\n const formInputLabelId = useMemo(() => rootProps.id ?? `${name}-${nanoid()}`, [name, rootProps.id])\n const inputLabelId = useMemo(() => nanoid(), [])\n const menuListId = useMemo(() => nanoid(), [])\n\n const [filteredOptions, getFilteredOptions] = useFilteredOptions({\n options,\n })\n\n const [loadedOptions, optionsLoading, getLoadedOptions] = useLoadedOptions({\n loadOptions,\n options,\n })\n\n const [dropdownSelectedOption, setDropdownSelectedOption] = useState<DropdownOption[]>(() =>\n getDropdownSelectedOption(selectedOption !== undefined ? selectedOption : defaultSelectedOption, multiple)\n )\n\n const [inputText, setInputText] = useState<string>(() => getDropdownInputText(dropdownSelectedOption, multiple))\n\n const [focusWithin, setFocusWithin] = useState<boolean>(false)\n\n const [menuOpenRequest, setMenuOpenRequest] = useState<boolean>(false)\n\n const menuOptions: DropdownOption[] = loadOptions ? loadedOptions : filteredOptions\n const menuOptionsLoading = loadOptions ? (loading ?? optionsLoading) : loading\n\n const menuOptionsGroups: ReturnType<typeof groupDropdownOptions> = useMemo(\n () => (multiple ? groupDropdownOptions(menuOptions, dropdownSelectedOption) : [[], []]),\n [multiple, menuOptions, dropdownSelectedOption]\n )\n\n const menuOpen = menuOpenRequest && !rootProps.disabled\n\n const inputRequired = required && dropdownSelectedOption.length === 0\n const inputActive = Boolean(menuOpen || inputText || focusWithin)\n\n const multiToggleChecked = menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length === 0\n const multiToggleIndeterminate = menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length > 0\n\n const inputRef = useRef<HTMLInputElement>(null)\n const [menuRef, setMenuRef] = useState<Nullable<HTMLElement>>(null)\n const menuListRef = useRef<HTMLUListElement>(null)\n const selectedOptionRef = useRef<HTMLElement>(null)\n const menuOpenPrevRef = useRef<boolean>(menuOpen)\n\n const updateInputText = useCallback(\n (inputTextValue: string) => {\n setInputText(inputTextValue)\n\n if (onChangeInput) {\n onChangeInput(inputTextValue)\n }\n },\n [onChangeInput]\n )\n\n const updateOptions = useCallback(\n (inputTextValue: string) => {\n if (loadOptions) {\n getLoadedOptions(inputTextValue)\n } else {\n getFilteredOptions(inputTextValue)\n }\n },\n [loadOptions, getLoadedOptions, getFilteredOptions]\n )\n\n const updateOptionsDebounced = useMemo(() => {\n return createDebouncedCallback(updateOptions, 150)\n }, [updateOptions])\n\n const preventBlur = (evt: React.PointerEvent<HTMLDivElement> | React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (\n evt.target !== inputRef.current &&\n evt.target instanceof Node &&\n (evt.currentTarget.contains(evt.target) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.target)))\n ) {\n evt.preventDefault()\n }\n }\n\n useScrollMonitor({\n target: scrollMonitorTarget,\n onScrollStart: () => {\n if (closeMenuOnScroll && menuOpen) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n },\n })\n\n useLayoutEffect(() => {\n if (selectedOption === undefined) return\n\n if (!multiple && !menuOpen) {\n updateInputText(getDropdownInputText(selectedOption))\n }\n setDropdownSelectedOption(getDropdownSelectedOption(selectedOption, multiple))\n }, [multiple, selectedOption, menuOpen, updateInputText])\n\n useEffect(() => {\n if (menuOpen === menuOpenPrevRef.current) return\n\n if (menuOpen && onOpenMenu) onOpenMenu()\n if (!menuOpen && onCloseMenu) onCloseMenu()\n\n menuOpenPrevRef.current = menuOpen\n }, [menuOpen, onCloseMenu, onOpenMenu])\n\n useEffect(() => {\n if (\n !multiple &&\n !disableAutoScrollToSelectedOption &&\n menuOpen &&\n !menuOptionsLoading &&\n inputText.length === 0 &&\n menuRef &&\n selectedOptionRef.current\n ) {\n const menuRect = menuRef.getBoundingClientRect()\n const selectedOptionRect = selectedOptionRef.current.getBoundingClientRect()\n\n if (selectedOptionRect.top < menuRect.top || selectedOptionRect.bottom > menuRect.bottom) {\n setTimeout(() => {\n if (menuRef && selectedOptionRef.current) {\n menuRef.scrollTo(0, selectedOptionRef.current.offsetTop)\n }\n }, 0)\n }\n }\n }, [multiple, disableAutoScrollToSelectedOption, menuOpen, menuOptionsLoading, inputText, menuRef])\n\n return (\n <FormInputLabel\n {...rootProps}\n {...sizeProps}\n ref={ref}\n id={formInputLabelId}\n labelId={inputLabelId}\n labelPosition={labelPosition}\n active={inputActive}\n onColored={contrast}\n primary={primary}\n error={status === 'error'}\n success={status === 'success'}\n focus={focusWithin}\n icon={[icon, <Styled.ChevronIcon key='chevron' up={menuOpen} />]}\n iconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...iconProps,\n }}\n palette={{\n color: rootProps.disabled ? palette.labelColorDisabled : palette.labelColor,\n backgroundColor: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColor,\n backgroundColorHover: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColorHover,\n borderColor: rootProps.disabled ? palette.borderColorDisabled : palette.borderColor,\n }}\n onClick={(evt) => {\n if (rootProps.onClick) rootProps.onClick(evt)\n\n if (rootProps.disabled) return\n\n inputRef.current?.focus()\n\n if (!menuOpen) {\n setMenuOpenRequest(true)\n\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n } else if (menuRef && evt.target instanceof Node && !menuRef.contains(evt.target)) {\n setMenuOpenRequest(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n }\n }}\n onPointerDown={(evt) => {\n if (rootProps.onPointerDown) rootProps.onPointerDown(evt)\n\n preventBlur(evt)\n }}\n onMouseDown={(evt) => {\n if (rootProps.onMouseDown) rootProps.onMouseDown(evt)\n\n if (!window.PointerEvent) preventBlur(evt)\n }}\n onFocus={(evt) => {\n if (rootProps.onFocus) rootProps.onFocus(evt)\n\n setFocusWithin(true)\n\n if (inputRef.current && evt.target === inputRef.current && searchable && !multiple && !menuOpen) {\n updateInputText('')\n }\n }}\n onBlur={(evt) => {\n if (rootProps.onBlur) rootProps.onBlur(evt)\n\n if (\n evt.currentTarget.contains(evt.relatedTarget) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.relatedTarget))\n ) {\n return\n }\n\n setFocusWithin(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }}\n input={\n <>\n {inputRequired && !searchable && !readOnly ? (\n <Styled.InputMimic\n required\n type='text'\n inputMode='none'\n form={form}\n tabIndex={-1}\n onFocus={() => {\n inputRef.current?.focus()\n }}\n />\n ) : null}\n <FormInput\n ref={inputRef}\n role='combobox'\n aria-controls={menuListId}\n aria-expanded={menuOpen}\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n type='text'\n autoComplete='off'\n autoCapitalize='off'\n autoCorrect='off'\n spellCheck='false'\n form={form}\n autoFocus={autoFocus}\n inputMode={searchable ? inputMode : 'none'}\n maxLength={maxLength}\n placeholder={placeholder}\n readOnly={readOnly || !searchable}\n required={inputRequired}\n disabled={rootProps.disabled}\n value={inputText}\n palette={{\n color: palette.color,\n colorDisabled: palette.colorDisabled,\n placeholderColor: palette.placeholderColor,\n placeholderColorDisabled: palette.placeholderColorDisabled,\n }}\n onClick={(evt) => {\n if (menuOpen && evt.currentTarget.selectionStart !== evt.currentTarget.selectionEnd) {\n evt.stopPropagation()\n }\n }}\n onChange={(evt) => {\n const inputValue = evt.currentTarget.value\n\n updateInputText(inputValue)\n updateOptionsDebounced(inputValue)\n setMenuOpenRequest(true)\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Enter.validate(evt.key)) {\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Space.validate(evt.key) && (!menuOpen || evt.currentTarget.selectionStart === 0)) {\n evt.preventDefault()\n\n if (!menuOpen) {\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n }\n\n setMenuOpenRequest((prev) => !prev)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Tab.validate(evt.key) && menuOpen) {\n evt.preventDefault()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.ArrowDown.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx + 1] ?? menuItems[0]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusFirstFocusable(menuListRef.current)\n }\n }\n\n if (keyboardKeys.ArrowUp.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx - 1] ?? menuItems[menuItems.length - 1]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusLastFocusable(menuListRef.current)\n }\n }\n }}\n />\n {dropdownSelectedOption.map((item) => (\n <input\n key={item.value}\n type='hidden'\n name={name}\n value={item.value}\n form={form}\n disabled={rootProps.disabled}\n />\n ))}\n </>\n }\n addon={\n <>\n {multiple && dropdownSelectedOption.length > 0 ? (\n <Chip\n size='xs'\n active\n black\n marginLeft={12}\n disabled={rootProps.disabled}\n cursor={rootProps.disabled ? 'not-allowed' : undefined}\n text={dropdownSelectedOption.length}\n textProps={{\n appearance: 'caption',\n size: 'xs',\n }}\n palette={\n rootProps.disabled\n ? {\n color: 'content-disabled',\n colorHover: 'content-disabled',\n backgroundColor: 'bg-disabled-small',\n backgroundColorHover: 'bg-disabled-small',\n }\n : undefined\n }\n onPointerDown={(evt) => {\n evt.preventDefault()\n }}\n onMouseDown={(evt) => {\n if (!window.PointerEvent) evt.preventDefault()\n }}\n discardButtonProps={{\n square: true,\n contrast: !rootProps.disabled,\n onClick: (evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption([])\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n },\n }}\n />\n ) : null}\n {!multiple && clearable && dropdownSelectedOption.length > 0 ? (\n <IconButton\n icon='close'\n size='l'\n square\n marginLeft={12}\n disabled={rootProps.disabled}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(null)\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n }}\n />\n ) : null}\n </>\n }\n dropdown={\n <DropdownMenu\n {...menuProps}\n setRef={setMenuRef}\n open={menuOpen}\n popperReferenceId={formInputLabelId}\n secondary={!contrast}\n elevated={contrast}\n disableAutoFocus\n palette={{\n backgroundColor: palette.menuBackgroundColor,\n borderColor: palette.menuBorderColor,\n }}\n empty={menuOptions.length === 0}\n loading={menuOptionsLoading}\n loadingMessage={loadingMessage}\n loadingIcon={loadingIcon}\n loadingIconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...loadingIconProps,\n }}\n emptyMessage={optionsEmptyMessage}\n emptyIcon={optionsEmptyIcon}\n emptyIconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...optionsEmptyIconProps,\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Tab.validate(evt.key)) {\n evt.preventDefault()\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Enter.validate(evt.key)) {\n inputRef.current?.focus()\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Backspace.validate(evt.key) && !readOnly && (multiple || (!multiple && clearable))) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(multiple ? [] : null)\n\n updateInputText('')\n updateOptions('')\n }\n }}\n >\n {multiple ? (\n <MenuList\n ref={menuListRef}\n id={menuListId}\n role='listbox'\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n aria-multiselectable\n >\n {inputText.length === 0 ? (\n <>\n {optionsMultiToggle ? (\n <ListItem\n {...sizeProps}\n text={optionsMultiToggleCaption}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n name={name}\n checked={multiToggleChecked}\n indeterminate={multiToggleIndeterminate}\n error={Boolean((multiToggleChecked || multiToggleIndeterminate) && status === 'error')}\n success={Boolean((multiToggleChecked || multiToggleIndeterminate) && status === 'success')}\n onChange={() => {\n if (!readOnly) {\n const update = multiToggleChecked || multiToggleIndeterminate ? [] : [...menuOptions]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n ) : null}\n {optionsMultiToggle ? <MenuDivider /> : null}\n {groupSelectedOptions\n ? menuOptionsGroups[0].map((option) => {\n const optionStatus = option.status ?? status\n const optionErrorStatus = optionStatus === 'error'\n const optionSuccessStatus = optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n active\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n inputRef.current?.focus()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected\n name={name}\n value={option.value}\n checked\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = dropdownSelectedOption.filter(\n (item) => item.value !== evt.currentTarget.value\n )\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })\n : null}\n {groupSelectedOptions && menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length > 0 ? (\n <MenuDivider />\n ) : null}\n {groupSelectedOptions\n ? menuOptionsGroups[1].map((option) => (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n inputRef.current?.focus()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={false}\n name={name}\n value={option.value}\n checked={false}\n onChange={() => {\n if (!readOnly) {\n const update = [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n ))\n : null}\n {!groupSelectedOptions &&\n menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n const optionStatus = option.status ?? status\n const optionErrorStatus = selected && optionStatus === 'error'\n const optionSuccessStatus = selected && optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n active={selected}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={selected}\n name={name}\n value={option.value}\n checked={selected}\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = selected\n ? dropdownSelectedOption.filter((item) => item.value !== evt.currentTarget.value)\n : [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n </>\n ) : (\n <>\n {menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n const optionStatus = option.status ?? status\n const optionErrorStatus = selected && optionStatus === 'error'\n const optionSuccessStatus = selected && optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n active={selected}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={selected}\n name={name}\n value={option.value}\n checked={selected}\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = selected\n ? dropdownSelectedOption.filter((item) => item.value !== evt.currentTarget.value)\n : [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n </>\n )}\n </MenuList>\n ) : (\n <MenuList\n ref={menuListRef}\n id={menuListId}\n role='listbox'\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n >\n {menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n return (\n <ListItem\n {...sizeProps}\n role='option'\n aria-selected={selected}\n ref={selected ? selectedOptionRef : undefined}\n key={option.value}\n text={option.text}\n active={selected}\n danger={Boolean(selected && status === 'error')}\n success={Boolean(selected && status === 'success')}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n const update = { ...option }\n\n if (selectedOption === undefined) {\n updateInputText(getDropdownInputText(update))\n setDropdownSelectedOption(getDropdownSelectedOption(update))\n }\n\n if (onSelectOption) onSelectOption(update)\n\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n }}\n />\n )\n })}\n </MenuList>\n )}\n </DropdownMenu>\n }\n />\n )\n }),\n {\n sizes: SIZES,\n displayName: COMPONENT_NAME,\n }\n)\n\nexport { Dropdown, COMPONENT_NAME }\n"],"names":["Dropdown","withMergedProps","forwardRef","props","ref","size","name","labelPosition","searchable","primary","optionsMultiToggle","iconProps","menuProps","loadingIconProps","optionsEmptyIconProps","loading","autoFocus","disableAutoScrollToSelectedOption","closeMenuOnScroll","scrollMonitorTarget","contrast","selectedOption","defaultSelectedOption","icon","inputMode","loadingMessage","loadingIcon","maxLength","multiple","clearable","onChangeInput","onCloseMenu","onOpenMenu","onSelectOption","options","loadOptions","groupSelectedOptions","optionsMultiToggleCaption","optionsEmptyMessage","optionsEmptyIcon","palette","placeholder","readOnly","required","status","sizeXXS","sizeXS","sizeS","sizeM","sizeL","sizeXL","form","rootProps","sizeProps","iconBaseProps","sizes","SIZES_ICON","color","disabled","formInputLabelId","useMemo","id","nanoid","inputLabelId","menuListId","filteredOptions","getFilteredOptions","useFilteredOptions","loadedOptions","optionsLoading","getLoadedOptions","useLoadedOptions","dropdownSelectedOption","setDropdownSelectedOption","useState","getDropdownSelectedOption","undefined","inputText","setInputText","getDropdownInputText","focusWithin","setFocusWithin","menuOpenRequest","setMenuOpenRequest","menuOptions","menuOptionsLoading","menuOptionsGroups","groupDropdownOptions","menuOpen","inputRequired","length","inputActive","Boolean","multiToggleChecked","multiToggleIndeterminate","inputRef","useRef","menuRef","setMenuRef","menuListRef","selectedOptionRef","menuOpenPrevRef","updateInputText","useCallback","inputTextValue","updateOptions","updateOptionsDebounced","createDebouncedCallback","preventBlur","evt","target","current","Node","currentTarget","contains","renderInPortal","preventDefault","useScrollMonitor","onScrollStart","focus","useLayoutEffect","useEffect","menuRect","getBoundingClientRect","selectedOptionRect","top","bottom","setTimeout","scrollTo","offsetTop","_jsx","FormInputLabel","labelId","active","onColored","error","success","jsx","Styled","up","labelColorDisabled","labelColor","backgroundColor","backgroundColorDisabled","backgroundColorHover","borderColor","borderColorDisabled","onClick","onPointerDown","onMouseDown","window","PointerEvent","onFocus","onBlur","relatedTarget","input","_jsxs","jsxs","_Fragment","children","type","tabIndex","FormInput","role","label","autoComplete","autoCapitalize","autoCorrect","spellCheck","value","colorDisabled","placeholderColor","placeholderColorDisabled","selectionStart","selectionEnd","stopPropagation","onChange","inputValue","onKeyDown","keyboardKeys","Enter","validate","key","Space","prev","Esc","Tab","ArrowDown","menuItems","idx","findIndex","item","focusTarget","HTMLElement","focusFirstFocusable","ArrowUp","focusLastFocusable","map","addon","Chip","black","marginLeft","cursor","text","textProps","appearance","colorHover","discardButtonProps","square","IconButton","dropdown","DropdownMenu","setRef","open","popperReferenceId","secondary","elevated","disableAutoFocus","menuBackgroundColor","menuBorderColor","empty","emptyMessage","emptyIcon","emptyIconProps","Backspace","MenuList","ListItem","borderRadius","ellipsis","wordBreak","control","InputCheckbox","SIZES_CHECKBOX","checked","indeterminate","update","MenuDivider","option","optionStatus","optionErrorStatus","optionSuccessStatus","_createElement","danger","filter","selected","SIZES","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{forwardRef,useMemo,useState,useRef,useCallback,useLayoutEffect,useEffect,createElement}from'react';import{nanoid}from'nanoid';import{withMergedProps}from'../../hocs/withMergedProps.mjs';import{useScrollMonitor}from'../../hooks/useScrollMonitor.mjs';import{focusFirstFocusable,focusLastFocusable}from'../../shared/utils/dom.mjs';import{createDebouncedCallback}from'../../shared/utils/misc.mjs';import{keyboardKeys}from'../../shared/constants.mjs';import{DropdownMenu}from'./DropdownMenu.mjs';import{useFilteredOptions,useLoadedOptions}from'./hooks.mjs';import{SIZES,SIZES_ICON,SIZES_CHECKBOX}from'./constants.mjs';import{getDropdownSelectedOption,getDropdownInputText,groupDropdownOptions}from'./utils.mjs';import{ChevronIcon,InputMimic}from'./style.mjs';import{jsx,jsxs,Fragment}from'react/jsx-runtime';import{FormInputLabel}from'../FormInputLabel/FormInputLabel.mjs';import{FormInput}from'../FormInput/FormInput.mjs';import{Chip}from'../Chip/Chip.mjs';import{IconButton}from'../IconButton/IconButton.mjs';import{MenuList}from'../MenuList/MenuList.mjs';import{ListItem}from'../ListItem/ListItem.mjs';import{InputCheckbox}from'../InputCheckbox/InputCheckbox.mjs';import{MenuDivider}from'../MenuDivider/MenuDivider.mjs';const COMPONENT_NAME='Dropdown';const Dropdown=withMergedProps(forwardRef(((e,o)=>{const{size:t="m",name:r="fox-dropdown",labelPosition:n="dynamic",searchable:s=!0,primary:a=!0,optionsMultiToggle:l=!0,iconProps:i={},menuProps:c={},loadingIconProps:d={},optionsEmptyIconProps:u={},loading:p,autoFocus:m,disableAutoScrollToSelectedOption:b,closeMenuOnScroll:f,scrollMonitorTarget:g,contrast:v,selectedOption:C,defaultSelectedOption:k,icon:x,inputMode:I,loadingMessage:h,loadingIcon:y,maxLength:w,multiple:D,clearable:M,onChangeInput:S,onCloseMenu:E,onOpenMenu:j,onSelectOption:P,options:L,loadOptions:O,groupSelectedOptions:F,optionsMultiToggleCaption:T,optionsEmptyMessage:B,optionsEmptyIcon:z,palette:K,placeholder:R,readOnly:X,required:H,status:N,sizeXXS:Z,sizeXS:_,sizeS:A,sizeM:q,sizeL:$,sizeXL:U,form:G,...J}=e;const Q={size:t,sizeXXS:Z,sizeXS:_,sizeS:A,sizeM:q,sizeL:$,sizeXL:U};const V={sizes:SIZES_ICON,color:J.disabled?'content-disabled':'content-onmain-tertiary'};const W=useMemo((()=>J.id??`${r}-${nanoid()}`),[r,J.id]);const Y=useMemo((()=>nanoid()),[]);const ee=useMemo((()=>nanoid()),[]);const[oe,te]=useFilteredOptions({options:L});const[re,ne,se]=useLoadedOptions({loadOptions:O,options:L});const[ae,le]=useState((()=>getDropdownSelectedOption(C!==void 0?C:k,D)));const[ie,ce]=useState((()=>getDropdownInputText(ae,D)));const[de,ue]=useState(!1);const[pe,me]=useState(!1);const be=O?re:oe;const fe=O?p??ne:p;const ge=useMemo((()=>D?groupDropdownOptions(be,ae):[[],[]]),[D,be,ae]);const ve=pe&&!J.disabled;const Ce=H&&ae.length===0;const ke=Boolean(ve||ie||de);const xe=ge[0].length>0&&ge[1].length===0;const Ie=ge[0].length>0&&ge[1].length>0;const he=useRef(null);const[ye,we]=useState(null);const De=useRef(null);const Me=useRef(null);const Se=useRef(ve);const Ee=useCallback((e=>{ce(e),S&&S(e)}),[S]);const je=useCallback((e=>{O?se(e):te(e)}),[O,se,te]);const Pe=useMemo((()=>createDebouncedCallback(je,150)),[je]);const preventBlur=e=>{e.target!==he.current&&e.target instanceof Node&&(e.currentTarget.contains(e.target)||c.renderInPortal&&ve&&ye&&ye.contains(e.target))&&e.preventDefault()};return useScrollMonitor({target:g,onScrollStart:()=>{f&&ve&&(he.current?.focus(),me(!1))}}),useLayoutEffect((()=>{C!==void 0&&(D||ve||Ee(getDropdownInputText(C)),le(getDropdownSelectedOption(C,D)))}),[D,C,ve,Ee]),useEffect((()=>{ve!==Se.current&&(ve&&j&&j(),!ve&&E&&E(),Se.current=ve)}),[ve,E,j]),useEffect((()=>{if(!D&&!b&&ve&&!fe&&ie.length===0&&ye&&Me.current){const e=ye.getBoundingClientRect();const o=Me.current.getBoundingClientRect();(o.top<e.top||o.bottom>e.bottom)&&setTimeout((()=>{ye&&Me.current&&ye.scrollTo(0,Me.current.offsetTop)}),0)}}),[D,b,ve,fe,ie,ye]),jsx(FormInputLabel,{...J,...Q,ref:o,id:W,labelId:Y,labelPosition:n,active:ke,onColored:v,primary:a,error:N==='error',success:N==='success',focus:de,icon:[x,jsx(ChevronIcon,{up:ve},'chevron')],iconProps:{...Q,...V,...i},palette:{color:J.disabled?K.labelColorDisabled:K.labelColor,backgroundColor:J.disabled?K.backgroundColorDisabled:K.backgroundColor,backgroundColorHover:J.disabled?K.backgroundColorDisabled:K.backgroundColorHover,borderColor:J.disabled?K.borderColorDisabled:K.borderColor},onClick:e=>{J.onClick&&J.onClick(e),J.disabled||(he.current?.focus(),ve?ye&&e.target instanceof Node&&!ye.contains(e.target)&&(me(!1),Ee(getDropdownInputText(ae,D))):(me(!0),je(''),s&&Ee('')))},onPointerDown:e=>{J.onPointerDown&&J.onPointerDown(e),preventBlur(e)},onMouseDown:e=>{J.onMouseDown&&J.onMouseDown(e),window.PointerEvent||preventBlur(e)},onFocus:e=>{J.onFocus&&J.onFocus(e),ue(!0),he.current&&e.target===he.current&&s&&!D&&!ve&&Ee('')},onBlur:e=>{J.onBlur&&J.onBlur(e),e.currentTarget.contains(e.relatedTarget)||c.renderInPortal&&ve&&ye&&ye.contains(e.relatedTarget)||(ue(!1),Ee(getDropdownInputText(ae,D)),me(!1))},input:jsxs(Fragment,{children:[Ce&&!s&&!X&&jsx(InputMimic,{required:!0,type:"text",inputMode:"none",form:G,tabIndex:-1,onFocus:()=>{he.current?.focus()}}),jsx(FormInput,{ref:he,role:"combobox","aria-controls":ee,"aria-expanded":ve,"aria-labelledby":J.label?Y:void 0,type:"text",autoComplete:"off",autoCapitalize:"off",autoCorrect:"off",spellCheck:"false",form:G,autoFocus:m,inputMode:s?I:'none',maxLength:w,placeholder:R,readOnly:X||!s,required:Ce,disabled:J.disabled,value:ie,palette:{color:K.color,colorDisabled:K.colorDisabled,placeholderColor:K.placeholderColor,placeholderColorDisabled:K.placeholderColorDisabled},onClick:e=>{ve&&e.currentTarget.selectionStart!==e.currentTarget.selectionEnd&&e.stopPropagation()},onChange:e=>{const o=e.currentTarget.value;Ee(o),Pe(o),me(!0)},onKeyDown:e=>{if(keyboardKeys.Enter.validate(e.key)&&(Ee(getDropdownInputText(ae,D)),me(!1)),!keyboardKeys.Space.validate(e.key)||ve&&e.currentTarget.selectionStart!==0||(e.preventDefault(),ve||(je(''),s&&Ee('')),me((e=>!e))),keyboardKeys.Esc.validate(e.key)&&me(!1),keyboardKeys.Tab.validate(e.key)&&ve&&(e.preventDefault(),me(!1)),keyboardKeys.ArrowDown.validate(e.key)&&ve&&De.current)if(e.preventDefault(),!D&&Me.current){const e=[...De.current.children];const o=e.findIndex((e=>e.contains(Me.current)));const t=e[o+1]??e[0];t instanceof HTMLElement&&focusFirstFocusable(t)}else focusFirstFocusable(De.current);if(keyboardKeys.ArrowUp.validate(e.key)&&ve&&De.current)if(e.preventDefault(),!D&&Me.current){const e=[...De.current.children];const o=e.findIndex((e=>e.contains(Me.current)));const t=e[o-1]??e[e.length-1];t instanceof HTMLElement&&focusFirstFocusable(t)}else focusLastFocusable(De.current)}}),ae.map((e=>jsx("input",{type:"hidden",name:r,value:e.value,form:G,disabled:J.disabled},e.value)))]}),addon:jsxs(Fragment,{children:[D&&ae.length>0&&jsx(Chip,{size:"xs",active:!0,black:!0,marginLeft:12,disabled:J.disabled,cursor:J.disabled?'not-allowed':void 0,text:ae.length,textProps:{appearance:'caption',size:'xs'},palette:J.disabled?{color:'content-disabled',colorHover:'content-disabled',backgroundColor:'bg-disabled-small',backgroundColorHover:'bg-disabled-small'}:void 0,onPointerDown:e=>{e.preventDefault()},onMouseDown:e=>{window.PointerEvent||e.preventDefault()},discardButtonProps:{square:!0,contrast:!J.disabled,onClick:e=>{e.stopPropagation(),X||(C===void 0&&le([]),P&&P([]),he.current?.focus(),Ee(''),je(''),me(!0))}}}),!D&&M&&ae.length>0&&jsx(IconButton,{icon:"close",size:"l",square:!0,marginLeft:12,disabled:J.disabled,onClick:e=>{e.stopPropagation(),X||(C===void 0&&le([]),P&&P(null),he.current?.focus(),Ee(''),je(''),me(!0))}})]}),dropdown:jsx(DropdownMenu,{...c,setRef:we,open:ve,popperReferenceId:W,secondary:!v,elevated:v,disableAutoFocus:!0,palette:{backgroundColor:K.menuBackgroundColor,borderColor:K.menuBorderColor},empty:be.length===0,loading:fe,loadingMessage:h,loadingIcon:y,loadingIconProps:{...Q,...V,...d},emptyMessage:B,emptyIcon:z,emptyIconProps:{...Q,...V,...u},onKeyDown:e=>{keyboardKeys.Tab.validate(e.key)&&(e.preventDefault(),he.current?.focus(),me(!1)),keyboardKeys.Enter.validate(e.key)&&(he.current?.focus(),Ee(getDropdownInputText(ae,D)),me(!1)),keyboardKeys.Esc.validate(e.key)&&(he.current?.focus(),me(!1)),keyboardKeys.Backspace.validate(e.key)&&!X&&(D||!D&&M)&&(C===void 0&&le([]),P&&P(D?[]:null),Ee(''),je(''))},children:jsx(MenuList,D?{ref:De,id:ee,role:"listbox","aria-labelledby":J.label?Y:void 0,"aria-multiselectable":!0,children:ie.length===0?jsxs(Fragment,{children:[l&&jsx(ListItem,{...Q,text:T,disabled:J.disabled,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",name:r,checked:xe,indeterminate:Ie,error:(xe||Ie)&&N==='error',success:(xe||Ie)&&N==='success',onChange:()=>{if(!X){const e=xe||Ie?[]:[...be];C===void 0&&le(e),P&&P(e)}}})}),l&&jsx(MenuDivider,{}),F&&ge[0].map((e=>{const o=e.status??N;const t=o==='error';const n=o==='success';return createElement(ListItem,{...Q,key:e.value,active:!0,text:e.text,danger:t,success:n,disabled:J.disabled,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation(),he.current?.focus()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",role:"option","aria-selected":!0,name:r,value:e.value,checked:!0,error:t,success:n,onChange:e=>{if(!X){const o=ae.filter((o=>o.value!==e.currentTarget.value));C===void 0&&le(o),P&&P(o)}}})})})),F&&ge[0].length>0&&ge[1].length>0&&jsx(MenuDivider,{}),F&&ge[1].map((e=>createElement(ListItem,{...Q,key:e.value,text:e.text,disabled:J.disabled,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation(),he.current?.focus()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",role:"option","aria-selected":!1,name:r,value:e.value,checked:!1,onChange:()=>{if(!X){const o=[...ae,e];C===void 0&&le(o),P&&P(o)}}})}))),!F&&be.map((e=>{const o=ae.findIndex((o=>o.value===e.value))!==-1;const t=e.status??N;const n=o&&t==='error';const s=o&&t==='success';return createElement(ListItem,{...Q,key:e.value,text:e.text,danger:n,success:s,disabled:J.disabled,active:o,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",role:"option","aria-selected":o,name:r,value:e.value,checked:o,error:n,success:s,onChange:t=>{if(!X){const r=o?ae.filter((e=>e.value!==t.currentTarget.value)):[...ae,e];C===void 0&&le(r),P&&P(r)}}})})}))]}):jsx(Fragment,{children:be.map((e=>{const o=ae.findIndex((o=>o.value===e.value))!==-1;const t=e.status??N;const n=o&&t==='error';const s=o&&t==='success';return createElement(ListItem,{...Q,key:e.value,text:e.text,danger:n,success:s,disabled:J.disabled,active:o,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",role:"option","aria-selected":o,name:r,value:e.value,checked:o,error:n,success:s,onChange:t=>{if(!X){const r=o?ae.filter((e=>e.value!==t.currentTarget.value)):[...ae,e];C===void 0&&le(r),P&&P(r)}}})})}))})}:{ref:De,id:ee,role:"listbox","aria-labelledby":J.label?Y:void 0,children:be.map((e=>{const o=ae.findIndex((o=>o.value===e.value))!==-1;return createElement(ListItem,{...Q,role:"option","aria-selected":o,ref:o?Me:void 0,key:e.value,text:e.text,active:o,danger:o&&N==='error',success:o&&N==='success',disabled:J.disabled,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:o=>{if(o.stopPropagation(),!X){const o={...e};C===void 0&&(Ee(getDropdownInputText(o)),le(getDropdownSelectedOption(o))),P&&P(o),he.current?.focus(),me(!1)}}})}))})})})})),{sizes:SIZES,displayName:"Dropdown"});export{COMPONENT_NAME,Dropdown};
|
|
1
|
+
import{forwardRef,useMemo,useState,useRef,useCallback,useLayoutEffect,useEffect,createElement}from'react';import{nanoid}from'nanoid';import{withMergedProps}from'../../hocs/withMergedProps.mjs';import{useScrollMonitor}from'../../hooks/useScrollMonitor.mjs';import{focusFirstFocusable,focusLastFocusable}from'../../shared/utils/dom.mjs';import{createDebouncedCallback}from'../../shared/utils/misc.mjs';import{keyboardKeys}from'../../shared/constants.mjs';import{DropdownMenu}from'./DropdownMenu.mjs';import{useFilteredOptions,useLoadedOptions}from'./hooks.mjs';import{SIZES,SIZES_ICON,SIZES_CHECKBOX}from'./constants.mjs';import{getDropdownSelectedOption,getDropdownInputText,groupDropdownOptions}from'./utils.mjs';import{ChevronIcon,InputMimic}from'./style.mjs';import{jsx,jsxs,Fragment}from'react/jsx-runtime';import{FormInputLabel}from'../FormInputLabel/FormInputLabel.mjs';import{FormInput}from'../FormInput/FormInput.mjs';import{Chip}from'../Chip/Chip.mjs';import{IconButton}from'../IconButton/IconButton.mjs';import{MenuList}from'../MenuList/MenuList.mjs';import{ListItem}from'../ListItem/ListItem.mjs';import{InputCheckbox}from'../InputCheckbox/InputCheckbox.mjs';import{MenuDivider}from'../MenuDivider/MenuDivider.mjs';const COMPONENT_NAME='Dropdown';const Dropdown=withMergedProps(forwardRef(((e,o)=>{const{size:t="m",name:n="fox-dropdown",labelPosition:r="dynamic",searchable:s=!0,primary:a=!0,optionsMultiToggle:l=!0,iconProps:i={},menuProps:c={},loadingIconProps:d={},optionsEmptyIconProps:u={},loading:p,autoFocus:m,disableAutoScrollToSelectedOption:b,closeMenuOnScroll:f,scrollMonitorTarget:g,contrast:v,selectedOption:C,defaultSelectedOption:k,icon:x,inputMode:I,loadingMessage:h,loadingIcon:y,maxLength:w,multiple:D,clearable:M,onChangeInput:S,onCloseMenu:E,onOpenMenu:j,onSelectOption:P,options:L,loadOptions:O,groupSelectedOptions:F,optionsMultiToggleCaption:T,optionsEmptyMessage:B,optionsEmptyIcon:z,palette:K,placeholder:R,readOnly:X,required:H,status:N,sizeXXS:Z,sizeXS:_,sizeS:A,sizeM:q,sizeL:$,sizeXL:U,form:G,...J}=e;const Q={size:t,sizeXXS:Z,sizeXS:_,sizeS:A,sizeM:q,sizeL:$,sizeXL:U};const V={sizes:SIZES_ICON,color:J.disabled?'content-disabled':'content-onmain-tertiary'};const W=useMemo((()=>J.id??`${n}-${nanoid()}`),[n,J.id]);const Y=useMemo((()=>nanoid()),[]);const ee=useMemo((()=>nanoid()),[]);const[oe,te]=useFilteredOptions({options:L});const[ne,re,se]=useLoadedOptions({loadOptions:O,options:L});const[ae,le]=useState((()=>getDropdownSelectedOption(C!==void 0?C:k,D)));const[ie,ce]=useState((()=>getDropdownInputText(ae,D)));const[de,ue]=useState(!1);const[pe,me]=useState(!1);const be=O?ne:oe;const fe=O?p??re:p;const ge=useMemo((()=>D?groupDropdownOptions(be,ae):[[],[]]),[D,be,ae]);const ve=pe&&!J.disabled;const Ce=H&&ae.length===0;const ke=Boolean(ve||ie||de);const xe=ge[0].length>0&&ge[1].length===0;const Ie=ge[0].length>0&&ge[1].length>0;const he=useRef(null);const[ye,we]=useState(null);const De=useRef(null);const Me=useRef(null);const Se=useRef(ve);const Ee=useCallback((e=>{ce(e),S&&S(e)}),[S]);const je=useCallback((e=>{O?se(e):te(e)}),[O,se,te]);const Pe=useMemo((()=>createDebouncedCallback(je,150)),[je]);const preventBlur=e=>{e.target!==he.current&&e.target instanceof Node&&(e.currentTarget.contains(e.target)||c.renderInPortal&&ve&&ye&&ye.contains(e.target))&&e.preventDefault()};return useScrollMonitor({target:g,onScrollStart:()=>{f&&ve&&(he.current?.focus(),me(!1))}}),useLayoutEffect((()=>{C!==void 0&&(D||ve||Ee(getDropdownInputText(C)),le(getDropdownSelectedOption(C,D)))}),[D,C,ve,Ee]),useEffect((()=>{ve!==Se.current&&(ve&&j&&j(),!ve&&E&&E(),Se.current=ve)}),[ve,E,j]),useEffect((()=>{if(!D&&!b&&ve&&!fe&&ie.length===0&&ye&&Me.current){const e=ye.getBoundingClientRect();const o=Me.current.getBoundingClientRect();(o.top<e.top||o.bottom>e.bottom)&&setTimeout((()=>{ye&&Me.current&&ye.scrollTo(0,Me.current.offsetTop)}),0)}}),[D,b,ve,fe,ie,ye]),jsx(FormInputLabel,{...J,...Q,ref:o,id:W,labelId:Y,labelPosition:r,active:ke,onColored:v,primary:a,error:N==='error',success:N==='success',focus:de,icon:[x,jsx(ChevronIcon,{up:ve},'chevron')],iconProps:{...Q,...V,...i},palette:{color:J.disabled?K.labelColorDisabled:K.labelColor,backgroundColor:J.disabled?K.backgroundColorDisabled:K.backgroundColor,backgroundColorHover:J.disabled?K.backgroundColorDisabled:K.backgroundColorHover,borderColor:J.disabled?K.borderColorDisabled:K.borderColor},onClick:e=>{J.onClick&&J.onClick(e),J.disabled||(he.current?.focus(),ve?ye&&e.target instanceof Node&&!ye.contains(e.target)&&(me(!1),Ee(getDropdownInputText(ae,D))):(me(!0),je(''),s&&Ee('')))},onPointerDown:e=>{J.onPointerDown&&J.onPointerDown(e),preventBlur(e)},onMouseDown:e=>{J.onMouseDown&&J.onMouseDown(e),window.PointerEvent||preventBlur(e)},onFocus:e=>{J.onFocus&&J.onFocus(e),ue(!0),he.current&&e.target===he.current&&s&&!D&&!ve&&Ee('')},onBlur:e=>{J.onBlur&&J.onBlur(e),e.currentTarget.contains(e.relatedTarget)||c.renderInPortal&&ve&&ye&&ye.contains(e.relatedTarget)||(ue(!1),Ee(getDropdownInputText(ae,D)),me(!1))},input:jsxs(Fragment,{children:[!Ce||s||X?null:jsx(InputMimic,{required:!0,type:"text",inputMode:"none",form:G,tabIndex:-1,onFocus:()=>{he.current?.focus()}}),jsx(FormInput,{ref:he,role:"combobox","aria-controls":ee,"aria-expanded":ve,"aria-labelledby":J.label?Y:void 0,type:"text",autoComplete:"off",autoCapitalize:"off",autoCorrect:"off",spellCheck:"false",form:G,autoFocus:m,inputMode:s?I:'none',maxLength:w,placeholder:R,readOnly:X||!s,required:Ce,disabled:J.disabled,value:ie,palette:{color:K.color,colorDisabled:K.colorDisabled,placeholderColor:K.placeholderColor,placeholderColorDisabled:K.placeholderColorDisabled},onClick:e=>{ve&&e.currentTarget.selectionStart!==e.currentTarget.selectionEnd&&e.stopPropagation()},onChange:e=>{const o=e.currentTarget.value;Ee(o),Pe(o),me(!0)},onKeyDown:e=>{if(keyboardKeys.Enter.validate(e.key)&&(Ee(getDropdownInputText(ae,D)),me(!1)),!keyboardKeys.Space.validate(e.key)||ve&&e.currentTarget.selectionStart!==0||(e.preventDefault(),ve||(je(''),s&&Ee('')),me((e=>!e))),keyboardKeys.Esc.validate(e.key)&&me(!1),keyboardKeys.Tab.validate(e.key)&&ve&&(e.preventDefault(),me(!1)),keyboardKeys.ArrowDown.validate(e.key)&&ve&&De.current)if(e.preventDefault(),!D&&Me.current){const e=[...De.current.children];const o=e.findIndex((e=>e.contains(Me.current)));const t=e[o+1]??e[0];t instanceof HTMLElement&&focusFirstFocusable(t)}else focusFirstFocusable(De.current);if(keyboardKeys.ArrowUp.validate(e.key)&&ve&&De.current)if(e.preventDefault(),!D&&Me.current){const e=[...De.current.children];const o=e.findIndex((e=>e.contains(Me.current)));const t=e[o-1]??e[e.length-1];t instanceof HTMLElement&&focusFirstFocusable(t)}else focusLastFocusable(De.current)}}),ae.map((e=>jsx("input",{type:"hidden",name:n,value:e.value,form:G,disabled:J.disabled},e.value)))]}),addon:jsxs(Fragment,{children:[D&&ae.length>0?jsx(Chip,{size:"xs",active:!0,black:!0,marginLeft:12,disabled:J.disabled,cursor:J.disabled?'not-allowed':void 0,text:ae.length,textProps:{appearance:'caption',size:'xs'},palette:J.disabled?{color:'content-disabled',colorHover:'content-disabled',backgroundColor:'bg-disabled-small',backgroundColorHover:'bg-disabled-small'}:void 0,onPointerDown:e=>{e.preventDefault()},onMouseDown:e=>{window.PointerEvent||e.preventDefault()},discardButtonProps:{square:!0,contrast:!J.disabled,onClick:e=>{e.stopPropagation(),X||(C===void 0&&le([]),P&&P([]),he.current?.focus(),Ee(''),je(''),me(!0))}}}):null,!D&&M&&ae.length>0?jsx(IconButton,{icon:"close",size:"l",square:!0,marginLeft:12,disabled:J.disabled,onClick:e=>{e.stopPropagation(),X||(C===void 0&&le([]),P&&P(null),he.current?.focus(),Ee(''),je(''),me(!0))}}):null]}),dropdown:jsx(DropdownMenu,{...c,setRef:we,open:ve,popperReferenceId:W,secondary:!v,elevated:v,disableAutoFocus:!0,palette:{backgroundColor:K.menuBackgroundColor,borderColor:K.menuBorderColor},empty:be.length===0,loading:fe,loadingMessage:h,loadingIcon:y,loadingIconProps:{...Q,...V,...d},emptyMessage:B,emptyIcon:z,emptyIconProps:{...Q,...V,...u},onKeyDown:e=>{keyboardKeys.Tab.validate(e.key)&&(e.preventDefault(),he.current?.focus(),me(!1)),keyboardKeys.Enter.validate(e.key)&&(he.current?.focus(),Ee(getDropdownInputText(ae,D)),me(!1)),keyboardKeys.Esc.validate(e.key)&&(he.current?.focus(),me(!1)),keyboardKeys.Backspace.validate(e.key)&&!X&&(D||!D&&M)&&(C===void 0&&le([]),P&&P(D?[]:null),Ee(''),je(''))},children:jsx(MenuList,D?{ref:De,id:ee,role:"listbox","aria-labelledby":J.label?Y:void 0,"aria-multiselectable":!0,children:ie.length===0?jsxs(Fragment,{children:[l?jsx(ListItem,{...Q,text:T,disabled:J.disabled,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",name:n,checked:xe,indeterminate:Ie,error:Boolean((xe||Ie)&&N==='error'),success:Boolean((xe||Ie)&&N==='success'),onChange:()=>{if(!X){const e=xe||Ie?[]:[...be];C===void 0&&le(e),P&&P(e)}}})}):null,l?jsx(MenuDivider,{}):null,F?ge[0].map((e=>{const o=e.status??N;const t=o==='error';const r=o==='success';return createElement(ListItem,{...Q,key:e.value,active:!0,text:e.text,danger:t,success:r,disabled:J.disabled,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation(),he.current?.focus()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",role:"option","aria-selected":!0,name:n,value:e.value,checked:!0,error:t,success:r,onChange:e=>{if(!X){const o=ae.filter((o=>o.value!==e.currentTarget.value));C===void 0&&le(o),P&&P(o)}}})})})):null,F&&ge[0].length>0&&ge[1].length>0?jsx(MenuDivider,{}):null,F?ge[1].map((e=>createElement(ListItem,{...Q,key:e.value,text:e.text,disabled:J.disabled,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation(),he.current?.focus()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",role:"option","aria-selected":!1,name:n,value:e.value,checked:!1,onChange:()=>{if(!X){const o=[...ae,e];C===void 0&&le(o),P&&P(o)}}})}))):null,!F&&be.map((e=>{const o=ae.findIndex((o=>o.value===e.value))!==-1;const t=e.status??N;const r=o&&t==='error';const s=o&&t==='success';return createElement(ListItem,{...Q,key:e.value,text:e.text,danger:r,success:s,disabled:J.disabled,active:o,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",role:"option","aria-selected":o,name:n,value:e.value,checked:o,error:r,success:s,onChange:t=>{if(!X){const n=o?ae.filter((e=>e.value!==t.currentTarget.value)):[...ae,e];C===void 0&&le(n),P&&P(n)}}})})}))]}):jsx(Fragment,{children:be.map((e=>{const o=ae.findIndex((o=>o.value===e.value))!==-1;const t=e.status??N;const r=o&&t==='error';const s=o&&t==='success';return createElement(ListItem,{...Q,key:e.value,text:e.text,danger:r,success:s,disabled:J.disabled,active:o,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:e=>{e.stopPropagation()},control:jsx(InputCheckbox,{sizes:SIZES_CHECKBOX,form:"none",role:"option","aria-selected":o,name:n,value:e.value,checked:o,error:r,success:s,onChange:t=>{if(!X){const n=o?ae.filter((e=>e.value!==t.currentTarget.value)):[...ae,e];C===void 0&&le(n),P&&P(n)}}})})}))})}:{ref:De,id:ee,role:"listbox","aria-labelledby":J.label?Y:void 0,children:be.map((e=>{const o=ae.findIndex((o=>o.value===e.value))!==-1;return createElement(ListItem,{...Q,role:"option","aria-selected":o,ref:o?Me:void 0,key:e.value,text:e.text,active:o,danger:Boolean(o&&N==='error'),success:Boolean(o&&N==='success'),disabled:J.disabled,borderRadius:8,ellipsis:!1,textProps:{wordBreak:'break-word'},onClick:o=>{if(o.stopPropagation(),!X){const o={...e};C===void 0&&(Ee(getDropdownInputText(o)),le(getDropdownSelectedOption(o))),P&&P(o),he.current?.focus(),me(!1)}}})}))})})})})),{sizes:SIZES,displayName:"Dropdown"});export{COMPONENT_NAME,Dropdown};
|
|
2
2
|
//# sourceMappingURL=Dropdown.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.mjs","sources":["../../../../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import { forwardRef, useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react'\nimport { nanoid } from 'nanoid'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport { useScrollMonitor } from 'hooks/useScrollMonitor'\nimport { focusFirstFocusable, focusLastFocusable } from 'shared/utils/dom'\nimport { createDebouncedCallback } from 'shared/utils/misc'\nimport { keyboardKeys } from 'shared/constants'\nimport type { Nullable } from 'shared/types'\nimport { FormInput } from 'components/FormInput'\nimport { FormInputLabel } from 'components/FormInputLabel'\nimport { MenuList } from 'components/MenuList'\nimport { MenuDivider } from 'components/MenuDivider'\nimport { ListItem } from 'components/ListItem'\nimport { InputCheckbox } from 'components/InputCheckbox'\nimport { Chip } from 'components/Chip'\nimport { IconButton } from 'components/IconButton'\nimport type { IconProps } from 'components/Icon'\nimport { DropdownMenu } from './DropdownMenu'\nimport { useFilteredOptions, useLoadedOptions } from './hooks'\nimport { SIZES, SIZES_CHECKBOX, SIZES_ICON } from './constants'\nimport { getDropdownInputText, getDropdownSelectedOption, groupDropdownOptions } from './utils'\nimport * as Styled from './style'\nimport type { DropdownProps, DropdownOption } from './types'\n\nconst COMPONENT_NAME = 'Dropdown'\n\n/**\n *\n * Компонент поддерживает все атрибуты \\<div\\> элемента.\n *\n * Можно передать \"ref\", который будет ассоциирован с рутовым элементом.\n *\n * Поддерживаются пропсы определения размеров и внешних отступов в зависимости от ширины вьюпорта.\n *\n * Полный интерфейс можно посмотреть [тут](https://github.com/foxford/ui/blob/master/src/components/Dropdown/types.ts).\n */\nconst Dropdown: React.ForwardRefExoticComponent<DropdownProps> = withMergedProps<DropdownProps, HTMLDivElement>(\n forwardRef((props, ref) => {\n const {\n size = 'm',\n name = 'fox-dropdown',\n labelPosition = 'dynamic',\n searchable = true,\n primary = true,\n optionsMultiToggle = true,\n iconProps = {},\n menuProps = {},\n loadingIconProps = {},\n optionsEmptyIconProps = {},\n loading,\n autoFocus,\n disableAutoScrollToSelectedOption,\n closeMenuOnScroll,\n scrollMonitorTarget,\n contrast,\n selectedOption,\n defaultSelectedOption,\n icon,\n inputMode,\n loadingMessage,\n loadingIcon,\n maxLength,\n multiple,\n clearable,\n onChangeInput,\n onCloseMenu,\n onOpenMenu,\n onSelectOption,\n options,\n loadOptions,\n groupSelectedOptions,\n optionsMultiToggleCaption,\n optionsEmptyMessage,\n optionsEmptyIcon,\n palette,\n placeholder,\n readOnly,\n required,\n status,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n form,\n ...rootProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconBaseProps: IconProps = {\n sizes: SIZES_ICON,\n color: rootProps.disabled ? 'content-disabled' : 'content-onmain-tertiary',\n }\n\n const formInputLabelId = useMemo(() => rootProps.id ?? `${name}-${nanoid()}`, [name, rootProps.id])\n const inputLabelId = useMemo(() => nanoid(), [])\n const menuListId = useMemo(() => nanoid(), [])\n\n const [filteredOptions, getFilteredOptions] = useFilteredOptions({\n options,\n })\n\n const [loadedOptions, optionsLoading, getLoadedOptions] = useLoadedOptions({\n loadOptions,\n options,\n })\n\n const [dropdownSelectedOption, setDropdownSelectedOption] = useState<DropdownOption[]>(() =>\n getDropdownSelectedOption(selectedOption !== undefined ? selectedOption : defaultSelectedOption, multiple)\n )\n\n const [inputText, setInputText] = useState<string>(() => getDropdownInputText(dropdownSelectedOption, multiple))\n\n const [focusWithin, setFocusWithin] = useState<boolean>(false)\n\n const [menuOpenRequest, setMenuOpenRequest] = useState<boolean>(false)\n\n const menuOptions: DropdownOption[] = loadOptions ? loadedOptions : filteredOptions\n const menuOptionsLoading = loadOptions ? loading ?? optionsLoading : loading\n\n const menuOptionsGroups: ReturnType<typeof groupDropdownOptions> = useMemo(\n () => (multiple ? groupDropdownOptions(menuOptions, dropdownSelectedOption) : [[], []]),\n [multiple, menuOptions, dropdownSelectedOption]\n )\n\n const menuOpen = menuOpenRequest && !rootProps.disabled\n\n const inputRequired = required && dropdownSelectedOption.length === 0\n const inputActive = Boolean(menuOpen || inputText || focusWithin)\n\n const multiToggleChecked = menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length === 0\n const multiToggleIndeterminate = menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length > 0\n\n const inputRef = useRef<HTMLInputElement>(null)\n const [menuRef, setMenuRef] = useState<Nullable<HTMLElement>>(null)\n const menuListRef = useRef<HTMLUListElement>(null)\n const selectedOptionRef = useRef<HTMLElement>(null)\n const menuOpenPrevRef = useRef<boolean>(menuOpen)\n\n const updateInputText = useCallback(\n (inputTextValue: string) => {\n setInputText(inputTextValue)\n\n if (onChangeInput) {\n onChangeInput(inputTextValue)\n }\n },\n [onChangeInput]\n )\n\n const updateOptions = useCallback(\n (inputTextValue: string) => {\n if (loadOptions) {\n getLoadedOptions(inputTextValue)\n } else {\n getFilteredOptions(inputTextValue)\n }\n },\n [loadOptions, getLoadedOptions, getFilteredOptions]\n )\n\n const updateOptionsDebounced = useMemo(() => {\n return createDebouncedCallback(updateOptions, 150)\n }, [updateOptions])\n\n const preventBlur = (evt: React.PointerEvent<HTMLDivElement> | React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (\n evt.target !== inputRef.current &&\n evt.target instanceof Node &&\n (evt.currentTarget.contains(evt.target) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.target)))\n ) {\n evt.preventDefault()\n }\n }\n\n useScrollMonitor({\n target: scrollMonitorTarget,\n onScrollStart: () => {\n if (closeMenuOnScroll && menuOpen) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n },\n })\n\n useLayoutEffect(() => {\n if (selectedOption === undefined) return\n\n if (!multiple && !menuOpen) {\n updateInputText(getDropdownInputText(selectedOption))\n }\n setDropdownSelectedOption(getDropdownSelectedOption(selectedOption, multiple))\n }, [multiple, selectedOption, menuOpen, updateInputText])\n\n useEffect(() => {\n if (menuOpen === menuOpenPrevRef.current) return\n\n if (menuOpen && onOpenMenu) onOpenMenu()\n if (!menuOpen && onCloseMenu) onCloseMenu()\n\n menuOpenPrevRef.current = menuOpen\n }, [menuOpen, onCloseMenu, onOpenMenu])\n\n useEffect(() => {\n if (\n !multiple &&\n !disableAutoScrollToSelectedOption &&\n menuOpen &&\n !menuOptionsLoading &&\n inputText.length === 0 &&\n menuRef &&\n selectedOptionRef.current\n ) {\n const menuRect = menuRef.getBoundingClientRect()\n const selectedOptionRect = selectedOptionRef.current.getBoundingClientRect()\n\n if (selectedOptionRect.top < menuRect.top || selectedOptionRect.bottom > menuRect.bottom) {\n setTimeout(() => {\n if (menuRef && selectedOptionRef.current) {\n menuRef.scrollTo(0, selectedOptionRef.current.offsetTop)\n }\n }, 0)\n }\n }\n }, [multiple, disableAutoScrollToSelectedOption, menuOpen, menuOptionsLoading, inputText, menuRef])\n\n return (\n <FormInputLabel\n {...rootProps}\n {...sizeProps}\n ref={ref}\n id={formInputLabelId}\n labelId={inputLabelId}\n labelPosition={labelPosition}\n active={inputActive}\n onColored={contrast}\n primary={primary}\n error={status === 'error'}\n success={status === 'success'}\n focus={focusWithin}\n icon={[icon, <Styled.ChevronIcon key='chevron' up={menuOpen} />]}\n iconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...iconProps,\n }}\n palette={{\n color: rootProps.disabled ? palette.labelColorDisabled : palette.labelColor,\n backgroundColor: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColor,\n backgroundColorHover: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColorHover,\n borderColor: rootProps.disabled ? palette.borderColorDisabled : palette.borderColor,\n }}\n onClick={(evt) => {\n if (rootProps.onClick) rootProps.onClick(evt)\n\n if (rootProps.disabled) return\n\n inputRef.current?.focus()\n\n if (!menuOpen) {\n setMenuOpenRequest(true)\n\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n } else if (menuRef && evt.target instanceof Node && !menuRef.contains(evt.target)) {\n setMenuOpenRequest(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n }\n }}\n onPointerDown={(evt) => {\n if (rootProps.onPointerDown) rootProps.onPointerDown(evt)\n\n preventBlur(evt)\n }}\n onMouseDown={(evt) => {\n if (rootProps.onMouseDown) rootProps.onMouseDown(evt)\n\n if (!window.PointerEvent) preventBlur(evt)\n }}\n onFocus={(evt) => {\n if (rootProps.onFocus) rootProps.onFocus(evt)\n\n setFocusWithin(true)\n\n if (inputRef.current && evt.target === inputRef.current && searchable && !multiple && !menuOpen) {\n updateInputText('')\n }\n }}\n onBlur={(evt) => {\n if (rootProps.onBlur) rootProps.onBlur(evt)\n\n if (\n evt.currentTarget.contains(evt.relatedTarget) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.relatedTarget))\n ) {\n return\n }\n\n setFocusWithin(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }}\n input={\n <>\n {inputRequired && !searchable && !readOnly && (\n <Styled.InputMimic\n required\n type='text'\n inputMode='none'\n form={form}\n tabIndex={-1}\n onFocus={() => {\n inputRef.current?.focus()\n }}\n />\n )}\n <FormInput\n ref={inputRef}\n role='combobox'\n aria-controls={menuListId}\n aria-expanded={menuOpen}\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n type='text'\n autoComplete='off'\n autoCapitalize='off'\n autoCorrect='off'\n spellCheck='false'\n form={form}\n autoFocus={autoFocus}\n inputMode={searchable ? inputMode : 'none'}\n maxLength={maxLength}\n placeholder={placeholder}\n readOnly={readOnly || !searchable}\n required={inputRequired}\n disabled={rootProps.disabled}\n value={inputText}\n palette={{\n color: palette.color,\n colorDisabled: palette.colorDisabled,\n placeholderColor: palette.placeholderColor,\n placeholderColorDisabled: palette.placeholderColorDisabled,\n }}\n onClick={(evt) => {\n if (menuOpen && evt.currentTarget.selectionStart !== evt.currentTarget.selectionEnd) {\n evt.stopPropagation()\n }\n }}\n onChange={(evt) => {\n const inputValue = evt.currentTarget.value\n\n updateInputText(inputValue)\n updateOptionsDebounced(inputValue)\n setMenuOpenRequest(true)\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Enter.validate(evt.key)) {\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Space.validate(evt.key) && (!menuOpen || evt.currentTarget.selectionStart === 0)) {\n evt.preventDefault()\n\n if (!menuOpen) {\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n }\n\n setMenuOpenRequest((prev) => !prev)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Tab.validate(evt.key) && menuOpen) {\n evt.preventDefault()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.ArrowDown.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx + 1] ?? menuItems[0]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusFirstFocusable(menuListRef.current)\n }\n }\n\n if (keyboardKeys.ArrowUp.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx - 1] ?? menuItems[menuItems.length - 1]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusLastFocusable(menuListRef.current)\n }\n }\n }}\n />\n {dropdownSelectedOption.map((item) => (\n <input\n key={item.value}\n type='hidden'\n name={name}\n value={item.value}\n form={form}\n disabled={rootProps.disabled}\n />\n ))}\n </>\n }\n addon={\n <>\n {multiple && dropdownSelectedOption.length > 0 && (\n <Chip\n size='xs'\n active\n black\n marginLeft={12}\n disabled={rootProps.disabled}\n cursor={rootProps.disabled ? 'not-allowed' : undefined}\n text={dropdownSelectedOption.length}\n textProps={{\n appearance: 'caption',\n size: 'xs',\n }}\n palette={\n rootProps.disabled\n ? {\n color: 'content-disabled',\n colorHover: 'content-disabled',\n backgroundColor: 'bg-disabled-small',\n backgroundColorHover: 'bg-disabled-small',\n }\n : undefined\n }\n onPointerDown={(evt) => {\n evt.preventDefault()\n }}\n onMouseDown={(evt) => {\n if (!window.PointerEvent) evt.preventDefault()\n }}\n discardButtonProps={{\n square: true,\n contrast: !rootProps.disabled,\n onClick: (evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption([])\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n },\n }}\n />\n )}\n {!multiple && clearable && dropdownSelectedOption.length > 0 && (\n <IconButton\n icon='close'\n size='l'\n square\n marginLeft={12}\n disabled={rootProps.disabled}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(null)\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n }}\n />\n )}\n </>\n }\n dropdown={\n <DropdownMenu\n {...menuProps}\n setRef={setMenuRef}\n open={menuOpen}\n popperReferenceId={formInputLabelId}\n secondary={!contrast}\n elevated={contrast}\n disableAutoFocus\n palette={{\n backgroundColor: palette.menuBackgroundColor,\n borderColor: palette.menuBorderColor,\n }}\n empty={menuOptions.length === 0}\n loading={menuOptionsLoading}\n loadingMessage={loadingMessage}\n loadingIcon={loadingIcon}\n loadingIconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...loadingIconProps,\n }}\n emptyMessage={optionsEmptyMessage}\n emptyIcon={optionsEmptyIcon}\n emptyIconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...optionsEmptyIconProps,\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Tab.validate(evt.key)) {\n evt.preventDefault()\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Enter.validate(evt.key)) {\n inputRef.current?.focus()\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Backspace.validate(evt.key) && !readOnly && (multiple || (!multiple && clearable))) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(multiple ? [] : null)\n\n updateInputText('')\n updateOptions('')\n }\n }}\n >\n {multiple ? (\n <MenuList\n ref={menuListRef}\n id={menuListId}\n role='listbox'\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n aria-multiselectable\n >\n {inputText.length === 0 ? (\n <>\n {optionsMultiToggle && (\n <ListItem\n {...sizeProps}\n text={optionsMultiToggleCaption}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n name={name}\n checked={multiToggleChecked}\n indeterminate={multiToggleIndeterminate}\n error={(multiToggleChecked || multiToggleIndeterminate) && status === 'error'}\n success={(multiToggleChecked || multiToggleIndeterminate) && status === 'success'}\n onChange={() => {\n if (!readOnly) {\n const update = multiToggleChecked || multiToggleIndeterminate ? [] : [...menuOptions]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )}\n {optionsMultiToggle && <MenuDivider />}\n {groupSelectedOptions &&\n menuOptionsGroups[0].map((option) => {\n const optionStatus = option.status ?? status\n const optionErrorStatus = optionStatus === 'error'\n const optionSuccessStatus = optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n active\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n inputRef.current?.focus()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected\n name={name}\n value={option.value}\n checked\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = dropdownSelectedOption.filter(\n (item) => item.value !== evt.currentTarget.value\n )\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n {groupSelectedOptions && menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length > 0 && (\n <MenuDivider />\n )}\n {groupSelectedOptions &&\n menuOptionsGroups[1].map((option) => (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n inputRef.current?.focus()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={false}\n name={name}\n value={option.value}\n checked={false}\n onChange={() => {\n if (!readOnly) {\n const update = [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n ))}\n {!groupSelectedOptions &&\n menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n const optionStatus = option.status ?? status\n const optionErrorStatus = selected && optionStatus === 'error'\n const optionSuccessStatus = selected && optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n active={selected}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={selected}\n name={name}\n value={option.value}\n checked={selected}\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = selected\n ? dropdownSelectedOption.filter((item) => item.value !== evt.currentTarget.value)\n : [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n </>\n ) : (\n <>\n {menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n const optionStatus = option.status ?? status\n const optionErrorStatus = selected && optionStatus === 'error'\n const optionSuccessStatus = selected && optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n active={selected}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={selected}\n name={name}\n value={option.value}\n checked={selected}\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = selected\n ? dropdownSelectedOption.filter((item) => item.value !== evt.currentTarget.value)\n : [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n </>\n )}\n </MenuList>\n ) : (\n <MenuList\n ref={menuListRef}\n id={menuListId}\n role='listbox'\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n >\n {menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n return (\n <ListItem\n {...sizeProps}\n role='option'\n aria-selected={selected}\n ref={selected ? selectedOptionRef : undefined}\n key={option.value}\n text={option.text}\n active={selected}\n danger={selected && status === 'error'}\n success={selected && status === 'success'}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n const update = { ...option }\n\n if (selectedOption === undefined) {\n updateInputText(getDropdownInputText(update))\n setDropdownSelectedOption(getDropdownSelectedOption(update))\n }\n\n if (onSelectOption) onSelectOption(update)\n\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n }}\n />\n )\n })}\n </MenuList>\n )}\n </DropdownMenu>\n }\n />\n )\n }),\n {\n sizes: SIZES,\n displayName: COMPONENT_NAME,\n }\n)\n\nexport { Dropdown, COMPONENT_NAME }\n"],"names":["COMPONENT_NAME","Dropdown","withMergedProps","forwardRef","props","ref","size","name","labelPosition","searchable","primary","optionsMultiToggle","iconProps","menuProps","loadingIconProps","optionsEmptyIconProps","loading","autoFocus","disableAutoScrollToSelectedOption","closeMenuOnScroll","scrollMonitorTarget","contrast","selectedOption","defaultSelectedOption","icon","inputMode","loadingMessage","loadingIcon","maxLength","multiple","clearable","onChangeInput","onCloseMenu","onOpenMenu","onSelectOption","options","loadOptions","groupSelectedOptions","optionsMultiToggleCaption","optionsEmptyMessage","optionsEmptyIcon","palette","placeholder","readOnly","required","status","sizeXXS","sizeXS","sizeS","sizeM","sizeL","sizeXL","form","rootProps","sizeProps","iconBaseProps","sizes","SIZES_ICON","color","disabled","formInputLabelId","useMemo","id","nanoid","inputLabelId","menuListId","filteredOptions","getFilteredOptions","useFilteredOptions","loadedOptions","optionsLoading","getLoadedOptions","useLoadedOptions","dropdownSelectedOption","setDropdownSelectedOption","useState","getDropdownSelectedOption","undefined","inputText","setInputText","getDropdownInputText","focusWithin","setFocusWithin","menuOpenRequest","setMenuOpenRequest","menuOptions","menuOptionsLoading","menuOptionsGroups","groupDropdownOptions","menuOpen","inputRequired","length","inputActive","Boolean","multiToggleChecked","multiToggleIndeterminate","inputRef","useRef","menuRef","setMenuRef","menuListRef","selectedOptionRef","menuOpenPrevRef","updateInputText","useCallback","inputTextValue","updateOptions","updateOptionsDebounced","createDebouncedCallback","preventBlur","evt","target","current","Node","currentTarget","contains","renderInPortal","preventDefault","useScrollMonitor","onScrollStart","focus","useLayoutEffect","useEffect","menuRect","getBoundingClientRect","selectedOptionRect","top","bottom","setTimeout","scrollTo","offsetTop","_jsx","FormInputLabel","labelId","active","onColored","error","success","Styled","up","labelColorDisabled","labelColor","backgroundColor","backgroundColorDisabled","backgroundColorHover","borderColor","borderColorDisabled","onClick","onPointerDown","onMouseDown","window","PointerEvent","onFocus","onBlur","relatedTarget","input","_jsxs","_Fragment","children","type","tabIndex","FormInput","role","label","autoComplete","autoCapitalize","autoCorrect","spellCheck","value","colorDisabled","placeholderColor","placeholderColorDisabled","selectionStart","selectionEnd","stopPropagation","onChange","inputValue","onKeyDown","keyboardKeys","Enter","validate","key","Space","prev","Esc","Tab","ArrowDown","menuItems","idx","findIndex","item","focusTarget","HTMLElement","focusFirstFocusable","ArrowUp","focusLastFocusable","map","addon","Chip","black","marginLeft","cursor","text","textProps","appearance","colorHover","discardButtonProps","square","IconButton","dropdown","DropdownMenu","setRef","open","popperReferenceId","secondary","elevated","disableAutoFocus","menuBackgroundColor","menuBorderColor","empty","emptyMessage","emptyIcon","emptyIconProps","Backspace","MenuList","ListItem","borderRadius","ellipsis","wordBreak","control","InputCheckbox","SIZES_CHECKBOX","checked","indeterminate","update","MenuDivider","option","optionStatus","optionErrorStatus","optionSuccessStatus","_createElement","danger","filter","selected","SIZES","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown.mjs","sources":["../../../../src/components/Dropdown/Dropdown.tsx"],"sourcesContent":["import { forwardRef, useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react'\nimport { nanoid } from 'nanoid'\nimport { withMergedProps } from 'hocs/withMergedProps'\nimport type { MergedProps } from 'hocs/withMergedProps'\nimport { useScrollMonitor } from 'hooks/useScrollMonitor'\nimport { focusFirstFocusable, focusLastFocusable } from 'shared/utils/dom'\nimport { createDebouncedCallback } from 'shared/utils/misc'\nimport { keyboardKeys } from 'shared/constants'\nimport type { Nullable } from 'shared/types'\nimport { FormInput } from 'components/FormInput'\nimport { FormInputLabel } from 'components/FormInputLabel'\nimport { MenuList } from 'components/MenuList'\nimport { MenuDivider } from 'components/MenuDivider'\nimport { ListItem } from 'components/ListItem'\nimport { InputCheckbox } from 'components/InputCheckbox'\nimport { Chip } from 'components/Chip'\nimport { IconButton } from 'components/IconButton'\nimport type { IconProps } from 'components/Icon'\nimport { DropdownMenu } from './DropdownMenu'\nimport { useFilteredOptions, useLoadedOptions } from './hooks'\nimport { SIZES, SIZES_CHECKBOX, SIZES_ICON } from './constants'\nimport { getDropdownInputText, getDropdownSelectedOption, groupDropdownOptions } from './utils'\nimport * as Styled from './style'\nimport type { DropdownProps, DropdownOption } from './types'\n\nconst COMPONENT_NAME = 'Dropdown'\n\n/**\n *\n * Компонент поддерживает все атрибуты \\<div\\> элемента.\n *\n * Можно передать \"ref\", который будет ассоциирован с рутовым элементом.\n *\n * Поддерживаются пропсы определения размеров и внешних отступов в зависимости от ширины вьюпорта.\n *\n * Полный интерфейс можно посмотреть [тут](https://github.com/foxford/ui/blob/master/src/components/Dropdown/types.ts).\n */\nconst Dropdown: React.ForwardRefExoticComponent<DropdownProps> = withMergedProps<DropdownProps, HTMLDivElement>(\n forwardRef<HTMLDivElement, MergedProps<DropdownProps>>((props, ref) => {\n const {\n size = 'm',\n name = 'fox-dropdown',\n labelPosition = 'dynamic',\n searchable = true,\n primary = true,\n optionsMultiToggle = true,\n iconProps = {},\n menuProps = {},\n loadingIconProps = {},\n optionsEmptyIconProps = {},\n loading,\n autoFocus,\n disableAutoScrollToSelectedOption,\n closeMenuOnScroll,\n scrollMonitorTarget,\n contrast,\n selectedOption,\n defaultSelectedOption,\n icon,\n inputMode,\n loadingMessage,\n loadingIcon,\n maxLength,\n multiple,\n clearable,\n onChangeInput,\n onCloseMenu,\n onOpenMenu,\n onSelectOption,\n options,\n loadOptions,\n groupSelectedOptions,\n optionsMultiToggleCaption,\n optionsEmptyMessage,\n optionsEmptyIcon,\n palette,\n placeholder,\n readOnly,\n required,\n status,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n form,\n ...rootProps\n } = props\n\n const sizeProps = {\n size,\n sizeXXS,\n sizeXS,\n sizeS,\n sizeM,\n sizeL,\n sizeXL,\n }\n\n const iconBaseProps: IconProps = {\n sizes: SIZES_ICON,\n color: rootProps.disabled ? 'content-disabled' : 'content-onmain-tertiary',\n }\n\n const formInputLabelId = useMemo(() => rootProps.id ?? `${name}-${nanoid()}`, [name, rootProps.id])\n const inputLabelId = useMemo(() => nanoid(), [])\n const menuListId = useMemo(() => nanoid(), [])\n\n const [filteredOptions, getFilteredOptions] = useFilteredOptions({\n options,\n })\n\n const [loadedOptions, optionsLoading, getLoadedOptions] = useLoadedOptions({\n loadOptions,\n options,\n })\n\n const [dropdownSelectedOption, setDropdownSelectedOption] = useState<DropdownOption[]>(() =>\n getDropdownSelectedOption(selectedOption !== undefined ? selectedOption : defaultSelectedOption, multiple)\n )\n\n const [inputText, setInputText] = useState<string>(() => getDropdownInputText(dropdownSelectedOption, multiple))\n\n const [focusWithin, setFocusWithin] = useState<boolean>(false)\n\n const [menuOpenRequest, setMenuOpenRequest] = useState<boolean>(false)\n\n const menuOptions: DropdownOption[] = loadOptions ? loadedOptions : filteredOptions\n const menuOptionsLoading = loadOptions ? (loading ?? optionsLoading) : loading\n\n const menuOptionsGroups: ReturnType<typeof groupDropdownOptions> = useMemo(\n () => (multiple ? groupDropdownOptions(menuOptions, dropdownSelectedOption) : [[], []]),\n [multiple, menuOptions, dropdownSelectedOption]\n )\n\n const menuOpen = menuOpenRequest && !rootProps.disabled\n\n const inputRequired = required && dropdownSelectedOption.length === 0\n const inputActive = Boolean(menuOpen || inputText || focusWithin)\n\n const multiToggleChecked = menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length === 0\n const multiToggleIndeterminate = menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length > 0\n\n const inputRef = useRef<HTMLInputElement>(null)\n const [menuRef, setMenuRef] = useState<Nullable<HTMLElement>>(null)\n const menuListRef = useRef<HTMLUListElement>(null)\n const selectedOptionRef = useRef<HTMLElement>(null)\n const menuOpenPrevRef = useRef<boolean>(menuOpen)\n\n const updateInputText = useCallback(\n (inputTextValue: string) => {\n setInputText(inputTextValue)\n\n if (onChangeInput) {\n onChangeInput(inputTextValue)\n }\n },\n [onChangeInput]\n )\n\n const updateOptions = useCallback(\n (inputTextValue: string) => {\n if (loadOptions) {\n getLoadedOptions(inputTextValue)\n } else {\n getFilteredOptions(inputTextValue)\n }\n },\n [loadOptions, getLoadedOptions, getFilteredOptions]\n )\n\n const updateOptionsDebounced = useMemo(() => {\n return createDebouncedCallback(updateOptions, 150)\n }, [updateOptions])\n\n const preventBlur = (evt: React.PointerEvent<HTMLDivElement> | React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (\n evt.target !== inputRef.current &&\n evt.target instanceof Node &&\n (evt.currentTarget.contains(evt.target) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.target)))\n ) {\n evt.preventDefault()\n }\n }\n\n useScrollMonitor({\n target: scrollMonitorTarget,\n onScrollStart: () => {\n if (closeMenuOnScroll && menuOpen) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n },\n })\n\n useLayoutEffect(() => {\n if (selectedOption === undefined) return\n\n if (!multiple && !menuOpen) {\n updateInputText(getDropdownInputText(selectedOption))\n }\n setDropdownSelectedOption(getDropdownSelectedOption(selectedOption, multiple))\n }, [multiple, selectedOption, menuOpen, updateInputText])\n\n useEffect(() => {\n if (menuOpen === menuOpenPrevRef.current) return\n\n if (menuOpen && onOpenMenu) onOpenMenu()\n if (!menuOpen && onCloseMenu) onCloseMenu()\n\n menuOpenPrevRef.current = menuOpen\n }, [menuOpen, onCloseMenu, onOpenMenu])\n\n useEffect(() => {\n if (\n !multiple &&\n !disableAutoScrollToSelectedOption &&\n menuOpen &&\n !menuOptionsLoading &&\n inputText.length === 0 &&\n menuRef &&\n selectedOptionRef.current\n ) {\n const menuRect = menuRef.getBoundingClientRect()\n const selectedOptionRect = selectedOptionRef.current.getBoundingClientRect()\n\n if (selectedOptionRect.top < menuRect.top || selectedOptionRect.bottom > menuRect.bottom) {\n setTimeout(() => {\n if (menuRef && selectedOptionRef.current) {\n menuRef.scrollTo(0, selectedOptionRef.current.offsetTop)\n }\n }, 0)\n }\n }\n }, [multiple, disableAutoScrollToSelectedOption, menuOpen, menuOptionsLoading, inputText, menuRef])\n\n return (\n <FormInputLabel\n {...rootProps}\n {...sizeProps}\n ref={ref}\n id={formInputLabelId}\n labelId={inputLabelId}\n labelPosition={labelPosition}\n active={inputActive}\n onColored={contrast}\n primary={primary}\n error={status === 'error'}\n success={status === 'success'}\n focus={focusWithin}\n icon={[icon, <Styled.ChevronIcon key='chevron' up={menuOpen} />]}\n iconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...iconProps,\n }}\n palette={{\n color: rootProps.disabled ? palette.labelColorDisabled : palette.labelColor,\n backgroundColor: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColor,\n backgroundColorHover: rootProps.disabled ? palette.backgroundColorDisabled : palette.backgroundColorHover,\n borderColor: rootProps.disabled ? palette.borderColorDisabled : palette.borderColor,\n }}\n onClick={(evt) => {\n if (rootProps.onClick) rootProps.onClick(evt)\n\n if (rootProps.disabled) return\n\n inputRef.current?.focus()\n\n if (!menuOpen) {\n setMenuOpenRequest(true)\n\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n } else if (menuRef && evt.target instanceof Node && !menuRef.contains(evt.target)) {\n setMenuOpenRequest(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n }\n }}\n onPointerDown={(evt) => {\n if (rootProps.onPointerDown) rootProps.onPointerDown(evt)\n\n preventBlur(evt)\n }}\n onMouseDown={(evt) => {\n if (rootProps.onMouseDown) rootProps.onMouseDown(evt)\n\n if (!window.PointerEvent) preventBlur(evt)\n }}\n onFocus={(evt) => {\n if (rootProps.onFocus) rootProps.onFocus(evt)\n\n setFocusWithin(true)\n\n if (inputRef.current && evt.target === inputRef.current && searchable && !multiple && !menuOpen) {\n updateInputText('')\n }\n }}\n onBlur={(evt) => {\n if (rootProps.onBlur) rootProps.onBlur(evt)\n\n if (\n evt.currentTarget.contains(evt.relatedTarget) ||\n (menuProps.renderInPortal && menuOpen && menuRef && menuRef.contains(evt.relatedTarget))\n ) {\n return\n }\n\n setFocusWithin(false)\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }}\n input={\n <>\n {inputRequired && !searchable && !readOnly ? (\n <Styled.InputMimic\n required\n type='text'\n inputMode='none'\n form={form}\n tabIndex={-1}\n onFocus={() => {\n inputRef.current?.focus()\n }}\n />\n ) : null}\n <FormInput\n ref={inputRef}\n role='combobox'\n aria-controls={menuListId}\n aria-expanded={menuOpen}\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n type='text'\n autoComplete='off'\n autoCapitalize='off'\n autoCorrect='off'\n spellCheck='false'\n form={form}\n autoFocus={autoFocus}\n inputMode={searchable ? inputMode : 'none'}\n maxLength={maxLength}\n placeholder={placeholder}\n readOnly={readOnly || !searchable}\n required={inputRequired}\n disabled={rootProps.disabled}\n value={inputText}\n palette={{\n color: palette.color,\n colorDisabled: palette.colorDisabled,\n placeholderColor: palette.placeholderColor,\n placeholderColorDisabled: palette.placeholderColorDisabled,\n }}\n onClick={(evt) => {\n if (menuOpen && evt.currentTarget.selectionStart !== evt.currentTarget.selectionEnd) {\n evt.stopPropagation()\n }\n }}\n onChange={(evt) => {\n const inputValue = evt.currentTarget.value\n\n updateInputText(inputValue)\n updateOptionsDebounced(inputValue)\n setMenuOpenRequest(true)\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Enter.validate(evt.key)) {\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Space.validate(evt.key) && (!menuOpen || evt.currentTarget.selectionStart === 0)) {\n evt.preventDefault()\n\n if (!menuOpen) {\n updateOptions('')\n if (searchable) {\n updateInputText('')\n }\n }\n\n setMenuOpenRequest((prev) => !prev)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Tab.validate(evt.key) && menuOpen) {\n evt.preventDefault()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.ArrowDown.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx + 1] ?? menuItems[0]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusFirstFocusable(menuListRef.current)\n }\n }\n\n if (keyboardKeys.ArrowUp.validate(evt.key) && menuOpen && menuListRef.current) {\n evt.preventDefault()\n\n if (!multiple && selectedOptionRef.current) {\n const menuItems = [...menuListRef.current.children]\n\n const idx = menuItems.findIndex((item) => item.contains(selectedOptionRef.current as Node))\n\n const focusTarget = menuItems[idx - 1] ?? menuItems[menuItems.length - 1]\n\n if (focusTarget instanceof HTMLElement) {\n focusFirstFocusable(focusTarget)\n }\n } else {\n focusLastFocusable(menuListRef.current)\n }\n }\n }}\n />\n {dropdownSelectedOption.map((item) => (\n <input\n key={item.value}\n type='hidden'\n name={name}\n value={item.value}\n form={form}\n disabled={rootProps.disabled}\n />\n ))}\n </>\n }\n addon={\n <>\n {multiple && dropdownSelectedOption.length > 0 ? (\n <Chip\n size='xs'\n active\n black\n marginLeft={12}\n disabled={rootProps.disabled}\n cursor={rootProps.disabled ? 'not-allowed' : undefined}\n text={dropdownSelectedOption.length}\n textProps={{\n appearance: 'caption',\n size: 'xs',\n }}\n palette={\n rootProps.disabled\n ? {\n color: 'content-disabled',\n colorHover: 'content-disabled',\n backgroundColor: 'bg-disabled-small',\n backgroundColorHover: 'bg-disabled-small',\n }\n : undefined\n }\n onPointerDown={(evt) => {\n evt.preventDefault()\n }}\n onMouseDown={(evt) => {\n if (!window.PointerEvent) evt.preventDefault()\n }}\n discardButtonProps={{\n square: true,\n contrast: !rootProps.disabled,\n onClick: (evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption([])\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n },\n }}\n />\n ) : null}\n {!multiple && clearable && dropdownSelectedOption.length > 0 ? (\n <IconButton\n icon='close'\n size='l'\n square\n marginLeft={12}\n disabled={rootProps.disabled}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(null)\n\n inputRef.current?.focus()\n updateInputText('')\n updateOptions('')\n setMenuOpenRequest(true)\n }\n }}\n />\n ) : null}\n </>\n }\n dropdown={\n <DropdownMenu\n {...menuProps}\n setRef={setMenuRef}\n open={menuOpen}\n popperReferenceId={formInputLabelId}\n secondary={!contrast}\n elevated={contrast}\n disableAutoFocus\n palette={{\n backgroundColor: palette.menuBackgroundColor,\n borderColor: palette.menuBorderColor,\n }}\n empty={menuOptions.length === 0}\n loading={menuOptionsLoading}\n loadingMessage={loadingMessage}\n loadingIcon={loadingIcon}\n loadingIconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...loadingIconProps,\n }}\n emptyMessage={optionsEmptyMessage}\n emptyIcon={optionsEmptyIcon}\n emptyIconProps={{\n ...sizeProps,\n ...iconBaseProps,\n ...optionsEmptyIconProps,\n }}\n onKeyDown={(evt) => {\n if (keyboardKeys.Tab.validate(evt.key)) {\n evt.preventDefault()\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Enter.validate(evt.key)) {\n inputRef.current?.focus()\n updateInputText(getDropdownInputText(dropdownSelectedOption, multiple))\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Esc.validate(evt.key)) {\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n\n if (keyboardKeys.Backspace.validate(evt.key) && !readOnly && (multiple || (!multiple && clearable))) {\n if (selectedOption === undefined) {\n setDropdownSelectedOption([])\n }\n\n if (onSelectOption) onSelectOption(multiple ? [] : null)\n\n updateInputText('')\n updateOptions('')\n }\n }}\n >\n {multiple ? (\n <MenuList\n ref={menuListRef}\n id={menuListId}\n role='listbox'\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n aria-multiselectable\n >\n {inputText.length === 0 ? (\n <>\n {optionsMultiToggle ? (\n <ListItem\n {...sizeProps}\n text={optionsMultiToggleCaption}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n name={name}\n checked={multiToggleChecked}\n indeterminate={multiToggleIndeterminate}\n error={Boolean((multiToggleChecked || multiToggleIndeterminate) && status === 'error')}\n success={Boolean((multiToggleChecked || multiToggleIndeterminate) && status === 'success')}\n onChange={() => {\n if (!readOnly) {\n const update = multiToggleChecked || multiToggleIndeterminate ? [] : [...menuOptions]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n ) : null}\n {optionsMultiToggle ? <MenuDivider /> : null}\n {groupSelectedOptions\n ? menuOptionsGroups[0].map((option) => {\n const optionStatus = option.status ?? status\n const optionErrorStatus = optionStatus === 'error'\n const optionSuccessStatus = optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n active\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n inputRef.current?.focus()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected\n name={name}\n value={option.value}\n checked\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = dropdownSelectedOption.filter(\n (item) => item.value !== evt.currentTarget.value\n )\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })\n : null}\n {groupSelectedOptions && menuOptionsGroups[0].length > 0 && menuOptionsGroups[1].length > 0 ? (\n <MenuDivider />\n ) : null}\n {groupSelectedOptions\n ? menuOptionsGroups[1].map((option) => (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n inputRef.current?.focus()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={false}\n name={name}\n value={option.value}\n checked={false}\n onChange={() => {\n if (!readOnly) {\n const update = [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n ))\n : null}\n {!groupSelectedOptions &&\n menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n const optionStatus = option.status ?? status\n const optionErrorStatus = selected && optionStatus === 'error'\n const optionSuccessStatus = selected && optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n active={selected}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={selected}\n name={name}\n value={option.value}\n checked={selected}\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = selected\n ? dropdownSelectedOption.filter((item) => item.value !== evt.currentTarget.value)\n : [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n </>\n ) : (\n <>\n {menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n const optionStatus = option.status ?? status\n const optionErrorStatus = selected && optionStatus === 'error'\n const optionSuccessStatus = selected && optionStatus === 'success'\n\n return (\n <ListItem\n {...sizeProps}\n key={option.value}\n text={option.text}\n danger={optionErrorStatus}\n success={optionSuccessStatus}\n disabled={rootProps.disabled}\n active={selected}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n }}\n control={\n <InputCheckbox\n sizes={SIZES_CHECKBOX}\n form='none'\n role='option'\n aria-selected={selected}\n name={name}\n value={option.value}\n checked={selected}\n error={optionErrorStatus}\n success={optionSuccessStatus}\n onChange={(evt) => {\n if (!readOnly) {\n const update = selected\n ? dropdownSelectedOption.filter((item) => item.value !== evt.currentTarget.value)\n : [...dropdownSelectedOption, option]\n\n if (selectedOption === undefined) {\n setDropdownSelectedOption(update)\n }\n\n if (onSelectOption) onSelectOption(update)\n }\n }}\n />\n }\n />\n )\n })}\n </>\n )}\n </MenuList>\n ) : (\n <MenuList\n ref={menuListRef}\n id={menuListId}\n role='listbox'\n aria-labelledby={rootProps.label ? inputLabelId : undefined}\n >\n {menuOptions.map((option) => {\n const selected = dropdownSelectedOption.findIndex((item) => item.value === option.value) !== -1\n\n return (\n <ListItem\n {...sizeProps}\n role='option'\n aria-selected={selected}\n ref={selected ? selectedOptionRef : undefined}\n key={option.value}\n text={option.text}\n active={selected}\n danger={Boolean(selected && status === 'error')}\n success={Boolean(selected && status === 'success')}\n disabled={rootProps.disabled}\n borderRadius={8}\n ellipsis={false}\n textProps={{ wordBreak: 'break-word' }}\n onClick={(evt) => {\n evt.stopPropagation()\n\n if (!readOnly) {\n const update = { ...option }\n\n if (selectedOption === undefined) {\n updateInputText(getDropdownInputText(update))\n setDropdownSelectedOption(getDropdownSelectedOption(update))\n }\n\n if (onSelectOption) onSelectOption(update)\n\n inputRef.current?.focus()\n setMenuOpenRequest(false)\n }\n }}\n />\n )\n })}\n </MenuList>\n )}\n </DropdownMenu>\n }\n />\n )\n }),\n {\n sizes: SIZES,\n displayName: COMPONENT_NAME,\n }\n)\n\nexport { Dropdown, COMPONENT_NAME }\n"],"names":["COMPONENT_NAME","Dropdown","withMergedProps","forwardRef","props","ref","size","name","labelPosition","searchable","primary","optionsMultiToggle","iconProps","menuProps","loadingIconProps","optionsEmptyIconProps","loading","autoFocus","disableAutoScrollToSelectedOption","closeMenuOnScroll","scrollMonitorTarget","contrast","selectedOption","defaultSelectedOption","icon","inputMode","loadingMessage","loadingIcon","maxLength","multiple","clearable","onChangeInput","onCloseMenu","onOpenMenu","onSelectOption","options","loadOptions","groupSelectedOptions","optionsMultiToggleCaption","optionsEmptyMessage","optionsEmptyIcon","palette","placeholder","readOnly","required","status","sizeXXS","sizeXS","sizeS","sizeM","sizeL","sizeXL","form","rootProps","sizeProps","iconBaseProps","sizes","SIZES_ICON","color","disabled","formInputLabelId","useMemo","id","nanoid","inputLabelId","menuListId","filteredOptions","getFilteredOptions","useFilteredOptions","loadedOptions","optionsLoading","getLoadedOptions","useLoadedOptions","dropdownSelectedOption","setDropdownSelectedOption","useState","getDropdownSelectedOption","undefined","inputText","setInputText","getDropdownInputText","focusWithin","setFocusWithin","menuOpenRequest","setMenuOpenRequest","menuOptions","menuOptionsLoading","menuOptionsGroups","groupDropdownOptions","menuOpen","inputRequired","length","inputActive","Boolean","multiToggleChecked","multiToggleIndeterminate","inputRef","useRef","menuRef","setMenuRef","menuListRef","selectedOptionRef","menuOpenPrevRef","updateInputText","useCallback","inputTextValue","updateOptions","updateOptionsDebounced","createDebouncedCallback","preventBlur","evt","target","current","Node","currentTarget","contains","renderInPortal","preventDefault","useScrollMonitor","onScrollStart","focus","useLayoutEffect","useEffect","menuRect","getBoundingClientRect","selectedOptionRect","top","bottom","setTimeout","scrollTo","offsetTop","_jsx","FormInputLabel","labelId","active","onColored","error","success","Styled","up","labelColorDisabled","labelColor","backgroundColor","backgroundColorDisabled","backgroundColorHover","borderColor","borderColorDisabled","onClick","onPointerDown","onMouseDown","window","PointerEvent","onFocus","onBlur","relatedTarget","input","_jsxs","_Fragment","children","type","tabIndex","FormInput","role","label","autoComplete","autoCapitalize","autoCorrect","spellCheck","value","colorDisabled","placeholderColor","placeholderColorDisabled","selectionStart","selectionEnd","stopPropagation","onChange","inputValue","onKeyDown","keyboardKeys","Enter","validate","key","Space","prev","Esc","Tab","ArrowDown","menuItems","idx","findIndex","item","focusTarget","HTMLElement","focusFirstFocusable","ArrowUp","focusLastFocusable","map","addon","Chip","black","marginLeft","cursor","text","textProps","appearance","colorHover","discardButtonProps","square","IconButton","dropdown","DropdownMenu","setRef","open","popperReferenceId","secondary","elevated","disableAutoFocus","menuBackgroundColor","menuBorderColor","empty","emptyMessage","emptyIcon","emptyIconProps","Backspace","MenuList","ListItem","borderRadius","ellipsis","wordBreak","control","InputCheckbox","SIZES_CHECKBOX","checked","indeterminate","update","MenuDivider","option","optionStatus","optionErrorStatus","optionSuccessStatus","_createElement","danger","filter","selected","SIZES","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var style=require('./style.js');var jsxRuntime=require('react/jsx-runtime');var MenuContainer=require('../MenuContainer/MenuContainer.js');var Icon=require('../Icon/Icon.js');var Text=require('../Text/Text.js');exports.DropdownMenuNoOptions=e=>{const{loadingIcon:n=jsxRuntime.jsx(style.LoadingIconAnimated,{}),emptyIcon:r="redo",loadingIconProps:t={},emptyIconProps:i={},loading:o,loadingMessage:s,emptyMessage:a}=e;return jsxRuntime.jsxs(MenuContainer.MenuContainer,{children:[jsxRuntime.jsx(style.IconContainer,{children:jsxRuntime.jsx(Icon.Icon,o?{preset:"brand",name:typeof n=='string'?n:void 0,icon:typeof n!='string'?n:void 0,...t}:{preset:"brand",name:typeof r=='string'?r:void 0,icon:typeof r!='string'?r:void 0,...i})}),o&&s
|
|
1
|
+
'use strict';var style=require('./style.js');var jsxRuntime=require('react/jsx-runtime');var MenuContainer=require('../MenuContainer/MenuContainer.js');var Icon=require('../Icon/Icon.js');var Text=require('../Text/Text.js');exports.DropdownMenuNoOptions=e=>{const{loadingIcon:n=jsxRuntime.jsx(style.LoadingIconAnimated,{}),emptyIcon:r="redo",loadingIconProps:t={},emptyIconProps:i={},loading:o,loadingMessage:s,emptyMessage:a}=e;return jsxRuntime.jsxs(MenuContainer.MenuContainer,{children:[jsxRuntime.jsx(style.IconContainer,{children:jsxRuntime.jsx(Icon.Icon,o?{preset:"brand",name:typeof n=='string'?n:void 0,icon:typeof n!='string'?n:void 0,...t}:{preset:"brand",name:typeof r=='string'?r:void 0,icon:typeof r!='string'?r:void 0,...i})}),o&&s?jsxRuntime.jsx(Text.Text,{as:"p",appearance:"body",size:"inherit",color:"inherit",textAlign:"center",wordBreak:"break-word",marginRight:12,marginBottom:12,marginLeft:12,children:s}):null,!o&&a?jsxRuntime.jsx(Text.Text,{as:"p",appearance:"body",size:"inherit",color:"inherit",textAlign:"center",wordBreak:"break-word",marginRight:12,marginBottom:12,marginLeft:12,children:a}):null]})};
|
|
2
2
|
//# sourceMappingURL=DropdownMenuNoOptions.js.map
|