@cube-dev/ui-kit 0.0.0-canary-ccca45d → 0.0.0-canary-2256c47
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/dist/_internal/hooks/use-chained-callback.js +1 -1
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.js +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/Item/Item.js +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +78 -148
- package/dist/components/content/Tree/Tree.js.map +1 -1
- package/dist/components/content/Tree/TreeNode.js +17 -64
- package/dist/components/content/Tree/TreeNode.js.map +1 -1
- package/dist/components/content/Tree/styled.js +1 -3
- package/dist/components/content/Tree/styled.js.map +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/types.d.ts +2 -2
- package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
- package/dist/components/content/Tree/use-load-data.js +22 -15
- package/dist/components/content/Tree/use-load-data.js.map +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/intl.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.js +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransition.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +2 -2
- package/docs/components/content/Tree.md +0 -9
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { mergeProps } from "../../../utils/react/mergeProps.js";
|
|
4
4
|
import { wrapNodeIfPlain } from "../../../utils/react/wrapNodeIfPlain.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
|
|
2
2
|
import { Space } from "../../layout/Space.js";
|
|
3
3
|
import { Grid } from "../../layout/Grid.js";
|
|
4
4
|
import { Flow } from "../../layout/Flow.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
|
|
2
2
|
import { _Item } from "../Item/Item.js";
|
|
3
3
|
import { CloseIcon } from "../../../icons/CloseIcon.js";
|
|
4
4
|
import { tasty } from "@tenphi/tasty";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { useSlotProps } from "../../utils/react/Slots.js";
|
|
4
4
|
import { BASE_STYLES, COLOR_STYLES, TEXT_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { TEXT_PROP_MAP, _Text } from "../Text.js";
|
|
4
4
|
import { highlightText } from "../highlightText.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { useSlotProps } from "../../utils/react/Slots.js";
|
|
4
4
|
import { TEXT_PROP_MAP } from "./Text.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
4
4
|
import { mergeRefs } from "../../../utils/react/useCombinedRefs.js";
|
|
@@ -18,16 +18,9 @@ import { Item, useTreeState } from "react-stately";
|
|
|
18
18
|
/**
|
|
19
19
|
* Render an `<Item>` for React Stately's collection builder.
|
|
20
20
|
*
|
|
21
|
-
* The visible
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* `childItems` for nested traversal).
|
|
25
|
-
*
|
|
26
|
-
* For nested traversal to work, the `children` of the `<Tree>` must
|
|
27
|
-
* be passed as a *function* together with the top-level `items`
|
|
28
|
-
* array — see the `<Tree>` `useCollection` call below. Stately
|
|
29
|
-
* propagates that renderer into `childItems` so nested arrays of
|
|
30
|
-
* raw `CubeTreeNodeData` are turned back into `<Item>` elements.
|
|
21
|
+
* The visible content is rendered by `TreeNode` via `nodesByKey`,
|
|
22
|
+
* so `<Item>`'s body is only used by Stately for the collection
|
|
23
|
+
* (`textValue` for keyboard nav, `childItems` for nested traversal).
|
|
31
24
|
*/
|
|
32
25
|
function renderItem(node) {
|
|
33
26
|
return /* @__PURE__ */ jsx(Item, {
|
|
@@ -36,7 +29,6 @@ function renderItem(node) {
|
|
|
36
29
|
children: node.title
|
|
37
30
|
}, node.key);
|
|
38
31
|
}
|
|
39
|
-
/** Walk the treeData and collect all keys whose `isDisabled === true`. */
|
|
40
32
|
function collectDisabledKeys(treeData, treeIsDisabled) {
|
|
41
33
|
const keys = [];
|
|
42
34
|
const visit = (nodes) => {
|
|
@@ -48,11 +40,7 @@ function collectDisabledKeys(treeData, treeIsDisabled) {
|
|
|
48
40
|
visit(treeData);
|
|
49
41
|
return keys;
|
|
50
42
|
}
|
|
51
|
-
/**
|
|
52
|
-
* Expand the supplied keys with all of their ancestors. Used when
|
|
53
|
-
* `autoExpandParent` is `true` so that the consumer can pass deep keys
|
|
54
|
-
* (e.g. search matches) without having to manually walk parents.
|
|
55
|
-
*/
|
|
43
|
+
/** Expand the supplied keys with all of their ancestor keys. */
|
|
56
44
|
function expandWithParents(keys, parentOf) {
|
|
57
45
|
if (!keys || keys.length === 0) return keys;
|
|
58
46
|
const set = new Set(keys);
|
|
@@ -66,48 +54,39 @@ function expandWithParents(keys, parentOf) {
|
|
|
66
54
|
return Array.from(set);
|
|
67
55
|
}
|
|
68
56
|
/**
|
|
69
|
-
*
|
|
70
|
-
* `
|
|
71
|
-
*
|
|
72
|
-
* - `selectionMode` wins when both are passed.
|
|
73
|
-
* - `isSelectable === false` is sugar for `selectionMode='none'`.
|
|
74
|
-
* - `selectionMode` defaults to `'single'` (matches AntD's default).
|
|
57
|
+
* Diff two key sets to find the single key that was added or removed.
|
|
58
|
+
* Returns `null` when both sets are equal.
|
|
75
59
|
*/
|
|
60
|
+
function findToggledKey(previous, next) {
|
|
61
|
+
for (const k of next) if (!previous.has(k)) return {
|
|
62
|
+
key: k,
|
|
63
|
+
added: true
|
|
64
|
+
};
|
|
65
|
+
for (const k of previous) if (!next.has(k)) return {
|
|
66
|
+
key: k,
|
|
67
|
+
added: false
|
|
68
|
+
};
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
76
71
|
function resolveSelectionMode(selectionMode, isSelectable) {
|
|
77
72
|
if (selectionMode != null) return selectionMode;
|
|
78
73
|
if (isSelectable === false) return "none";
|
|
79
74
|
return "single";
|
|
80
75
|
}
|
|
81
76
|
function TreeBase(props, ref) {
|
|
82
|
-
const { treeData, isCheckable = false, isSelectable, selectionMode: selectionModeProp,
|
|
77
|
+
const { treeData, isCheckable = false, isSelectable, selectionMode: selectionModeProp, isDisabled = false, defaultExpandedKeys, expandedKeys, autoExpandParent = false, defaultCheckedKeys, checkedKeys, defaultSelectedKeys, selectedKeys, height, loadData, onExpand, onCheck, onSelect, rowStyles, ariaLabel, qa, ...otherProps } = props;
|
|
83
78
|
const baseStyles = extractStyles(otherProps, OUTER_STYLES);
|
|
84
79
|
const treeRef = useRef(null);
|
|
85
|
-
/**
|
|
86
|
-
* Single tree walk that produces `byKey`, `parentOf`, and `childrenOf`.
|
|
87
|
-
* Shared with `useCheckboxTree` so a `treeData` change triggers exactly
|
|
88
|
-
* one walk (instead of three) for these three maps.
|
|
89
|
-
*/
|
|
90
80
|
const treeIndex = useMemo(() => buildTreeIndex(treeData), [treeData]);
|
|
91
81
|
const nodesByKey = treeIndex.byKey;
|
|
92
82
|
const parentOf = treeIndex.parentOf;
|
|
93
83
|
const disabledKeys = useMemo(() => collectDisabledKeys(treeData, isDisabled), [treeData, isDisabled]);
|
|
94
84
|
const selectionMode = resolveSelectionMode(selectionModeProp, isSelectable);
|
|
95
|
-
/**
|
|
96
|
-
* Apply `autoExpandParent` to the controlled `expandedKeys`. This is
|
|
97
|
-
* a one-shot thing — once the consumer responds to `onExpand` and
|
|
98
|
-
* sets `autoExpandParent` to `false`, we stop force-expanding parents.
|
|
99
|
-
*/
|
|
100
85
|
const effectiveExpandedKeys = useMemo(() => autoExpandParent ? expandWithParents(expandedKeys, parentOf) : expandedKeys, [
|
|
101
86
|
autoExpandParent,
|
|
102
87
|
expandedKeys,
|
|
103
88
|
parentOf
|
|
104
89
|
]);
|
|
105
|
-
/**
|
|
106
|
-
* Mirror the same logic for the uncontrolled `defaultExpandedKeys`.
|
|
107
|
-
* `useTreeState` only reads it on mount, but we still need to expand
|
|
108
|
-
* ancestors so consumers passing a deep key (e.g. a search match) get
|
|
109
|
-
* the same behaviour as in the controlled mode.
|
|
110
|
-
*/
|
|
111
90
|
const effectiveDefaultExpandedKeys = useMemo(() => autoExpandParent ? expandWithParents(defaultExpandedKeys, parentOf) : defaultExpandedKeys, [
|
|
112
91
|
autoExpandParent,
|
|
113
92
|
defaultExpandedKeys,
|
|
@@ -127,145 +106,103 @@ function TreeBase(props, ref) {
|
|
|
127
106
|
initialExpandedKeys: effectiveExpandedKeys ?? effectiveDefaultExpandedKeys
|
|
128
107
|
});
|
|
129
108
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* is `undefined` and would otherwise produce an empty `previous` set,
|
|
135
|
-
* mis-identifying every toggle.
|
|
136
|
-
*
|
|
137
|
-
* Must mirror what `useTreeState` was initialized with (the *effective*
|
|
138
|
-
* sets, which include `autoExpandParent` ancestors). Using the raw
|
|
139
|
-
* `defaultExpandedKeys` here would make the first toggle in uncontrolled
|
|
140
|
-
* mode diff against an undersized previous set, reporting auto-expanded
|
|
141
|
-
* ancestors as newly expanded.
|
|
109
|
+
* In controlled mode, `previous` is read from `effectiveExpandedKeys`;
|
|
110
|
+
* in uncontrolled mode this ref is the only source. Initialized from
|
|
111
|
+
* the *effective* (ancestor-expanded) keys so the first toggle diffs
|
|
112
|
+
* correctly.
|
|
142
113
|
*/
|
|
143
114
|
const previousExpandedRef = useRef(new Set(effectiveExpandedKeys ?? effectiveDefaultExpandedKeys ?? []));
|
|
144
|
-
/**
|
|
145
|
-
* Translate Stately's `Set<Key>` callbacks into the public AntD-flavoured
|
|
146
|
-
* `Key[]` shape and dispatch the per-key load.
|
|
147
|
-
*/
|
|
148
115
|
const handleExpandedChange = useEvent((nextSet) => {
|
|
149
116
|
loadDataController.onExpandedChanged(nextSet);
|
|
150
117
|
const previous = expandedKeys !== void 0 ? new Set(effectiveExpandedKeys ?? []) : previousExpandedRef.current;
|
|
151
118
|
previousExpandedRef.current = new Set(nextSet);
|
|
152
119
|
if (!onExpand) return;
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
toggledExpanded = true;
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
if (toggledKey == null) {
|
|
166
|
-
for (const k of previous) if (!nextSet.has(k)) {
|
|
167
|
-
toggledKey = k;
|
|
168
|
-
toggledExpanded = false;
|
|
169
|
-
break;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
const node = toggledKey != null ? nodesByKey.get(String(toggledKey)) : void 0;
|
|
173
|
-
onExpand(nextArr, {
|
|
174
|
-
expanded: toggledExpanded,
|
|
175
|
-
node: node ?? {}
|
|
176
|
-
});
|
|
120
|
+
const toggled = findToggledKey(previous, nextSet);
|
|
121
|
+
if (!toggled) return;
|
|
122
|
+
const node = nodesByKey.get(String(toggled.key));
|
|
123
|
+
if (!node) return;
|
|
124
|
+
const info = {
|
|
125
|
+
expanded: toggled.added,
|
|
126
|
+
node
|
|
127
|
+
};
|
|
128
|
+
onExpand(Array.from(nextSet), info);
|
|
177
129
|
});
|
|
130
|
+
/**
|
|
131
|
+
* Same pattern as `previousExpandedRef`: in controlled mode we read
|
|
132
|
+
* from `selectedKeys`; in uncontrolled mode this ref tracks state.
|
|
133
|
+
*/
|
|
134
|
+
const previousSelectionRef = useRef(new Set(selectedKeys ?? defaultSelectedKeys ?? []));
|
|
135
|
+
/**
|
|
136
|
+
* `useEvent` captures the closure lazily, so `state` (declared below
|
|
137
|
+
* `ariaProps` / `useTreeState`) is safely accessible at call time.
|
|
138
|
+
*/
|
|
178
139
|
const handleSelectionChange = useEvent((selection) => {
|
|
179
140
|
if (!onSelect) return;
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
} else {
|
|
196
|
-
toggledKey = arr[0] ?? null;
|
|
197
|
-
toggledSelected = true;
|
|
198
|
-
}
|
|
199
|
-
const node = toggledKey != null ? nodesByKey.get(String(toggledKey)) : void 0;
|
|
141
|
+
let arr;
|
|
142
|
+
if (selection === "all") {
|
|
143
|
+
arr = [];
|
|
144
|
+
for (const key of state.collection.getKeys()) {
|
|
145
|
+
const node = state.collection.getItem(key);
|
|
146
|
+
if (node && node.type === "item") arr.push(key);
|
|
147
|
+
}
|
|
148
|
+
} else arr = Array.from(selection);
|
|
149
|
+
const nextSet = new Set(arr);
|
|
150
|
+
const previous = selectedKeys !== void 0 ? new Set(selectedKeys ?? []) : previousSelectionRef.current;
|
|
151
|
+
previousSelectionRef.current = nextSet;
|
|
152
|
+
const toggled = findToggledKey(previous, nextSet);
|
|
153
|
+
if (!toggled) return;
|
|
154
|
+
const node = nodesByKey.get(String(toggled.key));
|
|
155
|
+
if (!node) return;
|
|
200
156
|
const selectedNodes = arr.map((k) => nodesByKey.get(String(k))).filter((n) => !!n);
|
|
201
|
-
|
|
202
|
-
selected:
|
|
203
|
-
node
|
|
157
|
+
const info = {
|
|
158
|
+
selected: toggled.added,
|
|
159
|
+
node,
|
|
204
160
|
selectedNodes
|
|
205
|
-
}
|
|
161
|
+
};
|
|
162
|
+
onSelect(arr, info);
|
|
206
163
|
});
|
|
207
|
-
|
|
208
|
-
* Stately propagates the `children` function through `childItems`,
|
|
209
|
-
* so a single render function recursively turns the entire
|
|
210
|
-
* `treeData` array into `<Item>` elements.
|
|
211
|
-
*/
|
|
212
|
-
const renderCollectionItem = useEvent((item) => renderItem(item));
|
|
164
|
+
const hasOnSelect = onSelect != null;
|
|
213
165
|
const ariaProps = useMemo(() => ({
|
|
214
166
|
selectionMode,
|
|
215
167
|
selectedKeys,
|
|
216
168
|
defaultSelectedKeys,
|
|
217
|
-
onSelectionChange:
|
|
169
|
+
onSelectionChange: hasOnSelect && selectionMode !== "none" ? handleSelectionChange : void 0,
|
|
218
170
|
expandedKeys: effectiveExpandedKeys,
|
|
219
171
|
defaultExpandedKeys: effectiveDefaultExpandedKeys,
|
|
220
172
|
onExpandedChange: handleExpandedChange,
|
|
221
173
|
disabledKeys,
|
|
222
174
|
disabledBehavior: "all",
|
|
223
175
|
items: treeData,
|
|
224
|
-
children:
|
|
225
|
-
"aria-label": "Tree"
|
|
176
|
+
children: renderItem,
|
|
177
|
+
"aria-label": ariaLabel ?? "Tree"
|
|
226
178
|
}), [
|
|
227
179
|
selectionMode,
|
|
228
180
|
selectedKeys,
|
|
229
181
|
defaultSelectedKeys,
|
|
230
|
-
|
|
182
|
+
hasOnSelect,
|
|
231
183
|
handleSelectionChange,
|
|
232
184
|
effectiveExpandedKeys,
|
|
233
185
|
effectiveDefaultExpandedKeys,
|
|
234
186
|
handleExpandedChange,
|
|
235
187
|
disabledKeys,
|
|
236
188
|
treeData,
|
|
237
|
-
|
|
189
|
+
ariaLabel
|
|
238
190
|
]);
|
|
239
191
|
const baseState = useTreeState(ariaProps);
|
|
240
|
-
/**
|
|
241
|
-
* The legacy `TreeCollection` returned by `useTreeState` doesn't
|
|
242
|
-
* implement `getChildren`, but `@react-aria/tree`'s `useTree`
|
|
243
|
-
* (via `useGridListItem`) calls it unguarded for any nested row
|
|
244
|
-
* (`node.level > 0`). Patch it once so `useTree` works on top of
|
|
245
|
-
* the legacy state without forking.
|
|
246
|
-
*/
|
|
247
192
|
const state = useMemo(() => {
|
|
248
193
|
const collection = baseState.collection;
|
|
249
194
|
if (typeof collection.getChildren === "function") return baseState;
|
|
250
|
-
const
|
|
251
|
-
|
|
195
|
+
const patched = Object.create(collection);
|
|
196
|
+
patched.getChildren = (key) => {
|
|
252
197
|
const node = collection.getItem(key);
|
|
253
|
-
|
|
254
|
-
for (const child of node.childNodes) result.push(child);
|
|
255
|
-
return result;
|
|
198
|
+
return node ? Array.from(node.childNodes) : [];
|
|
256
199
|
};
|
|
257
|
-
const patched = Object.assign(Object.create(Object.getPrototypeOf(collection)), collection, { getChildren });
|
|
258
200
|
return {
|
|
259
201
|
...baseState,
|
|
260
202
|
collection: patched
|
|
261
203
|
};
|
|
262
204
|
}, [baseState]);
|
|
263
205
|
const { gridProps } = useTree(ariaProps, state, treeRef);
|
|
264
|
-
/**
|
|
265
|
-
* Iterate the collection in DOM order. The TreeCollection only walks
|
|
266
|
-
* into expanded subtrees, so `getKeys()` already gives us *only*
|
|
267
|
-
* visible rows — no manual filtering required.
|
|
268
|
-
*/
|
|
269
206
|
const visibleNodes = useMemo(() => {
|
|
270
207
|
const out = [];
|
|
271
208
|
for (const key of state.collection.getKeys()) {
|
|
@@ -273,25 +210,18 @@ function TreeBase(props, ref) {
|
|
|
273
210
|
if (node && node.type === "item") out.push(node);
|
|
274
211
|
}
|
|
275
212
|
return out;
|
|
276
|
-
}, [state.collection
|
|
213
|
+
}, [state.collection]);
|
|
277
214
|
const heightStyle = useMemo(() => height != null ? { ["--tree-height"]: `${height}px` } : void 0, [height]);
|
|
278
215
|
const mods = useMemo(() => ({ "has-height": height != null }), [height]);
|
|
279
|
-
/**
|
|
280
|
-
* Merge the consumer's forwarded ref with our internal `treeRef`. Both
|
|
281
|
-
* must point at the same DOM node: `useTree` reads `treeRef.current` for
|
|
282
|
-
* keyboard navigation/focus management, and consumers expect the
|
|
283
|
-
* forwarded `ref` to receive the element too.
|
|
284
|
-
*/
|
|
285
|
-
const mergedRef = useMemo(() => mergeRefs(ref, treeRef), [ref]);
|
|
286
216
|
return /* @__PURE__ */ jsx(TreeElement, {
|
|
287
|
-
...mergeProps$1(gridProps, { ref:
|
|
288
|
-
ref: mergedRef,
|
|
217
|
+
...mergeProps$1(gridProps, { ref: useMemo(() => mergeRefs(ref, treeRef), [ref, treeRef]) }),
|
|
289
218
|
qa: qa ?? "Tree",
|
|
290
219
|
mods,
|
|
291
220
|
styles: baseStyles,
|
|
292
221
|
style: heightStyle,
|
|
293
222
|
children: visibleNodes.map((node) => {
|
|
294
|
-
const
|
|
223
|
+
const keyStr = String(node.key);
|
|
224
|
+
const data = nodesByKey.get(keyStr);
|
|
295
225
|
if (!data) return null;
|
|
296
226
|
return /* @__PURE__ */ jsx(TreeNode, {
|
|
297
227
|
node,
|
|
@@ -299,10 +229,9 @@ function TreeBase(props, ref) {
|
|
|
299
229
|
state,
|
|
300
230
|
isCheckable,
|
|
301
231
|
isExpanded: state.expandedKeys.has(node.key),
|
|
302
|
-
isChecked: checkbox.checkedSet.has(
|
|
303
|
-
isIndeterminate: checkbox.halfCheckedSet.has(
|
|
304
|
-
isLoading: loadDataController.loadingKeys.has(
|
|
305
|
-
isBlockNode: blockNode,
|
|
232
|
+
isChecked: checkbox.checkedSet.has(keyStr),
|
|
233
|
+
isIndeterminate: checkbox.halfCheckedSet.has(keyStr),
|
|
234
|
+
isLoading: loadDataController.loadingKeys.has(keyStr),
|
|
306
235
|
rowStyles,
|
|
307
236
|
onToggleChecked: checkbox.toggle
|
|
308
237
|
}, node.key);
|
|
@@ -310,6 +239,7 @@ function TreeBase(props, ref) {
|
|
|
310
239
|
});
|
|
311
240
|
}
|
|
312
241
|
const _Tree = forwardRef(TreeBase);
|
|
242
|
+
_Tree.displayName = "Tree";
|
|
313
243
|
/**
|
|
314
244
|
* Hierarchical data display with optional checkboxes, single/multi
|
|
315
245
|
* selection, async lazy loading, and keyboard navigation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.js","names":["mergeProps"],"sources":["../../../../src/components/content/Tree/Tree.tsx"],"sourcesContent":["import { OUTER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef } from 'react';\nimport { useTree } from 'react-aria';\nimport { Item, useTreeState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { mergeProps, mergeRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { TreeElement } from './styled';\nimport { buildTreeIndex } from './tree-index';\nimport { TreeNode } from './TreeNode';\nimport { useCheckboxTree } from './use-checkbox-tree';\nimport { useLoadData } from './use-load-data';\n\nimport type { Key, Node, Selection } from '@react-types/shared';\nimport type { CSSProperties, ForwardedRef, ReactElement } from 'react';\nimport type {\n CubeTreeNodeData,\n CubeTreeProps,\n TreeOnExpandInfo,\n TreeOnSelectInfo,\n TreeSelectionMode,\n} from './types';\n\n/**\n * Render an `<Item>` for React Stately's collection builder.\n *\n * The visible row content is rendered by `TreeNode` via a\n * `nodesByKey` lookup, so the `<Item>`'s body is only used by\n * Stately to build the collection (`textValue` for keyboard nav,\n * `childItems` for nested traversal).\n *\n * For nested traversal to work, the `children` of the `<Tree>` must\n * be passed as a *function* together with the top-level `items`\n * array — see the `<Tree>` `useCollection` call below. Stately\n * propagates that renderer into `childItems` so nested arrays of\n * raw `CubeTreeNodeData` are turned back into `<Item>` elements.\n */\nfunction renderItem(node: CubeTreeNodeData): ReactElement {\n const textValue =\n typeof node.title === 'string' ? node.title : String(node.key);\n return (\n <Item\n key={node.key}\n textValue={textValue}\n childItems={node.children as CubeTreeNodeData[] | undefined}\n >\n {node.title as any}\n </Item>\n );\n}\n\n/** Walk the treeData and collect all keys whose `isDisabled === true`. */\nfunction collectDisabledKeys(\n treeData: CubeTreeNodeData[],\n treeIsDisabled: boolean,\n): string[] {\n const keys: string[] = [];\n const visit = (nodes: CubeTreeNodeData[]) => {\n for (const node of nodes) {\n if (treeIsDisabled || node.isDisabled) keys.push(node.key);\n if (node.children) visit(node.children);\n }\n };\n visit(treeData);\n return keys;\n}\n\n/**\n * Expand the supplied keys with all of their ancestors. Used when\n * `autoExpandParent` is `true` so that the consumer can pass deep keys\n * (e.g. search matches) without having to manually walk parents.\n */\nfunction expandWithParents(\n keys: string[] | undefined,\n parentOf: Map<string, string | null>,\n): string[] | undefined {\n if (!keys || keys.length === 0) return keys;\n const set = new Set<string>(keys);\n for (const key of keys) {\n let parent = parentOf.get(key);\n while (parent) {\n set.add(parent);\n parent = parentOf.get(parent);\n }\n }\n return Array.from(set);\n}\n\n/**\n * Coerce the public `selectionMode` / `isSelectable` pair into a single\n * `selectionMode` value for `useTreeState`.\n *\n * - `selectionMode` wins when both are passed.\n * - `isSelectable === false` is sugar for `selectionMode='none'`.\n * - `selectionMode` defaults to `'single'` (matches AntD's default).\n */\nfunction resolveSelectionMode(\n selectionMode: TreeSelectionMode | undefined,\n isSelectable: boolean | undefined,\n): TreeSelectionMode {\n if (selectionMode != null) return selectionMode;\n if (isSelectable === false) return 'none';\n return 'single';\n}\n\nfunction TreeBase(props: CubeTreeProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n treeData,\n isCheckable = false,\n isSelectable,\n selectionMode: selectionModeProp,\n blockNode = false,\n isDisabled = false,\n defaultExpandedKeys,\n expandedKeys,\n autoExpandParent = false,\n defaultCheckedKeys,\n checkedKeys,\n defaultSelectedKeys,\n selectedKeys,\n height,\n loadData,\n onExpand,\n onCheck,\n onSelect,\n rowStyles,\n qa,\n ...otherProps\n } = props;\n\n const baseStyles = extractStyles(otherProps, OUTER_STYLES);\n\n const treeRef = useRef<HTMLDivElement>(null);\n\n /**\n * Single tree walk that produces `byKey`, `parentOf`, and `childrenOf`.\n * Shared with `useCheckboxTree` so a `treeData` change triggers exactly\n * one walk (instead of three) for these three maps.\n */\n const treeIndex = useMemo(() => buildTreeIndex(treeData), [treeData]);\n const nodesByKey = treeIndex.byKey;\n const parentOf = treeIndex.parentOf;\n\n const disabledKeys = useMemo(\n () => collectDisabledKeys(treeData, isDisabled),\n [treeData, isDisabled],\n );\n\n const selectionMode = resolveSelectionMode(selectionModeProp, isSelectable);\n\n /**\n * Apply `autoExpandParent` to the controlled `expandedKeys`. This is\n * a one-shot thing — once the consumer responds to `onExpand` and\n * sets `autoExpandParent` to `false`, we stop force-expanding parents.\n */\n const effectiveExpandedKeys = useMemo(\n () =>\n autoExpandParent\n ? expandWithParents(expandedKeys, parentOf)\n : expandedKeys,\n [autoExpandParent, expandedKeys, parentOf],\n );\n\n /**\n * Mirror the same logic for the uncontrolled `defaultExpandedKeys`.\n * `useTreeState` only reads it on mount, but we still need to expand\n * ancestors so consumers passing a deep key (e.g. a search match) get\n * the same behaviour as in the controlled mode.\n */\n const effectiveDefaultExpandedKeys = useMemo(\n () =>\n autoExpandParent\n ? expandWithParents(defaultExpandedKeys, parentOf)\n : defaultExpandedKeys,\n [autoExpandParent, defaultExpandedKeys, parentOf],\n );\n\n const checkbox = useCheckboxTree({\n treeData,\n index: treeIndex,\n isCheckable,\n defaultCheckedKeys,\n checkedKeys,\n onCheck,\n });\n\n const loadDataController = useLoadData({\n nodesByKey,\n loadData,\n initialExpandedKeys: effectiveExpandedKeys ?? effectiveDefaultExpandedKeys,\n });\n\n /**\n * Tracks the previously-expanded set so we can diff against the next set\n * inside `handleExpandedChange`. In controlled mode the parent owns the\n * truth (read from `effectiveExpandedKeys`); in uncontrolled mode this\n * ref is the only source for the previous state — `effectiveExpandedKeys`\n * is `undefined` and would otherwise produce an empty `previous` set,\n * mis-identifying every toggle.\n *\n * Must mirror what `useTreeState` was initialized with (the *effective*\n * sets, which include `autoExpandParent` ancestors). Using the raw\n * `defaultExpandedKeys` here would make the first toggle in uncontrolled\n * mode diff against an undersized previous set, reporting auto-expanded\n * ancestors as newly expanded.\n */\n const previousExpandedRef = useRef<Set<Key>>(\n new Set<Key>(effectiveExpandedKeys ?? effectiveDefaultExpandedKeys ?? []),\n );\n\n /**\n * Translate Stately's `Set<Key>` callbacks into the public AntD-flavoured\n * `Key[]` shape and dispatch the per-key load.\n */\n const handleExpandedChange = useEvent((nextSet: Set<Key>) => {\n loadDataController.onExpandedChanged(nextSet);\n\n const previous =\n expandedKeys !== undefined\n ? new Set<Key>(effectiveExpandedKeys ?? [])\n : previousExpandedRef.current;\n previousExpandedRef.current = new Set<Key>(nextSet);\n\n if (!onExpand) return;\n const nextArr: Key[] = Array.from(nextSet);\n\n /**\n * Find the single key that toggled relative to the previous set.\n * Useful for `info.node` and `info.expanded` — matches AntD.\n */\n let toggledKey: Key | null = null;\n let toggledExpanded = false;\n for (const k of nextArr) {\n if (!previous.has(k)) {\n toggledKey = k;\n toggledExpanded = true;\n break;\n }\n }\n if (toggledKey == null) {\n for (const k of previous) {\n if (!nextSet.has(k)) {\n toggledKey = k;\n toggledExpanded = false;\n break;\n }\n }\n }\n\n const node =\n toggledKey != null ? nodesByKey.get(String(toggledKey)) : undefined;\n const info: TreeOnExpandInfo = {\n expanded: toggledExpanded,\n node: node ?? ({} as CubeTreeNodeData),\n };\n onExpand(nextArr, info);\n });\n\n const handleSelectionChange = useEvent((selection: Selection) => {\n if (!onSelect) return;\n const arr: Key[] =\n selection === 'all'\n ? Array.from(nodesByKey.keys())\n : Array.from(selection);\n /**\n * Stately's `onSelectionChange` hands us the *next* selection only —\n * we don't get a \"toggled key\" diff for free. For `single` mode we\n * can infer it cheaply (it's the only entry); for `multiple` we\n * report the most recent addition. Falls back to the first key.\n */\n let toggledKey: Key | null = null;\n let toggledSelected = false;\n if (selectionMode === 'single') {\n toggledKey = arr[0] ?? null;\n toggledSelected = arr.length > 0;\n } else if (selection !== 'all') {\n toggledKey = arr.length > 0 ? arr[arr.length - 1] : null;\n toggledSelected = arr.length > 0;\n } else {\n toggledKey = arr[0] ?? null;\n toggledSelected = true;\n }\n\n const node =\n toggledKey != null ? nodesByKey.get(String(toggledKey)) : undefined;\n const selectedNodes = arr\n .map((k) => nodesByKey.get(String(k)))\n .filter((n): n is CubeTreeNodeData => !!n);\n\n const info: TreeOnSelectInfo = {\n selected: toggledSelected,\n node: node ?? ({} as CubeTreeNodeData),\n selectedNodes,\n };\n\n onSelect(arr, info);\n });\n\n /**\n * Stately propagates the `children` function through `childItems`,\n * so a single render function recursively turns the entire\n * `treeData` array into `<Item>` elements.\n */\n const renderCollectionItem = useEvent((item: CubeTreeNodeData) =>\n renderItem(item),\n );\n\n const ariaProps = useMemo(\n () => ({\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange:\n onSelect && selectionMode !== 'none'\n ? handleSelectionChange\n : undefined,\n expandedKeys: effectiveExpandedKeys,\n defaultExpandedKeys: effectiveDefaultExpandedKeys,\n onExpandedChange: handleExpandedChange,\n disabledKeys,\n disabledBehavior: 'all' as const,\n items: treeData,\n children: renderCollectionItem as any,\n 'aria-label': 'Tree',\n }),\n [\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n onSelect,\n handleSelectionChange,\n effectiveExpandedKeys,\n effectiveDefaultExpandedKeys,\n handleExpandedChange,\n disabledKeys,\n treeData,\n renderCollectionItem,\n ],\n );\n\n const baseState = useTreeState<CubeTreeNodeData>(ariaProps);\n\n /**\n * The legacy `TreeCollection` returned by `useTreeState` doesn't\n * implement `getChildren`, but `@react-aria/tree`'s `useTree`\n * (via `useGridListItem`) calls it unguarded for any nested row\n * (`node.level > 0`). Patch it once so `useTree` works on top of\n * the legacy state without forking.\n */\n const state = useMemo(() => {\n const collection = baseState.collection;\n if (typeof (collection as any).getChildren === 'function') {\n return baseState;\n }\n const getChildren = (key: Key): Iterable<Node<CubeTreeNodeData>> => {\n const result: Node<CubeTreeNodeData>[] = [];\n const node = collection.getItem(key);\n if (!node) return result;\n for (const child of node.childNodes) {\n result.push(child);\n }\n return result;\n };\n const patched = Object.assign(\n Object.create(Object.getPrototypeOf(collection)),\n collection,\n { getChildren },\n );\n return { ...baseState, collection: patched };\n }, [baseState]);\n\n const { gridProps } = useTree(ariaProps, state, treeRef);\n\n /**\n * Iterate the collection in DOM order. The TreeCollection only walks\n * into expanded subtrees, so `getKeys()` already gives us *only*\n * visible rows — no manual filtering required.\n */\n const visibleNodes: Node<CubeTreeNodeData>[] = useMemo(() => {\n const out: Node<CubeTreeNodeData>[] = [];\n for (const key of state.collection.getKeys()) {\n const node = state.collection.getItem(key);\n if (node && node.type === 'item') out.push(node);\n }\n return out;\n }, [state.collection, state.expandedKeys]);\n\n const heightStyle = useMemo<CSSProperties | undefined>(\n () =>\n height != null\n ? ({\n ['--tree-height' as keyof CSSProperties]: `${height}px`,\n } as CSSProperties)\n : undefined,\n [height],\n );\n\n const mods = useMemo(\n () => ({\n 'has-height': height != null,\n }),\n [height],\n );\n\n /**\n * Merge the consumer's forwarded ref with our internal `treeRef`. Both\n * must point at the same DOM node: `useTree` reads `treeRef.current` for\n * keyboard navigation/focus management, and consumers expect the\n * forwarded `ref` to receive the element too.\n */\n const mergedRef = useMemo(() => mergeRefs(ref, treeRef), [ref]);\n\n const elementProps = mergeProps(gridProps, {\n ref: mergedRef,\n });\n\n return (\n <TreeElement\n {...elementProps}\n ref={mergedRef}\n qa={qa ?? 'Tree'}\n mods={mods}\n styles={baseStyles}\n style={heightStyle}\n >\n {visibleNodes.map((node) => {\n const data = nodesByKey.get(String(node.key));\n if (!data) return null;\n const isExpanded = state.expandedKeys.has(node.key);\n return (\n <TreeNode\n key={node.key}\n node={node}\n data={data}\n state={state}\n isCheckable={isCheckable}\n isExpanded={isExpanded}\n isChecked={checkbox.checkedSet.has(String(node.key))}\n isIndeterminate={checkbox.halfCheckedSet.has(String(node.key))}\n isLoading={loadDataController.loadingKeys.has(String(node.key))}\n isBlockNode={blockNode}\n rowStyles={rowStyles}\n onToggleChecked={checkbox.toggle}\n />\n );\n })}\n </TreeElement>\n );\n}\n\nconst _Tree = forwardRef(TreeBase);\n\n/**\n * Hierarchical data display with optional checkboxes, single/multi\n * selection, async lazy loading, and keyboard navigation.\n *\n * Built on `useTree` / `useTreeState` (React Aria + React Stately) and\n * styled with Tasty.\n *\n * @example\n * ```tsx\n * <Tree\n * treeData={data}\n * isCheckable\n * selectionMode=\"none\"\n * defaultExpandedKeys={['root']}\n * onCheck={(keys) => console.log(keys)}\n * />\n * ```\n */\nexport const Tree = _Tree;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tree.js","names":["mergeProps"],"sources":["../../../../src/components/content/Tree/Tree.tsx"],"sourcesContent":["import { OUTER_STYLES } from '@tenphi/tasty';\nimport { forwardRef, useMemo, useRef } from 'react';\nimport { useTree } from 'react-aria';\nimport { Item, useTreeState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { mergeProps, mergeRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { TreeElement } from './styled';\nimport { buildTreeIndex } from './tree-index';\nimport { TreeNode } from './TreeNode';\nimport { useCheckboxTree } from './use-checkbox-tree';\nimport { useLoadData } from './use-load-data';\n\nimport type { Key, Node, Selection } from '@react-types/shared';\nimport type {\n CSSProperties,\n ForwardedRef,\n ReactElement,\n ReactNode,\n} from 'react';\nimport type {\n CubeTreeNodeData,\n CubeTreeProps,\n TreeOnExpandInfo,\n TreeOnSelectInfo,\n TreeSelectionMode,\n} from './types';\n\n/**\n * Render an `<Item>` for React Stately's collection builder.\n *\n * The visible content is rendered by `TreeNode` via `nodesByKey`,\n * so `<Item>`'s body is only used by Stately for the collection\n * (`textValue` for keyboard nav, `childItems` for nested traversal).\n */\nfunction renderItem(node: CubeTreeNodeData): ReactElement {\n const textValue =\n typeof node.title === 'string' ? node.title : String(node.key);\n return (\n <Item\n key={node.key}\n textValue={textValue}\n childItems={node.children as CubeTreeNodeData[] | undefined}\n >\n {node.title as ReactNode}\n </Item>\n );\n}\n\nfunction collectDisabledKeys(\n treeData: CubeTreeNodeData[],\n treeIsDisabled: boolean,\n): string[] {\n const keys: string[] = [];\n const visit = (nodes: CubeTreeNodeData[]) => {\n for (const node of nodes) {\n if (treeIsDisabled || node.isDisabled) keys.push(node.key);\n if (node.children) visit(node.children);\n }\n };\n visit(treeData);\n return keys;\n}\n\n/** Expand the supplied keys with all of their ancestor keys. */\nfunction expandWithParents(\n keys: string[] | undefined,\n parentOf: Map<string, string | null>,\n): string[] | undefined {\n if (!keys || keys.length === 0) return keys;\n const set = new Set<string>(keys);\n for (const key of keys) {\n let parent = parentOf.get(key);\n while (parent) {\n set.add(parent);\n parent = parentOf.get(parent);\n }\n }\n return Array.from(set);\n}\n\n/**\n * Diff two key sets to find the single key that was added or removed.\n * Returns `null` when both sets are equal.\n */\nfunction findToggledKey(\n previous: Set<Key>,\n next: Set<Key>,\n): { key: Key; added: boolean } | null {\n for (const k of next) {\n if (!previous.has(k)) return { key: k, added: true };\n }\n for (const k of previous) {\n if (!next.has(k)) return { key: k, added: false };\n }\n return null;\n}\n\nfunction resolveSelectionMode(\n selectionMode: TreeSelectionMode | undefined,\n isSelectable: boolean | undefined,\n): TreeSelectionMode {\n if (selectionMode != null) return selectionMode;\n if (isSelectable === false) return 'none';\n return 'single';\n}\n\nfunction TreeBase(props: CubeTreeProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n treeData,\n isCheckable = false,\n isSelectable,\n selectionMode: selectionModeProp,\n isDisabled = false,\n defaultExpandedKeys,\n expandedKeys,\n autoExpandParent = false,\n defaultCheckedKeys,\n checkedKeys,\n defaultSelectedKeys,\n selectedKeys,\n height,\n loadData,\n onExpand,\n onCheck,\n onSelect,\n rowStyles,\n ariaLabel,\n qa,\n ...otherProps\n } = props;\n\n const baseStyles = extractStyles(otherProps, OUTER_STYLES);\n\n const treeRef = useRef<HTMLDivElement>(null);\n\n const treeIndex = useMemo(() => buildTreeIndex(treeData), [treeData]);\n const nodesByKey = treeIndex.byKey;\n const parentOf = treeIndex.parentOf;\n\n const disabledKeys = useMemo(\n () => collectDisabledKeys(treeData, isDisabled),\n [treeData, isDisabled],\n );\n\n const selectionMode = resolveSelectionMode(selectionModeProp, isSelectable);\n\n const effectiveExpandedKeys = useMemo(\n () =>\n autoExpandParent\n ? expandWithParents(expandedKeys, parentOf)\n : expandedKeys,\n [autoExpandParent, expandedKeys, parentOf],\n );\n\n const effectiveDefaultExpandedKeys = useMemo(\n () =>\n autoExpandParent\n ? expandWithParents(defaultExpandedKeys, parentOf)\n : defaultExpandedKeys,\n [autoExpandParent, defaultExpandedKeys, parentOf],\n );\n\n const checkbox = useCheckboxTree({\n treeData,\n index: treeIndex,\n isCheckable,\n defaultCheckedKeys,\n checkedKeys,\n onCheck,\n });\n\n const loadDataController = useLoadData({\n nodesByKey,\n loadData,\n initialExpandedKeys: effectiveExpandedKeys ?? effectiveDefaultExpandedKeys,\n });\n\n /**\n * In controlled mode, `previous` is read from `effectiveExpandedKeys`;\n * in uncontrolled mode this ref is the only source. Initialized from\n * the *effective* (ancestor-expanded) keys so the first toggle diffs\n * correctly.\n */\n const previousExpandedRef = useRef<Set<Key>>(\n new Set<Key>(effectiveExpandedKeys ?? effectiveDefaultExpandedKeys ?? []),\n );\n\n const handleExpandedChange = useEvent((nextSet: Set<Key>) => {\n loadDataController.onExpandedChanged(nextSet);\n\n const previous =\n expandedKeys !== undefined\n ? new Set<Key>(effectiveExpandedKeys ?? [])\n : previousExpandedRef.current;\n previousExpandedRef.current = new Set<Key>(nextSet);\n\n if (!onExpand) return;\n\n const toggled = findToggledKey(previous, nextSet);\n if (!toggled) return;\n\n const node = nodesByKey.get(String(toggled.key));\n if (!node) return;\n\n const info: TreeOnExpandInfo = {\n expanded: toggled.added,\n node,\n };\n onExpand(Array.from(nextSet), info);\n });\n\n /**\n * Same pattern as `previousExpandedRef`: in controlled mode we read\n * from `selectedKeys`; in uncontrolled mode this ref tracks state.\n */\n const previousSelectionRef = useRef<Set<Key>>(\n new Set<Key>(selectedKeys ?? defaultSelectedKeys ?? []),\n );\n\n /**\n * `useEvent` captures the closure lazily, so `state` (declared below\n * `ariaProps` / `useTreeState`) is safely accessible at call time.\n */\n const handleSelectionChange = useEvent((selection: Selection) => {\n if (!onSelect) return;\n let arr: Key[];\n if (selection === 'all') {\n // `nodesByKey` contains the full tree; use the collection's visible\n // keys so we don't leak keys under collapsed parents.\n arr = [];\n for (const key of state.collection.getKeys()) {\n const node = state.collection.getItem(key);\n if (node && node.type === 'item') arr.push(key);\n }\n } else {\n arr = Array.from(selection);\n }\n\n const nextSet = new Set<Key>(arr);\n const previous =\n selectedKeys !== undefined\n ? new Set<Key>(selectedKeys ?? [])\n : previousSelectionRef.current;\n previousSelectionRef.current = nextSet;\n\n const toggled = findToggledKey(previous, nextSet);\n if (!toggled) return;\n\n const node = nodesByKey.get(String(toggled.key));\n if (!node) return;\n\n const selectedNodes = arr\n .map((k) => nodesByKey.get(String(k)))\n .filter((n): n is CubeTreeNodeData => !!n);\n\n const info: TreeOnSelectInfo = {\n selected: toggled.added,\n node,\n selectedNodes,\n };\n\n onSelect(arr, info);\n });\n\n const hasOnSelect = onSelect != null;\n\n const ariaProps = useMemo(\n () => ({\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange:\n hasOnSelect && selectionMode !== 'none'\n ? handleSelectionChange\n : undefined,\n expandedKeys: effectiveExpandedKeys,\n defaultExpandedKeys: effectiveDefaultExpandedKeys,\n onExpandedChange: handleExpandedChange,\n disabledKeys,\n disabledBehavior: 'all' as const,\n items: treeData,\n children: renderItem as any,\n 'aria-label': ariaLabel ?? 'Tree',\n }),\n [\n selectionMode,\n selectedKeys,\n defaultSelectedKeys,\n hasOnSelect,\n handleSelectionChange,\n effectiveExpandedKeys,\n effectiveDefaultExpandedKeys,\n handleExpandedChange,\n disabledKeys,\n treeData,\n ariaLabel,\n ],\n );\n\n const baseState = useTreeState<CubeTreeNodeData>(ariaProps);\n\n // The legacy `TreeCollection` from `useTreeState` lacks `getChildren`,\n // but `useTree` calls it for nested rows. Derive a patched state.\n // TODO: Remove this patch when upgrading to a react-stately version\n // that ships `getChildren` on TreeCollection natively.\n const state = useMemo(() => {\n const collection = baseState.collection;\n if (typeof (collection as any).getChildren === 'function') {\n return baseState;\n }\n const patched = Object.create(collection);\n patched.getChildren = (key: Key): Iterable<Node<CubeTreeNodeData>> => {\n const node = collection.getItem(key);\n return node ? Array.from(node.childNodes) : [];\n };\n return { ...baseState, collection: patched };\n }, [baseState]);\n\n const { gridProps } = useTree(ariaProps, state, treeRef);\n\n const visibleNodes: Node<CubeTreeNodeData>[] = useMemo(() => {\n const out: Node<CubeTreeNodeData>[] = [];\n for (const key of state.collection.getKeys()) {\n const node = state.collection.getItem(key);\n if (node && node.type === 'item') out.push(node);\n }\n return out;\n }, [state.collection]);\n\n const heightStyle = useMemo<CSSProperties | undefined>(\n () =>\n height != null\n ? ({\n ['--tree-height' as keyof CSSProperties]: `${height}px`,\n } as CSSProperties)\n : undefined,\n [height],\n );\n\n const mods = useMemo(\n () => ({\n 'has-height': height != null,\n }),\n [height],\n );\n\n // Both `useTree` and the consumer need the same DOM node.\n const mergedRef = useMemo(() => mergeRefs(ref, treeRef), [ref, treeRef]);\n\n const elementProps = mergeProps(gridProps, {\n ref: mergedRef,\n });\n\n return (\n <TreeElement\n {...elementProps}\n qa={qa ?? 'Tree'}\n mods={mods}\n styles={baseStyles}\n style={heightStyle}\n >\n {visibleNodes.map((node) => {\n const keyStr = String(node.key);\n const data = nodesByKey.get(keyStr);\n if (!data) return null;\n return (\n <TreeNode\n key={node.key}\n node={node}\n data={data}\n state={state}\n isCheckable={isCheckable}\n isExpanded={state.expandedKeys.has(node.key)}\n isChecked={checkbox.checkedSet.has(keyStr)}\n isIndeterminate={checkbox.halfCheckedSet.has(keyStr)}\n isLoading={loadDataController.loadingKeys.has(keyStr)}\n rowStyles={rowStyles}\n onToggleChecked={checkbox.toggle}\n />\n );\n })}\n </TreeElement>\n );\n}\n\nconst _Tree = forwardRef(TreeBase);\n_Tree.displayName = 'Tree';\n\n/**\n * Hierarchical data display with optional checkboxes, single/multi\n * selection, async lazy loading, and keyboard navigation.\n *\n * Built on `useTree` / `useTreeState` (React Aria + React Stately) and\n * styled with Tasty.\n *\n * @example\n * ```tsx\n * <Tree\n * treeData={data}\n * isCheckable\n * selectionMode=\"none\"\n * defaultExpandedKeys={['root']}\n * onCheck={(keys) => console.log(keys)}\n * />\n * ```\n */\nexport const Tree = _Tree;\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-2256c47 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { LoadingIcon } from "../../../icons/LoadingIcon.js";
|
|
@@ -10,102 +10,55 @@ import { jsx } from "react/jsx-runtime";
|
|
|
10
10
|
import { useHover, useTreeItem } from "react-aria";
|
|
11
11
|
|
|
12
12
|
//#region src/components/content/Tree/TreeNode.tsx
|
|
13
|
-
const
|
|
13
|
+
const stopPropagation = (e) => {
|
|
14
|
+
e.stopPropagation();
|
|
15
|
+
};
|
|
14
16
|
function TreeNodeInner(props) {
|
|
15
|
-
const { node, data, state, isCheckable, isExpanded, isIndeterminate, isChecked, isLoading,
|
|
17
|
+
const { node, data, state, isCheckable, isExpanded, isIndeterminate, isChecked, isLoading, onToggleChecked, rowStyles } = props;
|
|
16
18
|
const rowRef = useRef(null);
|
|
17
19
|
const { rowProps, gridCellProps, expandButtonProps, isPressed } = useTreeItem({ node }, state, rowRef);
|
|
18
20
|
const isDisabled = state.disabledKeys.has(node.key);
|
|
19
21
|
const isSelected = state.selectionManager.isSelected(node.key);
|
|
20
|
-
/**
|
|
21
|
-
* `useTreeItem` doesn't track hover. The `Item` variant we extend
|
|
22
|
-
* (`default.item`) uses the `hovered` mod (compiled to
|
|
23
|
-
* `[data-hovered]`), so we run `useHover` ourselves and wire its
|
|
24
|
-
* `hoverProps` into the row.
|
|
25
|
-
*/
|
|
26
22
|
const { hoverProps, isHovered } = useHover({ isDisabled });
|
|
27
|
-
/**
|
|
28
|
-
* React Aria uses a roving-tabindex "virtual focus" model for treegrid:
|
|
29
|
-
* only the row matching `selectionManager.focusedKey` is tabbable, and
|
|
30
|
-
* arrow-key navigation updates that key instead of moving DOM focus
|
|
31
|
-
* between every row. No `data-focused` / `:focus-visible` lands on the
|
|
32
|
-
* row, so we mirror the focused key as a `focused` mod on the item
|
|
33
|
-
* to make it stylable.
|
|
34
|
-
*/
|
|
35
23
|
const isFocused = state.selectionManager.isFocused && state.selectionManager.focusedKey === node.key;
|
|
36
|
-
/**
|
|
37
|
-
* `useTreeItem` reports `aria-expanded` only on rows that *can* expand
|
|
38
|
-
* (i.e. have child nodes in the collection). For lazy rows with no
|
|
39
|
-
* children loaded yet but `isLeaf !== true`, we still want to render
|
|
40
|
-
* a toggle so the consumer can fire `loadData`.
|
|
41
|
-
*/
|
|
42
24
|
const isLeaf = data.isLeaf === true || data.isLeaf !== false && !node.hasChildNodes;
|
|
43
25
|
const isRowCheckable = isCheckable && data.isCheckable !== false;
|
|
44
|
-
const handleCheckboxClick = useEvent((e) => {
|
|
45
|
-
e.stopPropagation();
|
|
46
|
-
});
|
|
47
26
|
const handleCheckboxChange = useEvent(() => {
|
|
48
27
|
onToggleChecked(String(node.key));
|
|
49
28
|
});
|
|
50
|
-
const
|
|
29
|
+
const sharedMods = useMemo(() => ({
|
|
51
30
|
checked: isChecked,
|
|
52
31
|
indeterminate: isIndeterminate,
|
|
53
32
|
expanded: isExpanded,
|
|
54
|
-
disabled: isDisabled,
|
|
55
33
|
loading: isLoading,
|
|
56
34
|
leaf: isLeaf,
|
|
57
|
-
"block-node": isBlockNode,
|
|
58
35
|
"has-checkbox": isRowCheckable
|
|
59
36
|
}), [
|
|
60
37
|
isChecked,
|
|
61
38
|
isIndeterminate,
|
|
62
39
|
isExpanded,
|
|
63
|
-
isDisabled,
|
|
64
40
|
isLoading,
|
|
65
41
|
isLeaf,
|
|
66
|
-
isBlockNode,
|
|
67
42
|
isRowCheckable
|
|
68
43
|
]);
|
|
44
|
+
const rowMods = useMemo(() => ({
|
|
45
|
+
...sharedMods,
|
|
46
|
+
disabled: isDisabled
|
|
47
|
+
}), [sharedMods, isDisabled]);
|
|
69
48
|
const itemMods = useMemo(() => ({
|
|
70
|
-
|
|
71
|
-
indeterminate: isIndeterminate,
|
|
72
|
-
expanded: isExpanded,
|
|
73
|
-
loading: isLoading,
|
|
74
|
-
leaf: isLeaf,
|
|
49
|
+
...sharedMods,
|
|
75
50
|
focused: isFocused,
|
|
76
51
|
hovered: isHovered,
|
|
77
|
-
pressed: isPressed
|
|
78
|
-
"has-checkbox": isRowCheckable
|
|
52
|
+
pressed: isPressed
|
|
79
53
|
}), [
|
|
80
|
-
|
|
81
|
-
isIndeterminate,
|
|
82
|
-
isExpanded,
|
|
83
|
-
isLoading,
|
|
84
|
-
isLeaf,
|
|
54
|
+
sharedMods,
|
|
85
55
|
isFocused,
|
|
86
56
|
isHovered,
|
|
87
|
-
isPressed
|
|
88
|
-
isRowCheckable
|
|
57
|
+
isPressed
|
|
89
58
|
]);
|
|
90
|
-
|
|
91
|
-
* Indent each row by its depth. `node.level` is 0-based at the root.
|
|
92
|
-
* Pushed down via a CSS custom property so the styled element can
|
|
93
|
-
* compute padding without re-extracting styles per row.
|
|
94
|
-
*/
|
|
95
|
-
const levelStyle = useMemo(() => ({ ["--tree-level"]: String((node.level ?? ROW_LEVEL_OFFSET) - ROW_LEVEL_OFFSET) }), [node.level]);
|
|
96
|
-
/**
|
|
97
|
-
* `aria-checked` for treegrid rows that act as multi-state checkboxes.
|
|
98
|
-
* Only set when the tree is checkable, so we don't pollute the row
|
|
99
|
-
* with checkbox semantics in select-only mode.
|
|
100
|
-
*/
|
|
59
|
+
const levelStyle = useMemo(() => ({ ["--tree-level"]: String(node.level ?? 0) }), [node.level]);
|
|
101
60
|
const ariaChecked = isRowCheckable ? isIndeterminate ? "mixed" : isChecked ? "true" : "false" : void 0;
|
|
102
61
|
const finalRowProps = mergeProps$1(rowProps, hoverProps, { "aria-checked": ariaChecked });
|
|
103
|
-
/**
|
|
104
|
-
* Always render a toggle slot — even for leaf rows — so siblings
|
|
105
|
-
* at the same indent level visually align. Leaves get a
|
|
106
|
-
* non-interactive placeholder (a plain div) so user clicks can't
|
|
107
|
-
* trigger anything.
|
|
108
|
-
*/
|
|
109
62
|
const toggleNode = isLeaf ? /* @__PURE__ */ jsx(TreeNodeTogglePlaceholder, {
|
|
110
63
|
"aria-hidden": true,
|
|
111
64
|
"data-element": "Toggle"
|
|
@@ -118,8 +71,8 @@ function TreeNodeInner(props) {
|
|
|
118
71
|
const checkboxNode = isRowCheckable ? /* @__PURE__ */ jsx(TreeNodeCheckboxWrapper, {
|
|
119
72
|
"data-element": "Checkbox",
|
|
120
73
|
role: "presentation",
|
|
121
|
-
onClick:
|
|
122
|
-
onKeyDown:
|
|
74
|
+
onClick: stopPropagation,
|
|
75
|
+
onKeyDown: stopPropagation,
|
|
123
76
|
children: /* @__PURE__ */ jsx(__Checkbox, {
|
|
124
77
|
isSelected: isChecked,
|
|
125
78
|
isIndeterminate,
|