@cube-dev/ui-kit 0.0.0-canary-7298754 → 0.0.0-canary-cb3e2bd
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/CHANGELOG.md +17 -0
- 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.d.ts +0 -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.d.ts +27 -0
- package/dist/components/content/Tree/Tree.js +317 -0
- package/dist/components/content/Tree/Tree.js.map +1 -0
- package/dist/components/content/Tree/TreeNode.js +131 -0
- package/dist/components/content/Tree/TreeNode.js.map +1 -0
- package/dist/components/content/Tree/index.d.ts +3 -0
- package/dist/components/content/Tree/styled.js +163 -0
- package/dist/components/content/Tree/styled.js.map +1 -0
- package/dist/components/content/Tree/types.d.ts +145 -0
- package/dist/components/content/Tree/use-checkbox-tree.js +251 -0
- package/dist/components/content/Tree/use-checkbox-tree.js.map +1 -0
- package/dist/components/content/Tree/use-load-data.js +68 -0
- package/dist/components/content/Tree/use-load-data.js.map +1 -0
- 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 +2 -2
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +2 -2
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/components/fields/TextInput/TextInput.js +2 -2
- 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.d.ts +1 -2
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransition.js +1 -1
- package/dist/components/overlays/Modal/Overlay.d.ts +0 -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.d.ts +0 -2
- 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/index.d.ts +0 -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.d.ts +4 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +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 +308 -0
- package/docs/tasty/dsl.md +1 -0
- package/package.json +2 -2
- package/dist/components/portal/PortalProvider.d.ts +0 -2
|
@@ -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-cb3e2bd | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { _Text } from "./Text.js";
|
|
4
4
|
import { CONTAINER_STYLES, TEXT_STYLES } 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-cb3e2bd | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { CONTAINER_STYLES, filterBaseProps, keyframes, tasty } from "@tenphi/tasty";
|
|
4
4
|
import { forwardRef } from "react";
|
|
@@ -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-cb3e2bd | Cube Dev Team */
|
|
2
2
|
import { RendererPrism, ensureYamlSqlExtensions } from "./prismSetup.js";
|
|
3
3
|
import { CONTAINER_STYLES, tasty } from "@tenphi/tasty";
|
|
4
4
|
import { forwardRef } from "react";
|
|
@@ -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-cb3e2bd | Cube Dev Team */
|
|
2
2
|
import { Prism as RendererPrism } from "prism-react-renderer";
|
|
3
3
|
|
|
4
4
|
//#region src/components/content/PrismCode/prismSetup.tsx
|
|
@@ -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-cb3e2bd | Cube Dev Team */
|
|
2
2
|
import { _PrismCode } from "../PrismCode/PrismCode.js";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { diffLines } from "diff";
|
|
@@ -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-cb3e2bd | 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-cb3e2bd | 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-cb3e2bd | 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-cb3e2bd | 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-cb3e2bd | 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-cb3e2bd | 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";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
import { CubeTreeProps } from "./types.js";
|
|
3
|
+
import * as react from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/content/Tree/Tree.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Hierarchical data display with optional checkboxes, single/multi
|
|
8
|
+
* selection, async lazy loading, and keyboard navigation.
|
|
9
|
+
*
|
|
10
|
+
* Built on `useTree` / `useTreeState` (React Aria + React Stately) and
|
|
11
|
+
* styled with Tasty.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <Tree
|
|
16
|
+
* treeData={data}
|
|
17
|
+
* isCheckable
|
|
18
|
+
* selectionMode="none"
|
|
19
|
+
* defaultExpandedKeys={['root']}
|
|
20
|
+
* onCheck={(keys) => console.log(keys)}
|
|
21
|
+
* />
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
declare const Tree: react.ForwardRefExoticComponent<CubeTreeProps & react.RefAttributes<HTMLDivElement>>;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { Tree };
|
|
27
|
+
//# sourceMappingURL=Tree.d.ts.map
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-cb3e2bd | Cube Dev Team */
|
|
2
|
+
import { extractStyles } from "../../../utils/styles.js";
|
|
3
|
+
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
4
|
+
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
5
|
+
import { TreeElement } from "./styled.js";
|
|
6
|
+
import { TreeNode } from "./TreeNode.js";
|
|
7
|
+
import { useCheckboxTree } from "./use-checkbox-tree.js";
|
|
8
|
+
import { useLoadData } from "./use-load-data.js";
|
|
9
|
+
import { OUTER_STYLES } from "@tenphi/tasty";
|
|
10
|
+
import { forwardRef, useMemo, useRef } from "react";
|
|
11
|
+
import { jsx } from "react/jsx-runtime";
|
|
12
|
+
import { useTree } from "react-aria";
|
|
13
|
+
import { Item, useTreeState } from "react-stately";
|
|
14
|
+
|
|
15
|
+
//#region src/components/content/Tree/Tree.tsx
|
|
16
|
+
/**
|
|
17
|
+
* Render an `<Item>` for React Stately's collection builder.
|
|
18
|
+
*
|
|
19
|
+
* The visible row content is rendered by `TreeNode` via a
|
|
20
|
+
* `nodesByKey` lookup, so the `<Item>`'s body is only used by
|
|
21
|
+
* Stately to build the collection (`textValue` for keyboard nav,
|
|
22
|
+
* `childItems` for nested traversal).
|
|
23
|
+
*
|
|
24
|
+
* For nested traversal to work, the `children` of the `<Tree>` must
|
|
25
|
+
* be passed as a *function* together with the top-level `items`
|
|
26
|
+
* array — see the `<Tree>` `useCollection` call below. Stately
|
|
27
|
+
* propagates that renderer into `childItems` so nested arrays of
|
|
28
|
+
* raw `CubeTreeNodeData` are turned back into `<Item>` elements.
|
|
29
|
+
*/
|
|
30
|
+
function renderItem(node) {
|
|
31
|
+
return /* @__PURE__ */ jsx(Item, {
|
|
32
|
+
textValue: typeof node.title === "string" ? node.title : String(node.key),
|
|
33
|
+
childItems: node.children,
|
|
34
|
+
children: node.title
|
|
35
|
+
}, node.key);
|
|
36
|
+
}
|
|
37
|
+
/** Walk the treeData and build a flat `key -> node` index. */
|
|
38
|
+
function buildNodesByKey(treeData) {
|
|
39
|
+
const map = /* @__PURE__ */ new Map();
|
|
40
|
+
const visit = (nodes) => {
|
|
41
|
+
for (const node of nodes) {
|
|
42
|
+
map.set(node.key, node);
|
|
43
|
+
if (node.children) visit(node.children);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
visit(treeData);
|
|
47
|
+
return map;
|
|
48
|
+
}
|
|
49
|
+
/** Walk the treeData and collect all keys whose `isDisabled === true`. */
|
|
50
|
+
function collectDisabledKeys(treeData, treeIsDisabled) {
|
|
51
|
+
const keys = [];
|
|
52
|
+
const visit = (nodes) => {
|
|
53
|
+
for (const node of nodes) {
|
|
54
|
+
if (treeIsDisabled || node.isDisabled) keys.push(node.key);
|
|
55
|
+
if (node.children) visit(node.children);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
visit(treeData);
|
|
59
|
+
return keys;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Map `key -> parentKey` (used for `autoExpandParent`).
|
|
63
|
+
*/
|
|
64
|
+
function buildParentOf(treeData) {
|
|
65
|
+
const parentOf = /* @__PURE__ */ new Map();
|
|
66
|
+
const visit = (nodes, parent) => {
|
|
67
|
+
for (const node of nodes) {
|
|
68
|
+
parentOf.set(node.key, parent);
|
|
69
|
+
if (node.children) visit(node.children, node.key);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
visit(treeData, null);
|
|
73
|
+
return parentOf;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Expand the supplied keys with all of their ancestors. Used when
|
|
77
|
+
* `autoExpandParent` is `true` so that the consumer can pass deep keys
|
|
78
|
+
* (e.g. search matches) without having to manually walk parents.
|
|
79
|
+
*/
|
|
80
|
+
function expandWithParents(keys, parentOf) {
|
|
81
|
+
if (!keys || keys.length === 0) return keys;
|
|
82
|
+
const set = new Set(keys);
|
|
83
|
+
for (const key of keys) {
|
|
84
|
+
let parent = parentOf.get(key);
|
|
85
|
+
while (parent) {
|
|
86
|
+
set.add(parent);
|
|
87
|
+
parent = parentOf.get(parent);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return Array.from(set);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Coerce the public `selectionMode` / `isSelectable` pair into a single
|
|
94
|
+
* `selectionMode` value for `useTreeState`.
|
|
95
|
+
*
|
|
96
|
+
* - `selectionMode` wins when both are passed.
|
|
97
|
+
* - `isSelectable === false` is sugar for `selectionMode='none'`.
|
|
98
|
+
* - `selectionMode` defaults to `'single'` (matches AntD's default).
|
|
99
|
+
*/
|
|
100
|
+
function resolveSelectionMode(selectionMode, isSelectable) {
|
|
101
|
+
if (selectionMode != null) return selectionMode;
|
|
102
|
+
if (isSelectable === false) return "none";
|
|
103
|
+
return "single";
|
|
104
|
+
}
|
|
105
|
+
function TreeBase(props, ref) {
|
|
106
|
+
const { treeData, isCheckable = false, isSelectable, selectionMode: selectionModeProp, blockNode = false, isDisabled = false, defaultExpandedKeys, expandedKeys, autoExpandParent = false, defaultCheckedKeys, checkedKeys, defaultSelectedKeys, selectedKeys, height, loadData, onExpand, onCheck, onSelect, rowStyles, qa, ...otherProps } = props;
|
|
107
|
+
const baseStyles = extractStyles(otherProps, OUTER_STYLES);
|
|
108
|
+
const treeRef = useRef(null);
|
|
109
|
+
const nodesByKey = useMemo(() => buildNodesByKey(treeData), [treeData]);
|
|
110
|
+
const parentOf = useMemo(() => buildParentOf(treeData), [treeData]);
|
|
111
|
+
const disabledKeys = useMemo(() => collectDisabledKeys(treeData, isDisabled), [treeData, isDisabled]);
|
|
112
|
+
const selectionMode = resolveSelectionMode(selectionModeProp, isSelectable);
|
|
113
|
+
/**
|
|
114
|
+
* Apply `autoExpandParent` to the controlled `expandedKeys`. This is
|
|
115
|
+
* a one-shot thing — once the consumer responds to `onExpand` and
|
|
116
|
+
* sets `autoExpandParent` to `false`, we stop force-expanding parents.
|
|
117
|
+
*/
|
|
118
|
+
const effectiveExpandedKeys = useMemo(() => autoExpandParent ? expandWithParents(expandedKeys, parentOf) : expandedKeys, [
|
|
119
|
+
autoExpandParent,
|
|
120
|
+
expandedKeys,
|
|
121
|
+
parentOf
|
|
122
|
+
]);
|
|
123
|
+
const checkbox = useCheckboxTree({
|
|
124
|
+
treeData,
|
|
125
|
+
isCheckable,
|
|
126
|
+
defaultCheckedKeys,
|
|
127
|
+
checkedKeys,
|
|
128
|
+
onCheck
|
|
129
|
+
});
|
|
130
|
+
const loadDataController = useLoadData({
|
|
131
|
+
nodesByKey,
|
|
132
|
+
loadData
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* Translate Stately's `Set<Key>` callbacks into the public AntD-flavoured
|
|
136
|
+
* `Key[]` shape and dispatch the per-key load.
|
|
137
|
+
*/
|
|
138
|
+
const handleExpandedChange = useEvent((nextSet) => {
|
|
139
|
+
loadDataController.onExpandedChanged(nextSet);
|
|
140
|
+
if (!onExpand) return;
|
|
141
|
+
const nextArr = Array.from(nextSet);
|
|
142
|
+
const previous = new Set(effectiveExpandedKeys ?? []);
|
|
143
|
+
/**
|
|
144
|
+
* Find the single key that toggled relative to the previous set.
|
|
145
|
+
* Useful for `info.node` and `info.expanded` — matches AntD.
|
|
146
|
+
*/
|
|
147
|
+
let toggledKey = null;
|
|
148
|
+
let toggledExpanded = false;
|
|
149
|
+
for (const k of nextArr) if (!previous.has(k)) {
|
|
150
|
+
toggledKey = k;
|
|
151
|
+
toggledExpanded = true;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
if (toggledKey == null) {
|
|
155
|
+
for (const k of previous) if (!nextSet.has(k)) {
|
|
156
|
+
toggledKey = k;
|
|
157
|
+
toggledExpanded = false;
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const node = toggledKey != null ? nodesByKey.get(String(toggledKey)) : void 0;
|
|
162
|
+
onExpand(nextArr, {
|
|
163
|
+
expanded: toggledExpanded,
|
|
164
|
+
node: node ?? {}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
const handleSelectionChange = useEvent((selection) => {
|
|
168
|
+
if (!onSelect) return;
|
|
169
|
+
const arr = selection === "all" ? Array.from(nodesByKey.keys()) : Array.from(selection);
|
|
170
|
+
/**
|
|
171
|
+
* Stately's `onSelectionChange` hands us the *next* selection only —
|
|
172
|
+
* we don't get a "toggled key" diff for free. For `single` mode we
|
|
173
|
+
* can infer it cheaply (it's the only entry); for `multiple` we
|
|
174
|
+
* report the most recent addition. Falls back to the first key.
|
|
175
|
+
*/
|
|
176
|
+
let toggledKey = null;
|
|
177
|
+
let toggledSelected = false;
|
|
178
|
+
if (selectionMode === "single") {
|
|
179
|
+
toggledKey = arr[0] ?? null;
|
|
180
|
+
toggledSelected = arr.length > 0;
|
|
181
|
+
} else if (selection !== "all") {
|
|
182
|
+
toggledKey = arr.length > 0 ? arr[arr.length - 1] : null;
|
|
183
|
+
toggledSelected = arr.length > 0;
|
|
184
|
+
} else {
|
|
185
|
+
toggledKey = arr[0] ?? null;
|
|
186
|
+
toggledSelected = true;
|
|
187
|
+
}
|
|
188
|
+
const node = toggledKey != null ? nodesByKey.get(String(toggledKey)) : void 0;
|
|
189
|
+
const selectedNodes = arr.map((k) => nodesByKey.get(String(k))).filter((n) => !!n);
|
|
190
|
+
onSelect(arr, {
|
|
191
|
+
selected: toggledSelected,
|
|
192
|
+
node: node ?? {},
|
|
193
|
+
selectedNodes
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
/**
|
|
197
|
+
* Stately propagates the `children` function through `childItems`,
|
|
198
|
+
* so a single render function recursively turns the entire
|
|
199
|
+
* `treeData` array into `<Item>` elements.
|
|
200
|
+
*/
|
|
201
|
+
const renderCollectionItem = useEvent((item) => renderItem(item));
|
|
202
|
+
const ariaProps = useMemo(() => ({
|
|
203
|
+
selectionMode,
|
|
204
|
+
selectedKeys,
|
|
205
|
+
defaultSelectedKeys,
|
|
206
|
+
onSelectionChange: onSelect && selectionMode !== "none" ? handleSelectionChange : void 0,
|
|
207
|
+
expandedKeys: effectiveExpandedKeys,
|
|
208
|
+
defaultExpandedKeys,
|
|
209
|
+
onExpandedChange: handleExpandedChange,
|
|
210
|
+
disabledKeys,
|
|
211
|
+
disabledBehavior: "all",
|
|
212
|
+
items: treeData,
|
|
213
|
+
children: renderCollectionItem,
|
|
214
|
+
"aria-label": "Tree"
|
|
215
|
+
}), [
|
|
216
|
+
selectionMode,
|
|
217
|
+
selectedKeys,
|
|
218
|
+
defaultSelectedKeys,
|
|
219
|
+
onSelect,
|
|
220
|
+
handleSelectionChange,
|
|
221
|
+
effectiveExpandedKeys,
|
|
222
|
+
defaultExpandedKeys,
|
|
223
|
+
handleExpandedChange,
|
|
224
|
+
disabledKeys,
|
|
225
|
+
treeData,
|
|
226
|
+
renderCollectionItem
|
|
227
|
+
]);
|
|
228
|
+
const baseState = useTreeState(ariaProps);
|
|
229
|
+
/**
|
|
230
|
+
* The legacy `TreeCollection` returned by `useTreeState` doesn't
|
|
231
|
+
* implement `getChildren`, but `@react-aria/tree`'s `useTree`
|
|
232
|
+
* (via `useGridListItem`) calls it unguarded for any nested row
|
|
233
|
+
* (`node.level > 0`). Patch it once so `useTree` works on top of
|
|
234
|
+
* the legacy state without forking.
|
|
235
|
+
*/
|
|
236
|
+
const state = useMemo(() => {
|
|
237
|
+
const collection = baseState.collection;
|
|
238
|
+
if (typeof collection.getChildren === "function") return baseState;
|
|
239
|
+
const getChildren = (key) => {
|
|
240
|
+
const result = [];
|
|
241
|
+
const node = collection.getItem(key);
|
|
242
|
+
if (!node) return result;
|
|
243
|
+
for (const child of node.childNodes) result.push(child);
|
|
244
|
+
return result;
|
|
245
|
+
};
|
|
246
|
+
const patched = Object.assign(Object.create(Object.getPrototypeOf(collection)), collection, { getChildren });
|
|
247
|
+
return {
|
|
248
|
+
...baseState,
|
|
249
|
+
collection: patched
|
|
250
|
+
};
|
|
251
|
+
}, [baseState]);
|
|
252
|
+
const { gridProps } = useTree(ariaProps, state, treeRef);
|
|
253
|
+
/**
|
|
254
|
+
* Iterate the collection in DOM order. The TreeCollection only walks
|
|
255
|
+
* into expanded subtrees, so `getKeys()` already gives us *only*
|
|
256
|
+
* visible rows — no manual filtering required.
|
|
257
|
+
*/
|
|
258
|
+
const visibleNodes = useMemo(() => {
|
|
259
|
+
const out = [];
|
|
260
|
+
for (const key of state.collection.getKeys()) {
|
|
261
|
+
const node = state.collection.getItem(key);
|
|
262
|
+
if (node && node.type === "item") out.push(node);
|
|
263
|
+
}
|
|
264
|
+
return out;
|
|
265
|
+
}, [state.collection, state.expandedKeys]);
|
|
266
|
+
const heightStyle = useMemo(() => height != null ? { ["--tree-height"]: `${height}px` } : void 0, [height]);
|
|
267
|
+
const mods = useMemo(() => ({ "has-height": height != null }), [height]);
|
|
268
|
+
return /* @__PURE__ */ jsx(TreeElement, {
|
|
269
|
+
...mergeProps$1(gridProps, { ref: ref ?? treeRef }),
|
|
270
|
+
ref: ref ?? treeRef,
|
|
271
|
+
qa: qa ?? "Tree",
|
|
272
|
+
mods,
|
|
273
|
+
styles: baseStyles,
|
|
274
|
+
style: heightStyle,
|
|
275
|
+
children: visibleNodes.map((node) => {
|
|
276
|
+
const data = nodesByKey.get(String(node.key));
|
|
277
|
+
if (!data) return null;
|
|
278
|
+
return /* @__PURE__ */ jsx(TreeNode, {
|
|
279
|
+
node,
|
|
280
|
+
data,
|
|
281
|
+
state,
|
|
282
|
+
isCheckable,
|
|
283
|
+
isExpanded: state.expandedKeys.has(node.key),
|
|
284
|
+
isChecked: checkbox.checkedSet.has(String(node.key)),
|
|
285
|
+
isIndeterminate: checkbox.halfCheckedSet.has(String(node.key)),
|
|
286
|
+
isLoading: loadDataController.loadingKeys.has(String(node.key)),
|
|
287
|
+
isBlockNode: blockNode,
|
|
288
|
+
rowStyles,
|
|
289
|
+
onToggleChecked: checkbox.toggle
|
|
290
|
+
}, node.key);
|
|
291
|
+
})
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
const _Tree = forwardRef(TreeBase);
|
|
295
|
+
/**
|
|
296
|
+
* Hierarchical data display with optional checkboxes, single/multi
|
|
297
|
+
* selection, async lazy loading, and keyboard navigation.
|
|
298
|
+
*
|
|
299
|
+
* Built on `useTree` / `useTreeState` (React Aria + React Stately) and
|
|
300
|
+
* styled with Tasty.
|
|
301
|
+
*
|
|
302
|
+
* @example
|
|
303
|
+
* ```tsx
|
|
304
|
+
* <Tree
|
|
305
|
+
* treeData={data}
|
|
306
|
+
* isCheckable
|
|
307
|
+
* selectionMode="none"
|
|
308
|
+
* defaultExpandedKeys={['root']}
|
|
309
|
+
* onCheck={(keys) => console.log(keys)}
|
|
310
|
+
* />
|
|
311
|
+
* ```
|
|
312
|
+
*/
|
|
313
|
+
const Tree = _Tree;
|
|
314
|
+
|
|
315
|
+
//#endregion
|
|
316
|
+
export { Tree };
|
|
317
|
+
//# sourceMappingURL=Tree.js.map
|
|
@@ -0,0 +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 } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { TreeElement } from './styled';\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 build a flat `key -> node` index. */\nfunction buildNodesByKey(\n treeData: CubeTreeNodeData[],\n): Map<string, CubeTreeNodeData> {\n const map = new Map<string, CubeTreeNodeData>();\n const visit = (nodes: CubeTreeNodeData[]) => {\n for (const node of nodes) {\n map.set(node.key, node);\n if (node.children) visit(node.children);\n }\n };\n visit(treeData);\n return map;\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 * Map `key -> parentKey` (used for `autoExpandParent`).\n */\nfunction buildParentOf(\n treeData: CubeTreeNodeData[],\n): Map<string, string | null> {\n const parentOf = new Map<string, string | null>();\n const visit = (nodes: CubeTreeNodeData[], parent: string | null) => {\n for (const node of nodes) {\n parentOf.set(node.key, parent);\n if (node.children) visit(node.children, node.key);\n }\n };\n visit(treeData, null);\n return parentOf;\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 const nodesByKey = useMemo(() => buildNodesByKey(treeData), [treeData]);\n const parentOf = useMemo(() => buildParentOf(treeData), [treeData]);\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 const checkbox = useCheckboxTree({\n treeData,\n isCheckable,\n defaultCheckedKeys,\n checkedKeys,\n onCheck,\n });\n\n const loadDataController = useLoadData({ nodesByKey, loadData });\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 if (!onExpand) return;\n const nextArr: Key[] = Array.from(nextSet);\n const previous = new Set<Key>(effectiveExpandedKeys ?? []);\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,\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 defaultExpandedKeys,\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 const elementProps = mergeProps(gridProps, {\n ref: ref ?? treeRef,\n });\n\n return (\n <TreeElement\n {...elementProps}\n ref={ref ?? treeRef}\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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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-cb3e2bd | Cube Dev Team */
|
|
2
|
+
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
|
+
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
4
|
+
import { LoadingIcon } from "../../../icons/LoadingIcon.js";
|
|
5
|
+
import { DirectionIcon } from "../../../icons/DirectionIcon.js";
|
|
6
|
+
import { TreeNodeCheckboxWrapper, TreeNodeRow, TreeNodeToggle, TreeNodeTogglePlaceholder, TreeRowItem } from "./styled.js";
|
|
7
|
+
import { __Checkbox } from "../../fields/Checkbox/Checkbox.js";
|
|
8
|
+
import { memo, useMemo, useRef } from "react";
|
|
9
|
+
import { jsx } from "react/jsx-runtime";
|
|
10
|
+
import { useTreeItem } from "react-aria";
|
|
11
|
+
|
|
12
|
+
//#region src/components/content/Tree/TreeNode.tsx
|
|
13
|
+
const ROW_LEVEL_OFFSET = 0;
|
|
14
|
+
function TreeNodeInner(props) {
|
|
15
|
+
const { node, data, state, isCheckable, isExpanded, isIndeterminate, isChecked, isLoading, isBlockNode, onToggleChecked, rowStyles } = props;
|
|
16
|
+
const rowRef = useRef(null);
|
|
17
|
+
const { rowProps, gridCellProps, expandButtonProps } = useTreeItem({ node }, state, rowRef);
|
|
18
|
+
const isDisabled = state.disabledKeys.has(node.key);
|
|
19
|
+
const isSelected = state.selectionManager.isSelected(node.key);
|
|
20
|
+
/**
|
|
21
|
+
* `useTreeItem` reports `aria-expanded` only on rows that *can* expand
|
|
22
|
+
* (i.e. have child nodes in the collection). For lazy rows with no
|
|
23
|
+
* children loaded yet but `isLeaf !== true`, we still want to render
|
|
24
|
+
* a toggle so the consumer can fire `loadData`.
|
|
25
|
+
*/
|
|
26
|
+
const isLeaf = data.isLeaf === true || data.isLeaf !== false && !node.hasChildNodes;
|
|
27
|
+
const isRowCheckable = isCheckable && data.isCheckable !== false;
|
|
28
|
+
const handleCheckboxClick = useEvent((e) => {
|
|
29
|
+
e.stopPropagation();
|
|
30
|
+
});
|
|
31
|
+
const handleCheckboxChange = useEvent(() => {
|
|
32
|
+
onToggleChecked(String(node.key));
|
|
33
|
+
});
|
|
34
|
+
const rowMods = useMemo(() => ({
|
|
35
|
+
checked: isChecked,
|
|
36
|
+
indeterminate: isIndeterminate,
|
|
37
|
+
expanded: isExpanded,
|
|
38
|
+
disabled: isDisabled,
|
|
39
|
+
loading: isLoading,
|
|
40
|
+
leaf: isLeaf,
|
|
41
|
+
"block-node": isBlockNode,
|
|
42
|
+
"has-checkbox": isRowCheckable
|
|
43
|
+
}), [
|
|
44
|
+
isChecked,
|
|
45
|
+
isIndeterminate,
|
|
46
|
+
isExpanded,
|
|
47
|
+
isDisabled,
|
|
48
|
+
isLoading,
|
|
49
|
+
isLeaf,
|
|
50
|
+
isBlockNode,
|
|
51
|
+
isRowCheckable
|
|
52
|
+
]);
|
|
53
|
+
const itemMods = useMemo(() => ({
|
|
54
|
+
checked: isChecked,
|
|
55
|
+
indeterminate: isIndeterminate,
|
|
56
|
+
expanded: isExpanded,
|
|
57
|
+
loading: isLoading,
|
|
58
|
+
leaf: isLeaf,
|
|
59
|
+
"has-checkbox": isRowCheckable
|
|
60
|
+
}), [
|
|
61
|
+
isChecked,
|
|
62
|
+
isIndeterminate,
|
|
63
|
+
isExpanded,
|
|
64
|
+
isLoading,
|
|
65
|
+
isLeaf,
|
|
66
|
+
isRowCheckable
|
|
67
|
+
]);
|
|
68
|
+
/**
|
|
69
|
+
* Indent each row by its depth. `node.level` is 0-based at the root.
|
|
70
|
+
* Pushed down via a CSS custom property so the styled element can
|
|
71
|
+
* compute padding without re-extracting styles per row.
|
|
72
|
+
*/
|
|
73
|
+
const levelStyle = useMemo(() => ({ ["--tree-level"]: String((node.level ?? ROW_LEVEL_OFFSET) - ROW_LEVEL_OFFSET) }), [node.level]);
|
|
74
|
+
/**
|
|
75
|
+
* `aria-checked` for treegrid rows that act as multi-state checkboxes.
|
|
76
|
+
* Only set when the tree is checkable, so we don't pollute the row
|
|
77
|
+
* with checkbox semantics in select-only mode.
|
|
78
|
+
*/
|
|
79
|
+
const ariaChecked = isRowCheckable ? isIndeterminate ? "mixed" : isChecked ? "true" : "false" : void 0;
|
|
80
|
+
const finalRowProps = mergeProps$1(rowProps, { "aria-checked": ariaChecked });
|
|
81
|
+
/**
|
|
82
|
+
* Always render a toggle slot — even for leaf rows — so siblings
|
|
83
|
+
* at the same indent level visually align. Leaves get a
|
|
84
|
+
* non-interactive placeholder (a plain div) so user clicks can't
|
|
85
|
+
* trigger anything.
|
|
86
|
+
*/
|
|
87
|
+
const toggleNode = isLeaf ? /* @__PURE__ */ jsx(TreeNodeTogglePlaceholder, {
|
|
88
|
+
"aria-hidden": true,
|
|
89
|
+
"data-element": "Toggle"
|
|
90
|
+
}) : /* @__PURE__ */ jsx(TreeNodeToggle, {
|
|
91
|
+
...expandButtonProps,
|
|
92
|
+
tabIndex: -1,
|
|
93
|
+
"data-element": "Toggle",
|
|
94
|
+
children: isLoading ? /* @__PURE__ */ jsx(LoadingIcon, {}) : /* @__PURE__ */ jsx(DirectionIcon, { to: isExpanded ? "bottom" : "right" })
|
|
95
|
+
});
|
|
96
|
+
const checkboxNode = isRowCheckable ? /* @__PURE__ */ jsx(TreeNodeCheckboxWrapper, {
|
|
97
|
+
"data-element": "Checkbox",
|
|
98
|
+
role: "presentation",
|
|
99
|
+
onClick: handleCheckboxClick,
|
|
100
|
+
onKeyDown: handleCheckboxClick,
|
|
101
|
+
children: /* @__PURE__ */ jsx(__Checkbox, {
|
|
102
|
+
isSelected: isChecked,
|
|
103
|
+
isIndeterminate,
|
|
104
|
+
isDisabled: isDisabled || data.isCheckboxDisabled,
|
|
105
|
+
"aria-label": typeof data.title === "string" ? data.title : String(node.key),
|
|
106
|
+
onChange: handleCheckboxChange
|
|
107
|
+
})
|
|
108
|
+
}) : null;
|
|
109
|
+
return /* @__PURE__ */ jsx(TreeNodeRow, {
|
|
110
|
+
...finalRowProps,
|
|
111
|
+
ref: rowRef,
|
|
112
|
+
mods: rowMods,
|
|
113
|
+
style: levelStyle,
|
|
114
|
+
"data-element": "Row",
|
|
115
|
+
"data-qa-key": String(node.key),
|
|
116
|
+
children: /* @__PURE__ */ jsx(TreeRowItem, {
|
|
117
|
+
...gridCellProps,
|
|
118
|
+
isSelected,
|
|
119
|
+
mods: itemMods,
|
|
120
|
+
icon: toggleNode,
|
|
121
|
+
prefix: checkboxNode,
|
|
122
|
+
styles: rowStyles,
|
|
123
|
+
children: data.title
|
|
124
|
+
})
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
const TreeNode = memo(TreeNodeInner);
|
|
128
|
+
|
|
129
|
+
//#endregion
|
|
130
|
+
export { TreeNode };
|
|
131
|
+
//# sourceMappingURL=TreeNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeNode.js","names":["mergeProps","Checkbox"],"sources":["../../../../src/components/content/Tree/TreeNode.tsx"],"sourcesContent":["import { memo, useMemo, useRef } from 'react';\nimport { useTreeItem } from 'react-aria';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { DirectionIcon, LoadingIcon } from '../../../icons';\nimport { mergeProps } from '../../../utils/react';\nimport { Checkbox } from '../../fields/Checkbox/Checkbox';\n\nimport {\n TreeNodeCheckboxWrapper,\n TreeNodeRow,\n TreeNodeToggle,\n TreeNodeTogglePlaceholder,\n TreeRowItem,\n} from './styled';\n\nimport type { Node } from '@react-types/shared';\nimport type { Styles } from '@tenphi/tasty';\nimport type {\n CSSProperties,\n KeyboardEvent as ReactKeyboardEvent,\n MouseEvent as ReactMouseEvent,\n ReactNode,\n} from 'react';\nimport type { TreeState } from 'react-stately';\nimport type { CubeTreeNodeData } from './types';\n\nexport interface TreeNodeProps {\n node: Node<CubeTreeNodeData>;\n /** The original `CubeTreeNodeData` for this row, looked up by key. */\n data: CubeTreeNodeData;\n state: TreeState<CubeTreeNodeData>;\n\n /** Whether the tree as a whole renders checkboxes. */\n isCheckable: boolean;\n /** Whether this row is currently expanded. */\n isExpanded: boolean;\n /** Whether the row is in an indeterminate (half-checked) state. */\n isIndeterminate: boolean;\n /** Whether the row is fully checked. */\n isChecked: boolean;\n /** Whether `loadData` is currently fetching this row's children. */\n isLoading: boolean;\n /** Whether the entire tree is `blockNode`. */\n isBlockNode: boolean;\n\n /** Toggle this row's checkbox (cascades). */\n onToggleChecked: (key: string) => void;\n\n /** Styles applied to the visible row (`TreeRowItem`). */\n rowStyles?: Styles;\n}\n\nconst ROW_LEVEL_OFFSET = 0; // root nodes start at level 0\n\nfunction TreeNodeInner(props: TreeNodeProps) {\n const {\n node,\n data,\n state,\n isCheckable,\n isExpanded,\n isIndeterminate,\n isChecked,\n isLoading,\n isBlockNode,\n onToggleChecked,\n rowStyles,\n } = props;\n\n const rowRef = useRef<HTMLDivElement>(null);\n\n const { rowProps, gridCellProps, expandButtonProps } = useTreeItem(\n { node },\n state,\n rowRef,\n );\n\n const isDisabled = state.disabledKeys.has(node.key);\n const isSelected = state.selectionManager.isSelected(node.key);\n /**\n * `useTreeItem` reports `aria-expanded` only on rows that *can* expand\n * (i.e. have child nodes in the collection). For lazy rows with no\n * children loaded yet but `isLeaf !== true`, we still want to render\n * a toggle so the consumer can fire `loadData`.\n */\n const isLeaf =\n data.isLeaf === true || (data.isLeaf !== false && !node.hasChildNodes);\n const isRowCheckable = isCheckable && data.isCheckable !== false;\n\n const handleCheckboxClick = useEvent(\n (e: ReactMouseEvent | ReactKeyboardEvent) => {\n e.stopPropagation();\n },\n );\n\n const handleCheckboxChange = useEvent(() => {\n onToggleChecked(String(node.key));\n });\n\n const rowMods = useMemo(\n () => ({\n checked: isChecked,\n indeterminate: isIndeterminate,\n expanded: isExpanded,\n disabled: isDisabled,\n loading: isLoading,\n leaf: isLeaf,\n 'block-node': isBlockNode,\n 'has-checkbox': isRowCheckable,\n }),\n [\n isChecked,\n isIndeterminate,\n isExpanded,\n isDisabled,\n isLoading,\n isLeaf,\n isBlockNode,\n isRowCheckable,\n ],\n );\n\n const itemMods = useMemo(\n () => ({\n checked: isChecked,\n indeterminate: isIndeterminate,\n expanded: isExpanded,\n loading: isLoading,\n leaf: isLeaf,\n 'has-checkbox': isRowCheckable,\n }),\n [isChecked, isIndeterminate, isExpanded, isLoading, isLeaf, isRowCheckable],\n );\n\n /**\n * Indent each row by its depth. `node.level` is 0-based at the root.\n * Pushed down via a CSS custom property so the styled element can\n * compute padding without re-extracting styles per row.\n */\n const levelStyle = useMemo<CSSProperties>(\n () => ({\n ['--tree-level' as keyof CSSProperties]: String(\n (node.level ?? ROW_LEVEL_OFFSET) - ROW_LEVEL_OFFSET,\n ),\n }),\n [node.level],\n );\n\n /**\n * `aria-checked` for treegrid rows that act as multi-state checkboxes.\n * Only set when the tree is checkable, so we don't pollute the row\n * with checkbox semantics in select-only mode.\n */\n const ariaChecked: ReactNode = isRowCheckable\n ? isIndeterminate\n ? 'mixed'\n : isChecked\n ? 'true'\n : 'false'\n : undefined;\n\n const finalRowProps = mergeProps(rowProps, {\n 'aria-checked': ariaChecked as string | boolean | undefined,\n });\n\n /**\n * Always render a toggle slot — even for leaf rows — so siblings\n * at the same indent level visually align. Leaves get a\n * non-interactive placeholder (a plain div) so user clicks can't\n * trigger anything.\n */\n const toggleNode = isLeaf ? (\n <TreeNodeTogglePlaceholder aria-hidden data-element=\"Toggle\" />\n ) : (\n <TreeNodeToggle {...expandButtonProps} tabIndex={-1} data-element=\"Toggle\">\n {isLoading ? (\n <LoadingIcon />\n ) : (\n <DirectionIcon to={isExpanded ? 'bottom' : 'right'} />\n )}\n </TreeNodeToggle>\n );\n\n const checkboxNode = isRowCheckable ? (\n <TreeNodeCheckboxWrapper\n data-element=\"Checkbox\"\n role=\"presentation\"\n onClick={handleCheckboxClick}\n onKeyDown={handleCheckboxClick}\n >\n <Checkbox\n isSelected={isChecked}\n isIndeterminate={isIndeterminate}\n isDisabled={isDisabled || data.isCheckboxDisabled}\n aria-label={\n typeof data.title === 'string' ? data.title : String(node.key)\n }\n // @ts-expect-error AriaCheckboxProps loses `onChange` where InputDOMProps overlaps (react-types).\n onChange={handleCheckboxChange}\n />\n </TreeNodeCheckboxWrapper>\n ) : null;\n\n return (\n <TreeNodeRow\n {...finalRowProps}\n ref={rowRef}\n mods={rowMods}\n style={levelStyle}\n data-element=\"Row\"\n data-qa-key={String(node.key)}\n >\n <TreeRowItem\n {...gridCellProps}\n isSelected={isSelected}\n mods={itemMods}\n icon={toggleNode}\n prefix={checkboxNode}\n styles={rowStyles}\n >\n {data.title}\n </TreeRowItem>\n </TreeNodeRow>\n );\n}\n\nexport const TreeNode = memo(TreeNodeInner);\n"],"mappings":";;;;;;;;;;;;AAqDA,MAAM,mBAAmB;AAEzB,SAAS,cAAc,OAAsB;CAC3C,MAAM,EACJ,MACA,MACA,OACA,aACA,YACA,iBACA,WACA,WACA,aACA,iBACA,cACE;CAEJ,MAAM,SAAS,OAAuB,KAAK;CAE3C,MAAM,EAAE,UAAU,eAAe,sBAAsB,YACrD,EAAE,MAAM,EACR,OACA,OACD;CAED,MAAM,aAAa,MAAM,aAAa,IAAI,KAAK,IAAI;CACnD,MAAM,aAAa,MAAM,iBAAiB,WAAW,KAAK,IAAI;;;;;;;CAO9D,MAAM,SACJ,KAAK,WAAW,QAAS,KAAK,WAAW,SAAS,CAAC,KAAK;CAC1D,MAAM,iBAAiB,eAAe,KAAK,gBAAgB;CAE3D,MAAM,sBAAsB,UACzB,MAA4C;AAC3C,IAAE,iBAAiB;GAEtB;CAED,MAAM,uBAAuB,eAAe;AAC1C,kBAAgB,OAAO,KAAK,IAAI,CAAC;GACjC;CAEF,MAAM,UAAU,eACP;EACL,SAAS;EACT,eAAe;EACf,UAAU;EACV,UAAU;EACV,SAAS;EACT,MAAM;EACN,cAAc;EACd,gBAAgB;EACjB,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;CAED,MAAM,WAAW,eACR;EACL,SAAS;EACT,eAAe;EACf,UAAU;EACV,SAAS;EACT,MAAM;EACN,gBAAgB;EACjB,GACD;EAAC;EAAW;EAAiB;EAAY;EAAW;EAAQ;EAAe,CAC5E;;;;;;CAOD,MAAM,aAAa,eACV,GACJ,iBAAwC,QACtC,KAAK,SAAS,oBAAoB,iBACpC,EACF,GACD,CAAC,KAAK,MAAM,CACb;;;;;;CAOD,MAAM,cAAyB,iBAC3B,kBACE,UACA,YACE,SACA,UACJ;CAEJ,MAAM,gBAAgBA,aAAW,UAAU,EACzC,gBAAgB,aACjB,CAAC;;;;;;;CAQF,MAAM,aAAa,SACjB,oBAAC;EAA0B;EAAY,gBAAa;GAAW,GAE/D,oBAAC;EAAe,GAAI;EAAmB,UAAU;EAAI,gBAAa;YAC/D,YACC,oBAAC,gBAAc,GAEf,oBAAC,iBAAc,IAAI,aAAa,WAAW,UAAW;GAEzC;CAGnB,MAAM,eAAe,iBACnB,oBAAC;EACC,gBAAa;EACb,MAAK;EACL,SAAS;EACT,WAAW;YAEX,oBAACC;GACC,YAAY;GACK;GACjB,YAAY,cAAc,KAAK;GAC/B,cACE,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,OAAO,KAAK,IAAI;GAGhE,UAAU;IACV;GACsB,GACxB;AAEJ,QACE,oBAAC;EACC,GAAI;EACJ,KAAK;EACL,MAAM;EACN,OAAO;EACP,gBAAa;EACb,eAAa,OAAO,KAAK,IAAI;YAE7B,oBAAC;GACC,GAAI;GACQ;GACZ,MAAM;GACN,MAAM;GACN,QAAQ;GACR,QAAQ;aAEP,KAAK;IACM;GACF;;AAIlB,MAAa,WAAW,KAAK,cAAc"}
|