@elliemae/ds-data-table 3.80.0-next.62 → 3.80.0-next.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/TruncatedTooltipText.js +1 -3
- package/dist/cjs/TruncatedTooltipText.js.map +2 -2
- package/dist/cjs/addons/Columns/ColumnAction/ColumnAction.js.map +2 -2
- package/dist/cjs/addons/Columns/ColumnDragHandle/ColumnDragHandle.js +27 -19
- package/dist/cjs/addons/Columns/ColumnDragHandle/ColumnDragHandle.js.map +2 -2
- package/dist/cjs/addons/Columns/ColumnExpand/ColumnExpand.js +25 -17
- package/dist/cjs/addons/Columns/ColumnExpand/ColumnExpand.js.map +2 -2
- package/dist/cjs/addons/Columns/ColumnSelectSingle/ColumnSelectSingle.js +24 -14
- package/dist/cjs/addons/Columns/ColumnSelectSingle/ColumnSelectSingle.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/CurrencyRangeFilter/CurrencyRangeFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/CurrencyRangeFilter/index.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/DateRangeFilter/DateRangeFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/DateRangeFilter/index.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/DateSwitcherFilter/DateSwitcherFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/DateSwitcherFilter/index.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/NumberRangeFilter/NumberRangeFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/NumberRangeFilter/index.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/BaseSelectFilter.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/BaseSelectFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/MultiCreatableFilter.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/MultiCreatableFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/MultiSelectFilter.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/MultiSelectFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/SingleCreatableFilter.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/SingleCreatableFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/SingleSelectFilter.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/SingleSelectFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SingleDateFilter/SingleDateFilterV2.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SingleDateFilter/index.js.map +2 -2
- package/dist/cjs/configs/constants.js +1 -3
- package/dist/cjs/configs/constants.js.map +2 -2
- package/dist/cjs/configs/index.js +0 -1
- package/dist/cjs/configs/index.js.map +2 -2
- package/dist/cjs/configs/useStore/index.js +1 -7
- package/dist/cjs/configs/useStore/index.js.map +2 -2
- package/dist/cjs/configs/useTableColsWithAddons.js +2 -2
- package/dist/cjs/configs/useTableColsWithAddons.js.map +2 -2
- package/dist/cjs/constants/index.js +2 -1
- package/dist/cjs/constants/index.js.map +2 -2
- package/dist/cjs/exported-related/EditableCell.js +6 -4
- package/dist/cjs/exported-related/EditableCell.js.map +2 -2
- package/dist/cjs/exported-related/FilterBar/FilterBarDropdownMenu.js +16 -62
- package/dist/cjs/exported-related/FilterBar/FilterBarDropdownMenu.js.map +2 -2
- package/dist/cjs/exported-related/FilterBar/FilterMenuButton.js +15 -15
- package/dist/cjs/exported-related/FilterBar/FilterMenuButton.js.map +2 -2
- package/dist/cjs/exported-related/FilterBar/PillsFromDataTableFilters.js.map +2 -2
- package/dist/cjs/{parts/RowVariants/types.js → exported-related/FilterBar/dropdownMenuV2Bridge/bridgeTypes.js} +3 -3
- package/dist/cjs/exported-related/FilterBar/dropdownMenuV2Bridge/bridgeTypes.js.map +7 -0
- package/dist/cjs/exported-related/FilterBar/dropdownMenuV2Bridge/conversionHelpers.js +137 -0
- package/dist/cjs/exported-related/FilterBar/dropdownMenuV2Bridge/conversionHelpers.js.map +7 -0
- package/dist/cjs/exported-related/FilterBar/dropdownMenuV2Bridge/getHumanReadableWarnings.js +64 -0
- package/dist/cjs/exported-related/FilterBar/dropdownMenuV2Bridge/getHumanReadableWarnings.js.map +7 -0
- package/dist/cjs/exported-related/FilterBar/dropdownMenuV2Bridge/index.js +113 -0
- package/dist/cjs/exported-related/FilterBar/dropdownMenuV2Bridge/index.js.map +7 -0
- package/dist/cjs/exported-related/FilterBar/dropdownMenuV2Bridge/types.js.map +7 -0
- package/dist/cjs/exported-related/FilterPopover/FilterPopoverV2.js +17 -8
- package/dist/cjs/exported-related/FilterPopover/FilterPopoverV2.js.map +2 -2
- package/dist/cjs/exported-related/FilterPopover/index.js +11 -2
- package/dist/cjs/exported-related/FilterPopover/index.js.map +2 -2
- package/dist/cjs/exported-related/FilterPopover/styled.js +11 -0
- package/dist/cjs/exported-related/FilterPopover/styled.js.map +2 -2
- package/dist/cjs/exported-related/FilterPopover/useGetFilterHandlers.js.map +1 -1
- package/dist/cjs/exported-related/FilterTypes.js +10 -0
- package/dist/cjs/exported-related/FilterTypes.js.map +2 -2
- package/dist/cjs/exported-related/RowRenderer/DefaultRowContentRenderer.js.map +2 -2
- package/dist/cjs/exported-related/RowRenderer/index.js +2 -0
- package/dist/cjs/exported-related/RowRenderer/index.js.map +2 -2
- package/dist/cjs/exported-related/Toolbar/Toolbar.js +36 -22
- package/dist/cjs/exported-related/Toolbar/Toolbar.js.map +2 -2
- package/dist/cjs/helpers/getIdFromUniqueRowAccessor.js.map +1 -1
- package/dist/cjs/helpers/gridLayoutHelpers.js +2 -0
- package/dist/cjs/helpers/gridLayoutHelpers.js.map +2 -2
- package/dist/cjs/helpers/index.js +1 -0
- package/dist/cjs/helpers/index.js.map +2 -2
- package/dist/cjs/{parts/internal.js → helpers/smallButtonSize.js} +17 -8
- package/dist/cjs/helpers/smallButtonSize.js.map +7 -0
- package/dist/cjs/parts/Cells/CellFactory.js.map +2 -2
- package/dist/cjs/parts/Cells/index.js +19 -8
- package/dist/cjs/parts/Cells/index.js.map +2 -2
- package/dist/cjs/parts/DnDHandle.js +4 -2
- package/dist/cjs/parts/DnDHandle.js.map +2 -2
- package/dist/cjs/parts/DropIndicator.js.map +2 -2
- package/dist/cjs/parts/EmptyContent.js +2 -2
- package/dist/cjs/parts/EmptyContent.js.map +2 -2
- package/dist/cjs/parts/FilterBar/FilterBarMenuButtonAddon.js +88 -0
- package/dist/cjs/parts/FilterBar/FilterBarMenuButtonAddon.js.map +7 -0
- package/dist/cjs/parts/FilterBar/FiltersBar.js +4 -39
- package/dist/cjs/parts/FilterBar/FiltersBar.js.map +2 -2
- package/dist/cjs/parts/FilterBar/components/MultiSelectPill.js.map +2 -2
- package/dist/cjs/{configs/fixedSizes.js → parts/FilterBar/convertExtraOptions.js} +16 -8
- package/dist/cjs/parts/FilterBar/convertExtraOptions.js.map +7 -0
- package/dist/cjs/parts/Headers/EmptyChildrenGroup.js +4 -2
- package/dist/cjs/parts/Headers/EmptyChildrenGroup.js.map +2 -2
- package/dist/cjs/parts/Headers/HeaderCell.js +29 -11
- package/dist/cjs/parts/Headers/HeaderCell.js.map +2 -2
- package/dist/cjs/parts/Headers/HeaderCellGroup.js +3 -1
- package/dist/cjs/parts/Headers/HeaderCellGroup.js.map +2 -2
- package/dist/cjs/parts/Headers/HeaderCellTitle.js +5 -1
- package/dist/cjs/parts/Headers/HeaderCellTitle.js.map +2 -2
- package/dist/cjs/parts/Headers/HeaderResizer.js +3 -1
- package/dist/cjs/parts/Headers/HeaderResizer.js.map +2 -2
- package/dist/cjs/parts/Headers/useHeaderCellConfig.js.map +2 -2
- package/dist/cjs/parts/Headers/useHeaderCellHandlers.js.map +2 -2
- package/dist/cjs/parts/Headers/useHeaderResizer.js +2 -2
- package/dist/cjs/parts/Headers/useHeaderResizer.js.map +2 -2
- package/dist/cjs/parts/HoC/withConditionalDnDSortableContext.js.map +2 -2
- package/dist/cjs/parts/RowVariants/RowVariantHeader.js +6 -2
- package/dist/cjs/parts/RowVariants/RowVariantHeader.js.map +2 -2
- package/dist/cjs/parts/SkeletonTable.js +1 -1
- package/dist/cjs/parts/SkeletonTable.js.map +2 -2
- package/dist/cjs/parts/SortByCaret.js +0 -1
- package/dist/cjs/parts/SortByCaret.js.map +2 -2
- package/dist/cjs/react-desc-prop-types.js +75 -21
- package/dist/cjs/react-desc-prop-types.js.map +2 -2
- package/dist/cjs/styled.js +7 -1
- package/dist/cjs/styled.js.map +2 -2
- package/dist/cjs/tentative-typescript-testing-for-unsafe-type/README.md +9 -0
- package/dist/cjs/tentative-typescript-testing-for-unsafe-type/filter-bar-props.js +71 -0
- package/dist/cjs/tentative-typescript-testing-for-unsafe-type/filter-bar-props.js.map +7 -0
- package/dist/cjs/tentative-typescript-testing-for-unsafe-type/get-row-variant.js +38 -0
- package/dist/cjs/tentative-typescript-testing-for-unsafe-type/get-row-variant.js.map +7 -0
- package/dist/cjs/{parts/FilterBar/index.js → tentative-typescript-testing-for-unsafe-type/sizes.js} +10 -12
- package/dist/cjs/tentative-typescript-testing-for-unsafe-type/sizes.js.map +7 -0
- package/dist/cjs/tentative-typescript-testing-for-unsafe-type/slot-props.js +134 -0
- package/dist/cjs/tentative-typescript-testing-for-unsafe-type/slot-props.js.map +7 -0
- package/dist/esm/TruncatedTooltipText.js +2 -8
- package/dist/esm/TruncatedTooltipText.js.map +2 -2
- package/dist/esm/addons/Columns/ColumnAction/ColumnAction.js.map +2 -2
- package/dist/esm/addons/Columns/ColumnDragHandle/ColumnDragHandle.js +28 -20
- package/dist/esm/addons/Columns/ColumnDragHandle/ColumnDragHandle.js.map +2 -2
- package/dist/esm/addons/Columns/ColumnExpand/ColumnExpand.js +25 -17
- package/dist/esm/addons/Columns/ColumnExpand/ColumnExpand.js.map +2 -2
- package/dist/esm/addons/Columns/ColumnSelectSingle/ColumnSelectSingle.js +24 -14
- package/dist/esm/addons/Columns/ColumnSelectSingle/ColumnSelectSingle.js.map +2 -2
- package/dist/esm/addons/Filters/Components/CurrencyRangeFilter/CurrencyRangeFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/CurrencyRangeFilter/index.js.map +2 -2
- package/dist/esm/addons/Filters/Components/DateRangeFilter/DateRangeFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/DateRangeFilter/index.js.map +2 -2
- package/dist/esm/addons/Filters/Components/DateSwitcherFilter/DateSwitcherFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/DateSwitcherFilter/index.js.map +2 -2
- package/dist/esm/addons/Filters/Components/NumberRangeFilter/NumberRangeFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/NumberRangeFilter/index.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/BaseSelectFilter.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/BaseSelectFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/MultiCreatableFilter.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/MultiCreatableFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/MultiSelectFilter.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/MultiSelectFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/SingleCreatableFilter.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/SingleCreatableFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/SingleSelectFilter.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/SingleSelectFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SingleDateFilter/SingleDateFilterV2.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SingleDateFilter/index.js.map +2 -2
- package/dist/esm/configs/constants.js +1 -3
- package/dist/esm/configs/constants.js.map +2 -2
- package/dist/esm/configs/index.js +0 -1
- package/dist/esm/configs/index.js.map +2 -2
- package/dist/esm/configs/useStore/index.js +2 -8
- package/dist/esm/configs/useStore/index.js.map +2 -2
- package/dist/esm/configs/useTableColsWithAddons.js +2 -2
- package/dist/esm/configs/useTableColsWithAddons.js.map +2 -2
- package/dist/esm/constants/index.js +2 -1
- package/dist/esm/constants/index.js.map +2 -2
- package/dist/esm/exported-related/EditableCell.js +6 -4
- package/dist/esm/exported-related/EditableCell.js.map +2 -2
- package/dist/esm/exported-related/FilterBar/FilterBarDropdownMenu.js +17 -63
- package/dist/esm/exported-related/FilterBar/FilterBarDropdownMenu.js.map +2 -2
- package/dist/esm/exported-related/FilterBar/FilterMenuButton.js +16 -16
- package/dist/esm/exported-related/FilterBar/FilterMenuButton.js.map +2 -2
- package/dist/esm/exported-related/FilterBar/PillsFromDataTableFilters.js.map +2 -2
- package/dist/esm/exported-related/FilterBar/dropdownMenuV2Bridge/bridgeTypes.js +2 -0
- package/dist/esm/{parts/RowVariants/types.js.map → exported-related/FilterBar/dropdownMenuV2Bridge/bridgeTypes.js.map} +1 -1
- package/dist/esm/exported-related/FilterBar/dropdownMenuV2Bridge/conversionHelpers.js +107 -0
- package/dist/esm/exported-related/FilterBar/dropdownMenuV2Bridge/conversionHelpers.js.map +7 -0
- package/dist/esm/exported-related/FilterBar/dropdownMenuV2Bridge/getHumanReadableWarnings.js +34 -0
- package/dist/esm/exported-related/FilterBar/dropdownMenuV2Bridge/getHumanReadableWarnings.js.map +7 -0
- package/dist/esm/exported-related/FilterBar/dropdownMenuV2Bridge/index.js +89 -0
- package/dist/esm/exported-related/FilterBar/dropdownMenuV2Bridge/index.js.map +7 -0
- package/dist/esm/exported-related/{FilterPopover → FilterBar/dropdownMenuV2Bridge}/types.js.map +1 -1
- package/dist/esm/exported-related/FilterPopover/FilterPopoverV2.js +17 -8
- package/dist/esm/exported-related/FilterPopover/FilterPopoverV2.js.map +2 -2
- package/dist/esm/exported-related/FilterPopover/index.js +11 -2
- package/dist/esm/exported-related/FilterPopover/index.js.map +2 -2
- package/dist/esm/exported-related/FilterPopover/styled.js +11 -0
- package/dist/esm/exported-related/FilterPopover/styled.js.map +2 -2
- package/dist/esm/exported-related/FilterPopover/useGetFilterHandlers.js.map +1 -1
- package/dist/esm/exported-related/FilterTypes.js +10 -0
- package/dist/esm/exported-related/FilterTypes.js.map +2 -2
- package/dist/esm/exported-related/RowRenderer/DefaultRowContentRenderer.js.map +2 -2
- package/dist/esm/exported-related/RowRenderer/index.js +3 -1
- package/dist/esm/exported-related/RowRenderer/index.js.map +2 -2
- package/dist/esm/exported-related/Toolbar/Toolbar.js +36 -22
- package/dist/esm/exported-related/Toolbar/Toolbar.js.map +2 -2
- package/dist/esm/helpers/getIdFromUniqueRowAccessor.js.map +1 -1
- package/dist/esm/helpers/gridLayoutHelpers.js +2 -0
- package/dist/esm/helpers/gridLayoutHelpers.js.map +2 -2
- package/dist/esm/helpers/index.js +1 -0
- package/dist/esm/helpers/index.js.map +2 -2
- package/dist/esm/helpers/smallButtonSize.js +17 -0
- package/dist/esm/helpers/smallButtonSize.js.map +7 -0
- package/dist/esm/parts/Cells/CellFactory.js.map +2 -2
- package/dist/esm/parts/Cells/index.js +19 -8
- package/dist/esm/parts/Cells/index.js.map +2 -2
- package/dist/esm/parts/DnDHandle.js +5 -3
- package/dist/esm/parts/DnDHandle.js.map +2 -2
- package/dist/esm/parts/DropIndicator.js.map +2 -2
- package/dist/esm/parts/EmptyContent.js +2 -2
- package/dist/esm/parts/EmptyContent.js.map +2 -2
- package/dist/esm/parts/FilterBar/FilterBarMenuButtonAddon.js +58 -0
- package/dist/esm/parts/FilterBar/FilterBarMenuButtonAddon.js.map +7 -0
- package/dist/esm/parts/FilterBar/FiltersBar.js +5 -40
- package/dist/esm/parts/FilterBar/FiltersBar.js.map +2 -2
- package/dist/esm/parts/FilterBar/components/MultiSelectPill.js.map +2 -2
- package/dist/esm/parts/FilterBar/convertExtraOptions.js +16 -0
- package/dist/esm/parts/FilterBar/convertExtraOptions.js.map +7 -0
- package/dist/esm/parts/Headers/EmptyChildrenGroup.js +4 -2
- package/dist/esm/parts/Headers/EmptyChildrenGroup.js.map +2 -2
- package/dist/esm/parts/Headers/HeaderCell.js +29 -11
- package/dist/esm/parts/Headers/HeaderCell.js.map +2 -2
- package/dist/esm/parts/Headers/HeaderCellGroup.js +4 -2
- package/dist/esm/parts/Headers/HeaderCellGroup.js.map +2 -2
- package/dist/esm/parts/Headers/HeaderCellTitle.js +5 -1
- package/dist/esm/parts/Headers/HeaderCellTitle.js.map +2 -2
- package/dist/esm/parts/Headers/HeaderResizer.js +4 -2
- package/dist/esm/parts/Headers/HeaderResizer.js.map +2 -2
- package/dist/esm/parts/Headers/useHeaderCellConfig.js.map +2 -2
- package/dist/esm/parts/Headers/useHeaderCellHandlers.js.map +2 -2
- package/dist/esm/parts/Headers/useHeaderResizer.js +3 -2
- package/dist/esm/parts/Headers/useHeaderResizer.js.map +2 -2
- package/dist/esm/parts/HoC/withConditionalDnDSortableContext.js.map +2 -2
- package/dist/esm/parts/RowVariants/RowVariantHeader.js +7 -3
- package/dist/esm/parts/RowVariants/RowVariantHeader.js.map +2 -2
- package/dist/esm/parts/SkeletonTable.js +1 -1
- package/dist/esm/parts/SkeletonTable.js.map +2 -2
- package/dist/esm/parts/SortByCaret.js +0 -1
- package/dist/esm/parts/SortByCaret.js.map +2 -2
- package/dist/esm/react-desc-prop-types.js +75 -21
- package/dist/esm/react-desc-prop-types.js.map +2 -2
- package/dist/esm/styled.js +8 -2
- package/dist/esm/styled.js.map +2 -2
- package/dist/esm/tentative-typescript-testing-for-unsafe-type/README.md +9 -0
- package/dist/esm/tentative-typescript-testing-for-unsafe-type/filter-bar-props.js +48 -0
- package/dist/esm/tentative-typescript-testing-for-unsafe-type/filter-bar-props.js.map +7 -0
- package/dist/esm/tentative-typescript-testing-for-unsafe-type/get-row-variant.js +15 -0
- package/dist/esm/tentative-typescript-testing-for-unsafe-type/get-row-variant.js.map +7 -0
- package/dist/esm/tentative-typescript-testing-for-unsafe-type/sizes.js +11 -0
- package/dist/esm/tentative-typescript-testing-for-unsafe-type/sizes.js.map +7 -0
- package/dist/esm/tentative-typescript-testing-for-unsafe-type/slot-props.js +111 -0
- package/dist/esm/tentative-typescript-testing-for-unsafe-type/slot-props.js.map +7 -0
- package/dist/types/TruncatedTooltipText.d.ts +2 -7
- package/dist/types/addons/Columns/ColumnAction/ColumnAction.d.ts +1 -3
- package/dist/types/addons/Filters/Components/CurrencyRangeFilter/CurrencyRangeFilterV2.d.ts +1 -6
- package/dist/types/addons/Filters/Components/CurrencyRangeFilter/index.d.ts +1 -6
- package/dist/types/addons/Filters/Components/DateRangeFilter/DateRangeFilterV2.d.ts +1 -6
- package/dist/types/addons/Filters/Components/DateRangeFilter/index.d.ts +1 -6
- package/dist/types/addons/Filters/Components/DateSwitcherFilter/DateSwitcherFilterV2.d.ts +1 -7
- package/dist/types/addons/Filters/Components/DateSwitcherFilter/index.d.ts +1 -7
- package/dist/types/addons/Filters/Components/NumberRangeFilter/NumberRangeFilterV2.d.ts +1 -6
- package/dist/types/addons/Filters/Components/NumberRangeFilter/index.d.ts +1 -6
- package/dist/types/addons/Filters/Components/SelectFilter/BaseSelectFilter.d.ts +1 -9
- package/dist/types/addons/Filters/Components/SelectFilter/BaseSelectFilterV2.d.ts +1 -9
- package/dist/types/addons/Filters/Components/SelectFilter/MultiCreatableFilter.d.ts +1 -4
- package/dist/types/addons/Filters/Components/SelectFilter/MultiCreatableFilterV2.d.ts +1 -4
- package/dist/types/addons/Filters/Components/SelectFilter/MultiSelectFilter.d.ts +1 -4
- package/dist/types/addons/Filters/Components/SelectFilter/MultiSelectFilterV2.d.ts +1 -4
- package/dist/types/addons/Filters/Components/SelectFilter/SingleCreatableFilter.d.ts +1 -4
- package/dist/types/addons/Filters/Components/SelectFilter/SingleCreatableFilterV2.d.ts +1 -4
- package/dist/types/addons/Filters/Components/SelectFilter/SingleSelectFilter.d.ts +1 -4
- package/dist/types/addons/Filters/Components/SelectFilter/SingleSelectFilterV2.d.ts +1 -4
- package/dist/types/addons/Filters/Components/SingleDateFilter/SingleDateFilterV2.d.ts +1 -3
- package/dist/types/addons/Filters/Components/SingleDateFilter/index.d.ts +1 -3
- package/dist/types/configs/constants.d.ts +0 -1
- package/dist/types/configs/index.d.ts +0 -1
- package/dist/types/configs/useStore/index.d.ts +1 -2
- package/dist/types/constants/index.d.ts +4 -0
- package/dist/types/exported-related/FilterBar/FilterBarDropdownMenu.d.ts +8 -7
- package/dist/types/exported-related/FilterBar/FilterMenuButton.d.ts +2 -19
- package/dist/types/exported-related/FilterBar/PillsFromDataTableFilters.d.ts +1 -10
- package/dist/types/exported-related/FilterBar/dropdownMenuV2Bridge/bridgeTypes.d.ts +22 -0
- package/dist/types/exported-related/FilterBar/dropdownMenuV2Bridge/conversionHelpers.d.ts +78 -0
- package/dist/types/exported-related/FilterBar/dropdownMenuV2Bridge/getHumanReadableWarnings.d.ts +7 -0
- package/dist/types/exported-related/FilterBar/dropdownMenuV2Bridge/index.d.ts +14 -0
- package/dist/types/exported-related/FilterBar/dropdownMenuV2Bridge/types.d.ts +60 -0
- package/dist/types/exported-related/FilterPopover/FilterPopoverV2.d.ts +2 -2
- package/dist/types/exported-related/FilterPopover/index.d.ts +2 -2
- package/dist/types/exported-related/FilterPopover/styled.d.ts +3 -1
- package/dist/types/exported-related/FilterPopover/useGetFilterHandlers.d.ts +2 -2
- package/dist/types/exported-related/FilterTypes.d.ts +10 -0
- package/dist/types/exported-related/RowRenderer/DefaultRowContentRenderer.d.ts +2 -2
- package/dist/types/exported-related/RowRenderer/index.d.ts +1 -16
- package/dist/types/exported-related/Toolbar/Toolbar.d.ts +1 -7
- package/dist/types/helpers/gridLayoutHelpers.d.ts +1 -0
- package/dist/types/helpers/index.d.ts +1 -0
- package/dist/types/helpers/smallButtonSize.d.ts +4 -0
- package/dist/types/parts/Cells/CellFactory.d.ts +1 -10
- package/dist/types/parts/DnDHandle.d.ts +4 -0
- package/dist/types/parts/DropIndicator.d.ts +1 -7
- package/dist/types/parts/FilterBar/FilterBarMenuButtonAddon.d.ts +14 -0
- package/dist/types/parts/FilterBar/components/MultiSelectPill.d.ts +1 -4
- package/dist/types/parts/FilterBar/convertExtraOptions.d.ts +8 -0
- package/dist/types/parts/Headers/EmptyChildrenGroup.d.ts +3 -1
- package/dist/types/parts/Headers/HeaderCell.d.ts +1 -7
- package/dist/types/parts/Headers/HeaderCellTitle.d.ts +1 -8
- package/dist/types/parts/Headers/useHeaderCellConfig.d.ts +1 -15
- package/dist/types/parts/Headers/useHeaderCellHandlers.d.ts +1 -22
- package/dist/types/parts/HoC/withConditionalDnDSortableContext.d.ts +1 -6
- package/dist/types/parts/SkeletonTable.d.ts +1 -1
- package/dist/types/react-desc-prop-types.d.ts +305 -6
- package/package.json +29 -31
- package/skills/ds-data-table-boundaries/SKILL.md +50 -43
- package/skills/ds-data-table-columns/SKILL.md +17 -11
- package/skills/ds-data-table-expandable/SKILL.md +21 -13
- package/skills/ds-data-table-feedback/SKILL.md +9 -9
- package/skills/ds-data-table-filtering/SKILL.md +32 -11
- package/skills/ds-data-table-health-check/SKILL.md +7 -7
- package/skills/ds-data-table-migration/SKILL.md +8 -7
- package/skills/ds-data-table-pagination/SKILL.md +6 -6
- package/skills/ds-data-table-row-variants/SKILL.md +34 -22
- package/skills/ds-data-table-selection/SKILL.md +23 -25
- package/skills/ds-data-table-setup/SKILL.md +31 -13
- package/skills/ds-data-table-slots/SKILL.md +55 -25
- package/dist/cjs/addons/Editables/DateEditableCell/DateEditableCell.js +0 -63
- package/dist/cjs/addons/Editables/DateEditableCell/DateEditableCell.js.map +0 -7
- package/dist/cjs/configs/fixedSizes.js.map +0 -7
- package/dist/cjs/configs/useInternalStateConfig.js +0 -80
- package/dist/cjs/configs/useInternalStateConfig.js.map +0 -7
- package/dist/cjs/configs/useValidateProps.js +0 -47
- package/dist/cjs/configs/useValidateProps.js.map +0 -7
- package/dist/cjs/exported-related/FilterPopover/types.js.map +0 -7
- package/dist/cjs/parts/Cells/Cell.js +0 -126
- package/dist/cjs/parts/Cells/Cell.js.map +0 -7
- package/dist/cjs/parts/FilterBar/DeprecatedDropdown.js +0 -85
- package/dist/cjs/parts/FilterBar/DeprecatedDropdown.js.map +0 -7
- package/dist/cjs/parts/FilterBar/index.js.map +0 -7
- package/dist/cjs/parts/RowVariants/types.js.map +0 -7
- package/dist/cjs/parts/internal.js.map +0 -7
- package/dist/esm/addons/Editables/DateEditableCell/DateEditableCell.js +0 -33
- package/dist/esm/addons/Editables/DateEditableCell/DateEditableCell.js.map +0 -7
- package/dist/esm/configs/fixedSizes.js +0 -8
- package/dist/esm/configs/fixedSizes.js.map +0 -7
- package/dist/esm/configs/useInternalStateConfig.js +0 -50
- package/dist/esm/configs/useInternalStateConfig.js.map +0 -7
- package/dist/esm/configs/useValidateProps.js +0 -17
- package/dist/esm/configs/useValidateProps.js.map +0 -7
- package/dist/esm/parts/Cells/Cell.js +0 -96
- package/dist/esm/parts/Cells/Cell.js.map +0 -7
- package/dist/esm/parts/FilterBar/DeprecatedDropdown.js +0 -55
- package/dist/esm/parts/FilterBar/DeprecatedDropdown.js.map +0 -7
- package/dist/esm/parts/FilterBar/index.js +0 -6
- package/dist/esm/parts/FilterBar/index.js.map +0 -7
- package/dist/esm/parts/RowVariants/types.js +0 -2
- package/dist/esm/parts/internal.js +0 -8
- package/dist/esm/parts/internal.js.map +0 -7
- package/dist/types/addons/Editables/DateEditableCell/DateEditableCell.d.ts +0 -7
- package/dist/types/configs/fixedSizes.d.ts +0 -3
- package/dist/types/configs/useInternalStateConfig.d.ts +0 -12
- package/dist/types/configs/useValidateProps.d.ts +0 -2
- package/dist/types/exported-related/FilterPopover/types.d.ts +0 -33
- package/dist/types/parts/Cells/Cell.d.ts +0 -12
- package/dist/types/parts/FilterBar/DeprecatedDropdown.d.ts +0 -13
- package/dist/types/parts/FilterBar/index.d.ts +0 -1
- package/dist/types/parts/RowVariants/types.d.ts +0 -19
- package/dist/types/parts/internal.d.ts +0 -2
- /package/dist/cjs/exported-related/{FilterPopover → FilterBar/dropdownMenuV2Bridge}/types.js +0 -0
- /package/dist/esm/exported-related/{FilterPopover → FilterBar/dropdownMenuV2Bridge}/types.js +0 -0
|
@@ -7,7 +7,7 @@ description: >
|
|
|
7
7
|
Column.Cell and Column.Header custom renderers are strongly discouraged — try slot injection first.
|
|
8
8
|
type: core
|
|
9
9
|
library: ds-data-table
|
|
10
|
-
library_version: '3.
|
|
10
|
+
library_version: '3.80.0'
|
|
11
11
|
requires:
|
|
12
12
|
- ds-data-table-setup
|
|
13
13
|
sources:
|
|
@@ -34,7 +34,7 @@ const columns = [
|
|
|
34
34
|
|
|
35
35
|
All column feature callbacks share the same contract:
|
|
36
36
|
|
|
37
|
-
- **First argument** (`newColumns` / `newData`) — the pre-baked OOB result. For standard cases with no custom business logic, no custom cells, and no column grouping edge cases, dispatch this directly to the state manager. This is the intended fast path.
|
|
37
|
+
- **First argument** (`newColumns` / `newData`) — the pre-baked OOB result. For standard cases with no custom business logic, no custom cells, and no column grouping edge cases, dispatch this directly to the state manager. This is the intended fast path. Sorting is the exception: `newColumns` only carries the sort indicator (`isSortedDesc`), and the table does not sort `data`.
|
|
38
38
|
- **Remaining arguments** — raw data (column ID, width, direction, reorder indexes). Use these when the OOB result falls short and custom handling is required (server-side operations, constraint validation, non-standard persistence).
|
|
39
39
|
|
|
40
40
|
### Sorting
|
|
@@ -46,9 +46,12 @@ const columns = [
|
|
|
46
46
|
];
|
|
47
47
|
|
|
48
48
|
// Full signature: (newColumns: Column[], headerId: string, direction: 'ASC' | 'DESC') => void
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
const handleColumnSort = useCallback((newColumns, headerId, direction) =>
|
|
49
|
+
// newColumns only updates the sort indicator (isSortedDesc). The table does not sort `data`:
|
|
50
|
+
// sort the rows from headerId + direction (client-side) or request sorted rows (server-side)
|
|
51
|
+
const handleColumnSort = useCallback((newColumns, headerId, direction) => {
|
|
52
|
+
dispatch(setColumns(newColumns));
|
|
53
|
+
// sort or refetch the rows by headerId and direction here
|
|
54
|
+
}, []);
|
|
52
55
|
|
|
53
56
|
<DataTable columns={columns} data={rows} height={500} onColumnSort={handleColumnSort} />;
|
|
54
57
|
```
|
|
@@ -140,7 +143,7 @@ Correct:
|
|
|
140
143
|
/>
|
|
141
144
|
```
|
|
142
145
|
|
|
143
|
-
`colsLayoutStyle='auto'` fills the container by distributing column widths equally. Under `auto`, `onColumnSizeChange` does not reliably track individual column widths — custom resize redistribution is not supported. Use `colsLayoutStyle='fixed'` (the default) whenever `isResizeable` and `onColumnSizeChange` are required.
|
|
146
|
+
`colsLayoutStyle='auto'` fills the container by distributing column widths equally. The table does not reject the combination: no error is thrown, so it can look fine in code review. Under `auto`, `onColumnSizeChange` does not reliably track individual column widths — custom resize redistribution is not supported. Use `colsLayoutStyle='fixed'` (the default) whenever `isResizeable` and `onColumnSizeChange` are required.
|
|
144
147
|
|
|
145
148
|
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-features-column--dynamic-columns-layout-1
|
|
146
149
|
|
|
@@ -157,14 +160,17 @@ Wrong:
|
|
|
157
160
|
Correct:
|
|
158
161
|
|
|
159
162
|
```jsx
|
|
160
|
-
const handleColumnSort = useCallback(
|
|
163
|
+
const handleColumnSort = useCallback(
|
|
164
|
+
(newColumns, columnId, direction) => handleSort({ column: columnId, direction }),
|
|
165
|
+
[],
|
|
166
|
+
);
|
|
161
167
|
|
|
162
168
|
<DataTable columns={columns} data={rows} height={500} onColumnSort={handleColumnSort} />;
|
|
163
169
|
```
|
|
164
170
|
|
|
165
171
|
`onColumnSortChange` is deprecated. Migrate on sight.
|
|
166
172
|
|
|
167
|
-
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable--
|
|
173
|
+
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-docs--api-reference
|
|
168
174
|
|
|
169
175
|
---
|
|
170
176
|
|
|
@@ -186,7 +192,7 @@ const handleColumnSizeChange = useCallback((newColumns, headerId, width) => hand
|
|
|
186
192
|
|
|
187
193
|
`onColumnResize` is deprecated. Migrate on sight.
|
|
188
194
|
|
|
189
|
-
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable--
|
|
195
|
+
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-docs--api-reference
|
|
190
196
|
|
|
191
197
|
---
|
|
192
198
|
|
|
@@ -218,7 +224,7 @@ const cellProps = useCallback((cell) => {
|
|
|
218
224
|
<DataTable columns={columns} data={rows} height={500} dsDatatableCell={cellProps} />;
|
|
219
225
|
```
|
|
220
226
|
|
|
221
|
-
|
|
227
|
+
A custom Cell replaces only the cell content: the `role="cell"` wrapper and the truncation tooltip still apply, but the default empty-value label (`role="group"` with `aria-label="Empty cell"`) is not rendered for your Cell, so handle empty values yourself, and the filter system sees the raw value, not what your Cell displays. A custom Cell is an opaque component the table cannot memoize through: it receives freshly built props, so React.memo does not stop its re-renders. Defined inline in columns, it also changes the table's props on every parent render, so the deep-compare that protects the table's calculations fails and they rerun for the whole table. Define it at module level, keep columns referentially stable, keep it light, and prefer slot injection. If a custom Cell is unavoidable, read `ds-data-table-boundaries/SKILL.md` in full, re-evaluate the plan against everything in that skill, and only then implement.
|
|
222
228
|
|
|
223
229
|
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-advanced--target-specific-row-style
|
|
224
230
|
|
|
@@ -240,7 +246,7 @@ Correct:
|
|
|
240
246
|
|
|
241
247
|
Column `width` accepts only pixel values (number or `"Npx"` string). Percentage widths are not supported.
|
|
242
248
|
|
|
243
|
-
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable--
|
|
249
|
+
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-docs--api-reference
|
|
244
250
|
|
|
245
251
|
---
|
|
246
252
|
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
name: ds-data-table-expandable
|
|
3
3
|
description: >
|
|
4
4
|
Expandable rows for @elliemae/ds-data-table. isExpandable flag, expandedRows
|
|
5
|
-
(Record<rowUid, boolean>) controlled state, onRowExpand handler, subRows
|
|
6
|
-
|
|
5
|
+
(Record<rowUid, boolean>) controlled state, onRowExpand handler, subRows (one level:
|
|
6
|
+
only top-level rows get a caret for their subRows). uniqueRowAccessor required. tableRowDetails (master-detail
|
|
7
7
|
non-tabular content panel) is DEPRECATED due to WCAG violations — propose alternative
|
|
8
8
|
page-level design instead.
|
|
9
9
|
type: core
|
|
10
10
|
library: ds-data-table
|
|
11
|
-
library_version: '3.
|
|
11
|
+
library_version: '3.80.0'
|
|
12
12
|
requires:
|
|
13
13
|
- ds-data-table-setup
|
|
14
14
|
sources:
|
|
@@ -22,10 +22,10 @@ import { DataTable } from '@elliemae/ds-data-table';
|
|
|
22
22
|
|
|
23
23
|
const rows = [
|
|
24
24
|
{
|
|
25
|
-
id: 1,
|
|
25
|
+
id: '1',
|
|
26
26
|
name: 'John',
|
|
27
27
|
myUniqueId: 'abc123',
|
|
28
|
-
subRows: [{ id: 11, name: 'Sub-item', myUniqueId: 'def456' }],
|
|
28
|
+
subRows: [{ id: '11', name: 'Sub-item', myUniqueId: 'def456' }],
|
|
29
29
|
},
|
|
30
30
|
];
|
|
31
31
|
|
|
@@ -52,12 +52,14 @@ const handleRowExpand = useCallback((newExpandedRows) => dispatch(setExpandedRow
|
|
|
52
52
|
```jsx
|
|
53
53
|
// Every row — including subRows — must have a unique value for uniqueRowAccessor
|
|
54
54
|
const generateRow = (id) => ({
|
|
55
|
-
id,
|
|
55
|
+
id: String(id),
|
|
56
56
|
myUniqueId: uid(16),
|
|
57
|
-
subRows: [{ id: id * 10, myUniqueId: uid(16) }],
|
|
57
|
+
subRows: [{ id: String(id * 10), myUniqueId: uid(16) }],
|
|
58
58
|
});
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
+
Only one level of `subRows` is expandable: the `subRows` caret is rendered only for top-level rows (depth 0; a row with `tableRowDetails` or `dimsumHeaderValue` shows a caret at any depth), and the visible list is built to depth 1. Nested `subRows` under a child row are not shown as an expandable tree.
|
|
62
|
+
|
|
61
63
|
### Programmatic expand on data update
|
|
62
64
|
|
|
63
65
|
```jsx
|
|
@@ -69,6 +71,8 @@ const handleRowExpand = useCallback((newExpandedRows) => {
|
|
|
69
71
|
// When data is reloaded, dispatch the same expandedRows to preserve state
|
|
70
72
|
```
|
|
71
73
|
|
|
74
|
+
This holds for keys taken from `uniqueRowAccessor`. Group header uids created by `groupBy` do not survive a re-grouping (see ds-data-table-row-variants).
|
|
75
|
+
|
|
72
76
|
## Common Mistakes
|
|
73
77
|
|
|
74
78
|
### CRITICAL Using tableRowDetails — master-detail is deprecated
|
|
@@ -78,7 +82,7 @@ Wrong:
|
|
|
78
82
|
```jsx
|
|
79
83
|
const rows = [
|
|
80
84
|
{
|
|
81
|
-
id: 1,
|
|
85
|
+
id: '1',
|
|
82
86
|
name: 'John',
|
|
83
87
|
tableRowDetails: ({ detailsIndent }) => (
|
|
84
88
|
<div style={{ paddingLeft: detailsIndent }}>
|
|
@@ -125,12 +129,14 @@ const RowActionsRenderer = React.memo(({ row, isRowSelected, cell }) => {
|
|
|
125
129
|
});
|
|
126
130
|
|
|
127
131
|
const renderRowActions = { columnWidth: 32, renderer: RowActionsRenderer };
|
|
132
|
+
// pass it to the table: <DataTable renderRowActions={renderRowActions} ... />
|
|
128
133
|
```
|
|
129
134
|
|
|
130
135
|
When surfacing this to the human, explain:
|
|
131
136
|
|
|
132
|
-
- `tableRowDetails` renders non-tabular HTML inside a
|
|
137
|
+
- `tableRowDetails` renders non-tabular HTML inside the table structure: a `role="region"` sibling of the row element, inside the table's `role="table"` wrapper. Screen readers expect only tabular content in table rows — the nested structure is invisible to assistive technologies by default, violating WCAG 1.3.1 (Info and Relationships) and 1.3.2 (Meaningful Sequence). The expand/collapse button lacks `aria-controls`, violating WCAG 2.1.1 (Keyboard). These are not implementation quality issues — they are structural, and no amount of ARIA patching fully resolves them.
|
|
133
138
|
- The Dimsum team has officially deprecated `tableRowDetails` and is removing all documentation for it.
|
|
139
|
+
- Passing `tableRowDetails` logs a one-time deprecation `console.warn` in development builds (propTypes validation does not run in production builds). It is expected, not a bug in the table.
|
|
134
140
|
- The alternative (detail dialog/panel triggered from row actions) keeps the table semantically clean, is fully accessible, and is natively supported.
|
|
135
141
|
- ICE internal engineers: full analysis at `https://confluence.ice.com/x/T3k0Jg`
|
|
136
142
|
|
|
@@ -141,7 +147,7 @@ When surfacing this to the human, explain:
|
|
|
141
147
|
Wrong:
|
|
142
148
|
|
|
143
149
|
```jsx
|
|
144
|
-
const rows = [{ id: 1, name: 'John', subRows: [{ id: 11, name: 'Sub-item' }] }];
|
|
150
|
+
const rows = [{ id: '1', name: 'John', subRows: [{ id: '11', name: 'Sub-item' }] }];
|
|
145
151
|
|
|
146
152
|
// expandedRows keys are unstable internal IDs — expanded state maps to wrong rows on re-render
|
|
147
153
|
<DataTable
|
|
@@ -159,7 +165,7 @@ Correct:
|
|
|
159
165
|
```jsx
|
|
160
166
|
// Each row (and each subRow) must have a field with a stable unique value
|
|
161
167
|
const rows = [
|
|
162
|
-
{ id: 1, name: 'John', myUniqueId: 'abc123', subRows: [{ id: 11, name: 'Sub-item', myUniqueId: 'def456' }] },
|
|
168
|
+
{ id: '1', name: 'John', myUniqueId: 'abc123', subRows: [{ id: '11', name: 'Sub-item', myUniqueId: 'def456' }] },
|
|
163
169
|
];
|
|
164
170
|
|
|
165
171
|
// uniqueRowAccessor names that field — expandedRows is then keyed by its value
|
|
@@ -174,7 +180,7 @@ const rows = [
|
|
|
174
180
|
/>;
|
|
175
181
|
```
|
|
176
182
|
|
|
177
|
-
`uniqueRowAccessor` tells the DataTable which field on each row object holds its stable unique identifier. `expandedRows` is a `Record<uid, boolean>` keyed by those values. Without it, the DataTable falls back to
|
|
183
|
+
`uniqueRowAccessor` tells the DataTable which field on each row object holds its stable unique identifier. `expandedRows` is a `Record<uid, boolean>` keyed by those values. Without it, the DataTable falls back to its internal position-based id (`"0"`, `"1"`, `"0.0"` for nested) — there is no fallback to `id` or `dsId` from your data. Position-based IDs shift whenever data is reordered or reloaded, silently mapping expanded state to the wrong rows.
|
|
178
184
|
|
|
179
185
|
Source: `@elliemae/ds-data-table:dist/types/react-desc-prop-types.d.ts`
|
|
180
186
|
|
|
@@ -204,7 +210,9 @@ const handleRowExpand = useCallback((newExpandedRows) => dispatch(setExpandedRow
|
|
|
204
210
|
/>;
|
|
205
211
|
```
|
|
206
212
|
|
|
207
|
-
`isExpandable` alone renders the expand caret
|
|
213
|
+
`isExpandable` alone renders the expand-all control in the header, and a caret on each row that has `subRows` (top-level rows only), `tableRowDetails`, or `dimsumHeaderValue`. The component is fully controlled — `expandedRows` defaults to `{}` and `onRowExpand` defaults to a no-op. Clicking a caret calls the no-op, `expandedRows` stays `{}`, and `isExpanded` is always `false`. The caret appears but clicking it does nothing visible.
|
|
214
|
+
|
|
215
|
+
The header expand-all control also calls `onRowExpand` with `toggledRow === 'All'` (the same sentinel `selectedControl` uses for select-all). It passes `{}` when collapsing all. When expanding all, it passes every row with `subRows` (at any depth, including rows that show no caret), `tableRowDetails` or `dimsumHeaderValue`, excluding rows in `disabledRows`. Handle it before treating `toggledRow` as a row id.
|
|
208
216
|
|
|
209
217
|
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-features-row--expandable
|
|
210
218
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ds-data-table-feedback
|
|
3
3
|
description: >
|
|
4
|
-
Async and empty feedback states for @elliemae/ds-data-table. isLoading spinner
|
|
5
|
-
isSkeleton placeholder rows (
|
|
4
|
+
Async and empty feedback states for @elliemae/ds-data-table. isLoading spinner in place of the rows,
|
|
5
|
+
isSkeleton placeholder rows (row count is computed from the numeric part of height — pass pixels),
|
|
6
6
|
noResultsMessage, noResultsSecondaryMessage, noResultsButtonLabel + onNoResultsButtonClick
|
|
7
7
|
pair for empty-state CTA, noResultsPlaceholder for fully custom empty state component.
|
|
8
8
|
type: core
|
|
9
9
|
library: ds-data-table
|
|
10
|
-
library_version: '3.
|
|
10
|
+
library_version: '3.80.0'
|
|
11
11
|
requires:
|
|
12
12
|
- ds-data-table-setup
|
|
13
13
|
sources:
|
|
@@ -19,7 +19,7 @@ sources:
|
|
|
19
19
|
```jsx
|
|
20
20
|
import { DataTable } from '@elliemae/ds-data-table';
|
|
21
21
|
|
|
22
|
-
//
|
|
22
|
+
// only isSkeleton reads the numeric part of height (isLoading does not)
|
|
23
23
|
<DataTable columns={columns} data={data} height={500} isSkeleton={isLoading} />;
|
|
24
24
|
```
|
|
25
25
|
|
|
@@ -40,7 +40,7 @@ import { DataTable } from '@elliemae/ds-data-table';
|
|
|
40
40
|
<DataTable columns={columns} data={[]} height={500} isSkeleton={isInitialLoading} />
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
Use `isSkeleton` for the initial data fetch when no rows exist yet.
|
|
43
|
+
Use `isSkeleton` for the initial data fetch when no rows exist yet. The skeleton row count is computed from the numeric part of `height`, so pass a pixel number (see Common Mistakes).
|
|
44
44
|
|
|
45
45
|
### Empty state with message
|
|
46
46
|
|
|
@@ -88,7 +88,7 @@ const EmptyStatePlaceholder = () => (
|
|
|
88
88
|
|
|
89
89
|
## Common Mistakes
|
|
90
90
|
|
|
91
|
-
### HIGH isSkeleton
|
|
91
|
+
### HIGH isSkeleton row count is wrong when height is a percentage
|
|
92
92
|
|
|
93
93
|
Wrong:
|
|
94
94
|
|
|
@@ -102,7 +102,7 @@ Correct:
|
|
|
102
102
|
<DataTable columns={columns} data={[]} height={500} isSkeleton={isLoading} />
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
Skeleton rows are calculated as `Math.floor((parseInt(height, 10) - 25) / 52)`. `parseInt` strips the unit suffix and reads only the numeric prefix — `"60vh"` → 60, `"100%"` → 100.
|
|
105
|
+
Skeleton rows are calculated as `Math.floor((parseInt(height, 10) - 25) / 52)`. `parseInt` strips the unit suffix and reads only the numeric prefix — `"60vh"` → 60, `"100%"` → 100. So `"100%"` renders a single placeholder row, and values below 77 produce none. Always pass a numeric pixel value so the placeholder count matches the table height you intend.
|
|
106
106
|
|
|
107
107
|
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-features-row--skeleton-rows-variant
|
|
108
108
|
|
|
@@ -152,7 +152,7 @@ Correct:
|
|
|
152
152
|
<DataTable columns={columns} data={[]} height={500} isSkeleton={isLoading} />
|
|
153
153
|
```
|
|
154
154
|
|
|
155
|
-
`isSkeleton` is the default choice. Both props replace the rows with a visual placeholder — the difference is purely graphical. `isSkeleton`
|
|
155
|
+
`isSkeleton` is the default choice. Both props replace the rows with a visual placeholder — the difference is purely graphical. `isSkeleton` replaces the whole table body, column header row included, with placeholder rows sized to the table height; `isLoading` keeps the column headers and shows a generic spinner in place of the rows.
|
|
156
156
|
|
|
157
157
|
Two reasons to default to `isSkeleton`:
|
|
158
158
|
|
|
@@ -178,7 +178,7 @@ Non-stable references cause DataTable to re-render on every parent render cycle
|
|
|
178
178
|
|
|
179
179
|
---
|
|
180
180
|
|
|
181
|
-
See also: ds-data-table-setup/SKILL.md —
|
|
181
|
+
See also: ds-data-table-setup/SKILL.md — bounded height requirement for virtualization
|
|
182
182
|
|
|
183
183
|
---
|
|
184
184
|
|
|
@@ -8,7 +8,7 @@ description: >
|
|
|
8
8
|
debt — migrate to V2 whenever found in existing code, never use in new implementations.
|
|
9
9
|
type: core
|
|
10
10
|
library: ds-data-table
|
|
11
|
-
library_version: '3.
|
|
11
|
+
library_version: '3.80.0'
|
|
12
12
|
requires:
|
|
13
13
|
- ds-data-table-setup
|
|
14
14
|
- ds-filter-bar-setup
|
|
@@ -112,12 +112,13 @@ const onFiltersChange = useCallback(
|
|
|
112
112
|
);
|
|
113
113
|
|
|
114
114
|
// fallbackRef is shared with the DSFilterBar assembly (passed as fallbackRef to
|
|
115
|
-
// useFilterBarPrevNextFocus).
|
|
116
|
-
//
|
|
115
|
+
// useFilterBarPrevNextFocus). The hook focuses fallbackRef only when no focusable element is
|
|
116
|
+
// left in the filter bar (a menu button in the bar takes the focus first), so this ref lands
|
|
117
|
+
// focus on the first column header in that case.
|
|
117
118
|
const fallbackRef = useRef(null);
|
|
118
119
|
|
|
119
120
|
// dsDatatableHeadTh injects fallbackRef into the first focusable column header,
|
|
120
|
-
// completing the focus chain
|
|
121
|
+
// completing the focus chain when the filter bar has nothing else to focus
|
|
121
122
|
const dsDatatableHeadTh = useCallback(({ columnId, firstFocuseableColumnHeaderId }) => {
|
|
122
123
|
if (columnId === firstFocuseableColumnHeaderId) return { innerRef: fallbackRef };
|
|
123
124
|
return {};
|
|
@@ -144,9 +145,21 @@ const dsDatatableHeadTh = useCallback(({ columnId, firstFocuseableColumnHeaderId
|
|
|
144
145
|
|
|
145
146
|
Do not pass `withFilterBar` to DataTable when using a composable `DSFilterBar` — the filter bar is external.
|
|
146
147
|
|
|
148
|
+
### Default filter bar menu (no filterBarAddonRenderer)
|
|
149
|
+
|
|
150
|
+
When `withFilterBar` is set and no `filterBarAddonRenderer` is passed, the filter bar renders its own menu button on `DSMenuButton`, with **Clear Filters** and the `filterBarProps.extraOptions` you provide (`{ type, id, label, onClick }`; `type: 'separator'` renders a separator). The menu reports through `filterBarProps`:
|
|
151
|
+
|
|
152
|
+
- `onDropdownMenuToggle(isOpen, eventType)`: called when the menu opens or closes.
|
|
153
|
+
- `onDropdownMenuClickOutside()`: called when the user clicks outside the open menu.
|
|
154
|
+
- `onDropdownMenuTriggerClick()`: called when the trigger is clicked.
|
|
155
|
+
- `isDropdownMenuOpen`: when you provide a boolean, your app owns the open state.
|
|
156
|
+
- `onClearAllFiltersClick()`: called after `onFiltersChange([])` when Clear Filters is activated.
|
|
157
|
+
|
|
158
|
+
For the details of the menu and how it behaves, see the [migration page](https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-docs--filter-bar-menu-button-migration).
|
|
159
|
+
|
|
147
160
|
### filterBarProps for inline filter bar customization
|
|
148
161
|
|
|
149
|
-
`filterBarAddonRenderer` must be a **stable React component reference** — defined at module level or imported, never inline or via `useCallback`.
|
|
162
|
+
`filterBarAddonRenderer` must be a **stable React component reference** — defined at module level or imported, never inline or via `useCallback`. The filter bar renders it as a component (`<FilterBarAddonRenderer innerRef={...} />`). Defining it inline creates a new component type on every render, so React unmounts and remounts the addon each time and its internal state is lost. `useCallback` returns the same reference only while its dependencies are unchanged, so an addon that closes over changing state gets a new reference: module level is the safe default.
|
|
150
163
|
|
|
151
164
|
The addon needs access to filter state and clear action from outside itself. Because `FilterBarAddon` is at module level, it reads what it needs at render time rather than closing over parent state — that is what makes this pattern work. Adapt to your project's state management stack:
|
|
152
165
|
|
|
@@ -154,24 +167,32 @@ The addon needs access to filter state and clear action from outside itself. Bec
|
|
|
154
167
|
- **Zustand / Jotai**: subscribe to the relevant store or atom directly inside `FilterBarAddon`
|
|
155
168
|
- **React Context**: use the pattern below (last resort — prefer the state manager options above)
|
|
156
169
|
|
|
157
|
-
```
|
|
170
|
+
```tsx
|
|
158
171
|
import { DSButtonV3 } from '@elliemae/ds-button-v2';
|
|
159
172
|
import { ScreenReaderOnly } from '@elliemae/ds-accessibility';
|
|
160
|
-
import { DataTable, applyOutOfTheBoxFilters } from '@elliemae/ds-data-table';
|
|
173
|
+
import { DataTable, applyOutOfTheBoxFilters, type DSDataTableT } from '@elliemae/ds-data-table';
|
|
161
174
|
import React, { createContext, useCallback, useContext, useState, useMemo } from 'react';
|
|
162
175
|
|
|
163
|
-
const FilterBarAddonContext = createContext(
|
|
176
|
+
const FilterBarAddonContext = createContext<{ filters: DSDataTableT.Filter[]; onClearFilters: () => void }>({
|
|
177
|
+
filters: [],
|
|
178
|
+
onClearFilters: () => {},
|
|
179
|
+
});
|
|
164
180
|
|
|
165
|
-
|
|
181
|
+
// the table passes innerRef, the trigger ref. The table uses it as the next-focus target of the last pill, so removing
|
|
182
|
+
// the last remaining pill focuses it. The table does not move focus when the menu closes: a custom addon must handle
|
|
183
|
+
// its own focus return. Attach innerRef to the rendered control.
|
|
184
|
+
const FilterBarAddon = ({ innerRef }) => {
|
|
166
185
|
const { filters, onClearFilters } = useContext(FilterBarAddonContext);
|
|
167
186
|
if (filters.length === 0) return null;
|
|
168
187
|
return (
|
|
169
|
-
<DSButtonV3 buttonType="text" onClick={onClearFilters}>
|
|
188
|
+
<DSButtonV3 innerRef={innerRef} buttonType="text" onClick={onClearFilters}>
|
|
170
189
|
Clear all filters
|
|
171
190
|
</DSButtonV3>
|
|
172
191
|
);
|
|
173
192
|
};
|
|
174
193
|
|
|
194
|
+
const filterBarProps = { filterBarAddonRenderer: FilterBarAddon };
|
|
195
|
+
|
|
175
196
|
const [announcement, setAnnouncement] = useState('');
|
|
176
197
|
|
|
177
198
|
const onFiltersChange = useCallback(
|
|
@@ -197,7 +218,7 @@ const ctxValue = useMemo(() => ({ filters, onClearFilters: handleClearFilters })
|
|
|
197
218
|
height={500}
|
|
198
219
|
withFilterBar
|
|
199
220
|
filters={filters}
|
|
200
|
-
filterBarProps={
|
|
221
|
+
filterBarProps={filterBarProps}
|
|
201
222
|
onFiltersChange={onFiltersChange}
|
|
202
223
|
/>
|
|
203
224
|
</FilterBarAddonContext.Provider>;
|
|
@@ -8,7 +8,7 @@ description: >
|
|
|
8
8
|
what gaps may affect the current task.
|
|
9
9
|
type: health-check
|
|
10
10
|
library: ds-data-table
|
|
11
|
-
library_version: '3.
|
|
11
|
+
library_version: '3.80.0'
|
|
12
12
|
requires:
|
|
13
13
|
- ds-data-table-setup
|
|
14
14
|
- ds-data-table-slots
|
|
@@ -81,9 +81,9 @@ Work through the following checks. For each finding, assign a severity:
|
|
|
81
81
|
|
|
82
82
|
#### Foundation checks (from ds-data-table-setup)
|
|
83
83
|
|
|
84
|
-
- [ ] `height` is a
|
|
84
|
+
- [ ] `height` is bounded: a number, a px string, a viewport unit such as `'60vh'`, or a percentage of a parent that has a definite height. With the default `'100%'` in an unsized parent, or `'auto'`, the table renders nearly every row (HIGH for large data)
|
|
85
85
|
- [ ] `uniqueRowAccessor` is present when selection, expand, or drag & drop is used
|
|
86
|
-
- [ ] `
|
|
86
|
+
- [ ] `dsDatatableTableWrapper={{ 'aria-label': '...' }}` is present — absence is a WCAG 4.1.2 VPAT failure
|
|
87
87
|
- [ ] `domIdAffix` is an explicit string when multiple DataTable instances coexist on the page
|
|
88
88
|
- [ ] All DataTable-driving state lives in the project's state manager — not `useState`
|
|
89
89
|
- [ ] No `useEffect` watches DataTable callback-driven state to trigger secondary logic
|
|
@@ -98,7 +98,7 @@ Work through the following checks. For each finding, assign a severity:
|
|
|
98
98
|
|
|
99
99
|
#### Selection checks (from ds-data-table-selection)
|
|
100
100
|
|
|
101
|
-
- [ ] `selection` prop is present — DataTable auto-injects the checkbox column when truthy; `multiSelectColumn` import is for customization only
|
|
101
|
+
- [ ] `selection` prop is present — DataTable auto-injects the checkbox column when truthy (unless `noSelectionColumn` is true); `multiSelectColumn` import is for customization only
|
|
102
102
|
- [ ] `onSelectionChange` is present when `selection` is present — without it, selection silently does nothing
|
|
103
103
|
- [ ] `uniqueRowAccessor` is set — without it, selection maps to wrong rows
|
|
104
104
|
- [ ] Select-all cross-page: if `selectedControl === 'All'` and the dataset is paginated, is `newSelection` being merged with existing selection rather than replacing it?
|
|
@@ -114,12 +114,12 @@ Work through the following checks. For each finding, assign a severity:
|
|
|
114
114
|
|
|
115
115
|
- [ ] Capital-P `Pagination` render prop is used — lowercase `pagination` prop is deprecated
|
|
116
116
|
- [ ] `TablePagination` is defined at module level — not inside the component body
|
|
117
|
-
- [ ] `data` passed to DataTable is the current page slice — DataTable does not paginate internally
|
|
117
|
+
- [ ] `data` passed to DataTable is the current page slice — with the `Pagination` render prop, DataTable does not paginate internally
|
|
118
118
|
- [ ] Page index resets to 1 on filter change where applicable
|
|
119
119
|
|
|
120
120
|
#### Expandable checks (from ds-data-table-expandable)
|
|
121
121
|
|
|
122
|
-
- [ ] `tableRowDetails` is not used — deprecated; WCAG violations; propose page-level alternative
|
|
122
|
+
- [ ] `tableRowDetails` is not used — deprecated; WCAG violations; propose page-level alternative (using it logs a one-time deprecation warning in development builds)
|
|
123
123
|
- [ ] `expandedRows` and `onRowExpand` are both present when `isExpandable` is set
|
|
124
124
|
- [ ] `uniqueRowAccessor` is set — required for expand state stability
|
|
125
125
|
|
|
@@ -134,7 +134,7 @@ Work through the following checks. For each finding, assign a severity:
|
|
|
134
134
|
|
|
135
135
|
- [ ] `isSkeleton` is preferred over `isLoading` for initial data fetch
|
|
136
136
|
- [ ] `noResultsButtonLabel` and `onNoResultsButtonClick` are either both present or both absent — either alone has no visible effect
|
|
137
|
-
- [ ] If `isSkeleton` is used, `height` is a numeric pixel value —
|
|
137
|
+
- [ ] If `isSkeleton` is used, `height` is a numeric pixel value — the skeleton row count is computed from its numeric part
|
|
138
138
|
|
|
139
139
|
#### Boundary checks (from ds-data-table-boundaries)
|
|
140
140
|
|
|
@@ -7,7 +7,7 @@ description: >
|
|
|
7
7
|
onColumnSizeChange. Scan for all instances before migrating — partial migration is not a migration.
|
|
8
8
|
type: lifecycle
|
|
9
9
|
library: ds-data-table
|
|
10
|
-
library_version: '3.
|
|
10
|
+
library_version: '3.80.0'
|
|
11
11
|
sources:
|
|
12
12
|
- '@elliemae/ds-data-table:dist/types/exported-related/FilterTypes.d.ts'
|
|
13
13
|
- '@elliemae/ds-data-table:dist/types/react-desc-prop-types.d.ts'
|
|
@@ -19,11 +19,12 @@ Before migrating, scan the entire codebase for all instances. Determine the corr
|
|
|
19
19
|
|
|
20
20
|
```
|
|
21
21
|
# Patterns to search for — adapt the directory to the project's structure
|
|
22
|
+
# Extended regex: use rg (ripgrep) or grep -E
|
|
22
23
|
|
|
23
24
|
# V1 filter usage — covers all types that have V1/V2 variants:
|
|
24
|
-
FILTER_TYPES\.(MULTI_SELECT|SELECT|CREATABLE_SELECT|CREATABLE_MULTI_SELECT|SINGLE_DATE|DATE_RANGE|DATE_SWITCHER|NUMBER_RANGE|FREE_TEXT_SEARCH|CURRENCY_RANGE)\b
|
|
25
|
-
ds-filter-multi-select
|
|
26
|
-
ds-filter-select
|
|
25
|
+
FILTER_TYPES\.(MULTI_SELECT|SELECT|CREATABLE_SELECT|CREATABLE_MULTI_SELECT|SINGLE_DATE|DATE_RANGE|DATE_SWITCHER|NUMBER_RANGE|FREE_TEXT_SEARCH|CURRENCY_RANGE)\b
|
|
26
|
+
['"]ds-filter-multi-select['"]
|
|
27
|
+
['"]ds-filter-select['"]
|
|
27
28
|
|
|
28
29
|
# Deprecated pagination prop:
|
|
29
30
|
pagination={
|
|
@@ -86,7 +87,7 @@ Every filter type in `FILTER_TYPES` has both a V1 and a V2 variant. The V1 name
|
|
|
86
87
|
columns={columns}
|
|
87
88
|
data={rows}
|
|
88
89
|
height={500}
|
|
89
|
-
pagination={{ pageSize: 10,
|
|
90
|
+
pagination={{ pageSize: 10, pageCount: 100 }}
|
|
90
91
|
/>
|
|
91
92
|
|
|
92
93
|
// After
|
|
@@ -95,7 +96,7 @@ Every filter type in `FILTER_TYPES` has both a V1 and a V2 variant. The V1 name
|
|
|
95
96
|
|
|
96
97
|
Two things change in the migration:
|
|
97
98
|
|
|
98
|
-
1. **Integration model** — the
|
|
99
|
+
1. **Integration model** — the lowercase object makes DataTable slice `data` by `pageIndex` and `pageSize` itself (unless `dataIsPage: true`, where the app passes the current page). The `Pagination` render prop does no slicing: the modern pattern requires the app to own data fetching and page slicing via AJAX
|
|
99
100
|
2. **Component model** — `Pagination` receives a React component reference, not a config object; that component must be defined at module level and read state from the project's state manager
|
|
100
101
|
|
|
101
102
|
For the full correct implementation of `TablePagination`, load `ds-data-table-pagination/SKILL.md`.
|
|
@@ -109,7 +110,7 @@ For the full correct implementation of `TablePagination`, load `ds-data-table-pa
|
|
|
109
110
|
|
|
110
111
|
```jsx
|
|
111
112
|
// After
|
|
112
|
-
// Signature: (newColumns,
|
|
113
|
+
// Signature: (newColumns, headerId, direction: 'ASC' | 'DESC') => void
|
|
113
114
|
const handleColumnSort = useCallback((newColumns) => dispatch(setColumns(newColumns)), []);
|
|
114
115
|
|
|
115
116
|
<DataTable columns={columns} data={rows} height={500} onColumnSort={handleColumnSort} />;
|
|
@@ -7,7 +7,7 @@ description: >
|
|
|
7
7
|
Lowercase pagination prop is deprecated legacy — migrate to Pagination component on sight.
|
|
8
8
|
type: core
|
|
9
9
|
library: ds-data-table
|
|
10
|
-
library_version: '3.
|
|
10
|
+
library_version: '3.80.0'
|
|
11
11
|
requires:
|
|
12
12
|
- ds-data-table-setup
|
|
13
13
|
- ds-pagination-setup
|
|
@@ -24,13 +24,14 @@ sources:
|
|
|
24
24
|
1. Check whether `@elliemae/ds-pagination` has a published intent skill — run `npx @tanstack/intent install` in the project or look for a `skills/` directory inside the `@elliemae/ds-pagination` package. The `ds-pagination-setup` skill covers the full composable assembly. If found, load it.
|
|
25
25
|
2. If no skill is found, ask the human to share a correct implementation example from the Dimsum storybook before proceeding. Do not approximate the assembly from incomplete information — omitting the AJAX model or memoization requirements produces incorrect implementations.
|
|
26
26
|
|
|
27
|
-
The DataTable side of the wiring. `TablePagination` is defined at module level — it is already a stable reference and does not need `useCallback`. Pass `pagedData` (the current page slice), not the full dataset — DataTable does not paginate internally; it renders whatever array it receives.
|
|
27
|
+
The DataTable side of the wiring. `TablePagination` is defined at module level — it is already a stable reference and does not need `useCallback`. Pass `pagedData` (the current page slice), not the full dataset — with the `Pagination` render prop, DataTable does not paginate internally; it renders whatever array it receives.
|
|
28
28
|
|
|
29
29
|
```jsx
|
|
30
30
|
import { DataTable } from '@elliemae/ds-data-table';
|
|
31
31
|
|
|
32
32
|
const TablePagination = () => {
|
|
33
33
|
// ... full assembly — see @elliemae/ds-pagination ds-pagination-setup skill
|
|
34
|
+
return null; // placeholder: the real component returns the assembled pagination
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
<DataTable columns={columns} data={pagedData} height={438} Pagination={TablePagination} />;
|
|
@@ -76,7 +77,7 @@ Correct:
|
|
|
76
77
|
<DataTable columns={columns} data={pagedData} height={500} Pagination={TablePagination} />
|
|
77
78
|
```
|
|
78
79
|
|
|
79
|
-
The lowercase `pagination` prop is legacy kept for backwards compatibility. Migrate on sight.
|
|
80
|
+
The lowercase `pagination` prop is legacy kept for backwards compatibility. Migrate on sight. Passing it logs a one-time `console.warn` in development builds. Never combine it with the `Pagination` render prop: without `dataIsPage: true` the table slices the data it receives again by `pageIndex` and `pageSize`, so rows silently disappear whenever the array you pass holds more rows than the lowercase `pageSize`.
|
|
80
81
|
|
|
81
82
|
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-features-pagination--paginated-table
|
|
82
83
|
|
|
@@ -96,7 +97,7 @@ Correct:
|
|
|
96
97
|
<DataTable columns={columns} data={pagedData} height={500} Pagination={TablePagination} />
|
|
97
98
|
```
|
|
98
99
|
|
|
99
|
-
DataTable does not
|
|
100
|
+
With the `Pagination` render prop, DataTable does not paginate: it shows (and scrolls) every row it receives, so pass only the current page.
|
|
100
101
|
|
|
101
102
|
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-features-pagination--paginated-table
|
|
102
103
|
|
|
@@ -110,7 +111,6 @@ Wrong:
|
|
|
110
111
|
// Defined inside a component — new reference or new component type on every render
|
|
111
112
|
const ParentComponent = () => {
|
|
112
113
|
const MyPagination = () => <DSPaginationContainer>...</DSPaginationContainer>;
|
|
113
|
-
// or: const MyPagination = useCallback(() => <DSPaginationContainer>...</DSPaginationContainer>, [...]);
|
|
114
114
|
return <DataTable columns={columns} data={pagedData} height={500} Pagination={MyPagination} />;
|
|
115
115
|
};
|
|
116
116
|
```
|
|
@@ -129,7 +129,7 @@ const ParentComponent = () => (
|
|
|
129
129
|
);
|
|
130
130
|
```
|
|
131
131
|
|
|
132
|
-
A component defined inside another component creates a new component type
|
|
132
|
+
A component defined inside another component creates a new component type on every render, so React unmounts and remounts it each time. `useCallback` keeps the same type only while its dependencies are unchanged. State manager integration (Redux/Zustand/Jotai) is the correct mechanism for sharing pagination state with a module-level component.
|
|
133
133
|
|
|
134
134
|
Source: https://dimsum.mortgagetech.ice.com/iframe.html?id=components-datatable-features-pagination--paginated-table
|
|
135
135
|
|