@cube-dev/ui-kit 0.81.0 → 0.82.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 +12 -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/Item.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 +1 -1
- 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/ItemAction/ItemAction.js +7 -2
- package/es/components/actions/ItemAction/index.js +1 -1
- package/es/components/actions/ItemButton/ItemButton.js +1 -1
- package/es/components/actions/ItemButton/index.js +1 -1
- package/es/components/actions/Link/Link.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/SubMenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubmenuTriggerContext.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 +1 -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/ItemBase/ItemBase.js +1 -1
- package/es/components/content/ItemBase/index.js +1 -1
- package/es/components/content/List/SectionHeading.js +1 -1
- package/es/components/content/List/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 +796 -180
- package/es/components/fields/ComboBox/index.js +2 -2
- 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 +47 -47
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +93 -315
- 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/LegacyComboBox/LegacyComboBox.js +290 -0
- package/es/components/fields/LegacyComboBox/index.js +10 -0
- package/es/components/fields/ListBox/ListBox.js +35 -5
- 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 +72 -53
- 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 +2 -2
- package/es/components/fields/TextInputMapper/index.js +1 -1
- package/es/components/fields/index.js +2 -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/helpers/DisplayTransition/DisplayTransition.js +242 -0
- package/es/components/helpers/index.js +10 -0
- 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/organisms/FileTabs/FileTabs.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 +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/NotificationsDialogContext.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 +30 -18
- package/es/components/overlays/Tooltip/TooltipProvider.js +2 -2
- package/es/components/overlays/Tooltip/TooltipTrigger.js +25 -7
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +1 -1
- package/es/components/portal/Portal.js +5 -2
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/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/item-themes.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/ChartHeatmapIcon.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/CubePauseIcon.js +1 -1
- package/es/icons/CubePlayIcon.js +1 -1
- package/es/icons/CurrencyDollarIcon.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/DecimalDecreaseIcon.js +1 -1
- package/es/icons/DecimalIncreaseIcon.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/Number123Icon.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/PercentageIcon.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 +2 -1
- package/es/provider.js +1 -1
- package/es/providers/TrackingProvider.js +1 -1
- package/es/providers/navigation.types.js +1 -1
- package/es/providers/navigationAdapter.default.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/debug.js +1 -1
- package/es/tasty/index.js +1 -1
- package/es/tasty/injector/index.js +1 -1
- package/es/tasty/injector/injector.js +1 -1
- package/es/tasty/injector/sheet-manager.js +1 -1
- package/es/tasty/injector/types.js +1 -1
- package/es/tasty/parser/classify.js +1 -1
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +1 -1
- package/es/tasty/parser/parser.js +1 -1
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.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/outline.js +1 -1
- package/es/tasty/styles/padding.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/isDevEnv.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/forwardRefWithGenerics.js +1 -1
- package/es/utils/react/index.js +2 -2
- 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 +11 -6
- 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/GridProvider.d.ts +1 -1
- package/types/components/fields/ComboBox/ComboBox.d.ts +101 -30
- package/types/components/fields/ComboBox/index.d.ts +2 -1
- package/types/components/fields/FilterListBox/FilterListBox.d.ts +7 -0
- package/types/components/fields/FilterPicker/FilterPicker.d.ts +9 -2
- package/types/components/fields/LegacyComboBox/LegacyComboBox.d.ts +49 -0
- package/types/components/fields/LegacyComboBox/index.d.ts +1 -0
- package/types/components/fields/ListBox/ListBox.d.ts +5 -0
- package/types/components/fields/Select/Select.d.ts +3 -1
- package/types/components/fields/index.d.ts +1 -0
- package/types/components/helpers/DisplayTransition/DisplayTransition.d.ts +24 -0
- package/types/components/helpers/index.d.ts +1 -0
- package/types/components/layout/Prefix.d.ts +1 -1
- package/types/components/layout/Suffix.d.ts +1 -1
- package/types/components/overlays/Tooltip/TooltipTrigger.d.ts +5 -0
- package/types/components/overlays/Tooltip/context.d.ts +6 -1
- package/types/components/portal/Portal.d.ts +1 -1
- package/types/index.d.ts +2 -0
- package/types/utils/react/index.d.ts +1 -1
- package/types/utils/react/useCombinedRefs.d.ts +3 -2
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.82.0
|
|
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 {
|
|
9
|
+
import { forwardRef, useCallback, useEffect, useId, useMemo, useRef, useState, } from 'react';
|
|
10
10
|
import { FocusScope, useKeyboard } from 'react-aria';
|
|
11
|
-
import { Section as BaseSection,
|
|
11
|
+
import { Section as BaseSection, useListState } from 'react-stately';
|
|
12
12
|
import { useEvent } from '../../../_internal';
|
|
13
13
|
import { useWarn } from '../../../_internal/hooks/use-warn';
|
|
14
14
|
import { CloseIcon, DirectionIcon, LoadingIcon } from '../../../icons';
|
|
@@ -63,8 +63,15 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
63
63
|
return fieldProps;
|
|
64
64
|
},
|
|
65
65
|
});
|
|
66
|
-
let { qa, label, extra, icon, rightIcon, prefix, suffix, hotkeys, triggerTooltip, triggerDescription, labelStyles, isRequired, necessityIndicator, validationState, isDisabled, isLoading, message, mods: externalMods, description, descriptionPlacement, 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, allValueProps, customValueProps, newCustomValueProps, searchPlaceholder, autoFocus, filter, emptyLabel, searchInputStyles, searchInputRef, listStyles, optionStyles, sectionStyles, headingStyles, listRef, disallowEmptySelection, shouldUseVirtualFocus, onEscape, onOptionClick, isClearable, searchValue, onSearchChange, ...otherProps } = props;
|
|
66
|
+
let { qa, label, extra, id, icon, rightIcon, prefix, suffix, hotkeys, triggerTooltip, triggerDescription, labelStyles, isRequired, necessityIndicator, validationState, isDisabled, isLoading, message, mods: externalMods, description, descriptionPlacement, 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, allValueProps, customValueProps, newCustomValueProps, searchPlaceholder, autoFocus, filter, emptyLabel, searchInputStyles, searchInputRef, listStyles, optionStyles, sectionStyles, headingStyles, listRef, disallowEmptySelection, shouldUseVirtualFocus, onEscape, onOptionClick, isClearable, searchValue, onSearchChange, sortSelectedToTop: sortSelectedToTopProp, ...otherProps } = props;
|
|
67
|
+
// Track if sortSelectedToTop was explicitly provided
|
|
68
|
+
const sortSelectedToTopExplicit = sortSelectedToTopProp !== undefined;
|
|
69
|
+
// Default to true if items are provided, false otherwise
|
|
70
|
+
const sortSelectedToTop = sortSelectedToTopProp ?? (items ? true : false);
|
|
67
71
|
styles = extractStyles(otherProps, PROP_STYLES, styles);
|
|
72
|
+
// Generate ID for label-trigger linking if not provided
|
|
73
|
+
const generatedId = useId();
|
|
74
|
+
const triggerId = id || generatedId;
|
|
68
75
|
// Generate a unique ID for this FilterPicker instance
|
|
69
76
|
const filterPickerId = useMemo(() => generateRandomId(), []);
|
|
70
77
|
// Get event bus for menu synchronization
|
|
@@ -81,7 +88,6 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
81
88
|
const [internalSelectedKeys, setInternalSelectedKeys] = useState(defaultSelectedKeys ?? []);
|
|
82
89
|
// Track popover open/close and capture children order for session
|
|
83
90
|
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
|
84
|
-
const cachedChildrenOrder = useRef(null);
|
|
85
91
|
// Cache for sorted items array when using `items` prop
|
|
86
92
|
const cachedItemsOrder = useRef(null);
|
|
87
93
|
const triggerRef = useRef(null);
|
|
@@ -92,9 +98,6 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
92
98
|
// session (which caused only the previously selected options to be rendered
|
|
93
99
|
// or the list to appear unsorted).
|
|
94
100
|
// ---------------------------------------------------------------------------
|
|
95
|
-
useEffect(() => {
|
|
96
|
-
cachedChildrenOrder.current = null;
|
|
97
|
-
}, [children]);
|
|
98
101
|
useEffect(() => {
|
|
99
102
|
cachedItemsOrder.current = null;
|
|
100
103
|
}, [items]);
|
|
@@ -106,73 +109,47 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
106
109
|
const effectiveSelectedKeys = isControlledMultiple
|
|
107
110
|
? selectedKeys
|
|
108
111
|
: internalSelectedKeys;
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
// so that callers work with the original key values supplied by the user.
|
|
117
|
-
let str = String(key);
|
|
118
|
-
// Remove React array/object key prefixes (".$" or ".") if present.
|
|
119
|
-
if (str.startsWith('.$')) {
|
|
120
|
-
str = str.slice(2);
|
|
121
|
-
}
|
|
122
|
-
else if (str.startsWith('.')) {
|
|
123
|
-
str = str.slice(1);
|
|
124
|
-
}
|
|
125
|
-
// Un-escape React's internal key encodings.
|
|
126
|
-
return str.replace(/=2/g, ':').replace(/=0/g, '=');
|
|
127
|
-
};
|
|
112
|
+
// Create a local collection for label extraction only (not for rendering)
|
|
113
|
+
// This gives us immediate access to textValue without waiting for FilterListBox
|
|
114
|
+
const localCollectionState = useListState({
|
|
115
|
+
children: children,
|
|
116
|
+
items: items,
|
|
117
|
+
selectionMode: 'none', // We don't need selection management
|
|
118
|
+
});
|
|
128
119
|
// ---------------------------------------------------------------------------
|
|
129
|
-
// Map
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
// that the key we pass to ListBox exactly matches the keys it receives from
|
|
133
|
-
// React Aria, so the initial selection is highlighted correctly.
|
|
120
|
+
// Map user-provided keys to collection keys using the local collection.
|
|
121
|
+
// The collection handles key normalization internally, so we use direct
|
|
122
|
+
// string comparison.
|
|
134
123
|
// ---------------------------------------------------------------------------
|
|
135
|
-
const
|
|
124
|
+
const findCollectionKey = useCallback((lookup) => {
|
|
136
125
|
if (lookup == null)
|
|
137
126
|
return lookup;
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
foundKey = element.key;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (element.props &&
|
|
151
|
-
typeof element.props === 'object' &&
|
|
152
|
-
'children' in element.props) {
|
|
153
|
-
traverse(element.props.children);
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
};
|
|
157
|
-
if (children)
|
|
158
|
-
traverse(children);
|
|
159
|
-
return foundKey;
|
|
160
|
-
}, [children]);
|
|
127
|
+
// Direct comparison - collection handles normalization internally
|
|
128
|
+
for (const item of localCollectionState.collection) {
|
|
129
|
+
if (String(item.key) === String(lookup)) {
|
|
130
|
+
return item.key;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Fallback: return the lookup key as-is
|
|
134
|
+
return lookup;
|
|
135
|
+
}, [localCollectionState.collection]);
|
|
161
136
|
const mappedSelectedKey = useMemo(() => {
|
|
162
137
|
if (selectionMode !== 'single')
|
|
163
138
|
return null;
|
|
164
|
-
return effectiveSelectedKey
|
|
165
|
-
|
|
139
|
+
return effectiveSelectedKey
|
|
140
|
+
? findCollectionKey(effectiveSelectedKey)
|
|
141
|
+
: null;
|
|
142
|
+
}, [selectionMode, effectiveSelectedKey, findCollectionKey]);
|
|
166
143
|
const mappedSelectedKeys = useMemo(() => {
|
|
167
144
|
if (selectionMode !== 'multiple')
|
|
168
145
|
return undefined;
|
|
169
146
|
if (effectiveSelectedKeys === 'all')
|
|
170
147
|
return 'all';
|
|
171
148
|
if (Array.isArray(effectiveSelectedKeys)) {
|
|
172
|
-
return effectiveSelectedKeys.map((k) =>
|
|
149
|
+
return effectiveSelectedKeys.map((k) => findCollectionKey(k));
|
|
173
150
|
}
|
|
174
151
|
return effectiveSelectedKeys;
|
|
175
|
-
}, [selectionMode, effectiveSelectedKeys,
|
|
152
|
+
}, [selectionMode, effectiveSelectedKeys, findCollectionKey]);
|
|
176
153
|
// Given an iterable of keys (array or Set) toggle membership for duplicates
|
|
177
154
|
const processSelectionArray = (iterable) => {
|
|
178
155
|
const resultSet = new Set();
|
|
@@ -187,149 +164,53 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
187
164
|
}
|
|
188
165
|
return Array.from(resultSet);
|
|
189
166
|
};
|
|
190
|
-
// Helper to get selected item labels for display
|
|
167
|
+
// Helper to get selected item labels for display using local collection
|
|
191
168
|
const getSelectedLabels = () => {
|
|
192
|
-
|
|
193
|
-
|
|
169
|
+
const collection = localCollectionState.collection;
|
|
170
|
+
// Helper to recursively collect all item labels from collection (including nested in sections)
|
|
171
|
+
const collectAllLabels = () => {
|
|
194
172
|
const allLabels = [];
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
// Regular item - extract label
|
|
207
|
-
const label = itemObj.textValue ||
|
|
208
|
-
itemObj.label ||
|
|
209
|
-
(typeof itemObj.children === 'string'
|
|
210
|
-
? itemObj.children
|
|
211
|
-
: '') ||
|
|
212
|
-
String(itemObj.children ||
|
|
213
|
-
itemObj.key ||
|
|
214
|
-
itemObj.id ||
|
|
215
|
-
item);
|
|
216
|
-
allLabels.push(label);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
});
|
|
220
|
-
};
|
|
221
|
-
const itemsArray = Array.isArray(items)
|
|
222
|
-
? items
|
|
223
|
-
: Array.from(items);
|
|
224
|
-
extractFromItems(itemsArray);
|
|
225
|
-
return allLabels;
|
|
226
|
-
}
|
|
227
|
-
// Extract from children if available
|
|
228
|
-
if (children) {
|
|
229
|
-
const extractAllLabels = (nodes) => {
|
|
230
|
-
if (!nodes)
|
|
231
|
-
return;
|
|
232
|
-
Children.forEach(nodes, (child) => {
|
|
233
|
-
if (!child || typeof child !== 'object')
|
|
234
|
-
return;
|
|
235
|
-
const element = child;
|
|
236
|
-
if (element.type === ReactAriaItem) {
|
|
237
|
-
const props = element.props;
|
|
238
|
-
const label = props.textValue ||
|
|
239
|
-
(typeof props.children === 'string' ? props.children : '') ||
|
|
240
|
-
String(props.children || '');
|
|
241
|
-
allLabels.push(label);
|
|
242
|
-
}
|
|
243
|
-
if (element.props &&
|
|
244
|
-
typeof element.props === 'object' &&
|
|
245
|
-
'children' in element.props) {
|
|
246
|
-
extractAllLabels(element.props.children);
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
};
|
|
250
|
-
extractAllLabels(children);
|
|
251
|
-
return allLabels;
|
|
252
|
-
}
|
|
173
|
+
const traverse = (nodes) => {
|
|
174
|
+
for (const node of nodes) {
|
|
175
|
+
if (node.type === 'item') {
|
|
176
|
+
allLabels.push(node.textValue || String(node.key));
|
|
177
|
+
}
|
|
178
|
+
else if (node.childNodes) {
|
|
179
|
+
traverse(node.childNodes);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
traverse(collection);
|
|
253
184
|
return allLabels;
|
|
185
|
+
};
|
|
186
|
+
// Handle "all" selection - return all available labels
|
|
187
|
+
if (selectionMode === 'multiple' && effectiveSelectedKeys === 'all') {
|
|
188
|
+
return collectAllLabels();
|
|
254
189
|
}
|
|
255
190
|
const selectedSet = new Set(selectionMode === 'multiple' && effectiveSelectedKeys !== 'all'
|
|
256
|
-
? (effectiveSelectedKeys || []).map((k) =>
|
|
191
|
+
? (effectiveSelectedKeys || []).map((k) => String(k))
|
|
257
192
|
: effectiveSelectedKey != null
|
|
258
|
-
? [
|
|
193
|
+
? [String(effectiveSelectedKey)]
|
|
259
194
|
: []);
|
|
260
195
|
const labels = [];
|
|
261
196
|
const processedKeys = new Set();
|
|
262
|
-
//
|
|
263
|
-
|
|
264
|
-
const
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
// Regular item - check if selected
|
|
274
|
-
const itemKey = itemObj.key || itemObj.id;
|
|
275
|
-
if (itemKey != null &&
|
|
276
|
-
selectedSet.has(normalizeKeyValue(itemKey))) {
|
|
277
|
-
const label = itemObj.textValue ||
|
|
278
|
-
itemObj.label ||
|
|
279
|
-
(typeof itemObj.children === 'string'
|
|
280
|
-
? itemObj.children
|
|
281
|
-
: '') ||
|
|
282
|
-
String(itemObj.children || itemKey);
|
|
283
|
-
labels.push(label);
|
|
284
|
-
processedKeys.add(normalizeKeyValue(itemKey));
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
};
|
|
290
|
-
const itemsArray = Array.isArray(items)
|
|
291
|
-
? items
|
|
292
|
-
: Array.from(items);
|
|
293
|
-
extractFromItems(itemsArray);
|
|
294
|
-
}
|
|
295
|
-
// Extract from children if available (for mixed mode or fallback)
|
|
296
|
-
if (children) {
|
|
297
|
-
const extractLabelsWithTracking = (nodes) => {
|
|
298
|
-
if (!nodes)
|
|
299
|
-
return;
|
|
300
|
-
Children.forEach(nodes, (child) => {
|
|
301
|
-
if (!child || typeof child !== 'object')
|
|
302
|
-
return;
|
|
303
|
-
const element = child;
|
|
304
|
-
if (element.type === ReactAriaItem) {
|
|
305
|
-
const childKey = String(element.key);
|
|
306
|
-
if (selectedSet.has(normalizeKeyValue(childKey))) {
|
|
307
|
-
const props = element.props;
|
|
308
|
-
const label = props.textValue ||
|
|
309
|
-
(typeof props.children === 'string' ? props.children : '') ||
|
|
310
|
-
String(props.children || '');
|
|
311
|
-
labels.push(label);
|
|
312
|
-
processedKeys.add(normalizeKeyValue(childKey));
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
if (element.props &&
|
|
316
|
-
typeof element.props === 'object' &&
|
|
317
|
-
'children' in element.props) {
|
|
318
|
-
extractLabelsWithTracking(element.props.children);
|
|
319
|
-
}
|
|
320
|
-
});
|
|
321
|
-
};
|
|
322
|
-
extractLabelsWithTracking(children);
|
|
323
|
-
}
|
|
324
|
-
// Handle custom values that don't have corresponding items/children
|
|
197
|
+
// Use collection.getItem() to directly retrieve items by key (works with sections)
|
|
198
|
+
selectedSet.forEach((key) => {
|
|
199
|
+
const item = collection.getItem(key);
|
|
200
|
+
if (item) {
|
|
201
|
+
labels.push(item.textValue || String(item.key));
|
|
202
|
+
processedKeys.add(String(item.key));
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
// Handle custom values that aren't in the collection
|
|
325
206
|
const selectedKeysArr = selectionMode === 'multiple' && effectiveSelectedKeys !== 'all'
|
|
326
207
|
? (effectiveSelectedKeys || []).map(String)
|
|
327
208
|
: effectiveSelectedKey != null
|
|
328
209
|
? [String(effectiveSelectedKey)]
|
|
329
210
|
: [];
|
|
330
|
-
// Add labels for any selected keys that weren't
|
|
211
|
+
// Add labels for any selected keys that weren't found in collection (custom values)
|
|
331
212
|
selectedKeysArr.forEach((key) => {
|
|
332
|
-
if (!processedKeys.has(
|
|
213
|
+
if (!processedKeys.has(String(key))) {
|
|
333
214
|
// This is a custom value, use the key as the label
|
|
334
215
|
labels.push(key);
|
|
335
216
|
}
|
|
@@ -361,133 +242,22 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
361
242
|
}, []); // run only once on mount
|
|
362
243
|
// Function to sort children with selected items on top
|
|
363
244
|
const getSortedChildren = useCallback(() => {
|
|
364
|
-
//
|
|
365
|
-
if (
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
// order once per pop-over opening session. The cache is cleared when the
|
|
369
|
-
// pop-over closes so the next opening can recompute.
|
|
370
|
-
if (cachedChildrenOrder.current) {
|
|
371
|
-
return cachedChildrenOrder.current;
|
|
372
|
-
}
|
|
373
|
-
// Popover is open – compute (or recompute) the sorted order for this
|
|
374
|
-
// session.
|
|
375
|
-
// Determine if there were any selections when the popover was previously closed.
|
|
376
|
-
const hadSelectionsWhenClosed = selectionMode === 'multiple'
|
|
377
|
-
? selectionsWhenClosed.current.multiple.length > 0
|
|
378
|
-
: selectionsWhenClosed.current.single !== null;
|
|
379
|
-
// Only apply sorting when there were selections in the previous session.
|
|
380
|
-
// We intentionally do not depend on the `isPopoverOpen` flag here because that
|
|
381
|
-
// flag is updated **after** the first render triggered by clicking the
|
|
382
|
-
// trigger button. Relying on it caused a timing issue where the very first
|
|
383
|
-
// render of a freshly-opened popover was unsorted. By removing the
|
|
384
|
-
// `isPopoverOpen` check we ensure items are already sorted during that first
|
|
385
|
-
// render while still maintaining stable order within an open popover thanks
|
|
386
|
-
// to the `cachedChildrenOrder` guard above.
|
|
387
|
-
if (!hadSelectionsWhenClosed) {
|
|
388
|
-
return children;
|
|
245
|
+
// Warn if sorting is explicitly requested but not supported
|
|
246
|
+
if (sortSelectedToTopExplicit && sortSelectedToTop && !items) {
|
|
247
|
+
console.warn('FilterPicker: sortSelectedToTop only works with the items prop. ' +
|
|
248
|
+
'Sorting will be skipped when using JSX children.');
|
|
389
249
|
}
|
|
390
|
-
//
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
if (selectionsWhenClosed.current.multiple === 'all') {
|
|
394
|
-
// Don't sort when "all" is selected, just return original children
|
|
395
|
-
return children;
|
|
396
|
-
}
|
|
397
|
-
else {
|
|
398
|
-
selectionsWhenClosed.current.multiple.forEach((key) => selectedSet.add(String(key)));
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
else if (selectionMode === 'single' &&
|
|
402
|
-
selectionsWhenClosed.current.single != null) {
|
|
403
|
-
selectedSet.add(String(selectionsWhenClosed.current.single));
|
|
404
|
-
}
|
|
405
|
-
// Helper function to check if an item is selected
|
|
406
|
-
const isItemSelected = (child) => {
|
|
407
|
-
return (child?.key != null && selectedSet.has(normalizeKeyValue(child.key)));
|
|
408
|
-
};
|
|
409
|
-
// Helper function to sort children array
|
|
410
|
-
const sortChildrenArray = (childrenArray) => {
|
|
411
|
-
const cloneWithNormalizedKey = (item) => cloneElement(item, {
|
|
412
|
-
key: item.key ? normalizeKeyValue(item.key) : undefined,
|
|
413
|
-
});
|
|
414
|
-
const selected = [];
|
|
415
|
-
const unselected = [];
|
|
416
|
-
childrenArray.forEach((child) => {
|
|
417
|
-
if (!child || typeof child !== 'object') {
|
|
418
|
-
unselected.push(child);
|
|
419
|
-
return;
|
|
420
|
-
}
|
|
421
|
-
const element = child;
|
|
422
|
-
// Handle sections - sort items within each section
|
|
423
|
-
if (element.type === BaseSection ||
|
|
424
|
-
element.type?.displayName === 'Section') {
|
|
425
|
-
const props = element.props;
|
|
426
|
-
const sectionChildren = Array.isArray(props.children)
|
|
427
|
-
? props.children
|
|
428
|
-
: [props.children];
|
|
429
|
-
const selectedItems = [];
|
|
430
|
-
const unselectedItems = [];
|
|
431
|
-
sectionChildren.forEach((sectionChild) => {
|
|
432
|
-
if (sectionChild && typeof sectionChild === 'object') {
|
|
433
|
-
const sectionElement = sectionChild;
|
|
434
|
-
if (sectionElement.type === ReactAriaItem ||
|
|
435
|
-
sectionElement.type?.displayName === 'Item') {
|
|
436
|
-
const clonedItem = cloneWithNormalizedKey(sectionElement);
|
|
437
|
-
if (isItemSelected(sectionElement)) {
|
|
438
|
-
selectedItems.push(clonedItem);
|
|
439
|
-
}
|
|
440
|
-
else {
|
|
441
|
-
unselectedItems.push(clonedItem);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
unselectedItems.push(sectionChild);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
449
|
-
unselectedItems.push(sectionChild);
|
|
450
|
-
}
|
|
451
|
-
});
|
|
452
|
-
// Create new section with sorted children, preserving React element properly
|
|
453
|
-
unselected.push(cloneElement(element, {
|
|
454
|
-
...element.props,
|
|
455
|
-
children: [...selectedItems, ...unselectedItems],
|
|
456
|
-
}));
|
|
457
|
-
}
|
|
458
|
-
// Handle non-section elements (items, dividers, etc.)
|
|
459
|
-
else {
|
|
460
|
-
const clonedItem = cloneWithNormalizedKey(element);
|
|
461
|
-
if (isItemSelected(element)) {
|
|
462
|
-
selected.push(clonedItem);
|
|
463
|
-
}
|
|
464
|
-
else {
|
|
465
|
-
unselected.push(clonedItem);
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
});
|
|
469
|
-
return [...selected, ...unselected];
|
|
470
|
-
};
|
|
471
|
-
// Sort the children
|
|
472
|
-
const childrenArray = Children.toArray(children);
|
|
473
|
-
const sortedChildren = sortChildrenArray(childrenArray);
|
|
474
|
-
// Cache the sorted order when popover opens or when we compute it for the
|
|
475
|
-
// first time before opening.
|
|
476
|
-
if (isPopoverOpen || !cachedChildrenOrder.current) {
|
|
477
|
-
cachedChildrenOrder.current = sortedChildren;
|
|
478
|
-
}
|
|
479
|
-
return sortedChildren;
|
|
480
|
-
}, [
|
|
481
|
-
children,
|
|
482
|
-
effectiveSelectedKeys,
|
|
483
|
-
effectiveSelectedKey,
|
|
484
|
-
selectionMode,
|
|
485
|
-
isPopoverOpen,
|
|
486
|
-
]);
|
|
250
|
+
// Return children as-is (no sorting for JSX children)
|
|
251
|
+
return children;
|
|
252
|
+
}, [children, sortSelectedToTop, sortSelectedToTopExplicit, items]);
|
|
487
253
|
// Compute sorted items array when using `items` prop
|
|
488
254
|
const getSortedItems = useCallback(() => {
|
|
489
255
|
if (!items)
|
|
490
256
|
return items;
|
|
257
|
+
// Only sort if explicitly enabled
|
|
258
|
+
if (!sortSelectedToTop) {
|
|
259
|
+
return items;
|
|
260
|
+
}
|
|
491
261
|
// Reuse the cached order if we have it. We only compute the sorted array
|
|
492
262
|
// once when the pop-over is opened. Cache is cleared on close.
|
|
493
263
|
if (cachedItemsOrder.current) {
|
|
@@ -556,6 +326,7 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
556
326
|
return sorted;
|
|
557
327
|
}, [
|
|
558
328
|
items,
|
|
329
|
+
sortSelectedToTop,
|
|
559
330
|
selectionMode,
|
|
560
331
|
isPopoverOpen,
|
|
561
332
|
selectionsWhenClosed.current.multiple,
|
|
@@ -631,7 +402,6 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
631
402
|
// Popover just closed – record the latest selection for the next opening
|
|
632
403
|
// and clear the cached order so the next session can compute afresh.
|
|
633
404
|
selectionsWhenClosed.current = { ...latestSelectionRef.current };
|
|
634
|
-
cachedChildrenOrder.current = null;
|
|
635
405
|
cachedItemsOrder.current = null;
|
|
636
406
|
}
|
|
637
407
|
}
|
|
@@ -680,7 +450,7 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
680
450
|
props.onClear?.();
|
|
681
451
|
return false;
|
|
682
452
|
});
|
|
683
|
-
return (_jsx(ItemButton, { ref: triggerRef, "data-popover-trigger": true, type: type, theme: validationState === 'invalid' ? 'danger' : theme, size: size, isDisabled: isDisabled || isLoading, mods: {
|
|
453
|
+
return (_jsx(ItemButton, { ref: triggerRef, "data-popover-trigger": true, id: triggerId, type: type, theme: validationState === 'invalid' ? 'danger' : theme, size: size, isDisabled: isDisabled || isLoading, mods: {
|
|
684
454
|
placeholder: !hasSelection,
|
|
685
455
|
selected: hasSelection,
|
|
686
456
|
...externalMods,
|
|
@@ -700,7 +470,7 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
700
470
|
gridRows: '1sf',
|
|
701
471
|
width: '30x max-content 50vw',
|
|
702
472
|
...popoverStyles,
|
|
703
|
-
}, 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, searchPlaceholder: searchPlaceholder, filter: filter, searchValue: searchValue, listStyles: listStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, listRef: listRef, disallowEmptySelection: disallowEmptySelection, emptyLabel: emptyLabel, searchInputStyles: searchInputStyles, searchInputRef: searchInputRef, disabledKeys: disabledKeys, focusOnHover: focusOnHover, shouldFocusWrap: shouldFocusWrap, allowsCustomValue: allowsCustomValue, selectionMode: selectionMode, validationState: validationState, isDisabled: isDisabled, isLoading: isLoading, stateRef: listStateRef, isCheckable: isCheckable, mods: {
|
|
473
|
+
}, children: _jsx(FocusScope, { restoreFocus: true, children: _jsx(FilterListBox, { autoFocus: true, items: items ? finalItems : undefined, "aria-label": `${props['aria-label'] ?? props.label ?? ''} Picker`, _internalCollection: localCollectionState.collection, selectedKey: selectionMode === 'single' ? mappedSelectedKey : undefined, selectedKeys: selectionMode === 'multiple' ? mappedSelectedKeys : undefined, searchPlaceholder: searchPlaceholder, filter: filter, searchValue: searchValue, listStyles: listStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, listRef: listRef, disallowEmptySelection: disallowEmptySelection, emptyLabel: emptyLabel, searchInputStyles: searchInputStyles, searchInputRef: searchInputRef, disabledKeys: disabledKeys, focusOnHover: focusOnHover, shouldFocusWrap: shouldFocusWrap, allowsCustomValue: allowsCustomValue, selectionMode: selectionMode, validationState: validationState, isDisabled: isDisabled, isLoading: isLoading, stateRef: listStateRef, isCheckable: isCheckable, mods: {
|
|
704
474
|
popover: true,
|
|
705
475
|
}, size: size === 'small' ? 'medium' : size, showSelectAll: showSelectAll, selectAllLabel: selectAllLabel, header: header, footer: footer, headerStyles: headerStyles, footerStyles: footerStyles, qa: `${props.qa || 'FilterPicker'}ListBox`, allValueProps: allValueProps, customValueProps: customValueProps, newCustomValueProps: newCustomValueProps, onSearchChange: onSearchChange, onEscape: () => close(), onOptionClick: (key) => {
|
|
706
476
|
// For FilterPicker, clicking the content area should close the popover
|
|
@@ -767,11 +537,19 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
767
537
|
}, children: (children
|
|
768
538
|
? finalChildren
|
|
769
539
|
: undefined) }) }) }))] }) }));
|
|
770
|
-
|
|
540
|
+
const finalProps = {
|
|
771
541
|
...props,
|
|
772
542
|
children: undefined,
|
|
773
543
|
styles: undefined,
|
|
774
|
-
}
|
|
544
|
+
};
|
|
545
|
+
// Ensure labelProps has the for attribute for label-trigger linking
|
|
546
|
+
if (!finalProps.labelProps) {
|
|
547
|
+
finalProps.labelProps = {};
|
|
548
|
+
}
|
|
549
|
+
if (!finalProps.labelProps.for) {
|
|
550
|
+
finalProps.labelProps.for = triggerId;
|
|
551
|
+
}
|
|
552
|
+
return wrapWithField(filterPickerField, ref, mergeProps(finalProps, {}));
|
|
775
553
|
});
|
|
776
554
|
FilterPicker.Item = ListBox.Item;
|
|
777
555
|
FilterPicker.Section = BaseSection;
|