@cube-dev/ui-kit 0.69.1 → 0.69.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -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 +1 -1
- package/es/components/actions/Action/Action.js +1 -1
- package/es/components/actions/Button/Button.js +38 -16
- 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 +1 -1
- package/es/components/actions/CommandMenu/index.js +1 -1
- package/es/components/actions/CommandMenu/styled.js +1 -1
- package/es/components/actions/Menu/Menu.js +1 -1
- package/es/components/actions/Menu/MenuItem.js +1 -1
- package/es/components/actions/Menu/MenuSection.js +1 -1
- package/es/components/actions/Menu/MenuTrigger.js +1 -1
- 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 +7 -1
- package/es/components/actions/index.js +1 -1
- package/es/components/actions/use-action.js +1 -1
- package/es/components/actions/use-anchored-menu.js +1 -1
- package/es/components/actions/use-context-menu.js +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +48 -6
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +401 -138
- package/es/components/fields/FilterPicker/index.js +1 -1
- 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 +132 -24
- 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 +58 -41
- 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 +1 -1
- 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 +1 -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 +1 -1
- 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 +2 -1
- package/es/components/overlays/Dialog/context.js +1 -1
- package/es/components/overlays/Dialog/index.js +1 -1
- package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
- 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 +1 -1
- 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 +1 -1
- package/es/icons/wrap-icon.js +1 -1
- package/es/index.js +1 -1
- package/es/provider.js +1 -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 +1 -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 +1 -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 +1 -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 +1 -1
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +1 -1
- package/es/utils/react/useEventBus.js +1 -1
- 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 +1 -1
- package/types/components/actions/Button/Button.d.ts +30 -12
- package/types/components/fields/FilterListBox/FilterListBox.d.ts +11 -11
- package/types/components/fields/FilterPicker/FilterPicker.d.ts +22 -18
- package/types/components/fields/ListBox/ListBox.d.ts +38 -21
- package/types/components/overlays/Dialog/DialogTrigger.d.ts +1 -0
@@ -1,18 +1,18 @@
|
|
1
1
|
/**
|
2
2
|
* @license MIT
|
3
3
|
* author: Cube Dev Team
|
4
|
-
* @cube-dev/ui-kit v0.69.
|
4
|
+
* @cube-dev/ui-kit v0.69.3
|
5
5
|
* Released under the MIT license.
|
6
6
|
*/
|
7
7
|
|
8
8
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
9
|
-
import { Children, cloneElement, forwardRef, useCallback, useEffect, useRef, useState, } from 'react';
|
9
|
+
import { Children, cloneElement, forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
10
10
|
import { FocusScope, useKeyboard } from 'react-aria';
|
11
11
|
import { Section as BaseSection, Item } from 'react-stately';
|
12
12
|
import { useWarn } from '../../../_internal/hooks/use-warn';
|
13
13
|
import { DirectionIcon } from '../../../icons';
|
14
14
|
import { useProviderProps } from '../../../provider';
|
15
|
-
import { BASE_STYLES, COLOR_STYLES, extractStyles, OUTER_STYLES, } from '../../../tasty';
|
15
|
+
import { BASE_STYLES, COLOR_STYLES, extractStyles, OUTER_STYLES, tasty, } from '../../../tasty';
|
16
16
|
import { mergeProps } from '../../../utils/react';
|
17
17
|
import { Button } from '../../actions';
|
18
18
|
import { Text } from '../../content/Text';
|
@@ -21,6 +21,16 @@ import { Dialog, DialogTrigger } from '../../overlays/Dialog';
|
|
21
21
|
import { FilterListBox, } from '../FilterListBox/FilterListBox';
|
22
22
|
import { ListBox } from '../ListBox';
|
23
23
|
const PROP_STYLES = [...BASE_STYLES, ...OUTER_STYLES, ...COLOR_STYLES];
|
24
|
+
const FilterPickerWrapper = tasty({
|
25
|
+
qa: 'FilterPicker',
|
26
|
+
styles: {
|
27
|
+
display: 'inline-grid',
|
28
|
+
flow: 'column',
|
29
|
+
gridRows: '1sf',
|
30
|
+
placeContent: 'stretch',
|
31
|
+
placeItems: 'stretch',
|
32
|
+
},
|
33
|
+
});
|
24
34
|
export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
25
35
|
props = useProviderProps(props);
|
26
36
|
props = useFormProps(props);
|
@@ -35,7 +45,13 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
35
45
|
}
|
36
46
|
fieldProps.onSelectionChange = (key) => {
|
37
47
|
if (props.selectionMode === 'multiple') {
|
38
|
-
|
48
|
+
// Handle "all" selection and array selections
|
49
|
+
if (key === 'all') {
|
50
|
+
onChange('all');
|
51
|
+
}
|
52
|
+
else {
|
53
|
+
onChange(key ? (Array.isArray(key) ? key : [key]) : []);
|
54
|
+
}
|
39
55
|
}
|
40
56
|
else {
|
41
57
|
onChange(Array.isArray(key) ? key[0] : key);
|
@@ -44,7 +60,7 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
44
60
|
return fieldProps;
|
45
61
|
},
|
46
62
|
});
|
47
|
-
let { qa, label, extra, icon, labelStyles, isRequired, necessityIndicator, validationState, isDisabled, isLoading, message, mods: externalMods, description, placeholder, size = 'medium', styles, listBoxStyles, popoverStyles, type = 'outline', theme = 'default', labelSuffix, shouldFocusWrap, children, selectedKey, defaultSelectedKey, selectedKeys, defaultSelectedKeys, disabledKeys, onSelectionChange, selectionMode = 'single', listStateRef, focusOnHover, header, footer, headerStyles, footerStyles, allowsCustomValue, renderSummary, isCheckable, ...otherProps } = props;
|
63
|
+
let { qa, label, extra, icon, rightIcon, labelStyles, isRequired, necessityIndicator, validationState, isDisabled, isLoading, message, mods: externalMods, description, placeholder, size = 'medium', styles, listBoxStyles, popoverStyles, type = 'outline', theme = 'default', labelSuffix, shouldFocusWrap, children, shouldFlip = true, selectedKey, defaultSelectedKey, selectedKeys, defaultSelectedKeys, disabledKeys, onSelectionChange, selectionMode = 'single', listStateRef, focusOnHover, showSelectAll, selectAllLabel = 'All', items, header, footer, headerStyles, footerStyles, triggerStyles, allowsCustomValue, renderSummary, isCheckable, ...otherProps } = props;
|
48
64
|
styles = extractStyles(otherProps, PROP_STYLES, styles);
|
49
65
|
// Warn if isCheckable is false in single selection mode
|
50
66
|
useWarn(isCheckable === false && selectionMode === 'single', {
|
@@ -59,6 +75,8 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
59
75
|
// Track popover open/close and capture children order for session
|
60
76
|
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
61
77
|
const cachedChildrenOrder = useRef(null);
|
78
|
+
// Cache for sorted items array when using `items` prop
|
79
|
+
const cachedItemsOrder = useRef(null);
|
62
80
|
const triggerRef = useRef(null);
|
63
81
|
const isControlledSingle = selectedKey !== undefined;
|
64
82
|
const isControlledMultiple = selectedKeys !== undefined;
|
@@ -68,7 +86,8 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
68
86
|
const effectiveSelectedKeys = isControlledMultiple
|
69
87
|
? selectedKeys
|
70
88
|
: internalSelectedKeys;
|
71
|
-
// Utility
|
89
|
+
// Utility: remove React's ".$" / "." prefixes from element keys so that we
|
90
|
+
// can compare them with user-provided keys.
|
72
91
|
const normalizeKeyValue = (key) => {
|
73
92
|
if (key == null)
|
74
93
|
return '';
|
@@ -79,11 +98,57 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
79
98
|
? str.slice(1)
|
80
99
|
: str;
|
81
100
|
};
|
101
|
+
// ---------------------------------------------------------------------------
|
102
|
+
// Map public-facing keys (without React's "." prefix) to the actual React
|
103
|
+
// element keys that appear in the collection (which usually have the `.$`
|
104
|
+
// or `.` prefix added by React when children are in an array). This ensures
|
105
|
+
// that the key we pass to ListBox exactly matches the keys it receives from
|
106
|
+
// React Aria, so the initial selection is highlighted correctly.
|
107
|
+
// ---------------------------------------------------------------------------
|
108
|
+
const findReactKey = useCallback((lookup) => {
|
109
|
+
if (lookup == null)
|
110
|
+
return lookup;
|
111
|
+
const normalizedLookup = normalizeKeyValue(lookup);
|
112
|
+
let foundKey = lookup;
|
113
|
+
const traverse = (nodes) => {
|
114
|
+
Children.forEach(nodes, (child) => {
|
115
|
+
if (!child || typeof child !== 'object')
|
116
|
+
return;
|
117
|
+
const element = child;
|
118
|
+
if (element.key != null) {
|
119
|
+
if (normalizeKeyValue(element.key) === normalizedLookup) {
|
120
|
+
foundKey = element.key;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
if (element.props?.children) {
|
124
|
+
traverse(element.props.children);
|
125
|
+
}
|
126
|
+
});
|
127
|
+
};
|
128
|
+
if (children)
|
129
|
+
traverse(children);
|
130
|
+
return foundKey;
|
131
|
+
}, [children]);
|
132
|
+
const mappedSelectedKey = useMemo(() => {
|
133
|
+
if (selectionMode !== 'single')
|
134
|
+
return null;
|
135
|
+
return effectiveSelectedKey ? findReactKey(effectiveSelectedKey) : null;
|
136
|
+
}, [selectionMode, effectiveSelectedKey, findReactKey]);
|
137
|
+
const mappedSelectedKeys = useMemo(() => {
|
138
|
+
if (selectionMode !== 'multiple')
|
139
|
+
return undefined;
|
140
|
+
if (effectiveSelectedKeys === 'all')
|
141
|
+
return 'all';
|
142
|
+
if (Array.isArray(effectiveSelectedKeys)) {
|
143
|
+
return effectiveSelectedKeys.map((k) => findReactKey(k));
|
144
|
+
}
|
145
|
+
return effectiveSelectedKeys;
|
146
|
+
}, [selectionMode, effectiveSelectedKeys, findReactKey]);
|
82
147
|
// Given an iterable of keys (array or Set) toggle membership for duplicates
|
83
148
|
const processSelectionArray = (iterable) => {
|
84
149
|
const resultSet = new Set();
|
85
150
|
for (const key of iterable) {
|
86
|
-
const nKey =
|
151
|
+
const nKey = String(key);
|
87
152
|
if (resultSet.has(nKey)) {
|
88
153
|
resultSet.delete(nKey); // toggle off if clicked twice
|
89
154
|
}
|
@@ -95,66 +160,145 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
95
160
|
};
|
96
161
|
// Helper to get selected item labels for display
|
97
162
|
const getSelectedLabels = () => {
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
163
|
+
// Handle "all" selection - return all available labels
|
164
|
+
if (selectionMode === 'multiple' && effectiveSelectedKeys === 'all') {
|
165
|
+
const allLabels = [];
|
166
|
+
// Extract from items prop if available
|
167
|
+
if (items) {
|
168
|
+
const extractFromItems = (itemsArray) => {
|
169
|
+
itemsArray.forEach((item) => {
|
170
|
+
if (item && typeof item === 'object') {
|
171
|
+
const itemObj = item;
|
172
|
+
if (Array.isArray(itemObj.children)) {
|
173
|
+
// Section-like object
|
174
|
+
extractFromItems(itemObj.children);
|
175
|
+
}
|
176
|
+
else {
|
177
|
+
// Regular item - extract label
|
178
|
+
const label = itemObj.textValue ||
|
179
|
+
itemObj.label ||
|
180
|
+
(typeof itemObj.children === 'string'
|
181
|
+
? itemObj.children
|
182
|
+
: '') ||
|
183
|
+
String(itemObj.children ||
|
184
|
+
itemObj.key ||
|
185
|
+
itemObj.id ||
|
186
|
+
item);
|
187
|
+
allLabels.push(label);
|
188
|
+
}
|
189
|
+
}
|
190
|
+
});
|
191
|
+
};
|
192
|
+
const itemsArray = Array.isArray(items)
|
193
|
+
? items
|
194
|
+
: Array.from(items);
|
195
|
+
extractFromItems(itemsArray);
|
196
|
+
return allLabels;
|
197
|
+
}
|
198
|
+
// Extract from children if available
|
199
|
+
if (children) {
|
200
|
+
const extractAllLabels = (nodes) => {
|
201
|
+
if (!nodes)
|
202
|
+
return;
|
203
|
+
Children.forEach(nodes, (child) => {
|
204
|
+
if (!child || typeof child !== 'object')
|
205
|
+
return;
|
206
|
+
const element = child;
|
207
|
+
if (element.type === Item) {
|
208
|
+
const label = element.props.textValue ||
|
209
|
+
(typeof element.props.children === 'string'
|
210
|
+
? element.props.children
|
211
|
+
: '') ||
|
212
|
+
String(element.props.children || '');
|
213
|
+
allLabels.push(label);
|
214
|
+
}
|
215
|
+
if (element.props?.children) {
|
216
|
+
extractAllLabels(element.props.children);
|
217
|
+
}
|
218
|
+
});
|
219
|
+
};
|
220
|
+
extractAllLabels(children);
|
221
|
+
return allLabels;
|
222
|
+
}
|
223
|
+
return allLabels;
|
224
|
+
}
|
225
|
+
const selectedSet = new Set(selectionMode === 'multiple' && effectiveSelectedKeys !== 'all'
|
226
|
+
? (effectiveSelectedKeys || []).map((k) => normalizeKeyValue(k))
|
102
227
|
: effectiveSelectedKey != null
|
103
|
-
? [
|
228
|
+
? [normalizeKeyValue(effectiveSelectedKey)]
|
104
229
|
: []);
|
105
230
|
const labels = [];
|
106
|
-
const extractLabels = (nodes) => {
|
107
|
-
Children.forEach(nodes, (child) => {
|
108
|
-
if (!child || typeof child !== 'object')
|
109
|
-
return;
|
110
|
-
if (child.type === Item) {
|
111
|
-
if (selectedSet.has(String(child.key))) {
|
112
|
-
const label = child.props.textValue ||
|
113
|
-
(typeof child.props.children === 'string'
|
114
|
-
? child.props.children
|
115
|
-
: '') ||
|
116
|
-
String(child.props.children || '');
|
117
|
-
labels.push(label);
|
118
|
-
}
|
119
|
-
}
|
120
|
-
if (child.props?.children) {
|
121
|
-
extractLabels(child.props.children);
|
122
|
-
}
|
123
|
-
});
|
124
|
-
};
|
125
231
|
const processedKeys = new Set();
|
126
|
-
//
|
127
|
-
|
128
|
-
|
129
|
-
|
232
|
+
// Extract from items prop if available
|
233
|
+
if (items) {
|
234
|
+
const extractFromItems = (itemsArray) => {
|
235
|
+
itemsArray.forEach((item) => {
|
236
|
+
if (item && typeof item === 'object') {
|
237
|
+
const itemObj = item;
|
238
|
+
if (Array.isArray(itemObj.children)) {
|
239
|
+
// Section-like object
|
240
|
+
extractFromItems(itemObj.children);
|
241
|
+
}
|
242
|
+
else {
|
243
|
+
// Regular item - check if selected
|
244
|
+
const itemKey = itemObj.key || itemObj.id;
|
245
|
+
if (itemKey != null &&
|
246
|
+
selectedSet.has(normalizeKeyValue(itemKey))) {
|
247
|
+
const label = itemObj.textValue ||
|
248
|
+
itemObj.label ||
|
249
|
+
(typeof itemObj.children === 'string'
|
250
|
+
? itemObj.children
|
251
|
+
: '') ||
|
252
|
+
String(itemObj.children || itemKey);
|
253
|
+
labels.push(label);
|
254
|
+
processedKeys.add(normalizeKeyValue(itemKey));
|
255
|
+
}
|
256
|
+
}
|
257
|
+
}
|
258
|
+
});
|
259
|
+
};
|
260
|
+
const itemsArray = Array.isArray(items)
|
261
|
+
? items
|
262
|
+
: Array.from(items);
|
263
|
+
extractFromItems(itemsArray);
|
264
|
+
}
|
265
|
+
// Extract from children if available (for mixed mode or fallback)
|
266
|
+
if (children) {
|
267
|
+
const extractLabelsWithTracking = (nodes) => {
|
268
|
+
if (!nodes)
|
130
269
|
return;
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
270
|
+
Children.forEach(nodes, (child) => {
|
271
|
+
if (!child || typeof child !== 'object')
|
272
|
+
return;
|
273
|
+
const element = child;
|
274
|
+
if (element.type === Item) {
|
275
|
+
const childKey = String(element.key);
|
276
|
+
if (selectedSet.has(normalizeKeyValue(childKey))) {
|
277
|
+
const label = element.props.textValue ||
|
278
|
+
(typeof element.props.children === 'string'
|
279
|
+
? element.props.children
|
280
|
+
: '') ||
|
281
|
+
String(element.props.children || '');
|
282
|
+
labels.push(label);
|
283
|
+
processedKeys.add(normalizeKeyValue(childKey));
|
284
|
+
}
|
141
285
|
}
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
}
|
146
|
-
}
|
147
|
-
|
148
|
-
|
149
|
-
// Handle custom values that don't have corresponding children
|
150
|
-
const selectedKeysArr = selectionMode === 'multiple'
|
286
|
+
if (element.props?.children) {
|
287
|
+
extractLabelsWithTracking(element.props.children);
|
288
|
+
}
|
289
|
+
});
|
290
|
+
};
|
291
|
+
extractLabelsWithTracking(children);
|
292
|
+
}
|
293
|
+
// Handle custom values that don't have corresponding items/children
|
294
|
+
const selectedKeysArr = selectionMode === 'multiple' && effectiveSelectedKeys !== 'all'
|
151
295
|
? (effectiveSelectedKeys || []).map(String)
|
152
296
|
: effectiveSelectedKey != null
|
153
297
|
? [String(effectiveSelectedKey)]
|
154
298
|
: [];
|
155
299
|
// Add labels for any selected keys that weren't processed (custom values)
|
156
300
|
selectedKeysArr.forEach((key) => {
|
157
|
-
if (!processedKeys.has(key)) {
|
301
|
+
if (!processedKeys.has(normalizeKeyValue(key))) {
|
158
302
|
// This is a custom value, use the key as the label
|
159
303
|
labels.push(key);
|
160
304
|
}
|
@@ -165,29 +309,36 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
165
309
|
const hasSelection = selectedLabels.length > 0;
|
166
310
|
// Always keep the latest selection in a ref (with normalized keys) so that we can read it synchronously in the popover close effect.
|
167
311
|
const latestSelectionRef = useRef({
|
168
|
-
single: effectiveSelectedKey != null
|
169
|
-
|
170
|
-
|
171
|
-
|
312
|
+
single: effectiveSelectedKey != null ? String(effectiveSelectedKey) : null,
|
313
|
+
multiple: effectiveSelectedKeys === 'all'
|
314
|
+
? 'all'
|
315
|
+
: (effectiveSelectedKeys ?? []).map(String),
|
172
316
|
});
|
173
317
|
useEffect(() => {
|
174
318
|
latestSelectionRef.current = {
|
175
|
-
single: effectiveSelectedKey != null
|
176
|
-
|
177
|
-
|
178
|
-
|
319
|
+
single: effectiveSelectedKey != null ? String(effectiveSelectedKey) : null,
|
320
|
+
multiple: effectiveSelectedKeys === 'all'
|
321
|
+
? 'all'
|
322
|
+
: (effectiveSelectedKeys ?? []).map(String),
|
179
323
|
};
|
180
324
|
}, [effectiveSelectedKey, effectiveSelectedKeys]);
|
181
325
|
const selectionsWhenClosed = useRef({ single: null, multiple: [] });
|
326
|
+
// Capture the initial selection (from defaultSelectedKey(s)) so that
|
327
|
+
// the very first popover open can already use it for sorting.
|
328
|
+
useEffect(() => {
|
329
|
+
selectionsWhenClosed.current = { ...latestSelectionRef.current };
|
330
|
+
}, []); // run only once on mount
|
182
331
|
// Function to sort children with selected items on top
|
183
332
|
const getSortedChildren = useCallback(() => {
|
184
|
-
|
333
|
+
// If children is not provided or is a render function, return it as-is
|
334
|
+
if (!children || typeof children === 'function')
|
185
335
|
return children;
|
186
|
-
// When the popover is **closed
|
187
|
-
//
|
188
|
-
//
|
189
|
-
|
190
|
-
|
336
|
+
// When the popover is **closed**, reuse the cached order if we have it to
|
337
|
+
// avoid unnecessary reflows. If we don't have a cache yet (first open),
|
338
|
+
// fall through to compute the sorted order so the very first render is
|
339
|
+
// already correct.
|
340
|
+
if (!isPopoverOpen && cachedChildrenOrder.current) {
|
341
|
+
return cachedChildrenOrder.current;
|
191
342
|
}
|
192
343
|
// Popover is open – compute (or recompute) the sorted order for this
|
193
344
|
// session.
|
@@ -209,11 +360,17 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
209
360
|
// Create selected keys set for fast lookup
|
210
361
|
const selectedSet = new Set();
|
211
362
|
if (selectionMode === 'multiple') {
|
212
|
-
selectionsWhenClosed.current.multiple
|
363
|
+
if (selectionsWhenClosed.current.multiple === 'all') {
|
364
|
+
// Don't sort when "all" is selected, just return original children
|
365
|
+
return children;
|
366
|
+
}
|
367
|
+
else {
|
368
|
+
selectionsWhenClosed.current.multiple.forEach((key) => selectedSet.add(String(key)));
|
369
|
+
}
|
213
370
|
}
|
214
371
|
else if (selectionMode === 'single' &&
|
215
372
|
selectionsWhenClosed.current.single != null) {
|
216
|
-
selectedSet.add(
|
373
|
+
selectedSet.add(String(selectionsWhenClosed.current.single));
|
217
374
|
}
|
218
375
|
// Helper function to check if an item is selected
|
219
376
|
const isItemSelected = (child) => {
|
@@ -222,7 +379,7 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
222
379
|
// Helper function to sort children array
|
223
380
|
const sortChildrenArray = (childrenArray) => {
|
224
381
|
const cloneWithNormalizedKey = (item) => cloneElement(item, {
|
225
|
-
key: normalizeKeyValue(item.key),
|
382
|
+
key: item.key ? normalizeKeyValue(item.key) : undefined,
|
226
383
|
});
|
227
384
|
const selected = [];
|
228
385
|
const unselected = [];
|
@@ -231,25 +388,30 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
231
388
|
unselected.push(child);
|
232
389
|
return;
|
233
390
|
}
|
391
|
+
const element = child;
|
234
392
|
// Handle sections - sort items within each section
|
235
|
-
if (
|
236
|
-
|
237
|
-
const sectionChildren = Array.isArray(
|
238
|
-
?
|
239
|
-
: [
|
393
|
+
if (element.type === BaseSection ||
|
394
|
+
element.type?.displayName === 'Section') {
|
395
|
+
const sectionChildren = Array.isArray(element.props.children)
|
396
|
+
? element.props.children
|
397
|
+
: [element.props.children];
|
240
398
|
const selectedItems = [];
|
241
399
|
const unselectedItems = [];
|
242
400
|
sectionChildren.forEach((sectionChild) => {
|
243
|
-
if (sectionChild &&
|
244
|
-
|
245
|
-
(
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
401
|
+
if (sectionChild && typeof sectionChild === 'object') {
|
402
|
+
const sectionElement = sectionChild;
|
403
|
+
if (sectionElement.type === Item ||
|
404
|
+
sectionElement.type?.displayName === 'Item') {
|
405
|
+
const clonedItem = cloneWithNormalizedKey(sectionElement);
|
406
|
+
if (isItemSelected(sectionElement)) {
|
407
|
+
selectedItems.push(clonedItem);
|
408
|
+
}
|
409
|
+
else {
|
410
|
+
unselectedItems.push(clonedItem);
|
411
|
+
}
|
250
412
|
}
|
251
413
|
else {
|
252
|
-
unselectedItems.push(
|
414
|
+
unselectedItems.push(sectionChild);
|
253
415
|
}
|
254
416
|
}
|
255
417
|
else {
|
@@ -257,15 +419,15 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
257
419
|
}
|
258
420
|
});
|
259
421
|
// Create new section with sorted children, preserving React element properly
|
260
|
-
unselected.push(cloneElement(
|
261
|
-
...
|
422
|
+
unselected.push(cloneElement(element, {
|
423
|
+
...element.props,
|
262
424
|
children: [...selectedItems, ...unselectedItems],
|
263
425
|
}));
|
264
426
|
}
|
265
427
|
// Handle non-section elements (items, dividers, etc.)
|
266
428
|
else {
|
267
|
-
const clonedItem = cloneWithNormalizedKey(
|
268
|
-
if (isItemSelected(
|
429
|
+
const clonedItem = cloneWithNormalizedKey(element);
|
430
|
+
if (isItemSelected(element)) {
|
269
431
|
selected.push(clonedItem);
|
270
432
|
}
|
271
433
|
else {
|
@@ -278,8 +440,9 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
278
440
|
// Sort the children
|
279
441
|
const childrenArray = Children.toArray(children);
|
280
442
|
const sortedChildren = sortChildrenArray(childrenArray);
|
281
|
-
// Cache the sorted order when popover opens
|
282
|
-
|
443
|
+
// Cache the sorted order when popover opens or when we compute it for the
|
444
|
+
// first time before opening.
|
445
|
+
if (isPopoverOpen || !cachedChildrenOrder.current) {
|
283
446
|
cachedChildrenOrder.current = sortedChildren;
|
284
447
|
}
|
285
448
|
return sortedChildren;
|
@@ -290,8 +453,85 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
290
453
|
selectionMode,
|
291
454
|
isPopoverOpen,
|
292
455
|
]);
|
456
|
+
// Compute sorted items array when using `items` prop
|
457
|
+
const getSortedItems = useCallback(() => {
|
458
|
+
if (!items)
|
459
|
+
return items;
|
460
|
+
// Reuse cached order when popover is closed to avoid needless re-renders
|
461
|
+
if (!isPopoverOpen && cachedItemsOrder.current) {
|
462
|
+
return cachedItemsOrder.current;
|
463
|
+
}
|
464
|
+
const selectedSet = new Set();
|
465
|
+
const addSelected = (key) => {
|
466
|
+
if (key != null)
|
467
|
+
selectedSet.add(String(key));
|
468
|
+
};
|
469
|
+
if (selectionMode === 'multiple') {
|
470
|
+
if (selectionsWhenClosed.current.multiple === 'all') {
|
471
|
+
// Do not sort when all selected – keep original order
|
472
|
+
return items;
|
473
|
+
}
|
474
|
+
selectionsWhenClosed.current.multiple.forEach(addSelected);
|
475
|
+
}
|
476
|
+
else {
|
477
|
+
if (selectionsWhenClosed.current.single != null) {
|
478
|
+
addSelected(selectionsWhenClosed.current.single);
|
479
|
+
}
|
480
|
+
}
|
481
|
+
if (selectedSet.size === 0) {
|
482
|
+
return items;
|
483
|
+
}
|
484
|
+
// Helpers to extract key from item object
|
485
|
+
const getItemKey = (obj) => {
|
486
|
+
if (obj == null || typeof obj !== 'object')
|
487
|
+
return undefined;
|
488
|
+
const item = obj;
|
489
|
+
if (item.key != null)
|
490
|
+
return String(item.key);
|
491
|
+
if (item.id != null)
|
492
|
+
return String(item.id);
|
493
|
+
return undefined;
|
494
|
+
};
|
495
|
+
const sortArray = (arr) => {
|
496
|
+
const selectedArr = [];
|
497
|
+
const unselectedArr = [];
|
498
|
+
arr.forEach((obj) => {
|
499
|
+
const item = obj;
|
500
|
+
if (obj && Array.isArray(item.children)) {
|
501
|
+
// Section-like object – keep order, but sort its children
|
502
|
+
const sortedChildren = sortArray(item.children);
|
503
|
+
unselectedArr.push({ ...item, children: sortedChildren });
|
504
|
+
}
|
505
|
+
else {
|
506
|
+
const key = getItemKey(obj);
|
507
|
+
if (key && selectedSet.has(key)) {
|
508
|
+
selectedArr.push(obj);
|
509
|
+
}
|
510
|
+
else {
|
511
|
+
unselectedArr.push(obj);
|
512
|
+
}
|
513
|
+
}
|
514
|
+
});
|
515
|
+
return [...selectedArr, ...unselectedArr];
|
516
|
+
};
|
517
|
+
const itemsArray = Array.isArray(items)
|
518
|
+
? items
|
519
|
+
: Array.from(items);
|
520
|
+
const sorted = sortArray(itemsArray);
|
521
|
+
if (isPopoverOpen || !cachedItemsOrder.current) {
|
522
|
+
cachedItemsOrder.current = sorted;
|
523
|
+
}
|
524
|
+
return sorted;
|
525
|
+
}, [
|
526
|
+
items,
|
527
|
+
selectionMode,
|
528
|
+
isPopoverOpen,
|
529
|
+
selectionsWhenClosed.current.multiple,
|
530
|
+
selectionsWhenClosed.current.single,
|
531
|
+
]);
|
532
|
+
const finalItems = getSortedItems();
|
293
533
|
// FilterListBox handles custom values internally when allowsCustomValue={true}
|
294
|
-
// We
|
534
|
+
// We provide sorted children (if any) and sorted items
|
295
535
|
const finalChildren = getSortedChildren();
|
296
536
|
const renderTriggerContent = () => {
|
297
537
|
// When there is a selection and a custom summary renderer is provided – use it.
|
@@ -321,6 +561,9 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
321
561
|
else if (selectionMode === 'single') {
|
322
562
|
content = selectedLabels[0];
|
323
563
|
}
|
564
|
+
else if (effectiveSelectedKeys === 'all') {
|
565
|
+
content = selectAllLabel;
|
566
|
+
}
|
324
567
|
else {
|
325
568
|
content = selectedLabels.join(', ');
|
326
569
|
}
|
@@ -329,6 +572,7 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
329
572
|
}
|
330
573
|
return (_jsx(Text, { ellipsis: true, style: { opacity: hasSelection ? 1 : 'var(--disabled-opacity)' }, children: content }));
|
331
574
|
};
|
575
|
+
const [shouldUpdatePosition, setShouldUpdatePosition] = useState(false);
|
332
576
|
// The trigger is rendered as a function so we can access the dialog state
|
333
577
|
const renderTrigger = (state) => {
|
334
578
|
// Track popover open/close state to control sorting
|
@@ -352,64 +596,83 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
352
596
|
}
|
353
597
|
},
|
354
598
|
});
|
355
|
-
|
599
|
+
useEffect(() => {
|
600
|
+
// Disable the update of the position while the popover is open (with a delay) to avoid jumping
|
601
|
+
setShouldUpdatePosition(!state.isOpen);
|
602
|
+
}, [state.isOpen]);
|
603
|
+
return (_jsx(Button, { ref: triggerRef, "data-menu-trigger": true, type: type, theme: validationState === 'invalid' ? 'danger' : theme, size: size, isDisabled: isDisabled, isLoading: isLoading, mods: {
|
356
604
|
placeholder: !hasSelection,
|
357
605
|
selected: hasSelection,
|
358
606
|
...externalMods,
|
359
|
-
}, icon: icon, rightIcon: _jsx(DirectionIcon, { to: state.isOpen ? 'top' : 'bottom' }), styles: styles, ...
|
607
|
+
}, icon: icon, rightIcon: rightIcon !== undefined ? (rightIcon) : (_jsx(DirectionIcon, { to: state.isOpen ? 'top' : 'bottom' })), styles: styles, ...keyboardProps, "aria-label": `${props['aria-label'] ?? props.label ?? ''}`, children: renderTriggerContent() }));
|
360
608
|
};
|
361
|
-
const filterPickerField = (_jsxs(DialogTrigger, { type: "popover", placement: "bottom start", shouldFlip:
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
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);
|
609
|
+
const filterPickerField = (_jsx(FilterPickerWrapper, { qa: props.qa || 'FilterPicker', styles: styles, ...otherProps, children: _jsxs(DialogTrigger, { type: "popover", placement: "bottom start", styles: triggerStyles, shouldUpdatePosition: shouldUpdatePosition, shouldFlip: shouldFlip, isDismissable: true, children: [renderTrigger, (close) => (_jsx(Dialog, { display: "grid", styles: { gridRows: '1sf', ...popoverStyles }, children: _jsx(FocusScope, { restoreFocus: true, children: _jsx(FilterListBox, { autoFocus: true, items: items ? finalItems : undefined, "aria-label": `${props['aria-label'] ?? props.label ?? ''} Picker`, selectedKey: selectionMode === 'single' ? mappedSelectedKey : undefined, selectedKeys: selectionMode === 'multiple' ? mappedSelectedKeys : undefined, disabledKeys: disabledKeys, focusOnHover: focusOnHover, shouldFocusWrap: shouldFocusWrap, allowsCustomValue: allowsCustomValue, selectionMode: selectionMode, validationState: validationState, isDisabled: isDisabled, stateRef: listStateRef, isCheckable: isCheckable, mods: {
|
610
|
+
popover: true,
|
611
|
+
}, size: size === 'small' ? 'medium' : size, showSelectAll: showSelectAll, selectAllLabel: selectAllLabel, header: header, footer: footer, headerStyles: headerStyles, footerStyles: footerStyles, qa: `${props.qa || 'FilterPicker'}ListBox`, onEscape: () => close(), onOptionClick: (key) => {
|
612
|
+
// For FilterPicker, clicking the content area should close the popover
|
613
|
+
// in multiple selection mode (single mode already closes via onSelectionChange)
|
614
|
+
if ((selectionMode === 'multiple' && isCheckable) ||
|
615
|
+
key === '__ALL__') {
|
616
|
+
close();
|
375
617
|
}
|
376
|
-
}
|
377
|
-
|
378
|
-
if
|
379
|
-
|
380
|
-
if (
|
381
|
-
|
618
|
+
}, onSelectionChange: (selection) => {
|
619
|
+
// No need to change any flags - children order is cached
|
620
|
+
// Update internal state if uncontrolled
|
621
|
+
if (selectionMode === 'single') {
|
622
|
+
if (!isControlledSingle) {
|
623
|
+
setInternalSelectedKey(selection);
|
624
|
+
}
|
625
|
+
}
|
626
|
+
else {
|
627
|
+
if (!isControlledMultiple) {
|
628
|
+
let normalized = selection;
|
629
|
+
if (selection === 'all') {
|
630
|
+
normalized = 'all';
|
631
|
+
}
|
632
|
+
else if (Array.isArray(selection)) {
|
633
|
+
normalized = processSelectionArray(selection);
|
634
|
+
}
|
635
|
+
else if (selection &&
|
636
|
+
typeof selection === 'object' &&
|
637
|
+
selection instanceof Set) {
|
638
|
+
normalized = processSelectionArray(selection);
|
639
|
+
}
|
640
|
+
setInternalSelectedKeys(normalized);
|
641
|
+
}
|
642
|
+
}
|
643
|
+
// Update latest selection ref synchronously
|
644
|
+
if (selectionMode === 'single') {
|
645
|
+
latestSelectionRef.current.single =
|
646
|
+
selection != null ? String(selection) : null;
|
647
|
+
}
|
648
|
+
else {
|
649
|
+
if (selection === 'all') {
|
650
|
+
latestSelectionRef.current.multiple = 'all';
|
651
|
+
}
|
652
|
+
else if (Array.isArray(selection)) {
|
653
|
+
latestSelectionRef.current.multiple = Array.from(new Set(processSelectionArray(selection)));
|
382
654
|
}
|
383
655
|
else if (selection &&
|
384
656
|
typeof selection === 'object' &&
|
385
657
|
selection instanceof Set) {
|
386
|
-
|
658
|
+
latestSelectionRef.current.multiple = Array.from(new Set(processSelectionArray(selection)));
|
659
|
+
}
|
660
|
+
else {
|
661
|
+
latestSelectionRef.current.multiple =
|
662
|
+
selection === 'all'
|
663
|
+
? 'all'
|
664
|
+
: Array.isArray(selection)
|
665
|
+
? selection.map(String)
|
666
|
+
: [];
|
387
667
|
}
|
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
668
|
}
|
404
|
-
|
405
|
-
|
669
|
+
onSelectionChange?.(selection);
|
670
|
+
if (selectionMode === 'single') {
|
671
|
+
close();
|
406
672
|
}
|
407
|
-
}
|
408
|
-
|
409
|
-
|
410
|
-
close();
|
411
|
-
}
|
412
|
-
}, children: finalChildren }) }) }))] }));
|
673
|
+
}, children: (children
|
674
|
+
? finalChildren
|
675
|
+
: undefined) }) }) }))] }) }));
|
413
676
|
return wrapWithField(filterPickerField, ref, mergeProps({
|
414
677
|
...props,
|
415
678
|
styles: undefined,
|