@cube-dev/ui-kit 0.0.0-canary-1f0dd2c → 0.0.0-canary-1d27aa0
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/README.md +7 -4
- package/dist/README.md +7 -4
- 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/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.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.d.ts +14 -14
- 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 +1 -1
- package/dist/components/content/Tree/TreeNode.js +1 -1
- package/dist/components/content/Tree/styled.js +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
- package/dist/components/content/Tree/use-load-data.js +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/data/DataTable/DataTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
- package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
- package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
- package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
- package/dist/components/data/TableBase/TableRow.js +1 -1
- package/dist/components/data/TableBase/TableView.js +1 -1
- package/dist/components/data/TableBase/column-menu.js +1 -1
- package/dist/components/data/TableBase/column-tint.js +1 -1
- package/dist/components/data/TableBase/row-menu.js +1 -1
- package/dist/components/data/TableBase/styled.d.ts +1 -2
- package/dist/components/data/TableBase/styled.js +1 -1
- package/dist/components/data/TableBase/table-tree.js +1 -1
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/use-cell-selection.d.ts +0 -1
- package/dist/components/data/TableBase/use-cell-selection.js +0 -0
- package/dist/components/data/TableBase/use-column-order.js +1 -1
- package/dist/components/data/TableBase/use-container-width.js +1 -1
- package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
- package/dist/components/data/TableBase/use-scrollability.js +1 -1
- package/dist/components/data/TableBase/use-table-columns.js +1 -1
- package/dist/components/data/TableBase/use-table-search.js +1 -1
- package/dist/components/data/TableBase/use-table-selection.js +1 -1
- package/dist/components/data/TableBase/use-table-sort.js +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/data/TableBase/use-table-tree-state.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/ColorInput/ColorInput.js +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
- package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
- package/dist/components/fields/CommandTextArea/useCaretAnchor.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/MonthPicker.js +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
- package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
- package/dist/components/fields/DatePicker/YearPicker.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/period.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/DraggableListBox.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
- package/dist/components/fields/ListBoxPopover/index.d.ts +0 -1
- package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.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/SearchComboBox/SearchComboBox.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/TextInput/useAutoSizeTextArea.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +1 -1
- package/dist/components/fields/color/channels.js +1 -1
- package/dist/components/fields/color/color.js +1 -1
- package/dist/components/fields/color/context.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.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/validation/ValidationIndicator.js +1 -1
- package/dist/components/form/validation/resolve-validation-props.js +1 -1
- package/dist/components/form/validation/use-validation-props.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/Board/Board.js +1 -1
- package/dist/components/layout/Board/BoardProvider.js +1 -1
- package/dist/components/layout/Board/BoardResponsive.js +1 -1
- package/dist/components/layout/Board/Widget.js +1 -1
- package/dist/components/layout/Board/WidgetHost.js +1 -1
- package/dist/components/layout/Board/board-context.js +1 -1
- package/dist/components/layout/Board/board-store.js +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/group-move.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +1 -1
- package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
- package/dist/components/layout/Board/use-board-selection.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/Pagination/Pagination.js +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.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/popover-placement.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/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/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/Calendar/styled.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/other/NoDataIcon/NoDataIcon.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/OpenTransitionContext.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/Modal/types.d.ts +0 -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 +2 -1
- package/dist/components/overlays/Tooltip/Tooltip.js.map +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/DraggableCollection.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/eslint-plugin/defaults.generated.js +1 -13
- package/dist/eslint-plugin/defaults.generated.js.map +1 -1
- package/dist/eslint-plugin/index.js +1 -1
- package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
- package/dist/i18n/I18nProvider.js +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/instance.js +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +1 -1
- package/dist/i18n/locales/en-US/uikit.js +1 -1
- package/dist/i18n/locales/es-ES/uikit.js +1 -1
- package/dist/i18n/locales/es-MX/uikit.js +1 -1
- package/dist/i18n/locales/fr-FR/uikit.js +1 -1
- package/dist/i18n/locales/it-IT/uikit.js +1 -1
- package/dist/i18n/locales/ja-JP/uikit.js +1 -1
- package/dist/i18n/locales/nb-NO/uikit.js +1 -1
- package/dist/i18n/locales/pt-BR/uikit.js +1 -1
- package/dist/i18n/locales/pt-PT/uikit.js +1 -1
- package/dist/i18n/locales/sv-SE/uikit.js +1 -1
- package/dist/i18n/locales/vi-VN/uikit.js +1 -1
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useI18n.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/ArrowNarrowDownIcon.js +1 -1
- package/dist/icons/ArrowNarrowUpIcon.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/GripVerticalIcon.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/PipetteIcon.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/probe/canonicalize.js +1 -1
- package/dist/probe/css.js +1 -1
- package/dist/probe/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/color-seed.js +1 -1
- package/dist/tokens/color-theme.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/lazy-styles.js +1 -1
- package/dist/tokens/palette-config.js +1 -1
- package/dist/tokens/palette.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/disabledProps.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/useBufferedValue.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/usePopoverSync.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 +3 -3
- package/docs/Colors.md +40 -16
- package/docs/ComplexLayout.md +0 -8
- package/docs/CreateComponent.md +8 -15
- package/docs/Introduction.md +36 -15
- package/docs/RenderCache.md +6 -8
- package/docs/Theming.md +497 -164
- package/docs/Usage.md +138 -108
- package/docs/Utilities.md +2 -2
- package/docs/components/CollectionItem.md +0 -1
- package/docs/components/actions/Banner.md +0 -1
- package/docs/components/actions/Button.md +36 -8
- package/docs/components/actions/ButtonSplit.md +0 -2
- package/docs/components/actions/CommandMenu.md +8 -8
- package/docs/components/actions/ItemButton.md +20 -6
- package/docs/components/actions/Link.md +5 -10
- package/docs/components/actions/Menu.md +11 -24
- package/docs/components/actions/MenuTrigger.md +12 -3
- package/docs/components/actions/use-anchored-menu.md +2 -2
- package/docs/components/actions/use-context-menu.md +2 -5
- package/docs/components/content/Badge.md +0 -3
- package/docs/components/content/HotKeys.md +14 -21
- package/docs/components/content/InlineInput.md +14 -14
- package/docs/components/content/Item.md +17 -25
- package/docs/components/content/ItemCard.md +0 -1
- package/docs/components/content/Layout.md +1 -12
- package/docs/components/content/PrismCode.md +18 -13
- package/docs/components/content/Tag.md +1 -1
- package/docs/components/content/TextItem.md +3 -5
- package/docs/components/content/Tree.md +154 -69
- package/docs/components/data/DataTable.md +168 -56
- package/docs/components/data/ItemTable.md +485 -182
- package/docs/components/fields/Checkbox.md +0 -2
- package/docs/components/fields/ColorInput.md +79 -38
- package/docs/components/fields/ColorPicker.md +39 -17
- package/docs/components/fields/ColorSwatch.md +30 -11
- package/docs/components/fields/ColorSwatchGroup.md +42 -18
- package/docs/components/fields/ComboBox.md +1 -13
- package/docs/components/fields/CommandTextArea.md +37 -10
- package/docs/components/fields/DatePicker.md +0 -3
- package/docs/components/fields/FileInput.md +0 -3
- package/docs/components/fields/FilterListBox.md +14 -34
- package/docs/components/fields/FilterPicker.md +16 -33
- package/docs/components/fields/HueSlider.md +5 -5
- package/docs/components/fields/ListBox.md +9 -35
- package/docs/components/fields/NumberInput.md +0 -3
- package/docs/components/fields/PasswordInput.md +0 -3
- package/docs/components/fields/PeriodPicker.md +17 -7
- package/docs/components/fields/Picker.md +29 -54
- package/docs/components/fields/RadioGroup.md +5 -13
- package/docs/components/fields/SearchComboBox.md +0 -3
- package/docs/components/fields/SearchInput.md +2 -4
- package/docs/components/fields/Select.md +13 -23
- package/docs/components/fields/Switch.md +0 -3
- package/docs/components/fields/TextInput.md +0 -3
- package/docs/components/fields/TextInputMapper.md +2 -1
- package/docs/components/form/Field.md +2 -5
- package/docs/components/form/Form.md +0 -5
- package/docs/components/form/FormInstance.md +1 -1
- package/docs/components/helpers/DisplayTransition.md +6 -10
- package/docs/components/helpers/IconSwitch.md +0 -1
- package/docs/components/layout/Board.md +190 -50
- package/docs/components/navigation/Pagination.md +75 -36
- package/docs/components/navigation/Tabs.md +15 -3
- package/docs/components/other/Calendar.md +39 -22
- package/docs/components/other/CubeLogo.md +1 -1
- package/docs/components/overlays/Dialog.md +0 -3
- package/docs/components/overlays/DialogContainer.md +0 -2
- package/docs/components/overlays/DialogForm.md +2 -6
- package/docs/components/overlays/DialogTrigger.md +2 -4
- package/docs/components/overlays/Notifications.md +0 -7
- package/docs/components/overlays/Toast.md +8 -12
- package/docs/components/overlays/Tooltip.md +12 -6
- package/docs/components/overlays/UseDialogContainer.md +10 -16
- package/docs/components/status/LoadingAnimation.md +9 -3
- package/docs/tasty/configuration.md +0 -127
- package/docs/tasty/injector.md +0 -11
- package/package.json +4 -4
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +0 -2
- package/dist/components/portal/PortalProvider.d.ts +0 -2
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
# ItemTable
|
|
2
2
|
|
|
3
|
-
ItemTable renders a list of records as a table: one row per entity, columns
|
|
3
|
+
ItemTable renders a list of records as a table: one row per entity, columns
|
|
4
|
+
declared as data rather than JSX. It is the general-purpose table for list and
|
|
5
|
+
admin pages.
|
|
4
6
|
|
|
5
|
-
It renders a real `<table>` with `role="grid"`, and is styled entirely through
|
|
7
|
+
It renders a real `<table>` with `role="grid"`, and is styled entirely through
|
|
8
|
+
tasty sub-elements — `Row`, `Cell`, `HeaderCell` and friends are reachable from
|
|
9
|
+
the single `styles` prop.
|
|
6
10
|
|
|
7
|
-
> `ItemTable` and `DataTable` are siblings over one internal engine. `ItemTable`
|
|
11
|
+
> `ItemTable` and `DataTable` are siblings over one internal engine. `ItemTable`
|
|
12
|
+
> is for records; `DataTable` is for analytics results (pivoted columns, pinned
|
|
13
|
+
> totals, cell-range selection).
|
|
8
14
|
|
|
9
15
|
## When to Use
|
|
10
16
|
|
|
11
17
|
- Listing entities the user acts on: deployments, users, API keys, roles.
|
|
12
|
-
- Any table where a row is a
|
|
13
|
-
|
|
18
|
+
- Any table where a row is a *thing* — it can be opened, selected, or given a
|
|
19
|
+
menu.
|
|
20
|
+
- Tables that need a column header richer than a label: icon, description,
|
|
21
|
+
tooltip, actions.
|
|
14
22
|
|
|
15
|
-
Use `DataTable` instead when a
|
|
23
|
+
Use `DataTable` instead when a *cell* is the unit of interest — query results,
|
|
24
|
+
pivots, totals. Use `ListBox` when there is only one column.
|
|
16
25
|
|
|
17
26
|
## Component
|
|
18
27
|
|
|
@@ -22,102 +31,197 @@ Use `DataTable` instead when a _cell_ is the unit of interest — query results,
|
|
|
22
31
|
- **`columns`** `CubeItemTableColumn<T>[]` — Column definitions. See below.
|
|
23
32
|
- **`rowKey`** `string` (default: `'id'`) — Property used as the row key.
|
|
24
33
|
- **`getRowKey`** `(row: T, index: number) => Key` — Wins over `rowKey`.
|
|
25
|
-
- **`getRowChildren`** `(row: T) => readonly T[] | undefined` — Enables tree
|
|
26
|
-
|
|
34
|
+
- **`getRowChildren`** `(row: T) => readonly T[] | undefined` — Enables tree
|
|
35
|
+
mode. `data` then contains top-level rows and children are read recursively.
|
|
36
|
+
- **`treeColumnKey`** `string` — Column containing indentation and the
|
|
37
|
+
disclosure control. Defaults to the first visible data column.
|
|
27
38
|
- **`expandedKeys`** `Key[]` — Controlled expanded rows.
|
|
28
39
|
- **`defaultExpandedKeys`** `Key[]` — Initially expanded rows. Defaults to none.
|
|
29
|
-
- **`onExpand`** `(keys, info) => void` — Reports the complete expanded-key list
|
|
30
|
-
|
|
31
|
-
- **`
|
|
32
|
-
|
|
33
|
-
- **`
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
- **`onExpand`** `(keys, info) => void` — Reports the complete expanded-key list
|
|
41
|
+
and the toggled row, key, zero-based level, parent key and resulting state.
|
|
42
|
+
- **`isLoading`** `boolean` (default: `false`) — Marks a fetch in flight. What
|
|
43
|
+
the user sees depends on `loadingIndicator`.
|
|
44
|
+
- **`loadingIndicator`** `'overlay' | 'skeleton' | 'none'` (default: `'overlay'`)
|
|
45
|
+
— What to show while `isLoading` is true over rows the table already has.
|
|
46
|
+
`overlay` keeps them, faded under a sweeping band; `skeleton` replaces them with
|
|
47
|
+
placeholders; `none` paints nothing beyond `aria-busy`. With no rows yet,
|
|
48
|
+
`overlay` and `skeleton` both fall back to skeleton rows.
|
|
49
|
+
- **`skeletonRowCount`** `number` (default: `6`) — Skeleton rows to show while
|
|
50
|
+
loading.
|
|
51
|
+
- **`emptyLabel`** `ReactNode` — Shown when there is nothing at all. Defaults to
|
|
52
|
+
a localized "No items".
|
|
53
|
+
- **`noResultsLabel`** `ReactNode` — Shown instead of `emptyLabel` when
|
|
54
|
+
`isFiltered` is set. Defaults to a localized "No results found".
|
|
55
|
+
- **`isFiltered`** `boolean` — Marks the emptiness as the result of a filter, so
|
|
56
|
+
`noResultsLabel` is shown instead of `emptyLabel`. The built-in search sets it
|
|
57
|
+
on its own; pass it explicitly when you filter `data` yourself.
|
|
36
58
|
- **`error`** `ReactNode` — Takes precedence over both labels.
|
|
37
|
-
- **`shape`** `'plain' | 'card'` (default: `'plain'`) — `card` adds a border and
|
|
38
|
-
|
|
39
|
-
- **`
|
|
59
|
+
- **`shape`** `'plain' | 'card'` (default: `'plain'`) — `card` adds a border and
|
|
60
|
+
a card radius.
|
|
61
|
+
- **`size`** `'xsmall' | 'small' | 'medium' | 'large' | 'xlarge'` (default:
|
|
62
|
+
`'medium'`) — Drives both heights. At `medium` a row is 40px and the header
|
|
63
|
+
32px, each plus its 1px separator.
|
|
64
|
+
- **`rowHeight`** `number` — Row height in px, overriding the one `size`
|
|
65
|
+
implies. Excludes the 1px separator.
|
|
40
66
|
- **`headerHeight`** `number` — Header height in px, excluding its 1px border.
|
|
41
|
-
- **`headerPreset`** `string` (default: `'c3'`) — Typography preset for the
|
|
67
|
+
- **`headerPreset`** `string` (default: `'c3'`) — Typography preset for the
|
|
68
|
+
column header. `c3` is the small uppercase caption the Cloud list tables use;
|
|
69
|
+
pass `'t3m'` for body-sized headers.
|
|
42
70
|
- **`isRowMoveAnimated`** `boolean` (default: `true`) — Slide rows to their new positions when the order changes, instead of teleporting them. Respects `prefers-reduced-motion`.
|
|
43
71
|
- **`isStriped`** `boolean` (default: `false`) — Alternating row background.
|
|
44
|
-
- **`isHeaderHidden`** `boolean` (default: `false`) — Hides the column header
|
|
45
|
-
|
|
46
|
-
- **`
|
|
47
|
-
|
|
48
|
-
- **`
|
|
72
|
+
- **`isHeaderHidden`** `boolean` (default: `false`) — Hides the column header
|
|
73
|
+
row and drops it from `aria-rowcount`.
|
|
74
|
+
- **`isHeaderSticky`** `boolean` (default: `true`) — Pins the column header
|
|
75
|
+
while the body scrolls.
|
|
76
|
+
- **`isAutoHeight`** `boolean` (default: `false`) — Shrink-wraps the frame to
|
|
77
|
+
the rendered rows instead of filling its flex pane. It takes precedence over
|
|
78
|
+
root height/flex sizing and disables virtualization.
|
|
79
|
+
- **`sortMode`** `'client' | 'server' | 'off'` (default: `'client'` when any
|
|
80
|
+
column is sortable, else `'off'`) — `client` reorders `data` itself; `server`
|
|
81
|
+
only reflects `sort` and fires `onSortChange`; `off` removes the affordance.
|
|
82
|
+
- **`sort`** `CubeTableSort | null` — Controlled sort, `{ columnKey, direction }`
|
|
83
|
+
with `direction` being `'asc' | 'desc'`.
|
|
49
84
|
- **`defaultSort`** `CubeTableSort | null` — Initial sort for uncontrolled usage.
|
|
50
|
-
- **`onSortChange`** `(sort: CubeTableSort | null) => void` — Fires on every step
|
|
51
|
-
|
|
52
|
-
- **`
|
|
53
|
-
|
|
85
|
+
- **`onSortChange`** `(sort: CubeTableSort | null) => void` — Fires on every step
|
|
86
|
+
of the cycle, including the return to unsorted.
|
|
87
|
+
- **`toolbar`** `ReactNode` — Replaces the entire toolbar row. Compose it from
|
|
88
|
+
`ItemTable.Search` / `ItemTable.Toolbar`, which read the table's state from
|
|
89
|
+
context.
|
|
90
|
+
- **`isSearchable`** `boolean` (default: `false`) — Render the built-in search
|
|
91
|
+
input in the toolbar.
|
|
92
|
+
- **`searchMode`** `'client' | 'server'` (default: `'client'`) — `client`
|
|
93
|
+
filters `data` with the built-in matcher; `server` only reports the term.
|
|
54
94
|
- **`searchPlaceholder`** `string` — Placeholder for the search input.
|
|
55
|
-
- **`searchValue`** `string` — Controlled term. Works with
|
|
95
|
+
- **`searchValue`** `string` — Controlled term. Works with
|
|
96
|
+
`isSearchable={false}` too, so a page can render its own input anywhere and
|
|
97
|
+
still drive the table's matcher.
|
|
56
98
|
- **`defaultSearchValue`** `string` — Initial term for uncontrolled usage.
|
|
57
99
|
- **`onSearchChange`** `(value: string) => void` — Debounced.
|
|
58
|
-
- **`searchDelay`** `number` (default: `500`) — Debounces the filter **and** the
|
|
59
|
-
|
|
100
|
+
- **`searchDelay`** `number` (default: `500`) — Debounces the filter **and** the
|
|
101
|
+
callback, in both modes. The input itself stays immediate.
|
|
102
|
+
- **`searchFilter`** `(row: T, query: string) => boolean` — Replaces the default
|
|
103
|
+
client matcher.
|
|
60
104
|
- **`filters`** `ReactNode` — Left group, after the search input.
|
|
61
105
|
- **`actions`** `ReactNode` — Right group. Arbitrary JSX.
|
|
62
|
-
- **`onRefresh`** `() => void` — Renders a refresh button at the end of the
|
|
63
|
-
|
|
64
|
-
- **`
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
106
|
+
- **`onRefresh`** `() => void` — Renders a refresh button at the end of the
|
|
107
|
+
toolbar.
|
|
108
|
+
- **`isVirtualized`** `boolean | 'auto'` (default: `'auto'`) — `'auto'` turns
|
|
109
|
+
virtualization on once the row count passes `virtualizeThreshold`. It needs a
|
|
110
|
+
bounded height to have a viewport to work against and is ignored when
|
|
111
|
+
`isAutoHeight` is enabled.
|
|
112
|
+
- **`virtualizeThreshold`** `number` (default: `50`) — Row count above which
|
|
113
|
+
`'auto'` virtualizes.
|
|
114
|
+
- **`overscan`** `number` (default: `12`) — Rows mounted beyond each viewport
|
|
115
|
+
edge while virtualized. Higher than a list's, because a fast flick outruns
|
|
116
|
+
React's re-render and the gap shows as blank rows.
|
|
117
|
+
- **`selectionMode`** `'none' | 'single' | 'multiple'` (default: `'none'`) —
|
|
118
|
+
`multiple` adds the checkbox column and a select-all header checkbox;
|
|
119
|
+
`single` adds the column without the header checkbox.
|
|
120
|
+
- **`selectedKeys`** `Key[] | 'all'` — Controlled selection. `'all'` is a
|
|
121
|
+
sentinel meaning "everything, including rows the client has not loaded".
|
|
68
122
|
- **`defaultSelectedKeys`** `Key[] | 'all'` — Initial selection.
|
|
69
|
-
- **`onSelectionChange`** `(keys: Key[] | 'all', rows: T[]) => void` — `rows`
|
|
70
|
-
|
|
71
|
-
- **`
|
|
72
|
-
|
|
123
|
+
- **`onSelectionChange`** `(keys: Key[] | 'all', rows: T[]) => void` — `rows`
|
|
124
|
+
holds only the rows the client has loaded.
|
|
125
|
+
- **`selectAllMode`** `'page' | 'filtered' | 'all'` (default: `'page'`) — What
|
|
126
|
+
the header checkbox acts on.
|
|
127
|
+
- **`isRowSelectable`** `(row: T) => boolean` — The row stays focusable and
|
|
128
|
+
clickable; only its checkbox goes inert.
|
|
129
|
+
- **`selectionTooltip`** `string | ((row: T) => string | undefined)` — Explains
|
|
130
|
+
an inert checkbox.
|
|
73
131
|
- **`disabledKeys`** `Key[]` — Rows that cannot be interacted with at all.
|
|
74
|
-
- **`treeSelectionBehavior`** `'cascade' | 'independent'` (default: `'cascade'`
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
- **`
|
|
79
|
-
-
|
|
80
|
-
|
|
81
|
-
- **`
|
|
82
|
-
|
|
132
|
+
- **`treeSelectionBehavior`** `'cascade' | 'independent'` (default: `'cascade'`
|
|
133
|
+
in tree mode) — Multiple selection only. Cascade selects eligible descendants
|
|
134
|
+
and derives checked or indeterminate ancestors; single selection is always
|
|
135
|
+
independent.
|
|
136
|
+
- **`rowLink`** `(row: T, index: number) => NavigateArg | undefined` — Turns the
|
|
137
|
+
row-header cell into a stretched link covering the whole row. Return
|
|
138
|
+
`undefined` for a row that should not navigate.
|
|
139
|
+
- **`onRowAction`** `(row: T, key: Key) => void` — Non-navigational activation:
|
|
140
|
+
Enter, or a click that did not land on a control inside a cell.
|
|
141
|
+
- **`rowMenu`** `ReactNode | ((row, ctx) => ReactNode | null)` — `Menu.Item`
|
|
142
|
+
children. Inert until `rowContextMenu` exposes it.
|
|
143
|
+
- **`rowContextMenu`** `boolean | 'context-only'` (default: `false`) — `true`
|
|
144
|
+
gives a `⋮` trigger column **and** right-click / Shift+F10;
|
|
145
|
+
`'context-only'` gives the keyboard and pointer paths without the column.
|
|
146
|
+
- **`onRowMenuAction`** `(action: string, row: T, key: Key) => void` — The
|
|
147
|
+
action key as written on `Menu.Item`.
|
|
148
|
+
- **`rowMenuTriggerProps`** `Partial<CubeItemActionProps>` — Forwarded to every
|
|
149
|
+
`⋮` trigger.
|
|
150
|
+
- **`bulkActions`** `CubeTableBulkAction<T>[]` — Actions offered while rows are
|
|
151
|
+
selected. Supplying any implies `selectionMode="multiple"`.
|
|
152
|
+
- **`bulkBarPlacement`** `'floating' | 'toolbar'` (default: `'floating'`) —
|
|
153
|
+
`floating` centres the bar over the body without changing the table's height;
|
|
154
|
+
`toolbar` replaces the `actions` group while a selection exists.
|
|
83
155
|
- **`bulkBarStyles`** `Styles` — Styles for the bar.
|
|
84
|
-
- **`paginationMode`** `'client' | 'server' | 'off'` (default: `'client'`) —
|
|
156
|
+
- **`paginationMode`** `'client' | 'server' | 'off'` (default: `'client'`) —
|
|
157
|
+
`client` slices the searched and sorted rows; `server` never slices and only
|
|
158
|
+
reflects `page` / `total`; `off` removes the control.
|
|
85
159
|
- **`pageSize`** `number` — Controlled page size.
|
|
86
160
|
- **`defaultPageSize`** `number` (default: `50`) — Initial page size.
|
|
87
|
-
- **`onPageSizeChange`** `(pageSize: number) => void` — Fires with the new size.
|
|
88
|
-
|
|
161
|
+
- **`onPageSizeChange`** `(pageSize: number) => void` — Fires with the new size.
|
|
162
|
+
Changing the size returns to page 1.
|
|
163
|
+
- **`pageSizeOptions`** `number[]` (default: `[10, 20, 50, 100, 500]`) — Choices
|
|
164
|
+
in the page-size selector.
|
|
89
165
|
- **`page`** `number` — Controlled 1-based page.
|
|
90
166
|
- **`defaultPage`** `number` (default: `1`) — Initial page.
|
|
91
167
|
- **`onPageChange`** `(page: number) => void` — Fires with the clamped page.
|
|
92
|
-
- **`onLoadMore`** `() => void` — `paginationMode="infinite"` only. Fires once
|
|
168
|
+
- **`onLoadMore`** `() => void` — `paginationMode="infinite"` only. Fires once
|
|
169
|
+
the end of the list comes into view.
|
|
93
170
|
- **`hasMore`** `boolean` — Whether there is anything left to fetch.
|
|
94
|
-
- **`isLoadingMore`** `boolean` — Suppresses further calls while a batch is in
|
|
95
|
-
|
|
96
|
-
- **`
|
|
171
|
+
- **`isLoadingMore`** `boolean` — Suppresses further calls while a batch is in
|
|
172
|
+
flight and shows a loading row.
|
|
173
|
+
- **`loadMoreMargin`** `number` (default: one viewport height) — How far before
|
|
174
|
+
the end to start fetching, in px.
|
|
175
|
+
- **`autoHidePagination`** `boolean` (default: `true`) — Hides the pagination
|
|
176
|
+
control when it cannot do anything: a single page whose total even the
|
|
177
|
+
smallest `pageSizeOptions` entry would not split. The footer still renders if
|
|
178
|
+
any slot has content.
|
|
97
179
|
- **`total`** `number` — Server mode: total row count behind the query.
|
|
98
|
-
- **`totalPages`** `number` — Server mode alternative to `total` when the count
|
|
99
|
-
|
|
100
|
-
- **`
|
|
180
|
+
- **`totalPages`** `number` — Server mode alternative to `total` when the count
|
|
181
|
+
is unknown.
|
|
182
|
+
- **`hasNextPage`** `boolean` — Server mode: keeps "next" enabled when neither
|
|
183
|
+
`total` nor `totalPages` is known.
|
|
184
|
+
- **`summary`** `boolean | ((info: CubeTablePageInfo) => ReactNode)` (default:
|
|
185
|
+
`true`) — The localized item range in the footer, e.g. "1–50 of 1,204".
|
|
101
186
|
- **`footer`** `ReactNode` — Replaces the entire footer row.
|
|
102
|
-
- **`footerStart`** `ReactNode` — Start footer slot. Renders even with
|
|
187
|
+
- **`footerStart`** `ReactNode` — Start footer slot. Renders even with
|
|
188
|
+
`paginationMode="off"` — this is where a "Load all results" button belongs.
|
|
103
189
|
- **`footerCenter`** `ReactNode` — Center footer slot.
|
|
104
190
|
- **`footerEnd`** `ReactNode` — End footer slot, before the pagination control.
|
|
105
191
|
- **`footerStyles`** `Styles` — Styles for the footer row.
|
|
106
|
-
- **`isReorderable`** `boolean` (default: `false`) — Lets rows be dragged into a
|
|
107
|
-
|
|
108
|
-
- **`
|
|
109
|
-
|
|
110
|
-
- **`
|
|
192
|
+
- **`isReorderable`** `boolean` (default: `false`) — Lets rows be dragged into a
|
|
193
|
+
new order.
|
|
194
|
+
- **`onReorder`** `(keys: Key[], rows: T[]) => void` — The **whole** new order,
|
|
195
|
+
not just the moved row, so it can be persisted directly.
|
|
196
|
+
- **`dropOnRow`** `{ isTarget, isAllowed?, onDrop }` — Dropping rows *onto* a
|
|
197
|
+
row, e.g. a workbook into a folder. Enables dragging on its own, and composes
|
|
198
|
+
with `isReorderable`.
|
|
199
|
+
- **`getItemDragInfo`** `(row: T) => { label, icon? }` — What the cursor drags.
|
|
200
|
+
One row shows its icon and label; several show a count. Without it the browser
|
|
201
|
+
drags a screenshot of the row.
|
|
202
|
+
- **`isResizable`** `boolean` (default: `false`) — Adds a resize handle to every
|
|
203
|
+
column; a column overrides with its own `isResizable`.
|
|
111
204
|
- **`columnWidths`** `Record<string, number>` — Controlled widths by column key.
|
|
112
205
|
- **`defaultColumnWidths`** `Record<string, number>` — Initial widths.
|
|
113
|
-
- **`onColumnResize`** `(columnKey, width, all) => void` — Fires once the
|
|
114
|
-
|
|
115
|
-
- **`
|
|
206
|
+
- **`onColumnResize`** `(columnKey, width, all) => void` — Fires once the
|
|
207
|
+
gesture ends, not on every pixel.
|
|
208
|
+
- **`columnContextMenu`** `boolean | 'context-only'` (default: `true`) — Where a
|
|
209
|
+
column's `header.menu` is exposed: a `⋮` trigger plus right-click and
|
|
210
|
+
Shift+F10, right-click only, or nowhere.
|
|
211
|
+
- **`onColumnMenuAction`** `(action, columnKey) => void` — The pressed
|
|
212
|
+
`Menu.Item` key, as written. Fires for the reserved sort keys too, after the
|
|
213
|
+
table has applied them.
|
|
116
214
|
- **`columnMenuTriggerProps`** `Record<string, any>` — Props for the `⋮` trigger.
|
|
117
215
|
- **`columnMenuProps`** `Record<string, any>` — Props for the `Menu`.
|
|
118
|
-
- **`storageKey`** `string` — Persists the table's own state under
|
|
119
|
-
-
|
|
120
|
-
|
|
216
|
+
- **`storageKey`** `string` — Persists the table's own state under
|
|
217
|
+
`cube-ui-kit:table:${storageKey}`. Controlled state is never stored — a
|
|
218
|
+
controlled `pageSize` or `sort` belongs to the page, and restoring it would
|
|
219
|
+
give the table a second, competing source of truth.
|
|
220
|
+
- **`persist`** `('pageSize' | 'columnWidths' | 'sort')[]` (default:
|
|
221
|
+
`['pageSize', 'columnWidths']`) — What `storageKey` covers. Sort is opt-in,
|
|
222
|
+
because a stored sort silently changes what the first screen of a table means.
|
|
223
|
+
- **`getRowProps`** `(ctx) => { isDimmed?, mods?, styles?, height?, qa?, tooltip? }`
|
|
224
|
+
— Per-row visuals.
|
|
121
225
|
- **`ariaLabel`** `string` — Labels the grid.
|
|
122
226
|
- **`isChecked`** `boolean` — Base checked-state modifier.
|
|
123
227
|
- **`place`** `string` — Tasty placement shorthand on the root frame.
|
|
@@ -156,11 +260,16 @@ interface CubeItemTableColumn<T> {
|
|
|
156
260
|
}
|
|
157
261
|
```
|
|
158
262
|
|
|
159
|
-
**The value pipeline is the escape hatch.** `getValue`, `format` and `compare`
|
|
263
|
+
**The value pipeline is the escape hatch.** `getValue`, `format` and `compare`
|
|
264
|
+
exist so a column whose displayed text differs from its raw value stays
|
|
265
|
+
sortable, searchable and copyable. `render` is for appearance only — sorting and
|
|
266
|
+
searching never see its output, which is why an object-valued column with no
|
|
267
|
+
`format` renders empty rather than `"[object Object]"`.
|
|
160
268
|
|
|
161
269
|
#### `CubeTableColumnHeader`
|
|
162
270
|
|
|
163
|
-
Every slot maps 1:1 onto the `Item` rendered inside the header cell, so a header
|
|
271
|
+
Every slot maps 1:1 onto the `Item` rendered inside the header cell, so a header
|
|
272
|
+
gets an icon, a description, a tooltip and actions for free:
|
|
164
273
|
|
|
165
274
|
```jsx
|
|
166
275
|
{
|
|
@@ -178,7 +287,11 @@ Every slot maps 1:1 onto the `Item` rendered inside the header cell, so a header
|
|
|
178
287
|
|
|
179
288
|
`header.render(ctx)` takes over the cell's content entirely.
|
|
180
289
|
|
|
181
|
-
On a sortable column the sort arrow occupies the `rightIcon` slot — it is an
|
|
290
|
+
On a sortable column the sort arrow occupies the `rightIcon` slot — it is an
|
|
291
|
+
icon, and that slot is sized and aligned for one. The slot stays reserved while
|
|
292
|
+
unsorted, so toggling a sort never shifts the label. If you set
|
|
293
|
+
`header.rightIcon` yourself it keeps the slot and the arrow falls back to
|
|
294
|
+
`suffix`.
|
|
182
295
|
|
|
183
296
|
### Base Properties
|
|
184
297
|
|
|
@@ -188,7 +301,8 @@ Supports Base Properties.
|
|
|
188
301
|
|
|
189
302
|
#### styles
|
|
190
303
|
|
|
191
|
-
Customizes the root frame. Every internal part of the table is a **sub-element**
|
|
304
|
+
Customizes the root frame. Every internal part of the table is a **sub-element**
|
|
305
|
+
reachable from this one prop — that is the whole styling contract.
|
|
192
306
|
|
|
193
307
|
**Sub-elements:**
|
|
194
308
|
|
|
@@ -196,7 +310,8 @@ Customizes the root frame. Every internal part of the table is a **sub-element**
|
|
|
196
310
|
- `Table` — the `<table>`
|
|
197
311
|
- `Head`, `HeadRow`, `HeaderCell` — the column header
|
|
198
312
|
- `Body`, `Row`, `Cell` — the data rows
|
|
199
|
-
- `TreeContent`, `TreeToggle`, `TreeValue` — indentation, disclosure/leaf
|
|
313
|
+
- `TreeContent`, `TreeToggle`, `TreeValue` — indentation, disclosure/leaf
|
|
314
|
+
placeholder, and the consumer-rendered value in the tree column
|
|
200
315
|
- `SortIndicator` — the sort arrow, inside the header `Item`'s suffix
|
|
201
316
|
- `Foot`, `FootRow`, `FootCell` — pinned totals
|
|
202
317
|
- `StateContent` — the empty / no-results / error content
|
|
@@ -210,13 +325,20 @@ const Compact = tasty(ItemTable, {
|
|
|
210
325
|
});
|
|
211
326
|
```
|
|
212
327
|
|
|
213
|
-
Rows publish their paint as inherited custom properties — `#row-base`,
|
|
328
|
+
Rows publish their paint as inherited custom properties — `#row-base`,
|
|
329
|
+
`#row-overlay`, `#row-text` and `$dim` — which cells consume. That is what lets
|
|
330
|
+
a pinned (and therefore opaque) cell match its row's state without duplicating
|
|
331
|
+
the state matrix.
|
|
214
332
|
|
|
215
|
-
Geometry runs through tokens too: `$row-height`, `$header-height`,
|
|
333
|
+
Geometry runs through tokens too: `$row-height`, `$header-height`,
|
|
334
|
+
`$cell-padding-x` (16px) and `$cell-padding-y`. Height lives on the **cells**,
|
|
335
|
+
not the `<tr>` — table layout ignores `min-height` on a row and sizes it from
|
|
336
|
+
its cells instead.
|
|
216
337
|
|
|
217
338
|
#### toolbarStyles
|
|
218
339
|
|
|
219
|
-
The toolbar row. Sub-elements: `Start` (search + filters) and `End` (actions +
|
|
340
|
+
The toolbar row. Sub-elements: `Start` (search + filters) and `End` (actions +
|
|
341
|
+
refresh).
|
|
220
342
|
|
|
221
343
|
#### searchStyles
|
|
222
344
|
|
|
@@ -224,11 +346,13 @@ The built-in search input.
|
|
|
224
346
|
|
|
225
347
|
#### headerStyles
|
|
226
348
|
|
|
227
|
-
The **column header row**. (The top chrome, when it arrives, is `toolbarStyles`
|
|
349
|
+
The **column header row**. (The top chrome, when it arrives, is `toolbarStyles`
|
|
350
|
+
— a table has two things called "header" and this one is the columns.)
|
|
228
351
|
|
|
229
352
|
#### headerCellStyles
|
|
230
353
|
|
|
231
|
-
Every column header cell. Wins over `headerPreset`, so this is where you go for
|
|
354
|
+
Every column header cell. Wins over `headerPreset`, so this is where you go for
|
|
355
|
+
anything the preset does not cover.
|
|
232
356
|
|
|
233
357
|
#### bodyStyles
|
|
234
358
|
|
|
@@ -253,17 +377,21 @@ These properties allow direct style application without using the `styles` prop:
|
|
|
253
377
|
- **Color:** `color`, `fill`, `fade`, `image`
|
|
254
378
|
- **Flow:** `flow`, `gap`, `columnGap`, `rowGap`, `placeItems`, `placeContent`, `alignItems`, `alignContent`, `justifyItems`, `justifyContent`, `align`, `justify`, `gridColumns`, `gridRows`, `gridTemplate`, `gridAreas`
|
|
255
379
|
|
|
256
|
-
`height` is the important one: there is no page-scroll mode, so
|
|
380
|
+
`height` is the important one: there is no page-scroll mode, so
|
|
381
|
+
bounding the table is what turns the body into a scroller and pins the header.
|
|
382
|
+
An unbounded table simply sizes to its content.
|
|
257
383
|
|
|
258
384
|
### Modifiers
|
|
259
385
|
|
|
260
|
-
| Modifier
|
|
261
|
-
|
|
|
262
|
-
| `size`
|
|
263
|
-
| `shape`
|
|
264
|
-
| `sticky-header` | `boolean`
|
|
386
|
+
| Modifier | Type | Description |
|
|
387
|
+
| -------- | ---- | ----------- |
|
|
388
|
+
| `size` | `SizeName` | Row height scale |
|
|
389
|
+
| `shape` | `'plain' \| 'card'` | Frame treatment |
|
|
390
|
+
| `sticky-header` | `boolean` | Header is pinned |
|
|
265
391
|
|
|
266
|
-
Row-level modifiers, set on each `<tr>`: `odd`, `selected`, `focused`, `dimmed`,
|
|
392
|
+
Row-level modifiers, set on each `<tr>`: `odd`, `selected`, `focused`, `dimmed`,
|
|
393
|
+
`disabled`, `drop-target`, `placeholder`. Cell-level: `pin`, `pin-edge`,
|
|
394
|
+
`align`, `wrap`, `state`.
|
|
267
395
|
|
|
268
396
|
## Examples
|
|
269
397
|
|
|
@@ -285,7 +413,8 @@ Row-level modifiers, set on each `<tr>`: `odd`, `selected`, `focused`, `dimmed`,
|
|
|
285
413
|
|
|
286
414
|
### Tree Rows
|
|
287
415
|
|
|
288
|
-
Supplying `getRowChildren` changes the root to `role="treegrid"`. Rows keep their
|
|
416
|
+
Supplying `getRowChildren` changes the root to `role="treegrid"`. Rows keep their
|
|
417
|
+
original objects; keys must be unique across the complete hierarchy.
|
|
289
418
|
|
|
290
419
|
```jsx
|
|
291
420
|
<ItemTable
|
|
@@ -298,11 +427,22 @@ Supplying `getRowChildren` changes the root to `role="treegrid"`. Rows keep thei
|
|
|
298
427
|
/>
|
|
299
428
|
```
|
|
300
429
|
|
|
301
|
-
Client sorting runs independently within every sibling collection. Client
|
|
430
|
+
Client sorting runs independently within every sibling collection. Client
|
|
431
|
+
search retains ancestor paths; a matching parent keeps its complete subtree,
|
|
432
|
+
and required branches open temporarily without changing `expandedKeys`. Client
|
|
433
|
+
pagination counts and slices roots, keeping each subtree on its parent's page.
|
|
434
|
+
Server modes treat the supplied nested page as already processed, and `total`
|
|
435
|
+
counts roots.
|
|
302
436
|
|
|
303
|
-
The chevron and Right/Left arrows expand or collapse. Up/Down traverse visible
|
|
437
|
+
The chevron and Right/Left arrows expand or collapse. Up/Down traverse visible
|
|
438
|
+
rows, typeahead uses the tree column, and Left on a collapsed child moves to its
|
|
439
|
+
parent. Ordinary row clicks still activate `onRowAction`/`rowLink`; the
|
|
440
|
+
disclosure does not. Select-all includes collapsed descendants. Disabled and
|
|
441
|
+
unselectable descendants are excluded from cascade.
|
|
304
442
|
|
|
305
|
-
Tree mode ignores `isReorderable`, because a flat reordered array cannot encode
|
|
443
|
+
Tree mode ignores `isReorderable`, because a flat reordered array cannot encode
|
|
444
|
+
parents. `dropOnRow` remains available for folder moves; self/descendant cycles
|
|
445
|
+
are rejected and selected descendants are collapsed under a dragged ancestor.
|
|
306
446
|
|
|
307
447
|
### Custom Cells
|
|
308
448
|
|
|
@@ -317,15 +457,21 @@ Tree mode ignores `isReorderable`, because a flat reordered array cannot encode
|
|
|
317
457
|
|
|
318
458
|
### Appearance
|
|
319
459
|
|
|
320
|
-
`shape="card"` frames the table, `isStriped` bands the rows, `size` drives both
|
|
460
|
+
`shape="card"` frames the table, `isStriped` bands the rows, `size` drives both
|
|
461
|
+
row and header height, and `isHeaderHidden` drops the header row.
|
|
321
462
|
|
|
322
463
|
### Empty, No-results and Error States
|
|
323
464
|
|
|
324
|
-
`isFiltered` is what separates "no matches" from "nothing exists"; the built-in
|
|
465
|
+
`isFiltered` is what separates "no matches" from "nothing exists"; the built-in
|
|
466
|
+
search sets it for you.
|
|
325
467
|
|
|
326
468
|
### Sorting
|
|
327
469
|
|
|
328
|
-
Sorting is **opt in, per column**: a table with no `isSortable` column has inert
|
|
470
|
+
Sorting is **opt in, per column**: a table with no `isSortable` column has inert
|
|
471
|
+
headers and `sortMode` resolves to `'off'`. Mark columns `isSortable` and
|
|
472
|
+
clicking a header cycles `ascending → descending → unsorted`. The third state
|
|
473
|
+
matters whenever the source order is meaningful, which is why it is the default
|
|
474
|
+
cycle; set `disallowSortRemoval` on a column to reduce it to `asc ↔ desc`.
|
|
329
475
|
|
|
330
476
|
```jsx
|
|
331
477
|
<ItemTable
|
|
@@ -341,7 +487,10 @@ Sorting is **opt in, per column**: a table with no `isSortable` column has inert
|
|
|
341
487
|
|
|
342
488
|
#### A fixed order the user cannot change
|
|
343
489
|
|
|
344
|
-
For a list that arrives in a meaningful order — most of them — leave every column
|
|
490
|
+
For a list that arrives in a meaningful order — most of them — leave every column
|
|
491
|
+
alone and pass the order you want. `sortMode="client"` keeps the engine sorting
|
|
492
|
+
while the headers stay inert, so nothing is clickable and no header takes a tab
|
|
493
|
+
stop:
|
|
345
494
|
|
|
346
495
|
```jsx
|
|
347
496
|
<ItemTable
|
|
@@ -352,13 +501,21 @@ For a list that arrives in a meaningful order — most of them — leave every c
|
|
|
352
501
|
/>
|
|
353
502
|
```
|
|
354
503
|
|
|
355
|
-
The sorted column still carries `aria-sort`, so a screen reader announces the
|
|
504
|
+
The sorted column still carries `aria-sort`, so a screen reader announces the
|
|
505
|
+
order even though the header cannot be operated. It is **not** drawn — the sort
|
|
506
|
+
arrow belongs to the clickable affordance — so add your own marker through
|
|
507
|
+
`header.suffix` if sighted users need to see which column the order follows.
|
|
356
508
|
|
|
357
509
|
Data already in the right order needs none of this: pass it and set nothing.
|
|
358
510
|
|
|
359
|
-
Client-side sorting compares raw `getValue` results — numerically for numbers,
|
|
511
|
+
Client-side sorting compares raw `getValue` results — numerically for numbers,
|
|
512
|
+
chronologically for dates — and falls back to a locale-aware collator over the
|
|
513
|
+
column's display text, so a formatted column sorts the way it reads. `compare`
|
|
514
|
+
overrides all of it. Nullish values sort first, then flip with the direction.
|
|
360
515
|
|
|
361
|
-
`sortMode="server"` reflects the state and reports changes without ever
|
|
516
|
+
`sortMode="server"` reflects the state and reports changes without ever
|
|
517
|
+
reordering the rows. The second table below is server-sorted over a simulated
|
|
518
|
+
round trip:
|
|
362
519
|
|
|
363
520
|
```jsx
|
|
364
521
|
<ItemTable
|
|
@@ -385,17 +542,30 @@ Client-side sorting compares raw `getValue` results — numerically for numbers,
|
|
|
385
542
|
/>
|
|
386
543
|
```
|
|
387
544
|
|
|
388
|
-
The default matcher tests each column's **display text** — `format?.(value) ??
|
|
545
|
+
The default matcher tests each column's **display text** — `format?.(value) ??
|
|
546
|
+
String(getValue(row))` — not the raw value. So a formatted column matches what
|
|
547
|
+
the user can actually see, a dotted `key` like `owner.name` is searchable, and a
|
|
548
|
+
column holding an object with no `format` is skipped rather than stringified
|
|
549
|
+
into `"[object Object]"` (which would make the query "object" match every row).
|
|
550
|
+
Opt a column out with `isSearchable: false`, or replace the matcher entirely
|
|
551
|
+
with `searchFilter`.
|
|
389
552
|
|
|
390
|
-
Searching also selects `noResultsLabel` over `emptyLabel` on its own, and resets
|
|
553
|
+
Searching also selects `noResultsLabel` over `emptyLabel` on its own, and resets
|
|
554
|
+
to page 1, so a client-search table distinguishes "no matches" from "nothing
|
|
555
|
+
exists" without the page owning the term.
|
|
391
556
|
|
|
392
557
|
### Server-side Search
|
|
393
558
|
|
|
394
|
-
`searchMode="server"` never filters — it reports the debounced term and the
|
|
559
|
+
`searchMode="server"` never filters — it reports the debounced term and the
|
|
560
|
+
query does the work.
|
|
395
561
|
|
|
396
562
|
### An External Search Box, and a Custom Toolbar
|
|
397
563
|
|
|
398
|
-
The input does not have to live in the table. `isSearchable={false}` hides the
|
|
564
|
+
The input does not have to live in the table. `isSearchable={false}` hides the
|
|
565
|
+
built-in one while a controlled `searchValue` still drives the table's matcher —
|
|
566
|
+
a first-class path, not a workaround. The second table rebuilds the toolbar
|
|
567
|
+
entirely; `ItemTable.Search` reads the table's state from context, so the term
|
|
568
|
+
still has one owner.
|
|
399
569
|
|
|
400
570
|
```jsx
|
|
401
571
|
const [term, setTerm] = useState('');
|
|
@@ -406,21 +576,34 @@ const [term, setTerm] = useState('');
|
|
|
406
576
|
|
|
407
577
|
### Pagination
|
|
408
578
|
|
|
409
|
-
Pagination lives in the footer and is on by default (`paginationMode="client"`,
|
|
579
|
+
Pagination lives in the footer and is on by default (`paginationMode="client"`,
|
|
580
|
+
50 rows a page). The page-size selector appears whenever `pageSizeOptions` is
|
|
581
|
+
set, and `summary` prints the localized item range.
|
|
410
582
|
|
|
411
583
|
```jsx
|
|
412
584
|
<ItemTable data={rows} columns={columns} defaultPageSize={20} pageSizeOptions={[20, 50, 100]} />
|
|
413
585
|
```
|
|
414
586
|
|
|
415
|
-
Client pagination slices the **searched and sorted** rows, so a page always
|
|
587
|
+
Client pagination slices the **searched and sorted** rows, so a page always
|
|
588
|
+
reflects what the user is looking at, and the summary counts filtered rows
|
|
589
|
+
rather than the raw array. Changing the page size returns to page 1, because the
|
|
590
|
+
old page index points at different rows under a new size.
|
|
416
591
|
|
|
417
|
-
Pagination that cannot do anything hides itself. One page of five rows would
|
|
592
|
+
Pagination that cannot do anything hides itself. One page of five rows would
|
|
593
|
+
otherwise render "1–5 of 5", a page-size selector whose every option shows the
|
|
594
|
+
same five rows, and a solitary "1" button. The test is both conditions together
|
|
595
|
+
— a single page **and** a total the smallest page size would not split — so a
|
|
596
|
+
15-row single page keeps its control, because "10 / page" would genuinely
|
|
597
|
+
paginate it. Set `autoHidePagination={false}` to always show it.
|
|
418
598
|
|
|
419
|
-
Note that pagination and virtualization are alternatives: a 50-row page is well
|
|
599
|
+
Note that pagination and virtualization are alternatives: a 50-row page is well
|
|
600
|
+
under `virtualizeThreshold`, so a paginated table normally renders every row.
|
|
601
|
+
Set `paginationMode="off"` for the long-scroll case.
|
|
420
602
|
|
|
421
603
|
### Infinite Scroll
|
|
422
604
|
|
|
423
|
-
`paginationMode="infinite"` replaces the page control with load-on-scroll. The
|
|
605
|
+
`paginationMode="infinite"` replaces the page control with load-on-scroll. The
|
|
606
|
+
table never slices in this mode — `data` is the list accumulated so far:
|
|
424
607
|
|
|
425
608
|
```jsx
|
|
426
609
|
<ItemTable
|
|
@@ -434,19 +617,42 @@ Note that pagination and virtualization are alternatives: a 50-row page is well
|
|
|
434
617
|
/>
|
|
435
618
|
```
|
|
436
619
|
|
|
437
|
-
It is driven by an `IntersectionObserver` on a sentinel at the end of the body
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
The
|
|
444
|
-
|
|
445
|
-
|
|
620
|
+
It is driven by an `IntersectionObserver` on a sentinel at the end of the body
|
|
621
|
+
rather than a scroll handler: `loadMoreMargin` then expresses "prefetch this far
|
|
622
|
+
before the end" directly, and it costs nothing per scroll tick. The observer
|
|
623
|
+
re-arms only once `isLoadingMore` clears, so a request in flight is never fired
|
|
624
|
+
twice by a sentinel still sitting in view.
|
|
625
|
+
|
|
626
|
+
The fetch starts **a full screen before the end** — `loadMoreMargin` defaults to
|
|
627
|
+
the scroller's own height — so the request goes out while there is still a
|
|
628
|
+
viewport of rows left to read, and the batch has usually arrived by the time the
|
|
629
|
+
user gets there. A fixed 200px, about five rows, meant a fast scroll reached the
|
|
630
|
+
bottom before the response did, which is exactly the stall infinite scroll is
|
|
631
|
+
supposed to avoid.
|
|
632
|
+
|
|
633
|
+
While a batch is in flight the table appends **skeleton rows**, not a spinner.
|
|
634
|
+
They keep the row grid, read as "more rows of this shape are coming", and grow
|
|
635
|
+
the scroll height smoothly instead of a block that appears and vanishes — and it
|
|
636
|
+
matches what the first load already shows.
|
|
637
|
+
|
|
638
|
+
The burst is sized to **the batch that is coming**, measured from the last one
|
|
639
|
+
that arrived, so the list keeps its length through the load: the user can carry
|
|
640
|
+
on scrolling into it, and nothing lurches when the rows land. Measured rather
|
|
641
|
+
than read from `pageSize`, which infinite-scroll consumers often do not set —
|
|
642
|
+
and the first batch is the best predictor of the second. Capped at 50 rows,
|
|
643
|
+
which is taller than any viewport, because these particular rows are not
|
|
644
|
+
virtualized.
|
|
645
|
+
|
|
646
|
+
Under virtualization the trailing spacer holds the remaining height, so the
|
|
647
|
+
sentinel still marks the true end of the list rather than the end of the
|
|
648
|
+
rendered window.
|
|
446
649
|
|
|
447
650
|
### Footer Slots
|
|
448
651
|
|
|
449
|
-
The footer has three named slots, and they render whether or not pagination is
|
|
652
|
+
The footer has three named slots, and they render whether or not pagination is
|
|
653
|
+
on. `footerStart` is where Cloud's "Load all results" button belongs — the thing
|
|
654
|
+
that today needs a `MutationObserver` to inject into ag-grid's paging panel,
|
|
655
|
+
because Community has no status bar.
|
|
450
656
|
|
|
451
657
|
```jsx
|
|
452
658
|
<ItemTable
|
|
@@ -459,7 +665,8 @@ The footer has three named slots, and they render whether or not pagination is o
|
|
|
459
665
|
|
|
460
666
|
### Server-side Pagination
|
|
461
667
|
|
|
462
|
-
`paginationMode="server"` never slices — it reflects `page` and reports changes,
|
|
668
|
+
`paginationMode="server"` never slices — it reflects `page` and reports changes,
|
|
669
|
+
and `total` comes from the query. `data` is the current page.
|
|
463
670
|
|
|
464
671
|
```jsx
|
|
465
672
|
<ItemTable
|
|
@@ -477,7 +684,8 @@ The footer has three named slots, and they render whether or not pagination is o
|
|
|
477
684
|
|
|
478
685
|
### Loading Behaviour
|
|
479
686
|
|
|
480
|
-
`loadingIndicator` chooses what happens while `isLoading` is true over rows the
|
|
687
|
+
`loadingIndicator` chooses what happens while `isLoading` is true over rows the
|
|
688
|
+
table already has — the window that only exists once a query is involved:
|
|
481
689
|
|
|
482
690
|
| Value | Behaviour |
|
|
483
691
|
| --- | --- |
|
|
@@ -485,11 +693,15 @@ The footer has three named slots, and they render whether or not pagination is o
|
|
|
485
693
|
| `skeleton` | The previous rows are discarded for placeholders. Honest that the data is gone, but it flashes on every page and a short page makes the table jump. |
|
|
486
694
|
| `none` | No visuals beyond `aria-busy`. For pages that already show a top-level progress bar and do not want a second indicator. |
|
|
487
695
|
|
|
488
|
-
With no rows yet, `overlay` and `skeleton` both render skeleton rows — there is
|
|
696
|
+
With no rows yet, `overlay` and `skeleton` both render skeleton rows — there is
|
|
697
|
+
nothing to keep — and `none` renders an empty body rather than flashing the
|
|
698
|
+
`emptyLabel` before the first response arrives.
|
|
489
699
|
|
|
490
700
|
### Bounded Height, Sticky Header and Pinned Columns
|
|
491
701
|
|
|
492
|
-
A bounded height turns the body into a scroller and pins the header. Pinned
|
|
702
|
+
A bounded height turns the body into a scroller and pins the header. Pinned
|
|
703
|
+
columns are sticky `<th>`/`<td>` — one scroller, no lanes, no scroll sync. They
|
|
704
|
+
are moved to the edges in DOM order too, so `aria-colindex` stays truthful.
|
|
493
705
|
|
|
494
706
|
```jsx
|
|
495
707
|
<ItemTable
|
|
@@ -505,9 +717,14 @@ A bounded height turns the body into a scroller and pins the header. Pinned colu
|
|
|
505
717
|
|
|
506
718
|
### Virtualization
|
|
507
719
|
|
|
508
|
-
Above `virtualizeThreshold` rows a bounded table virtualizes automatically. The
|
|
720
|
+
Above `virtualizeThreshold` rows a bounded table virtualizes automatically. The
|
|
721
|
+
DOM and the styles are identical either way — only the number of mounted rows
|
|
722
|
+
changes, so sorting, search, pinned columns and the sticky header all behave the
|
|
723
|
+
same.
|
|
509
724
|
|
|
510
|
-
For a compact list in normal page flow, set `isAutoHeight`. Its frame then ends
|
|
725
|
+
For a compact list in normal page flow, set `isAutoHeight`. Its frame then ends
|
|
726
|
+
at the final rendered row instead of filling the surrounding flex pane. The
|
|
727
|
+
complete result is rendered, so keep large lists bounded and virtualized.
|
|
511
728
|
|
|
512
729
|
```jsx
|
|
513
730
|
<ItemTable data={recentRows} columns={columns} paginationMode="off" isAutoHeight />
|
|
@@ -517,15 +734,26 @@ For a compact list in normal page flow, set `isAutoHeight`. Its frame then ends
|
|
|
517
734
|
<ItemTable height="420px" paginationMode="off" data={tenThousandRows} columns={columns} />
|
|
518
735
|
```
|
|
519
736
|
|
|
520
|
-
Overscroll is locked per axis, and only where the table can actually scroll, so
|
|
737
|
+
Overscroll is locked per axis, and only where the table can actually scroll, so
|
|
738
|
+
a table whose content fits never traps the wheel — the page behind it scrolls as
|
|
739
|
+
usual. On an axis that does scroll, a swipe at the edge neither chains to the
|
|
740
|
+
page (which is what would trigger browser back-navigation) nor rubber-bands,
|
|
741
|
+
since bouncing drags the rows off the sticky header and shows blank surface
|
|
742
|
+
behind them.
|
|
521
743
|
|
|
522
|
-
A native table cannot absolutely position a `<tr>` without breaking the table
|
|
744
|
+
A native table cannot absolutely position a `<tr>` without breaking the table
|
|
745
|
+
box, so the offset comes from leading and trailing spacer rows. Those are
|
|
746
|
+
`aria-hidden`, and `aria-rowcount` / `aria-rowindex` continue to describe the
|
|
747
|
+
whole dataset rather than the mounted window.
|
|
523
748
|
|
|
524
|
-
Virtualization is skipped for the empty, error and loading states, and turns off
|
|
749
|
+
Virtualization is skipped for the empty, error and loading states, and turns off
|
|
750
|
+
entirely with `isVirtualized={false}`.
|
|
525
751
|
|
|
526
752
|
### Wrapping Cells
|
|
527
753
|
|
|
528
|
-
Rows are **measured, not assumed**, so a column with `autoHeight` can wrap to a
|
|
754
|
+
Rows are **measured, not assumed**, so a column with `autoHeight` can wrap to a
|
|
755
|
+
different number of lines per row and the virtualized window still tracks
|
|
756
|
+
correctly.
|
|
529
757
|
|
|
530
758
|
### Selection
|
|
531
759
|
|
|
@@ -543,9 +771,13 @@ const [keys, setKeys] = useState([]);
|
|
|
543
771
|
/>
|
|
544
772
|
```
|
|
545
773
|
|
|
546
|
-
Selection is **keyed, not indexed**, so it survives sorting, searching and
|
|
774
|
+
Selection is **keyed, not indexed**, so it survives sorting, searching and
|
|
775
|
+
paging — the same row stays selected wherever it lands, and a row filtered out
|
|
776
|
+
by a search keeps its key rather than being silently deselected.
|
|
547
777
|
|
|
548
|
-
Shift-click a checkbox to extend the range from the last one you clicked
|
|
778
|
+
Shift-click a checkbox to extend the range from the last one you clicked
|
|
779
|
+
plainly. Shift-clicking back toward the anchor shrinks the range rather than
|
|
780
|
+
leaving the overshoot selected.
|
|
549
781
|
|
|
550
782
|
#### Three ways a row can be special
|
|
551
783
|
|
|
@@ -557,21 +789,30 @@ Deliberately distinct, and not interchangeable:
|
|
|
557
789
|
| `isRowSelectable` | yes | yes | no |
|
|
558
790
|
| `getRowProps().isDimmed` | yes | yes | **yes** — it is purely visual |
|
|
559
791
|
|
|
560
|
-
`selectionTooltip` explains an inert checkbox, which is the difference between
|
|
792
|
+
`selectionTooltip` explains an inert checkbox, which is the difference between
|
|
793
|
+
"this is broken" and "this row is still deploying".
|
|
561
794
|
|
|
562
795
|
#### What select-all reaches
|
|
563
796
|
|
|
564
797
|
`selectAllMode` decides the scope of the header checkbox:
|
|
565
798
|
|
|
566
799
|
- **`'page'`** (default) — the rows on the current page.
|
|
567
|
-
- **`'filtered'`** — every row passing the current search or filter, across
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
800
|
+
- **`'filtered'`** — every row passing the current search or filter, across
|
|
801
|
+
pages.
|
|
802
|
+
- **`'all'`** — emits the `'all'` sentinel instead of a key list. This is the
|
|
803
|
+
only mode that can mean rows the client has never loaded, so the consumer
|
|
804
|
+
decides what it means for its query — usually a `DELETE … WHERE <filter>`
|
|
805
|
+
rather than `WHERE id IN (…)`.
|
|
806
|
+
|
|
807
|
+
Unselectable rows are excluded from every scope. Pressing the header checkbox
|
|
808
|
+
while everything in scope is selected clears the **whole** selection, not just
|
|
809
|
+
the scope — leaving keys selected on other pages behind an unchecked-looking box
|
|
810
|
+
is how people delete things they did not mean to.
|
|
571
811
|
|
|
572
812
|
### Row Links and Row Actions
|
|
573
813
|
|
|
574
|
-
`rowLink` turns the row-header cell into a stretched anchor covering the whole
|
|
814
|
+
`rowLink` turns the row-header cell into a stretched anchor covering the whole
|
|
815
|
+
row:
|
|
575
816
|
|
|
576
817
|
```jsx
|
|
577
818
|
<ItemTable
|
|
@@ -581,15 +822,24 @@ Unselectable rows are excluded from every scope. Pressing the header checkbox wh
|
|
|
581
822
|
/>
|
|
582
823
|
```
|
|
583
824
|
|
|
584
|
-
Because it is a real `<a href>`, ⌘-click, middle-click and "Open in new tab"
|
|
825
|
+
Because it is a real `<a href>`, ⌘-click, middle-click and "Open in new tab"
|
|
826
|
+
all work natively — none of which an `onClick` handler can give you. The anchor
|
|
827
|
+
sits below the cells' own content in the stacking order, so a button or `⋮`
|
|
828
|
+
trigger inside a cell still takes its own clicks, and its accessible name comes
|
|
829
|
+
from the row-header cell rather than being announced as "link".
|
|
585
830
|
|
|
586
|
-
The row-header cell is styled as a link — `#purple-text` at weight 600, matching
|
|
831
|
+
The row-header cell is styled as a link — `#purple-text` at weight 600, matching
|
|
832
|
+
the kit's `Link`, with an underline while the row is hovered. The anchor itself
|
|
833
|
+
is invisible, so without that the row would give no sign that it navigates.
|
|
587
834
|
|
|
588
|
-
`onRowAction` is the non-navigational alternative — Enter, or a click that did
|
|
835
|
+
`onRowAction` is the non-navigational alternative — Enter, or a click that did
|
|
836
|
+
not land on a control inside a cell. Use one or the other, not both.
|
|
589
837
|
|
|
590
838
|
### Row Menu
|
|
591
839
|
|
|
592
|
-
`rowMenu` supplies `Menu.Item` children, and `rowContextMenu` decides where they
|
|
840
|
+
`rowMenu` supplies `Menu.Item` children, and `rowContextMenu` decides where they
|
|
841
|
+
are exposed. The split is deliberate: `rowMenu` alone renders nothing, so a row
|
|
842
|
+
never grows a `⋮` nobody asked for.
|
|
593
843
|
|
|
594
844
|
```jsx
|
|
595
845
|
<ItemTable
|
|
@@ -606,17 +856,19 @@ The row-header cell is styled as a link — `#purple-text` at weight 600, matchi
|
|
|
606
856
|
/>
|
|
607
857
|
```
|
|
608
858
|
|
|
609
|
-
| `rowContextMenu`
|
|
610
|
-
|
|
|
611
|
-
| `false` (default) | no
|
|
612
|
-
| `true`
|
|
613
|
-
| `'context-only'`
|
|
859
|
+
| `rowContextMenu` | `⋮` column | Right-click / Shift+F10 |
|
|
860
|
+
| --- | --- | --- |
|
|
861
|
+
| `false` (default) | no | no |
|
|
862
|
+
| `true` | yes | yes |
|
|
863
|
+
| `'context-only'` | no | yes |
|
|
614
864
|
|
|
615
|
-
A row whose resolver returns `null` gets no trigger, and right-clicking it falls
|
|
865
|
+
A row whose resolver returns `null` gets no trigger, and right-clicking it falls
|
|
866
|
+
through to the browser's own context menu — more useful than an empty popover.
|
|
616
867
|
|
|
617
868
|
### Bulk Actions
|
|
618
869
|
|
|
619
|
-
`bulkActions` implies `selectionMode="multiple"` — a bulk action with no way to
|
|
870
|
+
`bulkActions` implies `selectionMode="multiple"` — a bulk action with no way to
|
|
871
|
+
select rows is a contradiction, not a configuration.
|
|
620
872
|
|
|
621
873
|
```jsx
|
|
622
874
|
<ItemTable
|
|
@@ -643,13 +895,22 @@ A row whose resolver returns `null` gets no trigger, and right-clicking it falls
|
|
|
643
895
|
/>
|
|
644
896
|
```
|
|
645
897
|
|
|
646
|
-
Each action drives its own spinner through `setLoading`, so one slow request
|
|
898
|
+
Each action drives its own spinner through `setLoading`, so one slow request
|
|
899
|
+
does not freeze the others, and the selection clears when the action resolves.
|
|
900
|
+
Opt out with `deselectAfter: false` for an action that only reads — the default
|
|
901
|
+
exists because the rows an action just deleted or moved are usually gone.
|
|
647
902
|
|
|
648
|
-
`bulkBarPlacement="floating"` (the default) centres the bar over the body
|
|
903
|
+
`bulkBarPlacement="floating"` (the default) centres the bar over the body
|
|
904
|
+
without changing the table's height, so the rows never shift under the cursor.
|
|
905
|
+
`"toolbar"` takes over the `actions` group instead, for a page whose toolbar is
|
|
906
|
+
already crowded — the two compete for the same space, and while rows are
|
|
907
|
+
selected the bulk actions are what the user is reaching for.
|
|
649
908
|
|
|
650
909
|
**Escape** clears the selection from anywhere inside the table.
|
|
651
910
|
|
|
652
|
-
`ItemTable.BulkBar` is available as a compound member for placing the bar
|
|
911
|
+
`ItemTable.BulkBar` is available as a compound member for placing the bar
|
|
912
|
+
outside the default chrome; it reads the selection from context, so there is
|
|
913
|
+
still exactly one owner.
|
|
653
914
|
|
|
654
915
|
### Reordering Rows
|
|
655
916
|
|
|
@@ -664,15 +925,22 @@ Each action drives its own spinner through `setLoading`, so one slow request doe
|
|
|
664
925
|
/>
|
|
665
926
|
```
|
|
666
927
|
|
|
667
|
-
It is built on React Aria's collection drag-and-drop, through the same
|
|
928
|
+
It is built on React Aria's collection drag-and-drop, through the same
|
|
929
|
+
`DraggableCollection` wrapper `Tabs` and `ListBox` use — `RowCollection` and the
|
|
930
|
+
table's own `SelectionManager` satisfy its contract unchanged.
|
|
668
931
|
|
|
669
|
-
That buys the keyboard path as well as the pointer one: the grid takes a single
|
|
932
|
+
That buys the keyboard path as well as the pointer one: the grid takes a single
|
|
933
|
+
tab stop, arrows move between rows, Enter picks a row up and drops it, Escape
|
|
934
|
+
cancels. The drop line is drawn **on** the row rather than between rows, because
|
|
935
|
+
a native table has nowhere to put an element between two `<tr>`s.
|
|
670
936
|
|
|
671
|
-
`onReorder` reports the whole key order rather than just the moved row, so the
|
|
937
|
+
`onReorder` reports the whole key order rather than just the moved row, so the
|
|
938
|
+
result can be persisted without reconstructing it.
|
|
672
939
|
|
|
673
940
|
### Dropping Rows onto a Row
|
|
674
941
|
|
|
675
|
-
Some tables move rows
|
|
942
|
+
Some tables move rows *into* other rows rather than around them — a workbook
|
|
943
|
+
into a folder. `dropOnRow` covers that, and enables dragging on its own:
|
|
676
944
|
|
|
677
945
|
```jsx
|
|
678
946
|
<ItemTable
|
|
@@ -686,11 +954,21 @@ Some tables move rows _into_ other rows rather than around them — a workbook i
|
|
|
686
954
|
/>
|
|
687
955
|
```
|
|
688
956
|
|
|
689
|
-
This is a **different case from reordering**, and usually the only one a given
|
|
957
|
+
This is a **different case from reordering**, and usually the only one a given
|
|
958
|
+
table wants: Cloud's Workbooks page drags items into folders and never reorders
|
|
959
|
+
them. The story below is that shape.
|
|
690
960
|
|
|
691
|
-
They do compose if you need it — set `isReorderable` as well and a row that
|
|
961
|
+
They do compose if you need it — set `isReorderable` as well and a row that
|
|
962
|
+
refuses a drop falls back to reordering — but that combination is rare. Cloud
|
|
963
|
+
has to treat them as mutually exclusive because ag-grid cannot express both at
|
|
964
|
+
once; that restriction does not carry over.
|
|
692
965
|
|
|
693
|
-
`dropOnRow` replaces Cloud's `isDropOnRowEnabled`, `isDropTarget`,
|
|
966
|
+
`dropOnRow` replaces Cloud's `isDropOnRowEnabled`, `isDropTarget`,
|
|
967
|
+
`isDropOnRowAllowed` and `onDropOnRow` with one object, and drops the two
|
|
968
|
+
ag-grid workarounds beside them (`dropTargetRowKeyRef`,
|
|
969
|
+
`dropTargetRefreshColumnKey`) that existed only because ag-grid cannot re-render
|
|
970
|
+
a single cell from React state. Here the hovered row is just
|
|
971
|
+
`ctx.isDropTarget`.
|
|
694
972
|
|
|
695
973
|
### Column Resize
|
|
696
974
|
|
|
@@ -700,25 +978,36 @@ They do compose if you need it — set `isReorderable` as well and a row that re
|
|
|
700
978
|
<ItemTable isResizable storageKey="deployments" data={rows} columns={columns} />
|
|
701
979
|
```
|
|
702
980
|
|
|
703
|
-
It is built on React Aria's `useMove` — the same hook behind `Board`'s widgets —
|
|
981
|
+
It is built on React Aria's `useMove` — the same hook behind `Board`'s widgets —
|
|
982
|
+
so the handle takes **keyboard** input for free: focus it and use the arrow
|
|
983
|
+
keys, or Home/End to jump to the column's minimum and maximum. Widths clamp to
|
|
984
|
+
each column's `minWidth` / `maxWidth`, and a column opts out with
|
|
985
|
+
`isResizable: false`.
|
|
704
986
|
|
|
705
|
-
`onColumnResize` fires once the gesture ends rather than on every pixel, and
|
|
987
|
+
`onColumnResize` fires once the gesture ends rather than on every pixel, and
|
|
988
|
+
`columnWidths` is in the default `persist` list, so pairing `isResizable` with
|
|
989
|
+
`storageKey` makes a resized table come back the way the user left it.
|
|
706
990
|
|
|
707
991
|
### Persisting State
|
|
708
992
|
|
|
709
|
-
`storageKey` remembers the parts of the table's state a user expects to survive
|
|
993
|
+
`storageKey` remembers the parts of the table's state a user expects to survive
|
|
994
|
+
a reload:
|
|
710
995
|
|
|
711
996
|
```jsx
|
|
712
997
|
<ItemTable data={rows} columns={columns} storageKey="deployments" />
|
|
713
998
|
```
|
|
714
999
|
|
|
715
|
-
Only state the **table** owns is stored, so a controlled `pageSize` or `sort`
|
|
1000
|
+
Only state the **table** owns is stored, so a controlled `pageSize` or `sort`
|
|
1001
|
+
stays entirely the page's business. Sort is opt-in via `persist` — a stored sort
|
|
1002
|
+
silently changes what the first screen of a table means, which is rarely what
|
|
1003
|
+
you want by default:
|
|
716
1004
|
|
|
717
1005
|
```jsx
|
|
718
1006
|
<ItemTable storageKey="deployments" persist={['pageSize', 'sort']} data={rows} columns={columns} />
|
|
719
1007
|
```
|
|
720
1008
|
|
|
721
|
-
Reads and writes are best-effort: private mode, a disabled store, a quota error
|
|
1009
|
+
Reads and writes are best-effort: private mode, a disabled store, a quota error
|
|
1010
|
+
or a hand-edited value all degrade to "no persistence" rather than failing.
|
|
722
1011
|
|
|
723
1012
|
### Per-row Visuals
|
|
724
1013
|
|
|
@@ -735,32 +1024,46 @@ Reads and writes are best-effort: private mode, a disabled store, a quota error
|
|
|
735
1024
|
### Screen Reader Support
|
|
736
1025
|
|
|
737
1026
|
- The `<table>` carries `role="grid"` with `aria-rowcount` and `aria-colcount`.
|
|
738
|
-
- Row and column indices are **1-based and document-absolute** — header rows are
|
|
739
|
-
|
|
1027
|
+
- Row and column indices are **1-based and document-absolute** — header rows are
|
|
1028
|
+
counted, and the indices stay truthful when rows are virtualized or columns
|
|
1029
|
+
are pinned.
|
|
1030
|
+
- A column marked `isRowHeader` renders `<th scope="row">`, so a screen reader
|
|
1031
|
+
announces the row by name when moving between cells.
|
|
740
1032
|
- `aria-sort` is set on the sorted header only, never `"none"` on the rest.
|
|
741
|
-
- `aria-busy` is set while loading; skeleton rows keep the full cell structure so
|
|
1033
|
+
- `aria-busy` is set while loading; skeleton rows keep the full cell structure so
|
|
1034
|
+
nothing shifts when the data lands.
|
|
742
1035
|
|
|
743
1036
|
### ARIA Properties
|
|
744
1037
|
|
|
745
|
-
| Property
|
|
746
|
-
|
|
|
747
|
-
| `role="grid"`
|
|
748
|
-
| `aria-rowcount` / `aria-colcount` | the `<table>`
|
|
749
|
-
| `aria-rowindex`
|
|
750
|
-
| `aria-colindex`
|
|
751
|
-
| `aria-sort`
|
|
752
|
-
| `aria-busy`
|
|
1038
|
+
| Property | Applied to |
|
|
1039
|
+
| -------- | ---------- |
|
|
1040
|
+
| `role="grid"` | the `<table>` |
|
|
1041
|
+
| `aria-rowcount` / `aria-colcount` | the `<table>` |
|
|
1042
|
+
| `aria-rowindex` | every `<tr>` |
|
|
1043
|
+
| `aria-colindex` | every cell and column header |
|
|
1044
|
+
| `aria-sort` | the sorted column header |
|
|
1045
|
+
| `aria-busy` | the grid and its skeleton rows |
|
|
753
1046
|
|
|
754
1047
|
## Best Practices
|
|
755
1048
|
|
|
756
|
-
- Do: mark one column `isRowHeader`. It names the row for assistive tech and is
|
|
757
|
-
|
|
758
|
-
- Do:
|
|
759
|
-
|
|
760
|
-
- Do:
|
|
761
|
-
|
|
762
|
-
-
|
|
763
|
-
|
|
1049
|
+
- Do: mark one column `isRowHeader`. It names the row for assistive tech and is
|
|
1050
|
+
where a row link will anchor.
|
|
1051
|
+
- Do: give a column `format` when its display text differs from its raw value —
|
|
1052
|
+
that is what keeps it sortable, searchable and copyable.
|
|
1053
|
+
- Do: bound the table's height. Without a bound it grows to fit, the header
|
|
1054
|
+
cannot stick, and virtualization has no viewport to work against.
|
|
1055
|
+
- Do: leave the header preset alone unless you have a reason. `c3` is what the
|
|
1056
|
+
Cloud list tables use, and the header `Item` inherits the cell's typography so
|
|
1057
|
+
overriding `headerPreset` restyles the whole header consistently.
|
|
1058
|
+
- Do: pass `isFiltered` when you filter `data` yourself, so the empty state says
|
|
1059
|
+
"no matches".
|
|
1060
|
+
- Don't: reach for `render` to reformat text. `format` does it in a way the rest
|
|
1061
|
+
of the table understands — including sorting and search.
|
|
1062
|
+
- Don't: filter `data` yourself *and* leave `isFiltered` unset, or an empty
|
|
1063
|
+
result will read as "nothing exists".
|
|
1064
|
+
- Don't: put an `Item` in every cell. `Item` runs a hotkey subscription per
|
|
1065
|
+
instance; use `TextItem` (which the table does automatically for plain text)
|
|
1066
|
+
and reserve `Item` for the row-header cell.
|
|
764
1067
|
|
|
765
1068
|
## Suggested Improvements
|
|
766
1069
|
|