@cube-dev/ui-kit 0.0.0-canary-8dfe8a6 → 0.0.0-canary-5141f6d
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/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 +1 -1
- 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 +1 -1
- package/es/components/fields/ComboBox/index.js +1 -1
- package/es/components/fields/DatePicker/DateInput.js +1 -1
- package/es/components/fields/DatePicker/DateInputBase.js +1 -1
- package/es/components/fields/DatePicker/DatePicker.js +1 -1
- package/es/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/es/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/es/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/es/components/fields/DatePicker/TimeInput.js +1 -1
- package/es/components/fields/DatePicker/index.js +1 -1
- package/es/components/fields/DatePicker/intl.js +1 -1
- package/es/components/fields/DatePicker/parseDate.js +1 -1
- package/es/components/fields/DatePicker/props.js +1 -1
- package/es/components/fields/DatePicker/types.js +1 -1
- package/es/components/fields/DatePicker/utils.js +1 -1
- package/es/components/fields/FileInput/FileInput.js +1 -1
- package/es/components/fields/FilterListBox/FilterListBox.js +8 -20
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +4 -4
- package/es/components/fields/FilterPicker/index.js +1 -1
- package/es/components/fields/Input/Input.js +1 -1
- package/es/components/fields/Input/index.js +1 -1
- package/es/components/fields/ListBox/ListBox.js +1 -1
- 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/Picker/Picker.js +782 -0
- package/es/components/fields/Picker/index.js +10 -0
- 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 +1 -1
- package/es/components/fields/Select/index.js +1 -1
- package/es/components/fields/Slider/Gradation.js +1 -1
- package/es/components/fields/Slider/Header.js +1 -1
- package/es/components/fields/Slider/RangeSlider.js +1 -1
- package/es/components/fields/Slider/Slider.js +1 -1
- package/es/components/fields/Slider/SliderBase.js +1 -1
- package/es/components/fields/Slider/SliderInput.js +1 -1
- package/es/components/fields/Slider/SliderThumb.js +1 -1
- package/es/components/fields/Slider/SliderTrack.js +1 -1
- package/es/components/fields/Slider/elements.js +1 -1
- package/es/components/fields/Slider/index.js +1 -1
- package/es/components/fields/Slider/types.js +1 -1
- package/es/components/fields/Switch/Switch.js +1 -1
- package/es/components/fields/Switch/index.js +1 -1
- package/es/components/fields/TextArea/TextArea.js +1 -1
- package/es/components/fields/TextArea/index.js +1 -1
- package/es/components/fields/TextInput/TextInput.js +1 -1
- package/es/components/fields/TextInput/TextInputBase.js +1 -1
- package/es/components/fields/TextInput/index.js +1 -1
- package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/es/components/fields/TextInputMapper/index.js +1 -1
- package/es/components/fields/index.js +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/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 +1 -1
- package/es/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/es/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +1 -1
- package/es/components/portal/Portal.js +1 -1
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/index.js +1 -1
- package/es/components/portal/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/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 +1 -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 +1 -1
- package/es/utils/react/interactions.js +1 -1
- package/es/utils/react/isTextOnly.js +1 -1
- package/es/utils/react/mapProps.js +1 -1
- package/es/utils/react/mergeProps.js +1 -1
- package/es/utils/react/nullableValue.js +1 -1
- package/es/utils/react/sharedStore.js +1 -1
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +1 -1
- package/es/utils/react/useEventBus.js +1 -1
- package/es/utils/react/useId.js +1 -1
- package/es/utils/react/useIsDarwin.js +1 -1
- package/es/utils/react/useKeySymbols.js +1 -1
- package/es/utils/react/useLayoutEffect.js +1 -1
- package/es/utils/react/useQaProps.js +1 -1
- package/es/utils/react/useViewportSize.js +1 -1
- package/es/utils/react/wrapNodeIfPlain.js +1 -1
- package/es/utils/transitions.js +1 -1
- package/es/utils/tree.js +1 -1
- package/es/utils/warnings.js +1 -1
- package/es/version.js +2 -2
- package/package.json +1 -1
- package/types/components/fields/FilterListBox/FilterListBox.d.ts +2 -15
- package/types/components/fields/Picker/Picker.d.ts +62 -0
- package/types/components/fields/Picker/index.d.ts +2 -0
- package/types/components/fields/index.d.ts +1 -0
|
@@ -0,0 +1,782 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license MIT
|
|
3
|
+
* author: Cube Dev Team
|
|
4
|
+
* @cube-dev/ui-kit v0.0.0-canary-5141f6d
|
|
5
|
+
* Released under the MIT license.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { Children, cloneElement, forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
10
|
+
import { FocusScope, useKeyboard } from 'react-aria';
|
|
11
|
+
import { Section as BaseSection, Item as ReactAriaItem, } from 'react-stately';
|
|
12
|
+
import { useEvent } from '../../../_internal';
|
|
13
|
+
import { useWarn } from '../../../_internal/hooks/use-warn';
|
|
14
|
+
import { CloseIcon, DirectionIcon, LoadingIcon } from '../../../icons';
|
|
15
|
+
import { useProviderProps } from '../../../provider';
|
|
16
|
+
import { BASE_STYLES, COLOR_STYLES, extractStyles, filterBaseProps, OUTER_STYLES, tasty, } from '../../../tasty';
|
|
17
|
+
import { generateRandomId } from '../../../utils/random';
|
|
18
|
+
import { mergeProps } from '../../../utils/react';
|
|
19
|
+
import { useEventBus } from '../../../utils/react/useEventBus';
|
|
20
|
+
import { ItemAction, ItemButton } from '../../actions';
|
|
21
|
+
import { Text } from '../../content/Text';
|
|
22
|
+
import { useFieldProps, useFormProps, wrapWithField } from '../../form';
|
|
23
|
+
import { Dialog, DialogTrigger } from '../../overlays/Dialog';
|
|
24
|
+
import { ListBox } from '../ListBox/ListBox';
|
|
25
|
+
const PROP_STYLES = [...BASE_STYLES, ...OUTER_STYLES, ...COLOR_STYLES];
|
|
26
|
+
const PickerWrapper = tasty({
|
|
27
|
+
qa: 'Picker',
|
|
28
|
+
styles: {
|
|
29
|
+
display: 'inline-grid',
|
|
30
|
+
flow: 'column',
|
|
31
|
+
gridRows: '1sf',
|
|
32
|
+
placeContent: 'stretch',
|
|
33
|
+
placeItems: 'stretch',
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
export const Picker = forwardRef(function Picker(props, ref) {
|
|
37
|
+
props = useProviderProps(props);
|
|
38
|
+
props = useFormProps(props);
|
|
39
|
+
props = useFieldProps(props, {
|
|
40
|
+
valuePropsMapper: ({ value, onChange }) => {
|
|
41
|
+
const fieldProps = {};
|
|
42
|
+
if (props.selectionMode === 'multiple') {
|
|
43
|
+
fieldProps.selectedKeys = value || [];
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
fieldProps.selectedKey = value ?? null;
|
|
47
|
+
}
|
|
48
|
+
fieldProps.onSelectionChange = (key) => {
|
|
49
|
+
if (props.selectionMode === 'multiple') {
|
|
50
|
+
// Handle "all" selection and array selections
|
|
51
|
+
if (key === 'all') {
|
|
52
|
+
onChange('all');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
onChange(key ? (Array.isArray(key) ? key : [key]) : []);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
onChange(Array.isArray(key) ? key[0] : key);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
return fieldProps;
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
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, renderSummary, isCheckable, allValueProps, listStyles, optionStyles, sectionStyles, headingStyles, listRef, disallowEmptySelection, shouldUseVirtualFocus, onEscape, onOptionClick, isClearable, onClear, ...otherProps } = props;
|
|
66
|
+
styles = extractStyles(otherProps, PROP_STYLES, styles);
|
|
67
|
+
// Generate a unique ID for this Picker instance
|
|
68
|
+
const pickerId = useMemo(() => generateRandomId(), []);
|
|
69
|
+
// Get event bus for menu synchronization
|
|
70
|
+
const { emit, on } = useEventBus();
|
|
71
|
+
// Warn if isCheckable is false in single selection mode
|
|
72
|
+
useWarn(isCheckable === false && selectionMode === 'single', {
|
|
73
|
+
key: ['picker-checkable-single-mode'],
|
|
74
|
+
args: [
|
|
75
|
+
'CubeUIKit: isCheckable=false is not recommended in single selection mode as it may confuse users about selection behavior.',
|
|
76
|
+
],
|
|
77
|
+
});
|
|
78
|
+
// Internal selection state (uncontrolled scenario)
|
|
79
|
+
const [internalSelectedKey, setInternalSelectedKey] = useState(defaultSelectedKey ?? null);
|
|
80
|
+
const [internalSelectedKeys, setInternalSelectedKeys] = useState(defaultSelectedKeys ?? []);
|
|
81
|
+
// Track popover open/close and capture children order for session
|
|
82
|
+
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
|
83
|
+
const cachedChildrenOrder = useRef(null);
|
|
84
|
+
// Cache for sorted items array when using `items` prop
|
|
85
|
+
const cachedItemsOrder = useRef(null);
|
|
86
|
+
const triggerRef = useRef(null);
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Invalidate cached sorting whenever the available options change.
|
|
89
|
+
// This ensures newly provided options are displayed and properly sorted on
|
|
90
|
+
// the next popover open instead of re-using a stale order from a previous
|
|
91
|
+
// session (which caused only the previously selected options to be rendered
|
|
92
|
+
// or the list to appear unsorted).
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
cachedChildrenOrder.current = null;
|
|
96
|
+
}, [children]);
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
cachedItemsOrder.current = null;
|
|
99
|
+
}, [items]);
|
|
100
|
+
const isControlledSingle = selectedKey !== undefined;
|
|
101
|
+
const isControlledMultiple = selectedKeys !== undefined;
|
|
102
|
+
const effectiveSelectedKey = isControlledSingle
|
|
103
|
+
? selectedKey
|
|
104
|
+
: internalSelectedKey;
|
|
105
|
+
const effectiveSelectedKeys = isControlledMultiple
|
|
106
|
+
? selectedKeys
|
|
107
|
+
: internalSelectedKeys;
|
|
108
|
+
// Utility: remove React's ".$" / "." prefixes from element keys so that we
|
|
109
|
+
// can compare them with user-provided keys.
|
|
110
|
+
const normalizeKeyValue = (key) => {
|
|
111
|
+
if (key == null)
|
|
112
|
+
return '';
|
|
113
|
+
// React escapes "=" as "=0" and ":" as "=2" when it stores keys internally.
|
|
114
|
+
// We strip the possible React prefixes first and then un-escape those sequences
|
|
115
|
+
// so that callers work with the original key values supplied by the user.
|
|
116
|
+
let str = String(key);
|
|
117
|
+
// Remove React array/object key prefixes (".$" or ".") if present.
|
|
118
|
+
if (str.startsWith('.$')) {
|
|
119
|
+
str = str.slice(2);
|
|
120
|
+
}
|
|
121
|
+
else if (str.startsWith('.')) {
|
|
122
|
+
str = str.slice(1);
|
|
123
|
+
}
|
|
124
|
+
// Un-escape React's internal key encodings.
|
|
125
|
+
return str.replace(/=2/g, ':').replace(/=0/g, '=');
|
|
126
|
+
};
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Map public-facing keys (without React's "." prefix) to the actual React
|
|
129
|
+
// element keys that appear in the collection (which usually have the `.$`
|
|
130
|
+
// or `.` prefix added by React when children are in an array). This ensures
|
|
131
|
+
// that the key we pass to ListBox exactly matches the keys it receives from
|
|
132
|
+
// React Aria, so the initial selection is highlighted correctly.
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
const findReactKey = useCallback((lookup) => {
|
|
135
|
+
if (lookup == null)
|
|
136
|
+
return lookup;
|
|
137
|
+
const normalizedLookup = normalizeKeyValue(lookup);
|
|
138
|
+
let foundKey = lookup;
|
|
139
|
+
const traverse = (nodes) => {
|
|
140
|
+
Children.forEach(nodes, (child) => {
|
|
141
|
+
if (!child || typeof child !== 'object')
|
|
142
|
+
return;
|
|
143
|
+
const element = child;
|
|
144
|
+
if (element.key != null) {
|
|
145
|
+
if (normalizeKeyValue(element.key) === normalizedLookup) {
|
|
146
|
+
foundKey = element.key;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (element.props &&
|
|
150
|
+
typeof element.props === 'object' &&
|
|
151
|
+
'children' in element.props) {
|
|
152
|
+
traverse(element.props.children);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
if (children)
|
|
157
|
+
traverse(children);
|
|
158
|
+
return foundKey;
|
|
159
|
+
}, [children]);
|
|
160
|
+
const mappedSelectedKey = useMemo(() => {
|
|
161
|
+
if (selectionMode !== 'single')
|
|
162
|
+
return null;
|
|
163
|
+
return effectiveSelectedKey ? findReactKey(effectiveSelectedKey) : null;
|
|
164
|
+
}, [selectionMode, effectiveSelectedKey, findReactKey]);
|
|
165
|
+
const mappedSelectedKeys = useMemo(() => {
|
|
166
|
+
if (selectionMode !== 'multiple')
|
|
167
|
+
return undefined;
|
|
168
|
+
if (effectiveSelectedKeys === 'all')
|
|
169
|
+
return 'all';
|
|
170
|
+
if (Array.isArray(effectiveSelectedKeys)) {
|
|
171
|
+
return effectiveSelectedKeys.map((k) => findReactKey(k));
|
|
172
|
+
}
|
|
173
|
+
return effectiveSelectedKeys;
|
|
174
|
+
}, [selectionMode, effectiveSelectedKeys, findReactKey]);
|
|
175
|
+
// Given an iterable of keys (array or Set) toggle membership for duplicates
|
|
176
|
+
const processSelectionArray = (iterable) => {
|
|
177
|
+
const resultSet = new Set();
|
|
178
|
+
for (const key of iterable) {
|
|
179
|
+
const nKey = String(key);
|
|
180
|
+
if (resultSet.has(nKey)) {
|
|
181
|
+
resultSet.delete(nKey); // toggle off if clicked twice
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
resultSet.add(nKey); // select
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return Array.from(resultSet);
|
|
188
|
+
};
|
|
189
|
+
// Helper to get selected item labels for display
|
|
190
|
+
const getSelectedLabels = () => {
|
|
191
|
+
// Handle "all" selection - return all available labels
|
|
192
|
+
if (selectionMode === 'multiple' && effectiveSelectedKeys === 'all') {
|
|
193
|
+
const allLabels = [];
|
|
194
|
+
// Extract from items prop if available
|
|
195
|
+
if (items) {
|
|
196
|
+
const extractFromItems = (itemsArray) => {
|
|
197
|
+
itemsArray.forEach((item) => {
|
|
198
|
+
if (item && typeof item === 'object') {
|
|
199
|
+
const itemObj = item;
|
|
200
|
+
if (Array.isArray(itemObj.children)) {
|
|
201
|
+
// Section-like object
|
|
202
|
+
extractFromItems(itemObj.children);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// Regular item - extract label
|
|
206
|
+
const label = itemObj.textValue ||
|
|
207
|
+
itemObj.label ||
|
|
208
|
+
(typeof itemObj.children === 'string'
|
|
209
|
+
? itemObj.children
|
|
210
|
+
: '') ||
|
|
211
|
+
String(itemObj.children ||
|
|
212
|
+
itemObj.key ||
|
|
213
|
+
itemObj.id ||
|
|
214
|
+
item);
|
|
215
|
+
allLabels.push(label);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
const itemsArray = Array.isArray(items)
|
|
221
|
+
? items
|
|
222
|
+
: Array.from(items);
|
|
223
|
+
extractFromItems(itemsArray);
|
|
224
|
+
return allLabels;
|
|
225
|
+
}
|
|
226
|
+
// Extract from children if available
|
|
227
|
+
if (children) {
|
|
228
|
+
const extractAllLabels = (nodes) => {
|
|
229
|
+
if (!nodes)
|
|
230
|
+
return;
|
|
231
|
+
Children.forEach(nodes, (child) => {
|
|
232
|
+
if (!child || typeof child !== 'object')
|
|
233
|
+
return;
|
|
234
|
+
const element = child;
|
|
235
|
+
if (element.type === ReactAriaItem) {
|
|
236
|
+
const props = element.props;
|
|
237
|
+
const label = props.textValue ||
|
|
238
|
+
(typeof props.children === 'string' ? props.children : '') ||
|
|
239
|
+
String(props.children || '');
|
|
240
|
+
allLabels.push(label);
|
|
241
|
+
}
|
|
242
|
+
if (element.props &&
|
|
243
|
+
typeof element.props === 'object' &&
|
|
244
|
+
'children' in element.props) {
|
|
245
|
+
extractAllLabels(element.props.children);
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
};
|
|
249
|
+
extractAllLabels(children);
|
|
250
|
+
return allLabels;
|
|
251
|
+
}
|
|
252
|
+
return allLabels;
|
|
253
|
+
}
|
|
254
|
+
const selectedSet = new Set(selectionMode === 'multiple' && effectiveSelectedKeys !== 'all'
|
|
255
|
+
? (effectiveSelectedKeys || []).map((k) => normalizeKeyValue(k))
|
|
256
|
+
: effectiveSelectedKey != null
|
|
257
|
+
? [normalizeKeyValue(effectiveSelectedKey)]
|
|
258
|
+
: []);
|
|
259
|
+
const labels = [];
|
|
260
|
+
const processedKeys = new Set();
|
|
261
|
+
// Extract from items prop if available
|
|
262
|
+
if (items) {
|
|
263
|
+
const extractFromItems = (itemsArray) => {
|
|
264
|
+
itemsArray.forEach((item) => {
|
|
265
|
+
if (item && typeof item === 'object') {
|
|
266
|
+
const itemObj = item;
|
|
267
|
+
if (Array.isArray(itemObj.children)) {
|
|
268
|
+
// Section-like object
|
|
269
|
+
extractFromItems(itemObj.children);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
// Regular item - check if selected
|
|
273
|
+
const itemKey = itemObj.key || itemObj.id;
|
|
274
|
+
if (itemKey != null &&
|
|
275
|
+
selectedSet.has(normalizeKeyValue(itemKey))) {
|
|
276
|
+
const label = itemObj.textValue ||
|
|
277
|
+
itemObj.label ||
|
|
278
|
+
(typeof itemObj.children === 'string'
|
|
279
|
+
? itemObj.children
|
|
280
|
+
: '') ||
|
|
281
|
+
String(itemObj.children || itemKey);
|
|
282
|
+
labels.push(label);
|
|
283
|
+
processedKeys.add(normalizeKeyValue(itemKey));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
};
|
|
289
|
+
const itemsArray = Array.isArray(items)
|
|
290
|
+
? items
|
|
291
|
+
: Array.from(items);
|
|
292
|
+
extractFromItems(itemsArray);
|
|
293
|
+
}
|
|
294
|
+
// Extract from children if available (for mixed mode or fallback)
|
|
295
|
+
if (children) {
|
|
296
|
+
const extractLabelsWithTracking = (nodes) => {
|
|
297
|
+
if (!nodes)
|
|
298
|
+
return;
|
|
299
|
+
Children.forEach(nodes, (child) => {
|
|
300
|
+
if (!child || typeof child !== 'object')
|
|
301
|
+
return;
|
|
302
|
+
const element = child;
|
|
303
|
+
if (element.type === ReactAriaItem) {
|
|
304
|
+
const childKey = String(element.key);
|
|
305
|
+
if (selectedSet.has(normalizeKeyValue(childKey))) {
|
|
306
|
+
const props = element.props;
|
|
307
|
+
const label = props.textValue ||
|
|
308
|
+
(typeof props.children === 'string' ? props.children : '') ||
|
|
309
|
+
String(props.children || '');
|
|
310
|
+
labels.push(label);
|
|
311
|
+
processedKeys.add(normalizeKeyValue(childKey));
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (element.props &&
|
|
315
|
+
typeof element.props === 'object' &&
|
|
316
|
+
'children' in element.props) {
|
|
317
|
+
extractLabelsWithTracking(element.props.children);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
};
|
|
321
|
+
extractLabelsWithTracking(children);
|
|
322
|
+
}
|
|
323
|
+
// Handle custom values that don't have corresponding items/children
|
|
324
|
+
const selectedKeysArr = selectionMode === 'multiple' && effectiveSelectedKeys !== 'all'
|
|
325
|
+
? (effectiveSelectedKeys || []).map(String)
|
|
326
|
+
: effectiveSelectedKey != null
|
|
327
|
+
? [String(effectiveSelectedKey)]
|
|
328
|
+
: [];
|
|
329
|
+
// Add labels for any selected keys that weren't processed (custom values)
|
|
330
|
+
selectedKeysArr.forEach((key) => {
|
|
331
|
+
if (!processedKeys.has(normalizeKeyValue(key))) {
|
|
332
|
+
// This is a custom value, use the key as the label
|
|
333
|
+
labels.push(key);
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
return labels;
|
|
337
|
+
};
|
|
338
|
+
const selectedLabels = getSelectedLabels();
|
|
339
|
+
const hasSelection = selectedLabels.length > 0;
|
|
340
|
+
// Always keep the latest selection in a ref (with normalized keys) so that we can read it synchronously in the popover close effect.
|
|
341
|
+
const latestSelectionRef = useRef({
|
|
342
|
+
single: effectiveSelectedKey != null ? String(effectiveSelectedKey) : null,
|
|
343
|
+
multiple: effectiveSelectedKeys === 'all'
|
|
344
|
+
? 'all'
|
|
345
|
+
: (effectiveSelectedKeys ?? []).map(String),
|
|
346
|
+
});
|
|
347
|
+
useEffect(() => {
|
|
348
|
+
latestSelectionRef.current = {
|
|
349
|
+
single: effectiveSelectedKey != null ? String(effectiveSelectedKey) : null,
|
|
350
|
+
multiple: effectiveSelectedKeys === 'all'
|
|
351
|
+
? 'all'
|
|
352
|
+
: (effectiveSelectedKeys ?? []).map(String),
|
|
353
|
+
};
|
|
354
|
+
}, [effectiveSelectedKey, effectiveSelectedKeys]);
|
|
355
|
+
const selectionsWhenClosed = useRef({ single: null, multiple: [] });
|
|
356
|
+
// Capture the initial selection (from defaultSelectedKey(s)) so that
|
|
357
|
+
// the very first popover open can already use it for sorting.
|
|
358
|
+
useEffect(() => {
|
|
359
|
+
selectionsWhenClosed.current = { ...latestSelectionRef.current };
|
|
360
|
+
}, []); // run only once on mount
|
|
361
|
+
// Function to sort children with selected items on top
|
|
362
|
+
const getSortedChildren = useCallback(() => {
|
|
363
|
+
// If children is not provided or is a render function, return it as-is
|
|
364
|
+
if (!children || typeof children === 'function')
|
|
365
|
+
return children;
|
|
366
|
+
// Reuse the cached order if we have it. We only want to compute the sorted
|
|
367
|
+
// order once per pop-over opening session. The cache is cleared when the
|
|
368
|
+
// pop-over closes so the next opening can recompute.
|
|
369
|
+
if (cachedChildrenOrder.current) {
|
|
370
|
+
return cachedChildrenOrder.current;
|
|
371
|
+
}
|
|
372
|
+
// Popover is open – compute (or recompute) the sorted order for this
|
|
373
|
+
// session.
|
|
374
|
+
// Determine if there were any selections when the popover was previously closed.
|
|
375
|
+
const hadSelectionsWhenClosed = selectionMode === 'multiple'
|
|
376
|
+
? selectionsWhenClosed.current.multiple.length > 0
|
|
377
|
+
: selectionsWhenClosed.current.single !== null;
|
|
378
|
+
// Only apply sorting when there were selections in the previous session.
|
|
379
|
+
// We intentionally do not depend on the `isPopoverOpen` flag here because that
|
|
380
|
+
// flag is updated **after** the first render triggered by clicking the
|
|
381
|
+
// trigger button. Relying on it caused a timing issue where the very first
|
|
382
|
+
// render of a freshly-opened popover was unsorted. By removing the
|
|
383
|
+
// `isPopoverOpen` check we ensure items are already sorted during that first
|
|
384
|
+
// render while still maintaining stable order within an open popover thanks
|
|
385
|
+
// to the `cachedChildrenOrder` guard above.
|
|
386
|
+
if (!hadSelectionsWhenClosed) {
|
|
387
|
+
return children;
|
|
388
|
+
}
|
|
389
|
+
// Create selected keys set for fast lookup
|
|
390
|
+
const selectedSet = new Set();
|
|
391
|
+
if (selectionMode === 'multiple') {
|
|
392
|
+
if (selectionsWhenClosed.current.multiple === 'all') {
|
|
393
|
+
// Don't sort when "all" is selected, just return original children
|
|
394
|
+
return children;
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
selectionsWhenClosed.current.multiple.forEach((key) => selectedSet.add(String(key)));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
else if (selectionMode === 'single' &&
|
|
401
|
+
selectionsWhenClosed.current.single != null) {
|
|
402
|
+
selectedSet.add(String(selectionsWhenClosed.current.single));
|
|
403
|
+
}
|
|
404
|
+
// Helper function to check if an item is selected
|
|
405
|
+
const isItemSelected = (child) => {
|
|
406
|
+
return (child?.key != null && selectedSet.has(normalizeKeyValue(child.key)));
|
|
407
|
+
};
|
|
408
|
+
// Helper function to sort children array
|
|
409
|
+
const sortChildrenArray = (childrenArray) => {
|
|
410
|
+
const cloneWithNormalizedKey = (item) => cloneElement(item, {
|
|
411
|
+
key: item.key ? normalizeKeyValue(item.key) : undefined,
|
|
412
|
+
});
|
|
413
|
+
const selected = [];
|
|
414
|
+
const unselected = [];
|
|
415
|
+
childrenArray.forEach((child) => {
|
|
416
|
+
if (!child || typeof child !== 'object') {
|
|
417
|
+
unselected.push(child);
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const element = child;
|
|
421
|
+
// Handle sections - sort items within each section
|
|
422
|
+
if (element.type === BaseSection ||
|
|
423
|
+
element.type?.displayName === 'Section') {
|
|
424
|
+
const props = element.props;
|
|
425
|
+
const sectionChildren = Array.isArray(props.children)
|
|
426
|
+
? props.children
|
|
427
|
+
: [props.children];
|
|
428
|
+
const selectedItems = [];
|
|
429
|
+
const unselectedItems = [];
|
|
430
|
+
sectionChildren.forEach((sectionChild) => {
|
|
431
|
+
if (sectionChild && typeof sectionChild === 'object') {
|
|
432
|
+
const sectionElement = sectionChild;
|
|
433
|
+
if (sectionElement.type === ReactAriaItem ||
|
|
434
|
+
sectionElement.type?.displayName === 'Item') {
|
|
435
|
+
const clonedItem = cloneWithNormalizedKey(sectionElement);
|
|
436
|
+
if (isItemSelected(sectionElement)) {
|
|
437
|
+
selectedItems.push(clonedItem);
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
unselectedItems.push(clonedItem);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
unselectedItems.push(sectionChild);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
unselectedItems.push(sectionChild);
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
// Create new section with sorted children, preserving React element properly
|
|
452
|
+
unselected.push(cloneElement(element, {
|
|
453
|
+
...element.props,
|
|
454
|
+
children: [...selectedItems, ...unselectedItems],
|
|
455
|
+
}));
|
|
456
|
+
}
|
|
457
|
+
// Handle non-section elements (items, dividers, etc.)
|
|
458
|
+
else {
|
|
459
|
+
const clonedItem = cloneWithNormalizedKey(element);
|
|
460
|
+
if (isItemSelected(element)) {
|
|
461
|
+
selected.push(clonedItem);
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
unselected.push(clonedItem);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
return [...selected, ...unselected];
|
|
469
|
+
};
|
|
470
|
+
// Sort the children
|
|
471
|
+
const childrenArray = Children.toArray(children);
|
|
472
|
+
const sortedChildren = sortChildrenArray(childrenArray);
|
|
473
|
+
// Cache the sorted order when popover opens or when we compute it for the
|
|
474
|
+
// first time before opening.
|
|
475
|
+
if (isPopoverOpen || !cachedChildrenOrder.current) {
|
|
476
|
+
cachedChildrenOrder.current = sortedChildren;
|
|
477
|
+
}
|
|
478
|
+
return sortedChildren;
|
|
479
|
+
}, [
|
|
480
|
+
children,
|
|
481
|
+
effectiveSelectedKeys,
|
|
482
|
+
effectiveSelectedKey,
|
|
483
|
+
selectionMode,
|
|
484
|
+
isPopoverOpen,
|
|
485
|
+
]);
|
|
486
|
+
// Compute sorted items array when using `items` prop
|
|
487
|
+
const getSortedItems = useCallback(() => {
|
|
488
|
+
if (!items)
|
|
489
|
+
return items;
|
|
490
|
+
// Reuse the cached order if we have it. We only compute the sorted array
|
|
491
|
+
// once when the pop-over is opened. Cache is cleared on close.
|
|
492
|
+
if (cachedItemsOrder.current) {
|
|
493
|
+
return cachedItemsOrder.current;
|
|
494
|
+
}
|
|
495
|
+
const selectedSet = new Set();
|
|
496
|
+
const addSelected = (key) => {
|
|
497
|
+
if (key != null)
|
|
498
|
+
selectedSet.add(String(key));
|
|
499
|
+
};
|
|
500
|
+
if (selectionMode === 'multiple') {
|
|
501
|
+
if (selectionsWhenClosed.current.multiple === 'all') {
|
|
502
|
+
// Do not sort when all selected – keep original order
|
|
503
|
+
return items;
|
|
504
|
+
}
|
|
505
|
+
selectionsWhenClosed.current.multiple.forEach(addSelected);
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
if (selectionsWhenClosed.current.single != null) {
|
|
509
|
+
addSelected(selectionsWhenClosed.current.single);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
if (selectedSet.size === 0) {
|
|
513
|
+
return items;
|
|
514
|
+
}
|
|
515
|
+
// Helpers to extract key from item object
|
|
516
|
+
const getItemKey = (obj) => {
|
|
517
|
+
if (obj == null || typeof obj !== 'object')
|
|
518
|
+
return undefined;
|
|
519
|
+
const item = obj;
|
|
520
|
+
if (item.key != null)
|
|
521
|
+
return String(item.key);
|
|
522
|
+
if (item.id != null)
|
|
523
|
+
return String(item.id);
|
|
524
|
+
return undefined;
|
|
525
|
+
};
|
|
526
|
+
const sortArray = (arr) => {
|
|
527
|
+
const selectedArr = [];
|
|
528
|
+
const unselectedArr = [];
|
|
529
|
+
arr.forEach((obj) => {
|
|
530
|
+
const item = obj;
|
|
531
|
+
if (obj && Array.isArray(item.children)) {
|
|
532
|
+
// Section-like object – keep order, but sort its children
|
|
533
|
+
const sortedChildren = sortArray(item.children);
|
|
534
|
+
unselectedArr.push({ ...item, children: sortedChildren });
|
|
535
|
+
}
|
|
536
|
+
else {
|
|
537
|
+
const key = getItemKey(obj);
|
|
538
|
+
if (key && selectedSet.has(key)) {
|
|
539
|
+
selectedArr.push(obj);
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
unselectedArr.push(obj);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
return [...selectedArr, ...unselectedArr];
|
|
547
|
+
};
|
|
548
|
+
const itemsArray = Array.isArray(items)
|
|
549
|
+
? items
|
|
550
|
+
: Array.from(items);
|
|
551
|
+
const sorted = sortArray(itemsArray);
|
|
552
|
+
if (isPopoverOpen || !cachedItemsOrder.current) {
|
|
553
|
+
cachedItemsOrder.current = sorted;
|
|
554
|
+
}
|
|
555
|
+
return sorted;
|
|
556
|
+
}, [
|
|
557
|
+
items,
|
|
558
|
+
selectionMode,
|
|
559
|
+
isPopoverOpen,
|
|
560
|
+
selectionsWhenClosed.current.multiple,
|
|
561
|
+
selectionsWhenClosed.current.single,
|
|
562
|
+
]);
|
|
563
|
+
const finalItems = getSortedItems();
|
|
564
|
+
// We provide sorted children (if any) and sorted items
|
|
565
|
+
const finalChildren = getSortedChildren();
|
|
566
|
+
const renderTriggerContent = () => {
|
|
567
|
+
// When there is a selection and a custom summary renderer is provided – use it.
|
|
568
|
+
if (hasSelection && typeof renderSummary === 'function') {
|
|
569
|
+
if (selectionMode === 'single') {
|
|
570
|
+
return renderSummary({
|
|
571
|
+
selectedLabel: selectedLabels[0],
|
|
572
|
+
selectedKey: effectiveSelectedKey ?? null,
|
|
573
|
+
selectedLabels,
|
|
574
|
+
selectedKeys: effectiveSelectedKeys,
|
|
575
|
+
selectionMode: 'single',
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
return renderSummary({
|
|
579
|
+
selectedLabels,
|
|
580
|
+
selectedKeys: effectiveSelectedKeys,
|
|
581
|
+
selectionMode: 'multiple',
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
else if (hasSelection && renderSummary === false) {
|
|
585
|
+
return null;
|
|
586
|
+
}
|
|
587
|
+
let content = '';
|
|
588
|
+
if (!hasSelection) {
|
|
589
|
+
content = placeholder;
|
|
590
|
+
}
|
|
591
|
+
else if (selectionMode === 'single') {
|
|
592
|
+
content = selectedLabels[0];
|
|
593
|
+
}
|
|
594
|
+
else if (effectiveSelectedKeys === 'all') {
|
|
595
|
+
content = selectAllLabel;
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
content = selectedLabels.join(', ');
|
|
599
|
+
}
|
|
600
|
+
if (!content) {
|
|
601
|
+
return null;
|
|
602
|
+
}
|
|
603
|
+
return (_jsx(Text, { ellipsis: true, style: { opacity: hasSelection ? 1 : 'var(--disabled-opacity)' }, children: content }));
|
|
604
|
+
};
|
|
605
|
+
const [shouldUpdatePosition, setShouldUpdatePosition] = useState(true);
|
|
606
|
+
// The trigger is rendered as a function so we can access the dialog state
|
|
607
|
+
const renderTrigger = (state) => {
|
|
608
|
+
// Listen for other menus opening and close this one if needed
|
|
609
|
+
useEffect(() => {
|
|
610
|
+
const unsubscribe = on('popover:open', (data) => {
|
|
611
|
+
// If another menu is opening and this Picker is open, close this one
|
|
612
|
+
if (data.menuId !== pickerId && state.isOpen) {
|
|
613
|
+
state.close();
|
|
614
|
+
}
|
|
615
|
+
});
|
|
616
|
+
return unsubscribe;
|
|
617
|
+
}, [on, pickerId, state]);
|
|
618
|
+
// Emit event when this Picker opens
|
|
619
|
+
useEffect(() => {
|
|
620
|
+
if (state.isOpen) {
|
|
621
|
+
emit('popover:open', { menuId: pickerId });
|
|
622
|
+
}
|
|
623
|
+
}, [state.isOpen, emit, pickerId]);
|
|
624
|
+
// Track popover open/close state to control sorting
|
|
625
|
+
useEffect(() => {
|
|
626
|
+
if (state.isOpen !== isPopoverOpen) {
|
|
627
|
+
setIsPopoverOpen(state.isOpen);
|
|
628
|
+
if (!state.isOpen) {
|
|
629
|
+
// Popover just closed – record the latest selection for the next opening
|
|
630
|
+
// and clear the cached order so the next session can compute afresh.
|
|
631
|
+
selectionsWhenClosed.current = { ...latestSelectionRef.current };
|
|
632
|
+
cachedChildrenOrder.current = null;
|
|
633
|
+
cachedItemsOrder.current = null;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}, [state.isOpen, isPopoverOpen]);
|
|
637
|
+
// Add keyboard support for arrow keys to open the popover
|
|
638
|
+
const { keyboardProps } = useKeyboard({
|
|
639
|
+
onKeyDown: (e) => {
|
|
640
|
+
if ((e.key === 'ArrowUp' || e.key === 'ArrowDown') && !state.isOpen) {
|
|
641
|
+
e.preventDefault();
|
|
642
|
+
state.open();
|
|
643
|
+
}
|
|
644
|
+
},
|
|
645
|
+
});
|
|
646
|
+
useEffect(() => {
|
|
647
|
+
// Allow initial positioning & flipping when opening, then lock placement after transition
|
|
648
|
+
// Popover transition is ~120ms, give it a bit more time to finalize placement
|
|
649
|
+
if (state.isOpen) {
|
|
650
|
+
setShouldUpdatePosition(true);
|
|
651
|
+
const id = window.setTimeout(() => setShouldUpdatePosition(false), 160);
|
|
652
|
+
return () => window.clearTimeout(id);
|
|
653
|
+
}
|
|
654
|
+
else {
|
|
655
|
+
setShouldUpdatePosition(true);
|
|
656
|
+
}
|
|
657
|
+
}, [state.isOpen]);
|
|
658
|
+
// Clear button logic
|
|
659
|
+
let showClearButton = isClearable && hasSelection && !isDisabled && !props.isReadOnly;
|
|
660
|
+
// Clear function
|
|
661
|
+
let clearValue = useEvent(() => {
|
|
662
|
+
if (selectionMode === 'multiple') {
|
|
663
|
+
if (!isControlledMultiple) {
|
|
664
|
+
setInternalSelectedKeys([]);
|
|
665
|
+
}
|
|
666
|
+
onSelectionChange?.([]);
|
|
667
|
+
}
|
|
668
|
+
else {
|
|
669
|
+
if (!isControlledSingle) {
|
|
670
|
+
setInternalSelectedKey(null);
|
|
671
|
+
}
|
|
672
|
+
onSelectionChange?.(null);
|
|
673
|
+
}
|
|
674
|
+
if (state.isOpen) {
|
|
675
|
+
state.close();
|
|
676
|
+
}
|
|
677
|
+
triggerRef?.current?.focus?.();
|
|
678
|
+
onClear?.();
|
|
679
|
+
return false;
|
|
680
|
+
});
|
|
681
|
+
return (_jsx(ItemButton, { ref: triggerRef, "data-popover-trigger": true, type: type, theme: validationState === 'invalid' ? 'danger' : theme, size: size, isDisabled: isDisabled || isLoading, mods: {
|
|
682
|
+
placeholder: !hasSelection,
|
|
683
|
+
selected: hasSelection,
|
|
684
|
+
...externalMods,
|
|
685
|
+
}, icon: icon, rightIcon: isLoading ? (_jsx(LoadingIcon, {})) : rightIcon !== undefined ? (rightIcon) : showClearButton ? (_jsx(ItemAction, { icon: _jsx(CloseIcon, {}), size: size, theme: validationState === 'invalid' ? 'danger' : undefined, qa: "PickerClearButton", mods: { pressed: false }, onPress: clearValue })) : (_jsx(DirectionIcon, { to: state.isOpen ? 'top' : 'bottom' })), prefix: prefix, suffix: suffix, hotkeys: hotkeys, tooltip: triggerTooltip, description: triggerDescription, descriptionPlacement: descriptionPlacement, styles: styles, ...keyboardProps, "aria-label": `${props['aria-label'] ?? props.label ?? ''}`, children: renderTriggerContent() }));
|
|
686
|
+
};
|
|
687
|
+
const pickerField = (_jsx(PickerWrapper, { qa: props.qa || 'Picker', styles: styles, ...filterBaseProps(otherProps, { eventProps: true }), children: _jsxs(DialogTrigger, { type: "popover", placement: "bottom start", styles: triggerStyles, shouldUpdatePosition: shouldUpdatePosition, shouldFlip: shouldFlip && shouldUpdatePosition, isDismissable: true, shouldCloseOnInteractOutside: (el) => {
|
|
688
|
+
const menuTriggerEl = el.closest('[data-popover-trigger]');
|
|
689
|
+
// If no menu trigger was clicked, allow closing
|
|
690
|
+
if (!menuTriggerEl)
|
|
691
|
+
return true;
|
|
692
|
+
// If the same trigger that opened this popover was clicked, allow closing (toggle)
|
|
693
|
+
if (menuTriggerEl === triggerRef?.current)
|
|
694
|
+
return true;
|
|
695
|
+
// Otherwise, don't close here. Let the event bus handle closing when the other opens.
|
|
696
|
+
return false;
|
|
697
|
+
}, children: [renderTrigger, (close) => (_jsx(Dialog, { display: "grid", styles: {
|
|
698
|
+
gridRows: '1sf',
|
|
699
|
+
width: '30x max-content 50vw',
|
|
700
|
+
...popoverStyles,
|
|
701
|
+
}, children: _jsx(FocusScope, { restoreFocus: true, children: _jsx(ListBox, { autoFocus: true, items: items ? finalItems : undefined, "aria-label": `${props['aria-label'] ?? props.label ?? ''} Picker`, selectedKey: selectionMode === 'single' ? mappedSelectedKey : undefined, selectedKeys: selectionMode === 'multiple' ? mappedSelectedKeys : undefined, listStyles: listStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, listRef: listRef, disallowEmptySelection: disallowEmptySelection, disabledKeys: disabledKeys, focusOnHover: focusOnHover, shouldFocusWrap: shouldFocusWrap, selectionMode: selectionMode, validationState: validationState, isDisabled: isDisabled, isLoading: isLoading, stateRef: listStateRef, isCheckable: isCheckable, mods: {
|
|
702
|
+
popover: true,
|
|
703
|
+
}, size: size === 'small' ? 'medium' : size, showSelectAll: showSelectAll, selectAllLabel: selectAllLabel, header: header, footer: footer, headerStyles: headerStyles, footerStyles: footerStyles, qa: `${props.qa || 'Picker'}ListBox`, allValueProps: allValueProps, onEscape: () => close(), onOptionClick: (key) => {
|
|
704
|
+
// For Picker, clicking the content area should close the popover
|
|
705
|
+
// in multiple selection mode (single mode already closes via onSelectionChange)
|
|
706
|
+
if ((selectionMode === 'multiple' && isCheckable) ||
|
|
707
|
+
key === '__ALL__') {
|
|
708
|
+
close();
|
|
709
|
+
}
|
|
710
|
+
}, onSelectionChange: (selection) => {
|
|
711
|
+
// No need to change any flags - children order is cached
|
|
712
|
+
// Update internal state if uncontrolled
|
|
713
|
+
if (selectionMode === 'single') {
|
|
714
|
+
if (!isControlledSingle) {
|
|
715
|
+
setInternalSelectedKey(selection);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
if (!isControlledMultiple) {
|
|
720
|
+
let normalized = selection;
|
|
721
|
+
if (selection === 'all') {
|
|
722
|
+
normalized = 'all';
|
|
723
|
+
}
|
|
724
|
+
else if (Array.isArray(selection)) {
|
|
725
|
+
normalized = processSelectionArray(selection);
|
|
726
|
+
}
|
|
727
|
+
else if (selection &&
|
|
728
|
+
typeof selection === 'object' &&
|
|
729
|
+
selection instanceof Set) {
|
|
730
|
+
normalized = processSelectionArray(selection);
|
|
731
|
+
}
|
|
732
|
+
setInternalSelectedKeys(normalized);
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
// Update latest selection ref synchronously
|
|
736
|
+
if (selectionMode === 'single') {
|
|
737
|
+
latestSelectionRef.current.single =
|
|
738
|
+
selection != null ? String(selection) : null;
|
|
739
|
+
}
|
|
740
|
+
else {
|
|
741
|
+
if (selection === 'all') {
|
|
742
|
+
latestSelectionRef.current.multiple = 'all';
|
|
743
|
+
}
|
|
744
|
+
else if (Array.isArray(selection)) {
|
|
745
|
+
latestSelectionRef.current.multiple = Array.from(new Set(processSelectionArray(selection)));
|
|
746
|
+
}
|
|
747
|
+
else if (selection &&
|
|
748
|
+
typeof selection === 'object' &&
|
|
749
|
+
selection instanceof Set) {
|
|
750
|
+
latestSelectionRef.current.multiple = Array.from(new Set(processSelectionArray(selection)));
|
|
751
|
+
}
|
|
752
|
+
else {
|
|
753
|
+
latestSelectionRef.current.multiple =
|
|
754
|
+
selection === 'all'
|
|
755
|
+
? 'all'
|
|
756
|
+
: Array.isArray(selection)
|
|
757
|
+
? selection.map(String)
|
|
758
|
+
: [];
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
onSelectionChange?.(selection);
|
|
762
|
+
if (selectionMode === 'single') {
|
|
763
|
+
close();
|
|
764
|
+
}
|
|
765
|
+
}, children: (children
|
|
766
|
+
? finalChildren
|
|
767
|
+
: undefined) }) }) }))] }) }));
|
|
768
|
+
return wrapWithField(pickerField, ref, mergeProps({
|
|
769
|
+
...props,
|
|
770
|
+
children: undefined,
|
|
771
|
+
styles: undefined,
|
|
772
|
+
}, {}));
|
|
773
|
+
});
|
|
774
|
+
Picker.Item = ListBox.Item;
|
|
775
|
+
Picker.Section = BaseSection;
|
|
776
|
+
Object.defineProperty(Picker, 'cubeInputType', {
|
|
777
|
+
value: 'Picker',
|
|
778
|
+
enumerable: false,
|
|
779
|
+
configurable: false,
|
|
780
|
+
});
|
|
781
|
+
|
|
782
|
+
|