@cube-dev/ui-kit 0.66.1 → 0.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/es/_internal/hooks/index.js +1 -1
- package/es/_internal/hooks/use-chained-callback.js +1 -1
- package/es/_internal/hooks/use-debounced-value.js +1 -1
- package/es/_internal/hooks/use-deprecation-warning.js +1 -1
- package/es/_internal/hooks/use-effect-once.js +1 -1
- package/es/_internal/hooks/use-event.js +1 -1
- package/es/_internal/hooks/use-is-first-render.js +1 -1
- package/es/_internal/hooks/use-sync-ref.js +1 -1
- package/es/_internal/hooks/use-timer/index.js +1 -1
- package/es/_internal/hooks/use-timer/timer.js +1 -1
- package/es/_internal/hooks/use-timer/use-timer.js +1 -1
- package/es/_internal/hooks/use-update-effect.js +1 -1
- package/es/_internal/hooks/use-warn.js +1 -1
- package/es/_internal/index.js +1 -1
- package/es/components/Block.js +1 -1
- package/es/components/GlobalStyles.js +1 -1
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +1 -1
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +3 -2
- package/es/components/actions/Action/Action.js +1 -1
- package/es/components/actions/Button/Button.js +24 -21
- package/es/components/actions/Button/index.js +1 -1
- package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/es/components/actions/CommandMenu/CommandMenu.js +13 -23
- package/es/components/actions/CommandMenu/index.js +1 -1
- package/es/components/actions/CommandMenu/styled.js +1 -2
- package/es/components/actions/Menu/Menu.js +18 -13
- package/es/components/actions/Menu/MenuItem.js +2 -1
- package/es/components/actions/Menu/MenuSection.js +1 -1
- package/es/components/actions/Menu/MenuTrigger.js +48 -21
- package/es/components/actions/Menu/context.js +1 -1
- package/es/components/actions/Menu/index.js +1 -1
- package/es/components/actions/Menu/styled.js +47 -22
- package/es/components/actions/index.js +3 -1
- package/es/components/actions/use-action.js +1 -1
- package/es/components/actions/use-anchored-menu.js +98 -0
- package/es/components/actions/use-context-menu.js +206 -0
- package/es/components/content/ActiveZone/ActiveZone.js +1 -1
- package/es/components/content/Alert/Alert.js +1 -1
- package/es/components/content/Alert/index.js +1 -1
- package/es/components/content/Alert/types.js +1 -1
- package/es/components/content/Alert/use-alert.js +1 -1
- package/es/components/content/Avatar/Avatar.js +1 -1
- package/es/components/content/Badge/Badge.js +1 -1
- package/es/components/content/Card/Card.js +1 -1
- package/es/components/content/Content.js +1 -1
- package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/es/components/content/CopyPasteBlock/index.js +1 -1
- package/es/components/content/CopySnippet/CopySnippet.js +1 -1
- package/es/components/content/CopySnippet/index.js +1 -1
- package/es/components/content/Divider.js +1 -1
- package/es/components/content/Footer.js +1 -1
- package/es/components/content/Header.js +1 -1
- package/es/components/content/HotKeys/HotKeys.js +1 -1
- package/es/components/content/HotKeys/index.js +1 -1
- package/es/components/content/Paragraph.js +1 -1
- package/es/components/content/Placeholder/Placeholder.js +1 -1
- package/es/components/content/PrismCode/PrismCode.js +1 -1
- package/es/components/content/PrismCode/prismSetup.js +1 -1
- package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/es/components/content/Result/Result.js +1 -1
- package/es/components/content/Skeleton/Skeleton.js +1 -1
- package/es/components/content/Tag/Tag.js +2 -2
- package/es/components/content/Text.js +1 -1
- package/es/components/content/Title.js +1 -1
- package/es/components/fields/Checkbox/Checkbox.js +1 -1
- package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/es/components/fields/Checkbox/context.js +1 -1
- package/es/components/fields/Checkbox/index.js +1 -1
- package/es/components/fields/ComboBox/ComboBox.js +25 -3
- package/es/components/fields/ComboBox/index.js +1 -1
- package/es/components/fields/DatePicker/DateInput.js +1 -1
- package/es/components/fields/DatePicker/DateInputBase.js +1 -1
- package/es/components/fields/DatePicker/DatePicker.js +1 -1
- package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/es/components/fields/DatePicker/TimeInput.js +1 -1
- package/es/components/fields/DatePicker/index.js +1 -1
- package/es/components/fields/DatePicker/intl.js +1 -1
- package/es/components/fields/DatePicker/parseDate.js +1 -1
- package/es/components/fields/DatePicker/props.js +1 -1
- package/es/components/fields/DatePicker/types.js +1 -1
- package/es/components/fields/DatePicker/utils.js +1 -1
- package/es/components/fields/FileInput/FileInput.js +1 -1
- package/es/components/fields/FilterListBox/FilterListBox.js +580 -0
- package/es/components/fields/FilterListBox/index.js +10 -0
- package/es/components/fields/FilterPicker/FilterPicker.js +426 -0
- package/es/components/fields/FilterPicker/index.js +10 -0
- package/es/components/fields/Input/Input.js +1 -1
- package/es/components/fields/Input/index.js +1 -1
- package/es/components/fields/ListBox/ListBox.js +324 -238
- package/es/components/fields/ListBox/index.js +1 -1
- package/es/components/fields/NumberInput/NumberInput.js +1 -1
- package/es/components/fields/NumberInput/StepButton.js +1 -1
- package/es/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/es/components/fields/RadioGroup/Radio.js +1 -1
- package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/es/components/fields/RadioGroup/context.js +1 -1
- package/es/components/fields/RadioGroup/index.js +1 -1
- package/es/components/fields/SearchInput/SearchInput.js +1 -1
- package/es/components/fields/SearchInput/index.js +1 -1
- package/es/components/fields/Select/Select.js +48 -9
- package/es/components/fields/Select/index.js +1 -1
- package/es/components/fields/Slider/Gradation.js +1 -1
- package/es/components/fields/Slider/Header.js +1 -1
- package/es/components/fields/Slider/RangeSlider.js +1 -1
- package/es/components/fields/Slider/Slider.js +1 -1
- package/es/components/fields/Slider/SliderBase.js +4 -4
- package/es/components/fields/Slider/SliderInput.js +1 -1
- package/es/components/fields/Slider/SliderThumb.js +1 -1
- package/es/components/fields/Slider/SliderTrack.js +1 -1
- package/es/components/fields/Slider/elements.js +1 -1
- package/es/components/fields/Slider/index.js +1 -1
- package/es/components/fields/Slider/types.js +1 -1
- package/es/components/fields/Switch/Switch.js +1 -1
- package/es/components/fields/Switch/index.js +1 -1
- package/es/components/fields/TextArea/TextArea.js +1 -1
- package/es/components/fields/TextArea/index.js +1 -1
- package/es/components/fields/TextInput/TextInput.js +1 -1
- package/es/components/fields/TextInput/TextInputBase.js +1 -1
- package/es/components/fields/TextInput/index.js +1 -1
- package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/es/components/fields/TextInputMapper/index.js +1 -1
- package/es/components/fields/index.js +3 -1
- package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/es/components/form/FieldWrapper/index.js +1 -1
- package/es/components/form/FieldWrapper/types.js +1 -1
- package/es/components/form/Form/Field.js +1 -1
- package/es/components/form/Form/Form.js +1 -1
- package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/es/components/form/Form/ResetButton/index.js +1 -1
- package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/es/components/form/Form/SubmitButton/index.js +1 -1
- package/es/components/form/Form/SubmitError.js +1 -1
- package/es/components/form/Form/index.js +1 -1
- package/es/components/form/Form/types.js +1 -1
- package/es/components/form/Form/use-field/index.js +1 -1
- package/es/components/form/Form/use-field/types.js +1 -1
- package/es/components/form/Form/use-field/use-field-props.js +1 -1
- package/es/components/form/Form/use-field/use-field.js +1 -1
- package/es/components/form/Form/use-form.js +1 -1
- package/es/components/form/Form/validation.js +1 -1
- package/es/components/form/Label.js +1 -1
- package/es/components/form/index.js +1 -1
- package/es/components/form/wrapper.js +5 -2
- package/es/components/layout/Flex.js +1 -1
- package/es/components/layout/Flow.js +1 -1
- package/es/components/layout/Grid.js +1 -1
- package/es/components/layout/Panel.js +1 -1
- package/es/components/layout/Prefix.js +1 -1
- package/es/components/layout/ResizablePanel.js +1 -1
- package/es/components/layout/Space.js +1 -1
- package/es/components/layout/Suffix.js +1 -1
- package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -1
- package/es/components/navigation/Link/Link.js +1 -1
- package/es/components/organisms/FileTabs/FileTabs.js +1 -1
- package/es/components/organisms/Modal/Modal.js +1 -1
- package/es/components/organisms/StatsCard/StatsCard.js +1 -1
- package/es/components/other/Base64Upload/Base64Upload.js +1 -1
- package/es/components/other/Calendar/Calendar.js +1 -1
- package/es/components/other/Calendar/CalendarCell.js +1 -1
- package/es/components/other/Calendar/CalendarGrid.js +1 -1
- package/es/components/other/Calendar/RangeCalendar.js +1 -1
- package/es/components/other/CloudLogo/CloudLogo.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/es/components/overlays/AlertDialog/index.js +1 -1
- package/es/components/overlays/AlertDialog/types.js +1 -1
- package/es/components/overlays/Dialog/Dialog.js +1 -1
- package/es/components/overlays/Dialog/DialogContainer.js +1 -1
- package/es/components/overlays/Dialog/DialogForm.js +1 -1
- package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/es/components/overlays/Dialog/context.js +1 -1
- package/es/components/overlays/Dialog/index.js +2 -2
- package/es/components/overlays/Dialog/{dialog-container.js → use-dialog-container.js} +3 -3
- package/es/components/overlays/Modal/Modal.js +1 -1
- package/es/components/overlays/Modal/OpenTransition.js +1 -1
- package/es/components/overlays/Modal/Overlay.js +1 -1
- package/es/components/overlays/Modal/Popover.js +1 -1
- package/es/components/overlays/Modal/Tray.js +1 -1
- package/es/components/overlays/Modal/Underlay.js +1 -1
- package/es/components/overlays/Modal/index.js +1 -1
- package/es/components/overlays/Modal/types.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
- package/es/components/overlays/NewNotifications/Notification.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
- package/es/components/overlays/NewNotifications/index.js +1 -1
- package/es/components/overlays/NewNotifications/types.js +1 -1
- package/es/components/overlays/Notification/Notification.js +1 -1
- package/es/components/overlays/OverlayWrapper.js +1 -1
- package/es/components/overlays/Toasts/Toast.js +1 -1
- package/es/components/overlays/Toasts/index.js +1 -1
- package/es/components/overlays/Toasts/types.js +1 -1
- package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
- package/es/components/overlays/Tooltip/Tooltip.js +1 -1
- package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +1 -1
- package/es/components/portal/Portal.js +1 -1
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/index.js +1 -1
- package/es/components/portal/storybook/templates/CustomRoot.js +1 -1
- package/es/components/portal/storybook/templates/PortalOrder.js +1 -1
- package/es/components/portal/storybook/templates/basic.js +1 -1
- package/es/components/portal/storybook/templates/index.js +1 -1
- package/es/components/portal/types.js +1 -1
- package/es/components/portal/usePortal.js +1 -1
- package/es/components/shared/InvalidIcon.js +1 -1
- package/es/components/shared/ValidIcon.js +1 -1
- package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/es/components/status/LoadingAnimation/index.js +1 -1
- package/es/components/status/Spin/Cube.js +1 -1
- package/es/components/status/Spin/InternalSpinner.js +1 -1
- package/es/components/status/Spin/Spin.js +1 -1
- package/es/components/status/Spin/SpinsContainer.js +1 -1
- package/es/components/status/Spin/index.js +1 -1
- package/es/components/status/Spin/types.js +1 -1
- package/es/components/status/index.js +1 -1
- package/es/data/themes.js +1 -1
- package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/es/icons/AdjustmentsIcon.js +1 -1
- package/es/icons/AiIcon.js +1 -1
- package/es/icons/AreaChartIcon.js +1 -1
- package/es/icons/BackwardIcon.js +1 -1
- package/es/icons/BarChartIcon.js +1 -1
- package/es/icons/BellFilledIcon.js +1 -1
- package/es/icons/BellIcon.js +1 -1
- package/es/icons/BooleanIcon.js +1 -1
- package/es/icons/CalendarEditIcon.js +1 -1
- package/es/icons/CalendarIcon.js +1 -1
- package/es/icons/CaretDownIcon.js +1 -1
- package/es/icons/CaretUpIcon.js +1 -1
- package/es/icons/ChartAreaStackedIcon.js +1 -1
- package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarGroupedIcon.js +1 -1
- package/es/icons/ChartBarHorizontalIcon.js +1 -1
- package/es/icons/ChartBarLineIcon.js +1 -1
- package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBoxPlot2Icon.js +1 -1
- package/es/icons/ChartBoxPlotIcon.js +1 -1
- package/es/icons/ChartBubbleIcon.js +1 -1
- package/es/icons/ChartDonut2Icon.js +1 -1
- package/es/icons/ChartFunnelIcon.js +1 -1
- package/es/icons/ChartKPIIcon.js +12 -0
- package/es/icons/ChartPie2Icon.js +1 -1
- package/es/icons/ChartScatterIcon.js +1 -1
- package/es/icons/CheckCircleFilledIcon.js +1 -1
- package/es/icons/CheckCircleIcon.js +1 -1
- package/es/icons/CheckIcon.js +1 -1
- package/es/icons/CircleFilledIcon.js +1 -1
- package/es/icons/ClearIcon.js +1 -1
- package/es/icons/CloseCircleFilledIcon.js +1 -1
- package/es/icons/CloseCircleIcon.js +1 -1
- package/es/icons/CloseIcon.js +1 -1
- package/es/icons/CodeIcon.js +1 -1
- package/es/icons/CopyIcon.js +1 -1
- package/es/icons/CountIcon.js +1 -1
- package/es/icons/CubeIcon.js +1 -1
- package/es/icons/DangerIcon.js +1 -1
- package/es/icons/DashboardIcon.js +1 -1
- package/es/icons/DatabaseIcon.js +1 -1
- package/es/icons/DirectionIcon.js +1 -1
- package/es/icons/DonutIcon.js +1 -1
- package/es/icons/DownIcon.js +1 -1
- package/es/icons/EditIcon.js +1 -1
- package/es/icons/ExclamationCircleFilledIcon.js +1 -1
- package/es/icons/ExclamationCircleIcon.js +1 -1
- package/es/icons/ExclamationIcon.js +1 -1
- package/es/icons/EyeIcon.js +1 -1
- package/es/icons/EyeInvisibleIcon.js +1 -1
- package/es/icons/FilterIcon.js +1 -1
- package/es/icons/FolderFilledIcon.js +1 -1
- package/es/icons/FolderIcon.js +1 -1
- package/es/icons/FolderOpenFilledIcon.js +1 -1
- package/es/icons/FolderOpenIcon.js +1 -1
- package/es/icons/ForwardIcon.js +1 -1
- package/es/icons/HierarchyIcon.js +1 -1
- package/es/icons/Icon.js +1 -1
- package/es/icons/InfoCircleIcon.js +1 -1
- package/es/icons/InfoIcon.js +1 -1
- package/es/icons/KeyIcon.js +1 -1
- package/es/icons/LeftIcon.js +1 -1
- package/es/icons/LineChartIcon.js +1 -1
- package/es/icons/LoadingIcon.js +1 -1
- package/es/icons/LockFilledIcon.js +1 -1
- package/es/icons/LockIcon.js +1 -1
- package/es/icons/MoreIcon.js +1 -1
- package/es/icons/NotAllowedIcon.js +1 -1
- package/es/icons/NumberIcon.js +1 -1
- package/es/icons/PauseCircleFilledIcon.js +1 -1
- package/es/icons/PauseCircleIcon.js +1 -1
- package/es/icons/PauseIcon.js +1 -1
- package/es/icons/PieChartIcon.js +1 -1
- package/es/icons/PlayCircleIcon.js +1 -1
- package/es/icons/PlayIcon.js +1 -1
- package/es/icons/PlusIcon.js +1 -1
- package/es/icons/ReloadIcon.js +1 -1
- package/es/icons/ReportIcon.js +1 -1
- package/es/icons/ReturnIcon.js +1 -1
- package/es/icons/RightIcon.js +1 -1
- package/es/icons/SchemeIcon.js +1 -1
- package/es/icons/SearchIcon.js +1 -1
- package/es/icons/SettingsIcon.js +1 -1
- package/es/icons/ShieldFilledIcon.js +1 -1
- package/es/icons/ShieldIcon.js +1 -1
- package/es/icons/SlashIcon.js +1 -1
- package/es/icons/SparklesIcon.js +1 -1
- package/es/icons/SqlIcon.js +1 -1
- package/es/icons/StatsIcon.js +1 -1
- package/es/icons/StopIcon.js +1 -1
- package/es/icons/StringIcon.js +1 -1
- package/es/icons/SwitchIcon.js +1 -1
- package/es/icons/TableIcon.js +1 -1
- package/es/icons/ThumbsDownIcon.js +1 -1
- package/es/icons/ThumbsUpIcon.js +1 -1
- package/es/icons/ThunderboltCrossedIcon.js +1 -1
- package/es/icons/ThunderboltFilledIcon.js +1 -1
- package/es/icons/ThunderboltIcon.js +1 -1
- package/es/icons/TimeIcon.js +1 -1
- package/es/icons/UnlockIcon.js +1 -1
- package/es/icons/UpIcon.js +1 -1
- package/es/icons/UserGroupIcon.js +1 -1
- package/es/icons/UserIcon.js +1 -1
- package/es/icons/UserLockIcon.js +1 -1
- package/es/icons/ViewIcon.js +1 -1
- package/es/icons/WarningFilledIcon.js +1 -1
- package/es/icons/WarningIcon.js +1 -1
- package/es/icons/add-new-icon.js +1 -1
- package/es/icons/index.js +2 -1
- package/es/icons/wrap-icon.js +1 -1
- package/es/index.js +1 -1
- package/es/provider.js +4 -1
- package/es/providers/TrackingProvider.js +1 -1
- package/es/services/notification.js +1 -1
- package/es/shared/form.js +1 -1
- package/es/shared/index.js +1 -1
- package/es/stories/Form.legacy-stories.js +1 -1
- package/es/stories/FormFieldArgs.js +1 -1
- package/es/stories/Layout.stories.js +1 -1
- package/es/stories/Tasty.stories.js +1 -1
- package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
- package/es/stories/components/DialogFormApp.js +1 -1
- package/es/stories/components/StyledButton.js +1 -1
- package/es/stories/lists/baseProps.js +1 -1
- package/es/tasty/index.js +1 -1
- package/es/tasty/providers/BreakpointsProvider.js +1 -1
- package/es/tasty/styles/align.js +1 -1
- package/es/tasty/styles/border.js +1 -1
- package/es/tasty/styles/boxShadow.combinator.js +1 -1
- package/es/tasty/styles/color.js +1 -1
- package/es/tasty/styles/createStyle.js +1 -1
- package/es/tasty/styles/dimension.js +1 -1
- package/es/tasty/styles/display.js +1 -1
- package/es/tasty/styles/fade.js +1 -1
- package/es/tasty/styles/fill.js +1 -1
- package/es/tasty/styles/flow.js +1 -1
- package/es/tasty/styles/font.js +1 -1
- package/es/tasty/styles/fontStyle.js +1 -1
- package/es/tasty/styles/gap.js +1 -1
- package/es/tasty/styles/groupRadius.js +1 -1
- package/es/tasty/styles/height.js +1 -1
- package/es/tasty/styles/index.js +1 -1
- package/es/tasty/styles/inset.js +1 -1
- package/es/tasty/styles/justify.js +1 -1
- package/es/tasty/styles/list.js +1 -1
- package/es/tasty/styles/margin.js +1 -1
- package/es/tasty/styles/marginBlock.js +1 -1
- package/es/tasty/styles/marginInline.js +1 -1
- package/es/tasty/styles/outline.js +1 -1
- package/es/tasty/styles/padding.js +1 -1
- package/es/tasty/styles/paddingBlock.js +1 -1
- package/es/tasty/styles/paddingInline.js +1 -1
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +1 -1
- package/es/tasty/styles/preset.js +1 -1
- package/es/tasty/styles/radius.js +1 -1
- package/es/tasty/styles/reset.js +1 -1
- package/es/tasty/styles/scrollbar.js +1 -1
- package/es/tasty/styles/shadow.js +1 -1
- package/es/tasty/styles/styledScrollbar.js +1 -1
- package/es/tasty/styles/transition.js +1 -1
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +1 -1
- package/es/tasty/tasty.js +1 -1
- package/es/tasty/types.js +1 -1
- package/es/tasty/utils/cache-wrapper.js +1 -1
- package/es/tasty/utils/case-converter.js +1 -1
- package/es/tasty/utils/colors.js +1 -1
- package/es/tasty/utils/dotize.js +1 -1
- package/es/tasty/utils/filterBaseProps.js +1 -1
- package/es/tasty/utils/getDisplayName.js +1 -1
- package/es/tasty/utils/getModCombinations.js +1 -1
- package/es/tasty/utils/mergeStyles.js +1 -1
- package/es/tasty/utils/modAttrs.js +1 -1
- package/es/tasty/utils/renderStyles.js +1 -1
- package/es/tasty/utils/responsive.js +1 -1
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +4 -1
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tokens.js +1 -1
- package/es/type-checks.js +1 -1
- package/es/utils/ResizeSensor.js +1 -1
- package/es/utils/modules.js +1 -1
- package/es/utils/promise.js +1 -1
- package/es/utils/random.js +7 -1
- package/es/utils/range.js +1 -1
- package/es/utils/react/Slots.js +1 -1
- package/es/utils/react/chain.js +1 -1
- package/es/utils/react/index.js +3 -1
- package/es/utils/react/interactions.js +1 -1
- package/es/utils/react/isTextOnly.js +1 -1
- package/es/utils/react/mapProps.js +1 -1
- package/es/utils/react/mergeProps.js +1 -1
- package/es/utils/react/nullableValue.js +1 -1
- package/es/utils/react/sharedStore.js +51 -0
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +42 -0
- package/es/utils/react/useEventBus.js +124 -0
- package/es/utils/react/useId.js +1 -1
- package/es/utils/react/useIsDarwin.js +1 -1
- package/es/utils/react/useKeySymbols.js +1 -1
- package/es/utils/react/useLayoutEffect.js +1 -1
- package/es/utils/react/useQaProps.js +1 -1
- package/es/utils/react/useViewportSize.js +1 -1
- package/es/utils/react/wrapNodeIfPlain.js +1 -1
- package/es/utils/transitions.js +1 -1
- package/es/utils/tree.js +1 -1
- package/es/utils/warnings.js +1 -1
- package/es/version.js +2 -2
- package/package.json +2 -1
- package/types/components/actions/Button/Button.d.ts +8 -5
- package/types/components/actions/Menu/Menu.d.ts +3 -0
- package/types/components/actions/Menu/MenuItem.d.ts +1 -1
- package/types/components/actions/Menu/MenuTrigger.d.ts +2 -3
- package/types/components/actions/Menu/styled.d.ts +1 -0
- package/types/components/actions/index.d.ts +2 -0
- package/types/components/actions/use-anchored-menu.d.ts +34 -0
- package/types/components/actions/use-context-menu.d.ts +42 -0
- package/types/components/content/Card/Card.d.ts +2 -2
- package/types/components/content/CopyPasteBlock/CopyPasteBlock.d.ts +1 -1
- package/types/components/fields/FilterListBox/FilterListBox.d.ts +51 -0
- package/types/components/fields/FilterListBox/index.d.ts +1 -0
- package/types/components/fields/FilterPicker/FilterPicker.d.ts +55 -0
- package/types/components/fields/FilterPicker/index.d.ts +1 -0
- package/types/components/fields/ListBox/ListBox.d.ts +48 -22
- package/types/components/fields/Select/Select.d.ts +8 -1
- package/types/components/fields/index.d.ts +2 -0
- package/types/components/overlays/Dialog/index.d.ts +1 -1
- package/types/icons/ChartKPIIcon.d.ts +4 -0
- package/types/icons/index.d.ts +1 -0
- package/types/shared/form.d.ts +2 -0
- package/types/tasty/utils/styles.d.ts +1 -0
- package/types/utils/random.d.ts +4 -0
- package/types/utils/react/index.d.ts +4 -0
- package/types/utils/react/sharedStore.d.ts +11 -0
- package/types/utils/react/useControlledFocusVisible.d.ts +10 -0
- package/types/utils/react/useEventBus.d.ts +74 -0
- /package/types/components/overlays/Dialog/{dialog-container.d.ts → use-dialog-container.d.ts} +0 -0
@@ -0,0 +1,426 @@
|
|
1
|
+
/**
|
2
|
+
* @license MIT
|
3
|
+
* author: Cube Dev Team
|
4
|
+
* @cube-dev/ui-kit v0.68.0
|
5
|
+
* Released under the MIT license.
|
6
|
+
*/
|
7
|
+
|
8
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
9
|
+
import React, { forwardRef, useRef, useState, } from 'react';
|
10
|
+
import { Section as BaseSection, Item } from 'react-stately';
|
11
|
+
import { useWarn } from '../../../_internal/hooks/use-warn';
|
12
|
+
import { DirectionIcon } from '../../../icons';
|
13
|
+
import { useProviderProps } from '../../../provider';
|
14
|
+
import { BASE_STYLES, COLOR_STYLES, extractStyles, OUTER_STYLES, } from '../../../tasty';
|
15
|
+
import { mergeProps } from '../../../utils/react';
|
16
|
+
import { Button } from '../../actions';
|
17
|
+
import { Text } from '../../content/Text';
|
18
|
+
import { useFieldProps, useFormProps, wrapWithField } from '../../form';
|
19
|
+
import { Dialog, DialogTrigger } from '../../overlays/Dialog';
|
20
|
+
import { FilterListBox, } from '../FilterListBox/FilterListBox';
|
21
|
+
import { ListBox } from '../ListBox';
|
22
|
+
const PROP_STYLES = [...BASE_STYLES, ...OUTER_STYLES, ...COLOR_STYLES];
|
23
|
+
export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
24
|
+
props = useProviderProps(props);
|
25
|
+
props = useFormProps(props);
|
26
|
+
props = useFieldProps(props, {
|
27
|
+
valuePropsMapper: ({ value, onChange }) => {
|
28
|
+
const fieldProps = {};
|
29
|
+
if (props.selectionMode === 'multiple') {
|
30
|
+
fieldProps.selectedKeys = value || [];
|
31
|
+
}
|
32
|
+
else {
|
33
|
+
fieldProps.selectedKey = value ?? null;
|
34
|
+
}
|
35
|
+
fieldProps.onSelectionChange = (key) => {
|
36
|
+
if (props.selectionMode === 'multiple') {
|
37
|
+
onChange(key ? (Array.isArray(key) ? key : [key]) : []);
|
38
|
+
}
|
39
|
+
else {
|
40
|
+
onChange(Array.isArray(key) ? key[0] : key);
|
41
|
+
}
|
42
|
+
};
|
43
|
+
return fieldProps;
|
44
|
+
},
|
45
|
+
});
|
46
|
+
let { qa, label, extra, icon, labelStyles, isRequired, necessityIndicator, validationState, isDisabled, isLoading, message, mods: externalMods, description, placeholder, size = 'small', styles, listBoxStyles, popoverStyles, type = 'outline', theme = 'default', labelSuffix, children, selectedKey, defaultSelectedKey, selectedKeys, defaultSelectedKeys, disabledKeys, onSelectionChange, selectionMode = 'single', listStateRef, focusOnHover, header, footer, headerStyles, footerStyles, allowsCustomValue, renderSummary, isCheckable, ...otherProps } = props;
|
47
|
+
styles = extractStyles(otherProps, PROP_STYLES, styles);
|
48
|
+
// Warn if isCheckable is false in single selection mode
|
49
|
+
useWarn(isCheckable === false && selectionMode === 'single', {
|
50
|
+
key: ['filterpicker-checkable-single-mode'],
|
51
|
+
args: [
|
52
|
+
'CubeUIKit: isCheckable=false is not recommended in single selection mode as it may confuse users about selection behavior.',
|
53
|
+
],
|
54
|
+
});
|
55
|
+
// Internal selection state (uncontrolled scenario)
|
56
|
+
const [internalSelectedKey, setInternalSelectedKey] = useState(defaultSelectedKey ?? null);
|
57
|
+
const [internalSelectedKeys, setInternalSelectedKeys] = useState(defaultSelectedKeys ?? []);
|
58
|
+
// Track popover open/close and capture children order for session
|
59
|
+
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
60
|
+
const cachedChildrenOrder = useRef(null);
|
61
|
+
const triggerRef = useRef(null);
|
62
|
+
const isControlledSingle = selectedKey !== undefined;
|
63
|
+
const isControlledMultiple = selectedKeys !== undefined;
|
64
|
+
const effectiveSelectedKey = isControlledSingle
|
65
|
+
? selectedKey
|
66
|
+
: internalSelectedKey;
|
67
|
+
const effectiveSelectedKeys = isControlledMultiple
|
68
|
+
? selectedKeys
|
69
|
+
: internalSelectedKeys;
|
70
|
+
// Utility to normalize React keys by stripping array prefixes like ".$" or "."
|
71
|
+
const normalizeKeyValue = (key) => {
|
72
|
+
if (key == null)
|
73
|
+
return '';
|
74
|
+
const str = String(key);
|
75
|
+
return str.startsWith('.$')
|
76
|
+
? str.slice(2)
|
77
|
+
: str.startsWith('.')
|
78
|
+
? str.slice(1)
|
79
|
+
: str;
|
80
|
+
};
|
81
|
+
// Given an iterable of keys (array or Set) toggle membership for duplicates
|
82
|
+
const processSelectionArray = (iterable) => {
|
83
|
+
const resultSet = new Set();
|
84
|
+
for (const key of iterable) {
|
85
|
+
const nKey = normalizeKeyValue(key);
|
86
|
+
if (resultSet.has(nKey)) {
|
87
|
+
resultSet.delete(nKey); // toggle off if clicked twice
|
88
|
+
}
|
89
|
+
else {
|
90
|
+
resultSet.add(nKey); // select
|
91
|
+
}
|
92
|
+
}
|
93
|
+
return Array.from(resultSet);
|
94
|
+
};
|
95
|
+
// Helper to get selected item labels for display
|
96
|
+
const getSelectedLabels = () => {
|
97
|
+
if (!children)
|
98
|
+
return [];
|
99
|
+
const selectedSet = new Set(selectionMode === 'multiple'
|
100
|
+
? (effectiveSelectedKeys || []).map(String)
|
101
|
+
: effectiveSelectedKey != null
|
102
|
+
? [String(effectiveSelectedKey)]
|
103
|
+
: []);
|
104
|
+
const labels = [];
|
105
|
+
const extractLabels = (nodes) => {
|
106
|
+
React.Children.forEach(nodes, (child) => {
|
107
|
+
if (!child || typeof child !== 'object')
|
108
|
+
return;
|
109
|
+
if (child.type === Item) {
|
110
|
+
if (selectedSet.has(String(child.key))) {
|
111
|
+
const label = child.props.textValue ||
|
112
|
+
(typeof child.props.children === 'string'
|
113
|
+
? child.props.children
|
114
|
+
: '') ||
|
115
|
+
String(child.props.children || '');
|
116
|
+
labels.push(label);
|
117
|
+
}
|
118
|
+
}
|
119
|
+
if (child.props?.children) {
|
120
|
+
extractLabels(child.props.children);
|
121
|
+
}
|
122
|
+
});
|
123
|
+
};
|
124
|
+
const processedKeys = new Set();
|
125
|
+
// Modified extractLabels to track which keys we've processed
|
126
|
+
const extractLabelsWithTracking = (nodes) => {
|
127
|
+
React.Children.forEach(nodes, (child) => {
|
128
|
+
if (!child || typeof child !== 'object')
|
129
|
+
return;
|
130
|
+
if (child.type === Item) {
|
131
|
+
const childKey = String(child.key);
|
132
|
+
if (selectedSet.has(childKey)) {
|
133
|
+
const label = child.props.textValue ||
|
134
|
+
(typeof child.props.children === 'string'
|
135
|
+
? child.props.children
|
136
|
+
: '') ||
|
137
|
+
String(child.props.children || '');
|
138
|
+
labels.push(label);
|
139
|
+
processedKeys.add(childKey);
|
140
|
+
}
|
141
|
+
}
|
142
|
+
if (child.props?.children) {
|
143
|
+
extractLabelsWithTracking(child.props.children);
|
144
|
+
}
|
145
|
+
});
|
146
|
+
};
|
147
|
+
extractLabelsWithTracking(children);
|
148
|
+
// Handle custom values that don't have corresponding children
|
149
|
+
const selectedKeysArr = selectionMode === 'multiple'
|
150
|
+
? (effectiveSelectedKeys || []).map(String)
|
151
|
+
: effectiveSelectedKey != null
|
152
|
+
? [String(effectiveSelectedKey)]
|
153
|
+
: [];
|
154
|
+
// Add labels for any selected keys that weren't processed (custom values)
|
155
|
+
selectedKeysArr.forEach((key) => {
|
156
|
+
if (!processedKeys.has(key)) {
|
157
|
+
// This is a custom value, use the key as the label
|
158
|
+
labels.push(key);
|
159
|
+
}
|
160
|
+
});
|
161
|
+
return labels;
|
162
|
+
};
|
163
|
+
const selectedLabels = getSelectedLabels();
|
164
|
+
const hasSelection = selectedLabels.length > 0;
|
165
|
+
// Always keep the latest selection in a ref (with normalized keys) so that we can read it synchronously in the popover close effect.
|
166
|
+
const latestSelectionRef = useRef({
|
167
|
+
single: effectiveSelectedKey != null
|
168
|
+
? normalizeKeyValue(effectiveSelectedKey)
|
169
|
+
: null,
|
170
|
+
multiple: (effectiveSelectedKeys ?? []).map(normalizeKeyValue),
|
171
|
+
});
|
172
|
+
React.useEffect(() => {
|
173
|
+
latestSelectionRef.current = {
|
174
|
+
single: effectiveSelectedKey != null
|
175
|
+
? normalizeKeyValue(effectiveSelectedKey)
|
176
|
+
: null,
|
177
|
+
multiple: (effectiveSelectedKeys ?? []).map(normalizeKeyValue),
|
178
|
+
};
|
179
|
+
}, [effectiveSelectedKey, effectiveSelectedKeys]);
|
180
|
+
const selectionsWhenClosed = useRef({ single: null, multiple: [] });
|
181
|
+
// Function to sort children with selected items on top
|
182
|
+
const getSortedChildren = React.useCallback(() => {
|
183
|
+
if (!children)
|
184
|
+
return children;
|
185
|
+
// When the popover is **closed** we don't want to trigger any resorting –
|
186
|
+
// that could cause visible re-flows during the fade-out animation. Simply
|
187
|
+
// reuse whatever order we had while it was open (if available).
|
188
|
+
if (!isPopoverOpen) {
|
189
|
+
return cachedChildrenOrder.current ?? children;
|
190
|
+
}
|
191
|
+
// Popover is open – compute (or recompute) the sorted order for this
|
192
|
+
// session.
|
193
|
+
// Determine if there were any selections when the popover was previously closed.
|
194
|
+
const hadSelectionsWhenClosed = selectionMode === 'multiple'
|
195
|
+
? selectionsWhenClosed.current.multiple.length > 0
|
196
|
+
: selectionsWhenClosed.current.single !== null;
|
197
|
+
// Only apply sorting when there were selections in the previous session.
|
198
|
+
// We intentionally do not depend on the `isPopoverOpen` flag here because that
|
199
|
+
// flag is updated **after** the first render triggered by clicking the
|
200
|
+
// trigger button. Relying on it caused a timing issue where the very first
|
201
|
+
// render of a freshly-opened popover was unsorted. By removing the
|
202
|
+
// `isPopoverOpen` check we ensure items are already sorted during that first
|
203
|
+
// render while still maintaining stable order within an open popover thanks
|
204
|
+
// to the `cachedChildrenOrder` guard above.
|
205
|
+
if (!hadSelectionsWhenClosed) {
|
206
|
+
return children;
|
207
|
+
}
|
208
|
+
// Create selected keys set for fast lookup
|
209
|
+
const selectedSet = new Set();
|
210
|
+
if (selectionMode === 'multiple') {
|
211
|
+
selectionsWhenClosed.current.multiple.forEach((key) => selectedSet.add(normalizeKeyValue(key)));
|
212
|
+
}
|
213
|
+
else if (selectionMode === 'single' &&
|
214
|
+
selectionsWhenClosed.current.single != null) {
|
215
|
+
selectedSet.add(normalizeKeyValue(selectionsWhenClosed.current.single));
|
216
|
+
}
|
217
|
+
// Helper function to check if an item is selected
|
218
|
+
const isItemSelected = (child) => {
|
219
|
+
return (child?.key != null && selectedSet.has(normalizeKeyValue(child.key)));
|
220
|
+
};
|
221
|
+
// Helper function to sort children array
|
222
|
+
const sortChildrenArray = (childrenArray) => {
|
223
|
+
const cloneWithNormalizedKey = (item) => React.cloneElement(item, {
|
224
|
+
key: normalizeKeyValue(item.key),
|
225
|
+
});
|
226
|
+
const selected = [];
|
227
|
+
const unselected = [];
|
228
|
+
childrenArray.forEach((child) => {
|
229
|
+
if (!child || typeof child !== 'object') {
|
230
|
+
unselected.push(child);
|
231
|
+
return;
|
232
|
+
}
|
233
|
+
// Handle sections - sort items within each section
|
234
|
+
if (child.type === BaseSection ||
|
235
|
+
child.type?.displayName === 'Section') {
|
236
|
+
const sectionChildren = Array.isArray(child.props.children)
|
237
|
+
? child.props.children
|
238
|
+
: [child.props.children];
|
239
|
+
const selectedItems = [];
|
240
|
+
const unselectedItems = [];
|
241
|
+
sectionChildren.forEach((sectionChild) => {
|
242
|
+
if (sectionChild &&
|
243
|
+
typeof sectionChild === 'object' &&
|
244
|
+
(sectionChild.type === Item ||
|
245
|
+
sectionChild.type?.displayName === 'Item')) {
|
246
|
+
const clonedItem = cloneWithNormalizedKey(sectionChild);
|
247
|
+
if (isItemSelected(sectionChild)) {
|
248
|
+
selectedItems.push(clonedItem);
|
249
|
+
}
|
250
|
+
else {
|
251
|
+
unselectedItems.push(clonedItem);
|
252
|
+
}
|
253
|
+
}
|
254
|
+
else {
|
255
|
+
unselectedItems.push(sectionChild);
|
256
|
+
}
|
257
|
+
});
|
258
|
+
// Create new section with sorted children, preserving React element properly
|
259
|
+
unselected.push(React.cloneElement(child, {
|
260
|
+
...child.props,
|
261
|
+
children: [...selectedItems, ...unselectedItems],
|
262
|
+
}));
|
263
|
+
}
|
264
|
+
// Handle non-section elements (items, dividers, etc.)
|
265
|
+
else {
|
266
|
+
const clonedItem = cloneWithNormalizedKey(child);
|
267
|
+
if (isItemSelected(child)) {
|
268
|
+
selected.push(clonedItem);
|
269
|
+
}
|
270
|
+
else {
|
271
|
+
unselected.push(clonedItem);
|
272
|
+
}
|
273
|
+
}
|
274
|
+
});
|
275
|
+
return [...selected, ...unselected];
|
276
|
+
};
|
277
|
+
// Sort the children
|
278
|
+
const childrenArray = React.Children.toArray(children);
|
279
|
+
const sortedChildren = sortChildrenArray(childrenArray);
|
280
|
+
// Cache the sorted order when popover opens
|
281
|
+
if (isPopoverOpen) {
|
282
|
+
cachedChildrenOrder.current = sortedChildren;
|
283
|
+
}
|
284
|
+
return sortedChildren;
|
285
|
+
}, [
|
286
|
+
children,
|
287
|
+
effectiveSelectedKeys,
|
288
|
+
effectiveSelectedKey,
|
289
|
+
selectionMode,
|
290
|
+
isPopoverOpen,
|
291
|
+
]);
|
292
|
+
// FilterListBox handles custom values internally when allowsCustomValue={true}
|
293
|
+
// We only provide the sorted original children
|
294
|
+
const finalChildren = getSortedChildren();
|
295
|
+
// Function to close popover and focus trigger button
|
296
|
+
const closeAndFocus = React.useCallback((close) => {
|
297
|
+
close();
|
298
|
+
// Use setTimeout to ensure the popover closes first, then focus the trigger
|
299
|
+
setTimeout(() => {
|
300
|
+
if (triggerRef.current) {
|
301
|
+
triggerRef.current.focus();
|
302
|
+
}
|
303
|
+
}, 0);
|
304
|
+
}, []);
|
305
|
+
const renderTriggerContent = () => {
|
306
|
+
// When there is a selection and a custom summary renderer is provided – use it.
|
307
|
+
if (hasSelection && typeof renderSummary === 'function') {
|
308
|
+
if (selectionMode === 'single') {
|
309
|
+
return renderSummary({
|
310
|
+
selectedLabel: selectedLabels[0],
|
311
|
+
selectedKey: effectiveSelectedKey ?? null,
|
312
|
+
selectedLabels,
|
313
|
+
selectedKeys: effectiveSelectedKeys,
|
314
|
+
selectionMode: 'single',
|
315
|
+
});
|
316
|
+
}
|
317
|
+
return renderSummary({
|
318
|
+
selectedLabels,
|
319
|
+
selectedKeys: effectiveSelectedKeys,
|
320
|
+
selectionMode: 'multiple',
|
321
|
+
});
|
322
|
+
}
|
323
|
+
else if (hasSelection && renderSummary === false) {
|
324
|
+
return null;
|
325
|
+
}
|
326
|
+
let content = '';
|
327
|
+
if (!hasSelection) {
|
328
|
+
content = placeholder;
|
329
|
+
}
|
330
|
+
else if (selectionMode === 'single') {
|
331
|
+
content = selectedLabels[0];
|
332
|
+
}
|
333
|
+
else {
|
334
|
+
content = selectedLabels.join(', ');
|
335
|
+
}
|
336
|
+
if (!content) {
|
337
|
+
return null;
|
338
|
+
}
|
339
|
+
return (_jsx(Text, { ellipsis: true, style: { opacity: hasSelection ? 1 : 'var(--disabled-opacity)' }, children: content }));
|
340
|
+
};
|
341
|
+
// The trigger is rendered as a function so we can access the dialog state
|
342
|
+
const renderTrigger = (state) => {
|
343
|
+
// Track popover open/close state to control sorting
|
344
|
+
React.useEffect(() => {
|
345
|
+
if (state.isOpen !== isPopoverOpen) {
|
346
|
+
setIsPopoverOpen(state.isOpen);
|
347
|
+
if (!state.isOpen) {
|
348
|
+
// Popover just closed – preserve the current sorted order so the
|
349
|
+
// fade-out animation keeps its layout unchanged. We only need to
|
350
|
+
// record the latest selection for the next session.
|
351
|
+
selectionsWhenClosed.current = { ...latestSelectionRef.current };
|
352
|
+
}
|
353
|
+
}
|
354
|
+
}, [state.isOpen, isPopoverOpen]);
|
355
|
+
return (_jsx(Button, { ref: triggerRef, qa: props.qa || 'FilterPicker', type: type, theme: validationState === 'invalid' ? 'danger' : theme, size: size, isDisabled: isDisabled, isLoading: isLoading, mods: {
|
356
|
+
placeholder: !hasSelection,
|
357
|
+
selected: hasSelection,
|
358
|
+
...externalMods,
|
359
|
+
}, icon: icon, rightIcon: _jsx(DirectionIcon, { to: state.isOpen ? 'top' : 'bottom' }), styles: styles, ...otherProps, "aria-label": `${props['aria-label'] ?? props.label ?? ''}`, children: renderTriggerContent() }));
|
360
|
+
};
|
361
|
+
const filterPickerField = (_jsxs(DialogTrigger, { type: "popover", placement: "bottom start", shouldFlip: true, isDismissable: true, children: [renderTrigger, (close) => (_jsx(Dialog, { display: "grid", styles: { gridRows: '1sf', ...popoverStyles }, children: _jsx(FilterListBox, { autoFocus: true, "aria-label": `${props['aria-label'] ?? props.label ?? ''} Picker`, selectedKey: selectionMode === 'single' ? effectiveSelectedKey : undefined, selectedKeys: selectionMode === 'multiple' ? effectiveSelectedKeys : undefined, disabledKeys: disabledKeys, focusOnHover: focusOnHover, allowsCustomValue: allowsCustomValue, selectionMode: selectionMode, validationState: validationState, isDisabled: isDisabled, stateRef: listStateRef, isCheckable: isCheckable, mods: {
|
362
|
+
popover: true,
|
363
|
+
}, header: header, footer: footer, headerStyles: headerStyles, footerStyles: footerStyles, qa: `${props.qa || 'FilterPicker'}ListBox`, onEscape: () => closeAndFocus(close), onOptionClick: (key) => {
|
364
|
+
// For FilterPicker, clicking the content area should close the popover
|
365
|
+
// in multiple selection mode (single mode already closes via onSelectionChange)
|
366
|
+
if (selectionMode === 'multiple' && isCheckable) {
|
367
|
+
closeAndFocus(close);
|
368
|
+
}
|
369
|
+
}, onSelectionChange: (selection) => {
|
370
|
+
// No need to change any flags - children order is cached
|
371
|
+
// Update internal state if uncontrolled
|
372
|
+
if (selectionMode === 'single') {
|
373
|
+
if (!isControlledSingle) {
|
374
|
+
setInternalSelectedKey(selection);
|
375
|
+
}
|
376
|
+
}
|
377
|
+
else {
|
378
|
+
if (!isControlledMultiple) {
|
379
|
+
let normalized = selection;
|
380
|
+
if (Array.isArray(selection)) {
|
381
|
+
normalized = processSelectionArray(selection);
|
382
|
+
}
|
383
|
+
else if (selection &&
|
384
|
+
typeof selection === 'object' &&
|
385
|
+
selection instanceof Set) {
|
386
|
+
normalized = processSelectionArray(selection);
|
387
|
+
}
|
388
|
+
setInternalSelectedKeys(normalized);
|
389
|
+
}
|
390
|
+
}
|
391
|
+
// Update latest selection ref synchronously
|
392
|
+
if (selectionMode === 'single') {
|
393
|
+
latestSelectionRef.current.single = selection;
|
394
|
+
}
|
395
|
+
else {
|
396
|
+
if (Array.isArray(selection)) {
|
397
|
+
latestSelectionRef.current.multiple = Array.from(new Set(processSelectionArray(selection)));
|
398
|
+
}
|
399
|
+
else if (selection &&
|
400
|
+
typeof selection === 'object' &&
|
401
|
+
selection instanceof Set) {
|
402
|
+
latestSelectionRef.current.multiple = Array.from(new Set(processSelectionArray(selection)));
|
403
|
+
}
|
404
|
+
else {
|
405
|
+
latestSelectionRef.current.multiple = selection;
|
406
|
+
}
|
407
|
+
}
|
408
|
+
onSelectionChange?.(selection);
|
409
|
+
if (selectionMode === 'single') {
|
410
|
+
closeAndFocus(close);
|
411
|
+
}
|
412
|
+
}, children: finalChildren }) }))] }));
|
413
|
+
return wrapWithField(filterPickerField, ref, mergeProps({
|
414
|
+
...props,
|
415
|
+
styles: undefined,
|
416
|
+
}, {}));
|
417
|
+
});
|
418
|
+
FilterPicker.Item = ListBox.Item;
|
419
|
+
FilterPicker.Section = BaseSection;
|
420
|
+
Object.defineProperty(FilterPicker, 'cubeInputType', {
|
421
|
+
value: 'FilterPicker',
|
422
|
+
enumerable: false,
|
423
|
+
configurable: false,
|
424
|
+
});
|
425
|
+
|
426
|
+
|