@cube-dev/ui-kit 0.81.0 → 0.82.1
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 +20 -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 +2 -2
- package/es/components/fields/Checkbox/CheckboxGroup.js +2 -2
- 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 +792 -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 +2 -2
- package/es/components/fields/FilterListBox/FilterListBox.js +36 -46
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +83 -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 +25 -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 +2 -2
- package/es/components/fields/RadioGroup/RadioGroup.js +2 -2
- 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 +73 -54
- 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 +2 -2
- 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 +2 -2
- 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 +3 -3
- package/es/components/fields/TextInput/index.js +1 -1
- package/es/components/fields/TextInputMapper/TextInputMapper.js +3 -3
- 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 +21 -5
- 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/shared/form.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.1
|
|
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, 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,7 +63,11 @@ 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, form, ...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);
|
|
68
72
|
// Generate a unique ID for this FilterPicker instance
|
|
69
73
|
const filterPickerId = useMemo(() => generateRandomId(), []);
|
|
@@ -81,7 +85,6 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
81
85
|
const [internalSelectedKeys, setInternalSelectedKeys] = useState(defaultSelectedKeys ?? []);
|
|
82
86
|
// Track popover open/close and capture children order for session
|
|
83
87
|
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
|
84
|
-
const cachedChildrenOrder = useRef(null);
|
|
85
88
|
// Cache for sorted items array when using `items` prop
|
|
86
89
|
const cachedItemsOrder = useRef(null);
|
|
87
90
|
const triggerRef = useRef(null);
|
|
@@ -92,9 +95,6 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
92
95
|
// session (which caused only the previously selected options to be rendered
|
|
93
96
|
// or the list to appear unsorted).
|
|
94
97
|
// ---------------------------------------------------------------------------
|
|
95
|
-
useEffect(() => {
|
|
96
|
-
cachedChildrenOrder.current = null;
|
|
97
|
-
}, [children]);
|
|
98
98
|
useEffect(() => {
|
|
99
99
|
cachedItemsOrder.current = null;
|
|
100
100
|
}, [items]);
|
|
@@ -106,73 +106,47 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
106
106
|
const effectiveSelectedKeys = isControlledMultiple
|
|
107
107
|
? selectedKeys
|
|
108
108
|
: 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
|
-
};
|
|
109
|
+
// Create a local collection for label extraction only (not for rendering)
|
|
110
|
+
// This gives us immediate access to textValue without waiting for FilterListBox
|
|
111
|
+
const localCollectionState = useListState({
|
|
112
|
+
children: children,
|
|
113
|
+
items: items,
|
|
114
|
+
selectionMode: 'none', // We don't need selection management
|
|
115
|
+
});
|
|
128
116
|
// ---------------------------------------------------------------------------
|
|
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.
|
|
117
|
+
// Map user-provided keys to collection keys using the local collection.
|
|
118
|
+
// The collection handles key normalization internally, so we use direct
|
|
119
|
+
// string comparison.
|
|
134
120
|
// ---------------------------------------------------------------------------
|
|
135
|
-
const
|
|
121
|
+
const findCollectionKey = useCallback((lookup) => {
|
|
136
122
|
if (lookup == null)
|
|
137
123
|
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]);
|
|
124
|
+
// Direct comparison - collection handles normalization internally
|
|
125
|
+
for (const item of localCollectionState.collection) {
|
|
126
|
+
if (String(item.key) === String(lookup)) {
|
|
127
|
+
return item.key;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Fallback: return the lookup key as-is
|
|
131
|
+
return lookup;
|
|
132
|
+
}, [localCollectionState.collection]);
|
|
161
133
|
const mappedSelectedKey = useMemo(() => {
|
|
162
134
|
if (selectionMode !== 'single')
|
|
163
135
|
return null;
|
|
164
|
-
return effectiveSelectedKey
|
|
165
|
-
|
|
136
|
+
return effectiveSelectedKey
|
|
137
|
+
? findCollectionKey(effectiveSelectedKey)
|
|
138
|
+
: null;
|
|
139
|
+
}, [selectionMode, effectiveSelectedKey, findCollectionKey]);
|
|
166
140
|
const mappedSelectedKeys = useMemo(() => {
|
|
167
141
|
if (selectionMode !== 'multiple')
|
|
168
142
|
return undefined;
|
|
169
143
|
if (effectiveSelectedKeys === 'all')
|
|
170
144
|
return 'all';
|
|
171
145
|
if (Array.isArray(effectiveSelectedKeys)) {
|
|
172
|
-
return effectiveSelectedKeys.map((k) =>
|
|
146
|
+
return effectiveSelectedKeys.map((k) => findCollectionKey(k));
|
|
173
147
|
}
|
|
174
148
|
return effectiveSelectedKeys;
|
|
175
|
-
}, [selectionMode, effectiveSelectedKeys,
|
|
149
|
+
}, [selectionMode, effectiveSelectedKeys, findCollectionKey]);
|
|
176
150
|
// Given an iterable of keys (array or Set) toggle membership for duplicates
|
|
177
151
|
const processSelectionArray = (iterable) => {
|
|
178
152
|
const resultSet = new Set();
|
|
@@ -187,149 +161,53 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
187
161
|
}
|
|
188
162
|
return Array.from(resultSet);
|
|
189
163
|
};
|
|
190
|
-
// Helper to get selected item labels for display
|
|
164
|
+
// Helper to get selected item labels for display using local collection
|
|
191
165
|
const getSelectedLabels = () => {
|
|
192
|
-
|
|
193
|
-
|
|
166
|
+
const collection = localCollectionState.collection;
|
|
167
|
+
// Helper to recursively collect all item labels from collection (including nested in sections)
|
|
168
|
+
const collectAllLabels = () => {
|
|
194
169
|
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
|
-
}
|
|
170
|
+
const traverse = (nodes) => {
|
|
171
|
+
for (const node of nodes) {
|
|
172
|
+
if (node.type === 'item') {
|
|
173
|
+
allLabels.push(node.textValue || String(node.key));
|
|
174
|
+
}
|
|
175
|
+
else if (node.childNodes) {
|
|
176
|
+
traverse(node.childNodes);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
traverse(collection);
|
|
253
181
|
return allLabels;
|
|
182
|
+
};
|
|
183
|
+
// Handle "all" selection - return all available labels
|
|
184
|
+
if (selectionMode === 'multiple' && effectiveSelectedKeys === 'all') {
|
|
185
|
+
return collectAllLabels();
|
|
254
186
|
}
|
|
255
187
|
const selectedSet = new Set(selectionMode === 'multiple' && effectiveSelectedKeys !== 'all'
|
|
256
|
-
? (effectiveSelectedKeys || []).map((k) =>
|
|
188
|
+
? (effectiveSelectedKeys || []).map((k) => String(k))
|
|
257
189
|
: effectiveSelectedKey != null
|
|
258
|
-
? [
|
|
190
|
+
? [String(effectiveSelectedKey)]
|
|
259
191
|
: []);
|
|
260
192
|
const labels = [];
|
|
261
193
|
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
|
|
194
|
+
// Use collection.getItem() to directly retrieve items by key (works with sections)
|
|
195
|
+
selectedSet.forEach((key) => {
|
|
196
|
+
const item = collection.getItem(key);
|
|
197
|
+
if (item) {
|
|
198
|
+
labels.push(item.textValue || String(item.key));
|
|
199
|
+
processedKeys.add(String(item.key));
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
// Handle custom values that aren't in the collection
|
|
325
203
|
const selectedKeysArr = selectionMode === 'multiple' && effectiveSelectedKeys !== 'all'
|
|
326
204
|
? (effectiveSelectedKeys || []).map(String)
|
|
327
205
|
: effectiveSelectedKey != null
|
|
328
206
|
? [String(effectiveSelectedKey)]
|
|
329
207
|
: [];
|
|
330
|
-
// Add labels for any selected keys that weren't
|
|
208
|
+
// Add labels for any selected keys that weren't found in collection (custom values)
|
|
331
209
|
selectedKeysArr.forEach((key) => {
|
|
332
|
-
if (!processedKeys.has(
|
|
210
|
+
if (!processedKeys.has(String(key))) {
|
|
333
211
|
// This is a custom value, use the key as the label
|
|
334
212
|
labels.push(key);
|
|
335
213
|
}
|
|
@@ -361,133 +239,22 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
361
239
|
}, []); // run only once on mount
|
|
362
240
|
// Function to sort children with selected items on top
|
|
363
241
|
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;
|
|
242
|
+
// Warn if sorting is explicitly requested but not supported
|
|
243
|
+
if (sortSelectedToTopExplicit && sortSelectedToTop && !items) {
|
|
244
|
+
console.warn('FilterPicker: sortSelectedToTop only works with the items prop. ' +
|
|
245
|
+
'Sorting will be skipped when using JSX children.');
|
|
389
246
|
}
|
|
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
|
-
]);
|
|
247
|
+
// Return children as-is (no sorting for JSX children)
|
|
248
|
+
return children;
|
|
249
|
+
}, [children, sortSelectedToTop, sortSelectedToTopExplicit, items]);
|
|
487
250
|
// Compute sorted items array when using `items` prop
|
|
488
251
|
const getSortedItems = useCallback(() => {
|
|
489
252
|
if (!items)
|
|
490
253
|
return items;
|
|
254
|
+
// Only sort if explicitly enabled
|
|
255
|
+
if (!sortSelectedToTop) {
|
|
256
|
+
return items;
|
|
257
|
+
}
|
|
491
258
|
// Reuse the cached order if we have it. We only compute the sorted array
|
|
492
259
|
// once when the pop-over is opened. Cache is cleared on close.
|
|
493
260
|
if (cachedItemsOrder.current) {
|
|
@@ -556,6 +323,7 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
556
323
|
return sorted;
|
|
557
324
|
}, [
|
|
558
325
|
items,
|
|
326
|
+
sortSelectedToTop,
|
|
559
327
|
selectionMode,
|
|
560
328
|
isPopoverOpen,
|
|
561
329
|
selectionsWhenClosed.current.multiple,
|
|
@@ -631,7 +399,6 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
631
399
|
// Popover just closed – record the latest selection for the next opening
|
|
632
400
|
// and clear the cached order so the next session can compute afresh.
|
|
633
401
|
selectionsWhenClosed.current = { ...latestSelectionRef.current };
|
|
634
|
-
cachedChildrenOrder.current = null;
|
|
635
402
|
cachedItemsOrder.current = null;
|
|
636
403
|
}
|
|
637
404
|
}
|
|
@@ -680,7 +447,7 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
680
447
|
props.onClear?.();
|
|
681
448
|
return false;
|
|
682
449
|
});
|
|
683
|
-
return (_jsx(ItemButton, { ref: triggerRef, "data-popover-trigger": true, type: type, theme: validationState === 'invalid' ? 'danger' : theme, size: size, isDisabled: isDisabled || isLoading, mods: {
|
|
450
|
+
return (_jsx(ItemButton, { ref: triggerRef, "data-popover-trigger": true, id: id, type: type, theme: validationState === 'invalid' ? 'danger' : theme, size: size, isDisabled: isDisabled || isLoading, mods: {
|
|
684
451
|
placeholder: !hasSelection,
|
|
685
452
|
selected: hasSelection,
|
|
686
453
|
...externalMods,
|
|
@@ -700,7 +467,7 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
700
467
|
gridRows: '1sf',
|
|
701
468
|
width: '30x max-content 50vw',
|
|
702
469
|
...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: {
|
|
470
|
+
}, 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
471
|
popover: true,
|
|
705
472
|
}, 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
473
|
// For FilterPicker, clicking the content area should close the popover
|
|
@@ -767,11 +534,12 @@ export const FilterPicker = forwardRef(function FilterPicker(props, ref) {
|
|
|
767
534
|
}, children: (children
|
|
768
535
|
? finalChildren
|
|
769
536
|
: undefined) }) }) }))] }) }));
|
|
770
|
-
|
|
537
|
+
const finalProps = {
|
|
771
538
|
...props,
|
|
772
539
|
children: undefined,
|
|
773
540
|
styles: undefined,
|
|
774
|
-
}
|
|
541
|
+
};
|
|
542
|
+
return wrapWithField(filterPickerField, ref, mergeProps(finalProps, {}));
|
|
775
543
|
});
|
|
776
544
|
FilterPicker.Item = ListBox.Item;
|
|
777
545
|
FilterPicker.Section = BaseSection;
|