@careharmony/mantine-react-table-ng 0.0.0-stage → 4.0.0-beta.0
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/LICENSE +21 -0
- package/README.md +217 -3
- package/dist/index.cjs +4023 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1488 -0
- package/dist/index.esm.d.mts +1488 -0
- package/dist/index.esm.mjs +3909 -0
- package/dist/index.esm.mjs.map +1 -0
- package/locales/ar/index.cjs +97 -0
- package/locales/ar/index.d.cts +3 -0
- package/locales/ar/index.esm.d.mts +3 -0
- package/locales/ar/index.esm.mjs +95 -0
- package/locales/ar/package.json +19 -0
- package/locales/az/index.cjs +97 -0
- package/locales/az/index.d.cts +3 -0
- package/locales/az/index.esm.d.mts +3 -0
- package/locales/az/index.esm.mjs +95 -0
- package/locales/az/package.json +19 -0
- package/locales/bg/index.cjs +97 -0
- package/locales/bg/index.d.cts +3 -0
- package/locales/bg/index.esm.d.mts +3 -0
- package/locales/bg/index.esm.mjs +95 -0
- package/locales/bg/package.json +19 -0
- package/locales/cs/index.cjs +97 -0
- package/locales/cs/index.d.cts +3 -0
- package/locales/cs/index.esm.d.mts +3 -0
- package/locales/cs/index.esm.mjs +95 -0
- package/locales/cs/package.json +19 -0
- package/locales/da/index.cjs +97 -0
- package/locales/da/index.d.cts +3 -0
- package/locales/da/index.esm.d.mts +3 -0
- package/locales/da/index.esm.mjs +95 -0
- package/locales/da/package.json +19 -0
- package/locales/de/index.cjs +97 -0
- package/locales/de/index.d.cts +3 -0
- package/locales/de/index.esm.d.mts +3 -0
- package/locales/de/index.esm.mjs +95 -0
- package/locales/de/package.json +19 -0
- package/locales/el/index.cjs +97 -0
- package/locales/el/index.d.cts +3 -0
- package/locales/el/index.esm.d.mts +3 -0
- package/locales/el/index.esm.mjs +95 -0
- package/locales/el/package.json +19 -0
- package/locales/en/index.cjs +97 -0
- package/locales/en/index.d.cts +3 -0
- package/locales/en/index.esm.d.mts +3 -0
- package/locales/en/index.esm.mjs +95 -0
- package/locales/en/package.json +19 -0
- package/locales/es/index.cjs +97 -0
- package/locales/es/index.d.cts +3 -0
- package/locales/es/index.esm.d.mts +3 -0
- package/locales/es/index.esm.mjs +95 -0
- package/locales/es/package.json +19 -0
- package/locales/et/index.cjs +97 -0
- package/locales/et/index.d.cts +3 -0
- package/locales/et/index.esm.d.mts +3 -0
- package/locales/et/index.esm.mjs +95 -0
- package/locales/et/package.json +19 -0
- package/locales/fa/index.cjs +97 -0
- package/locales/fa/index.d.cts +3 -0
- package/locales/fa/index.esm.d.mts +3 -0
- package/locales/fa/index.esm.mjs +95 -0
- package/locales/fa/package.json +19 -0
- package/locales/fi/index.cjs +97 -0
- package/locales/fi/index.d.cts +3 -0
- package/locales/fi/index.esm.d.mts +3 -0
- package/locales/fi/index.esm.mjs +95 -0
- package/locales/fi/package.json +19 -0
- package/locales/fr/index.cjs +97 -0
- package/locales/fr/index.d.cts +3 -0
- package/locales/fr/index.esm.d.mts +3 -0
- package/locales/fr/index.esm.mjs +95 -0
- package/locales/fr/package.json +19 -0
- package/locales/he/index.cjs +97 -0
- package/locales/he/index.d.cts +3 -0
- package/locales/he/index.esm.d.mts +3 -0
- package/locales/he/index.esm.mjs +95 -0
- package/locales/he/package.json +19 -0
- package/locales/hr/index.cjs +97 -0
- package/locales/hr/index.d.cts +3 -0
- package/locales/hr/index.esm.d.mts +3 -0
- package/locales/hr/index.esm.mjs +95 -0
- package/locales/hr/package.json +19 -0
- package/locales/hu/index.cjs +97 -0
- package/locales/hu/index.d.cts +3 -0
- package/locales/hu/index.esm.d.mts +3 -0
- package/locales/hu/index.esm.mjs +95 -0
- package/locales/hu/package.json +19 -0
- package/locales/hy/index.cjs +97 -0
- package/locales/hy/index.d.cts +3 -0
- package/locales/hy/index.esm.d.mts +3 -0
- package/locales/hy/index.esm.mjs +95 -0
- package/locales/hy/package.json +19 -0
- package/locales/id/index.cjs +97 -0
- package/locales/id/index.d.cts +3 -0
- package/locales/id/index.esm.d.mts +3 -0
- package/locales/id/index.esm.mjs +95 -0
- package/locales/id/package.json +19 -0
- package/locales/it/index.cjs +97 -0
- package/locales/it/index.d.cts +3 -0
- package/locales/it/index.esm.d.mts +3 -0
- package/locales/it/index.esm.mjs +95 -0
- package/locales/it/package.json +19 -0
- package/locales/ja/index.cjs +97 -0
- package/locales/ja/index.d.cts +3 -0
- package/locales/ja/index.esm.d.mts +3 -0
- package/locales/ja/index.esm.mjs +95 -0
- package/locales/ja/package.json +19 -0
- package/locales/ko/index.cjs +97 -0
- package/locales/ko/index.d.cts +3 -0
- package/locales/ko/index.esm.d.mts +3 -0
- package/locales/ko/index.esm.mjs +95 -0
- package/locales/ko/package.json +19 -0
- package/locales/nl/index.cjs +97 -0
- package/locales/nl/index.d.cts +3 -0
- package/locales/nl/index.esm.d.mts +3 -0
- package/locales/nl/index.esm.mjs +95 -0
- package/locales/nl/package.json +19 -0
- package/locales/no/index.cjs +97 -0
- package/locales/no/index.d.cts +3 -0
- package/locales/no/index.esm.d.mts +3 -0
- package/locales/no/index.esm.mjs +95 -0
- package/locales/no/package.json +19 -0
- package/locales/np/index.cjs +97 -0
- package/locales/np/index.d.cts +3 -0
- package/locales/np/index.esm.d.mts +3 -0
- package/locales/np/index.esm.mjs +95 -0
- package/locales/np/package.json +19 -0
- package/locales/pl/index.cjs +97 -0
- package/locales/pl/index.d.cts +3 -0
- package/locales/pl/index.esm.d.mts +3 -0
- package/locales/pl/index.esm.mjs +95 -0
- package/locales/pl/package.json +19 -0
- package/locales/pt/index.cjs +97 -0
- package/locales/pt/index.d.cts +3 -0
- package/locales/pt/index.esm.d.mts +3 -0
- package/locales/pt/index.esm.mjs +95 -0
- package/locales/pt/package.json +19 -0
- package/locales/pt-BR/index.cjs +97 -0
- package/locales/pt-BR/index.d.cts +3 -0
- package/locales/pt-BR/index.esm.d.mts +3 -0
- package/locales/pt-BR/index.esm.mjs +95 -0
- package/locales/pt-BR/package.json +19 -0
- package/locales/ro/index.cjs +97 -0
- package/locales/ro/index.d.cts +3 -0
- package/locales/ro/index.esm.d.mts +3 -0
- package/locales/ro/index.esm.mjs +95 -0
- package/locales/ro/package.json +19 -0
- package/locales/ru/index.cjs +97 -0
- package/locales/ru/index.d.cts +3 -0
- package/locales/ru/index.esm.d.mts +3 -0
- package/locales/ru/index.esm.mjs +95 -0
- package/locales/ru/package.json +19 -0
- package/locales/sk/index.cjs +97 -0
- package/locales/sk/index.d.cts +3 -0
- package/locales/sk/index.esm.d.mts +3 -0
- package/locales/sk/index.esm.mjs +95 -0
- package/locales/sk/package.json +19 -0
- package/locales/sr-Cyrl-RS/index.cjs +97 -0
- package/locales/sr-Cyrl-RS/index.d.cts +3 -0
- package/locales/sr-Cyrl-RS/index.esm.d.mts +3 -0
- package/locales/sr-Cyrl-RS/index.esm.mjs +95 -0
- package/locales/sr-Cyrl-RS/package.json +19 -0
- package/locales/sr-Latn-RS/index.cjs +97 -0
- package/locales/sr-Latn-RS/index.d.cts +3 -0
- package/locales/sr-Latn-RS/index.esm.d.mts +3 -0
- package/locales/sr-Latn-RS/index.esm.mjs +95 -0
- package/locales/sr-Latn-RS/package.json +19 -0
- package/locales/sv/index.cjs +97 -0
- package/locales/sv/index.d.cts +3 -0
- package/locales/sv/index.esm.d.mts +3 -0
- package/locales/sv/index.esm.mjs +95 -0
- package/locales/sv/package.json +19 -0
- package/locales/th/index.cjs +97 -0
- package/locales/th/index.d.cts +3 -0
- package/locales/th/index.esm.d.mts +3 -0
- package/locales/th/index.esm.mjs +95 -0
- package/locales/th/package.json +19 -0
- package/locales/tr/index.cjs +97 -0
- package/locales/tr/index.d.cts +3 -0
- package/locales/tr/index.esm.d.mts +3 -0
- package/locales/tr/index.esm.mjs +95 -0
- package/locales/tr/package.json +19 -0
- package/locales/uk/index.cjs +97 -0
- package/locales/uk/index.d.cts +3 -0
- package/locales/uk/index.esm.d.mts +3 -0
- package/locales/uk/index.esm.mjs +95 -0
- package/locales/uk/package.json +19 -0
- package/locales/vi/index.cjs +97 -0
- package/locales/vi/index.d.cts +3 -0
- package/locales/vi/index.esm.d.mts +3 -0
- package/locales/vi/index.esm.mjs +95 -0
- package/locales/vi/package.json +19 -0
- package/locales/zh-Hans/index.cjs +97 -0
- package/locales/zh-Hans/index.d.cts +3 -0
- package/locales/zh-Hans/index.esm.d.mts +3 -0
- package/locales/zh-Hans/index.esm.mjs +95 -0
- package/locales/zh-Hans/package.json +19 -0
- package/locales/zh-Hant/index.cjs +97 -0
- package/locales/zh-Hant/index.d.cts +3 -0
- package/locales/zh-Hant/index.esm.d.mts +3 -0
- package/locales/zh-Hant/index.esm.mjs +95 -0
- package/locales/zh-Hant/package.json +19 -0
- package/package.json +184 -4
- package/src/components/MantineReactTable.tsx +38 -0
- package/src/components/body/MRT_TableBody.module.css +42 -0
- package/src/components/body/MRT_TableBody.tsx +214 -0
- package/src/components/body/MRT_TableBodyCell.module.css +107 -0
- package/src/components/body/MRT_TableBodyCell.tsx +355 -0
- package/src/components/body/MRT_TableBodyCellValue.tsx +114 -0
- package/src/components/body/MRT_TableBodyEmptyRow.tsx +89 -0
- package/src/components/body/MRT_TableBodyRow.module.css +261 -0
- package/src/components/body/MRT_TableBodyRow.tsx +278 -0
- package/src/components/body/MRT_TableBodyRowGrabHandle.tsx +59 -0
- package/src/components/body/MRT_TableBodyRowPinButton.tsx +59 -0
- package/src/components/body/MRT_TableDetailPanel.module.css +35 -0
- package/src/components/body/MRT_TableDetailPanel.tsx +132 -0
- package/src/components/buttons/MRT_ColumnPinningButtons.module.css +11 -0
- package/src/components/buttons/MRT_ColumnPinningButtons.tsx +69 -0
- package/src/components/buttons/MRT_CopyButton.module.css +27 -0
- package/src/components/buttons/MRT_CopyButton.tsx +84 -0
- package/src/components/buttons/MRT_EditActionButtons.module.css +4 -0
- package/src/components/buttons/MRT_EditActionButtons.tsx +139 -0
- package/src/components/buttons/MRT_ExpandAllButton.module.css +26 -0
- package/src/components/buttons/MRT_ExpandAllButton.tsx +84 -0
- package/src/components/buttons/MRT_ExpandButton.module.css +37 -0
- package/src/components/buttons/MRT_ExpandButton.tsx +121 -0
- package/src/components/buttons/MRT_GrabHandleButton.module.css +6 -0
- package/src/components/buttons/MRT_GrabHandleButton.tsx +65 -0
- package/src/components/buttons/MRT_RowPinButton.tsx +84 -0
- package/src/components/buttons/MRT_ShowHideColumnsButton.tsx +46 -0
- package/src/components/buttons/MRT_ToggleDensePaddingButton.tsx +66 -0
- package/src/components/buttons/MRT_ToggleFiltersButton.tsx +45 -0
- package/src/components/buttons/MRT_ToggleFullScreenButton.tsx +59 -0
- package/src/components/buttons/MRT_ToggleGlobalFilterButton.tsx +52 -0
- package/src/components/buttons/MRT_ToggleRowActionMenuButton.tsx +87 -0
- package/src/components/footer/MRT_TableFooter.module.css +17 -0
- package/src/components/footer/MRT_TableFooter.tsx +70 -0
- package/src/components/footer/MRT_TableFooterCell.module.css +59 -0
- package/src/components/footer/MRT_TableFooterCell.tsx +126 -0
- package/src/components/footer/MRT_TableFooterRow.module.css +10 -0
- package/src/components/footer/MRT_TableFooterRow.tsx +111 -0
- package/src/components/head/MRT_TableHead.module.css +32 -0
- package/src/components/head/MRT_TableHead.tsx +106 -0
- package/src/components/head/MRT_TableHeadCell.module.css +172 -0
- package/src/components/head/MRT_TableHeadCell.tsx +317 -0
- package/src/components/head/MRT_TableHeadCellFilterContainer.module.css +5 -0
- package/src/components/head/MRT_TableHeadCellFilterContainer.tsx +123 -0
- package/src/components/head/MRT_TableHeadCellFilterLabel.module.css +14 -0
- package/src/components/head/MRT_TableHeadCellFilterLabel.tsx +176 -0
- package/src/components/head/MRT_TableHeadCellGrabHandle.tsx +82 -0
- package/src/components/head/MRT_TableHeadCellResizeHandle.module.css +44 -0
- package/src/components/head/MRT_TableHeadCellResizeHandle.tsx +68 -0
- package/src/components/head/MRT_TableHeadCellSortLabel.module.css +22 -0
- package/src/components/head/MRT_TableHeadCellSortLabel.tsx +90 -0
- package/src/components/head/MRT_TableHeadRow.module.css +12 -0
- package/src/components/head/MRT_TableHeadRow.tsx +105 -0
- package/src/components/inputs/MRT_EditCellTextInput.tsx +214 -0
- package/src/components/inputs/MRT_FilterCheckBox.module.css +4 -0
- package/src/components/inputs/MRT_FilterCheckbox.tsx +80 -0
- package/src/components/inputs/MRT_FilterRangeFields.module.css +5 -0
- package/src/components/inputs/MRT_FilterRangeFields.tsx +36 -0
- package/src/components/inputs/MRT_FilterRangeSlider.module.css +6 -0
- package/src/components/inputs/MRT_FilterRangeSlider.tsx +107 -0
- package/src/components/inputs/MRT_FilterTextInput.module.css +27 -0
- package/src/components/inputs/MRT_FilterTextInput.tsx +418 -0
- package/src/components/inputs/MRT_GlobalFilterTextInput.module.css +11 -0
- package/src/components/inputs/MRT_GlobalFilterTextInput.tsx +142 -0
- package/src/components/inputs/MRT_SelectCheckbox.tsx +138 -0
- package/src/components/menus/MRT_ColumnActionMenu.module.css +7 -0
- package/src/components/menus/MRT_ColumnActionMenu.tsx +288 -0
- package/src/components/menus/MRT_FilterOptionMenu.module.css +6 -0
- package/src/components/menus/MRT_FilterOptionMenu.tsx +279 -0
- package/src/components/menus/MRT_RowActionMenu.tsx +75 -0
- package/src/components/menus/MRT_ShowHideColumnsMenu.module.css +10 -0
- package/src/components/menus/MRT_ShowHideColumnsMenu.tsx +136 -0
- package/src/components/menus/MRT_ShowHideColumnsMenuItems.module.css +35 -0
- package/src/components/menus/MRT_ShowHideColumnsMenuItems.tsx +171 -0
- package/src/components/modals/MRT_EditRowModal.tsx +98 -0
- package/src/components/table/MRT_Table.module.css +7 -0
- package/src/components/table/MRT_Table.tsx +155 -0
- package/src/components/table/MRT_TableContainer.module.css +32 -0
- package/src/components/table/MRT_TableContainer.tsx +124 -0
- package/src/components/table/MRT_TablePaper.module.css +88 -0
- package/src/components/table/MRT_TablePaper.tsx +91 -0
- package/src/components/toolbar/MRT_BottomToolbar.module.css +40 -0
- package/src/components/toolbar/MRT_BottomToolbar.tsx +99 -0
- package/src/components/toolbar/MRT_ProgressBar.module.css +10 -0
- package/src/components/toolbar/MRT_ProgressBar.tsx +54 -0
- package/src/components/toolbar/MRT_TablePagination.module.css +20 -0
- package/src/components/toolbar/MRT_TablePagination.tsx +175 -0
- package/src/components/toolbar/MRT_ToolbarAlertBanner.module.css +37 -0
- package/src/components/toolbar/MRT_ToolbarAlertBanner.tsx +169 -0
- package/src/components/toolbar/MRT_ToolbarDropZone.module.css +23 -0
- package/src/components/toolbar/MRT_ToolbarDropZone.tsx +68 -0
- package/src/components/toolbar/MRT_ToolbarInternalButtons.module.css +6 -0
- package/src/components/toolbar/MRT_ToolbarInternalButtons.tsx +74 -0
- package/src/components/toolbar/MRT_TopToolbar.module.css +24 -0
- package/src/components/toolbar/MRT_TopToolbar.tsx +127 -0
- package/src/components/toolbar/common.styles.module.css +10 -0
- package/src/fns/aggregationFns.ts +3 -0
- package/src/fns/filterFns.ts +243 -0
- package/src/fns/sortingFns.ts +34 -0
- package/src/hooks/display-columns/getMRT_RowActionsColumnDef.tsx +25 -0
- package/src/hooks/display-columns/getMRT_RowDragColumnDef.tsx +32 -0
- package/src/hooks/display-columns/getMRT_RowExpandColumnDef.tsx +94 -0
- package/src/hooks/display-columns/getMRT_RowNumbersColumnDef.tsx +32 -0
- package/src/hooks/display-columns/getMRT_RowPinningColumnDef.tsx +26 -0
- package/src/hooks/display-columns/getMRT_RowSelectColumnDef.tsx +36 -0
- package/src/hooks/display-columns/getMRT_RowSpacerColumnDef.tsx +36 -0
- package/src/hooks/useMRT_ColumnVirtualizer.ts +135 -0
- package/src/hooks/useMRT_Effects.ts +109 -0
- package/src/hooks/useMRT_RowVirtualizer.ts +101 -0
- package/src/hooks/useMRT_Rows.ts +47 -0
- package/src/hooks/useMRT_TableInstance.ts +320 -0
- package/src/hooks/useMRT_TableOptions.ts +300 -0
- package/src/hooks/useMRT_TableSnapshot.ts +134 -0
- package/src/hooks/useMRT_VirtualizerScrollElement.ts +31 -0
- package/src/hooks/useMantineReactTable.ts +23 -0
- package/src/icons.ts +108 -0
- package/src/index.ts +91 -0
- package/src/locales/ar.ts +96 -0
- package/src/locales/az.ts +96 -0
- package/src/locales/bg.ts +96 -0
- package/src/locales/cs.ts +97 -0
- package/src/locales/da.ts +96 -0
- package/src/locales/de.ts +96 -0
- package/src/locales/el.ts +96 -0
- package/src/locales/en.ts +96 -0
- package/src/locales/es.ts +96 -0
- package/src/locales/et.ts +97 -0
- package/src/locales/fa.ts +96 -0
- package/src/locales/fi.ts +97 -0
- package/src/locales/fr.ts +96 -0
- package/src/locales/he.ts +96 -0
- package/src/locales/hr.ts +96 -0
- package/src/locales/hu.ts +96 -0
- package/src/locales/hy.ts +96 -0
- package/src/locales/id.ts +97 -0
- package/src/locales/it.ts +96 -0
- package/src/locales/ja.ts +96 -0
- package/src/locales/ko.ts +96 -0
- package/src/locales/nl.ts +96 -0
- package/src/locales/no.ts +97 -0
- package/src/locales/np.ts +97 -0
- package/src/locales/pl.ts +96 -0
- package/src/locales/pt-BR.ts +96 -0
- package/src/locales/pt.ts +96 -0
- package/src/locales/ro.ts +96 -0
- package/src/locales/ru.ts +96 -0
- package/src/locales/sk.ts +97 -0
- package/src/locales/sr-Cyrl-RS.ts +96 -0
- package/src/locales/sr-Latn-RS.ts +96 -0
- package/src/locales/sv.ts +96 -0
- package/src/locales/th.ts +97 -0
- package/src/locales/tr.ts +96 -0
- package/src/locales/uk.ts +96 -0
- package/src/locales/vi.ts +96 -0
- package/src/locales/zh-Hans.ts +95 -0
- package/src/locales/zh-Hant.ts +95 -0
- package/src/types.ts +1299 -0
- package/src/typings.d.ts +1 -0
- package/src/utils/column.utils.ts +157 -0
- package/src/utils/displayColumn.utils.ts +153 -0
- package/src/utils/row.utils.ts +263 -0
- package/src/utils/snapshot.utils.ts +97 -0
- package/src/utils/style.utils.ts +32 -0
- package/src/utils/tanstack.helpers.ts +66 -0
- package/src/utils/utils.ts +15 -0
- package/src/utils/virtualization.utils.ts +85 -0
- package/styles.css +1381 -0
package/src/typings.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declare module '*.module.css';
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { type Row } from '@tanstack/react-table';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
type MRT_Column,
|
|
5
|
+
type MRT_ColumnDef,
|
|
6
|
+
type MRT_ColumnOrderState,
|
|
7
|
+
type MRT_DefinedColumnDef,
|
|
8
|
+
type MRT_DefinedTableOptions,
|
|
9
|
+
type MRT_FilterOption,
|
|
10
|
+
type MRT_RowData,
|
|
11
|
+
} from '../types';
|
|
12
|
+
|
|
13
|
+
export const getColumnId = <TData extends MRT_RowData>(
|
|
14
|
+
columnDef: MRT_ColumnDef<TData>,
|
|
15
|
+
): string =>
|
|
16
|
+
columnDef.id ?? columnDef.accessorKey?.toString?.() ?? columnDef.header;
|
|
17
|
+
|
|
18
|
+
export const getAllLeafColumnDefs = <TData extends MRT_RowData>(
|
|
19
|
+
columns: MRT_ColumnDef<TData>[],
|
|
20
|
+
): MRT_ColumnDef<TData>[] => {
|
|
21
|
+
const allLeafColumnDefs: MRT_ColumnDef<TData>[] = [];
|
|
22
|
+
const getLeafColumns = (cols: MRT_ColumnDef<TData>[]) => {
|
|
23
|
+
cols.forEach((col) => {
|
|
24
|
+
if (col.columns) {
|
|
25
|
+
getLeafColumns(col.columns);
|
|
26
|
+
} else {
|
|
27
|
+
allLeafColumnDefs.push(col);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
getLeafColumns(columns);
|
|
32
|
+
return allLeafColumnDefs;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Marks the placeholder rows that `useMRT_TableInstance` generates for the
|
|
37
|
+
* loading skeletons. The same `Symbol.for` key is written there.
|
|
38
|
+
*/
|
|
39
|
+
export const skeletonRowKey = Symbol.for('mrt-skeleton-row');
|
|
40
|
+
|
|
41
|
+
export const isSkeletonRow = (originalRow: unknown): boolean =>
|
|
42
|
+
!!(originalRow as null | Record<symbol, unknown>)?.[skeletonRowKey];
|
|
43
|
+
|
|
44
|
+
const skeletonSafeAccessorFns = new WeakSet<object>();
|
|
45
|
+
|
|
46
|
+
export const prepareColumns = <TData extends MRT_RowData>({
|
|
47
|
+
columnDefs,
|
|
48
|
+
tableOptions,
|
|
49
|
+
}: {
|
|
50
|
+
columnDefs: MRT_ColumnDef<TData>[];
|
|
51
|
+
tableOptions: MRT_DefinedTableOptions<TData>;
|
|
52
|
+
}): MRT_DefinedColumnDef<TData>[] => {
|
|
53
|
+
const {
|
|
54
|
+
aggregationFns = {},
|
|
55
|
+
defaultDisplayColumn,
|
|
56
|
+
filterFns = {},
|
|
57
|
+
sortingFns = {},
|
|
58
|
+
state: { columnFilterFns = {} } = {},
|
|
59
|
+
} = tableOptions;
|
|
60
|
+
return columnDefs.map((columnDef) => {
|
|
61
|
+
//assign columnId
|
|
62
|
+
if (!columnDef.id) columnDef.id = getColumnId(columnDef);
|
|
63
|
+
//assign columnDefType
|
|
64
|
+
if (!columnDef.columnDefType) columnDef.columnDefType = 'data';
|
|
65
|
+
if (columnDef.columns?.length) {
|
|
66
|
+
columnDef.columnDefType = 'group';
|
|
67
|
+
//recursively prepare columns if this is a group column
|
|
68
|
+
columnDef.columns = prepareColumns({
|
|
69
|
+
columnDefs: columnDef.columns,
|
|
70
|
+
tableOptions,
|
|
71
|
+
});
|
|
72
|
+
} else if (columnDef.columnDefType === 'data') {
|
|
73
|
+
//assign aggregationFns if multiple aggregationFns are provided
|
|
74
|
+
if (Array.isArray(columnDef.aggregationFn)) {
|
|
75
|
+
const aggFns = columnDef.aggregationFn as string[];
|
|
76
|
+
columnDef.aggregationFn = (
|
|
77
|
+
columnId: string,
|
|
78
|
+
leafRows: Row<TData>[],
|
|
79
|
+
childRows: Row<TData>[],
|
|
80
|
+
) =>
|
|
81
|
+
aggFns.map((fn) =>
|
|
82
|
+
aggregationFns[fn]?.(columnId, leafRows, childRows),
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
//skeleton rows hold no data, so a custom accessorFn must not read them
|
|
87
|
+
const { accessorFn } = columnDef;
|
|
88
|
+
if (accessorFn && !skeletonSafeAccessorFns.has(accessorFn)) {
|
|
89
|
+
columnDef.accessorFn = ((originalRow: TData, index: number) =>
|
|
90
|
+
isSkeletonRow(originalRow)
|
|
91
|
+
? null
|
|
92
|
+
: (accessorFn as (originalRow: TData, index: number) => any)(
|
|
93
|
+
originalRow,
|
|
94
|
+
index,
|
|
95
|
+
)) as MRT_ColumnDef<TData>['accessorFn'];
|
|
96
|
+
skeletonSafeAccessorFns.add(columnDef.accessorFn as object);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
//assign filterFns
|
|
100
|
+
//a column added after the first render has no `columnFilterFns` state yet
|
|
101
|
+
const filterMode: MRT_FilterOption | undefined =
|
|
102
|
+
columnFilterFns[columnDef.id] ??
|
|
103
|
+
(columnDef as MRT_DefinedColumnDef<TData>)._filterFn ??
|
|
104
|
+
(columnDef.filterFn instanceof Function
|
|
105
|
+
? undefined
|
|
106
|
+
: ((columnDef.filterFn as MRT_FilterOption | undefined) ??
|
|
107
|
+
getDefaultColumnFilterFn(columnDef)));
|
|
108
|
+
if (filterMode !== undefined) {
|
|
109
|
+
if (Object.keys(filterFns).includes(filterMode)) {
|
|
110
|
+
columnDef.filterFn = filterFns[filterMode] ?? filterFns.fuzzy;
|
|
111
|
+
}
|
|
112
|
+
//custom filter modes that are not in `filterFns` still need to be tracked
|
|
113
|
+
(columnDef as MRT_DefinedColumnDef<TData>)._filterFn = filterMode;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
//assign sortingFns
|
|
117
|
+
if (Object.keys(sortingFns).includes(columnDef.sortingFn as string)) {
|
|
118
|
+
// @ts-ignore
|
|
119
|
+
columnDef.sortingFn = sortingFns[columnDef.sortingFn];
|
|
120
|
+
}
|
|
121
|
+
} else if (columnDef.columnDefType === 'display') {
|
|
122
|
+
columnDef = {
|
|
123
|
+
...(defaultDisplayColumn as MRT_ColumnDef<TData>),
|
|
124
|
+
...columnDef,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return columnDef;
|
|
128
|
+
}) as MRT_DefinedColumnDef<TData>[];
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export const reorderColumn = <TData extends MRT_RowData>(
|
|
132
|
+
draggedColumn: MRT_Column<TData>,
|
|
133
|
+
targetColumn: MRT_Column<TData>,
|
|
134
|
+
columnOrder: MRT_ColumnOrderState,
|
|
135
|
+
): MRT_ColumnOrderState => {
|
|
136
|
+
if (draggedColumn.getCanPin()) {
|
|
137
|
+
draggedColumn.pin(targetColumn.getIsPinned());
|
|
138
|
+
}
|
|
139
|
+
const newColumnOrder = [...columnOrder];
|
|
140
|
+
newColumnOrder.splice(
|
|
141
|
+
newColumnOrder.indexOf(targetColumn.id),
|
|
142
|
+
0,
|
|
143
|
+
newColumnOrder.splice(newColumnOrder.indexOf(draggedColumn.id), 1)[0],
|
|
144
|
+
);
|
|
145
|
+
return newColumnOrder;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export const getDefaultColumnFilterFn = <TData extends MRT_RowData>(
|
|
149
|
+
columnDef: MRT_ColumnDef<TData>,
|
|
150
|
+
): MRT_FilterOption => {
|
|
151
|
+
const { filterVariant } = columnDef;
|
|
152
|
+
if (filterVariant === 'multi-select') return 'arrIncludesSome';
|
|
153
|
+
if (filterVariant?.includes('range')) return 'betweenInclusive';
|
|
154
|
+
if (['checkbox', 'date', 'select'].includes(filterVariant || ''))
|
|
155
|
+
return 'equals';
|
|
156
|
+
return 'fuzzy';
|
|
157
|
+
};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type MRT_ColumnDef,
|
|
3
|
+
type MRT_DefinedTableOptions,
|
|
4
|
+
type MRT_DisplayColumnIds,
|
|
5
|
+
type MRT_Localization,
|
|
6
|
+
type MRT_RowData,
|
|
7
|
+
type MRT_StatefulTableOptions,
|
|
8
|
+
} from '../types';
|
|
9
|
+
import { getAllLeafColumnDefs, getColumnId } from './column.utils';
|
|
10
|
+
|
|
11
|
+
export function defaultDisplayColumnProps<TData extends MRT_RowData>({
|
|
12
|
+
header,
|
|
13
|
+
id,
|
|
14
|
+
size,
|
|
15
|
+
tableOptions,
|
|
16
|
+
}: {
|
|
17
|
+
header?: keyof MRT_Localization;
|
|
18
|
+
id: MRT_DisplayColumnIds;
|
|
19
|
+
size: number;
|
|
20
|
+
tableOptions: MRT_DefinedTableOptions<TData>;
|
|
21
|
+
}): MRT_ColumnDef<TData> {
|
|
22
|
+
const { defaultDisplayColumn, displayColumnDefOptions, localization } =
|
|
23
|
+
tableOptions;
|
|
24
|
+
return {
|
|
25
|
+
...defaultDisplayColumn,
|
|
26
|
+
header: header ? localization[header]! : '',
|
|
27
|
+
size,
|
|
28
|
+
...displayColumnDefOptions?.[id],
|
|
29
|
+
id,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const showRowPinningColumn = <TData extends MRT_RowData>(
|
|
34
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
35
|
+
): boolean => {
|
|
36
|
+
const { enableRowPinning, rowPinningDisplayMode } = tableOptions;
|
|
37
|
+
return !!(enableRowPinning && !rowPinningDisplayMode?.startsWith('select'));
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export const showRowDragColumn = <TData extends MRT_RowData>(
|
|
41
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
42
|
+
): boolean => {
|
|
43
|
+
const { enableRowDragging, enableRowOrdering } = tableOptions;
|
|
44
|
+
return !!(enableRowDragging || enableRowOrdering);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export const showRowExpandColumn = <TData extends MRT_RowData>(
|
|
48
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
49
|
+
): boolean => {
|
|
50
|
+
const {
|
|
51
|
+
enableExpanding,
|
|
52
|
+
enableGrouping,
|
|
53
|
+
renderDetailPanel,
|
|
54
|
+
state: { grouping },
|
|
55
|
+
} = tableOptions;
|
|
56
|
+
return !!(
|
|
57
|
+
enableExpanding ||
|
|
58
|
+
(enableGrouping && grouping?.length) ||
|
|
59
|
+
renderDetailPanel
|
|
60
|
+
);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const showRowActionsColumn = <TData extends MRT_RowData>(
|
|
64
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
65
|
+
): boolean => {
|
|
66
|
+
const {
|
|
67
|
+
createDisplayMode,
|
|
68
|
+
editDisplayMode,
|
|
69
|
+
enableEditing,
|
|
70
|
+
enableRowActions,
|
|
71
|
+
state: { creatingRow },
|
|
72
|
+
} = tableOptions;
|
|
73
|
+
return !!(
|
|
74
|
+
enableRowActions ||
|
|
75
|
+
(creatingRow && createDisplayMode === 'row') ||
|
|
76
|
+
(enableEditing && ['modal', 'row'].includes(editDisplayMode ?? ''))
|
|
77
|
+
);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const showRowSelectionColumn = <TData extends MRT_RowData>(
|
|
81
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
82
|
+
): boolean => !!tableOptions.enableRowSelection;
|
|
83
|
+
|
|
84
|
+
export const showRowNumbersColumn = <TData extends MRT_RowData>(
|
|
85
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
86
|
+
): boolean => !!tableOptions.enableRowNumbers;
|
|
87
|
+
|
|
88
|
+
export const showRowSpacerColumn = <TData extends MRT_RowData>(
|
|
89
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
90
|
+
): boolean => tableOptions.layoutMode === 'grid-no-grow';
|
|
91
|
+
|
|
92
|
+
export const getLeadingDisplayColumnIds = <TData extends MRT_RowData>(
|
|
93
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
94
|
+
) =>
|
|
95
|
+
[
|
|
96
|
+
showRowPinningColumn(tableOptions) && 'mrt-row-pin',
|
|
97
|
+
showRowDragColumn(tableOptions) && 'mrt-row-drag',
|
|
98
|
+
tableOptions.positionActionsColumn === 'first' &&
|
|
99
|
+
showRowActionsColumn(tableOptions) &&
|
|
100
|
+
'mrt-row-actions',
|
|
101
|
+
tableOptions.positionExpandColumn === 'first' &&
|
|
102
|
+
showRowExpandColumn(tableOptions) &&
|
|
103
|
+
'mrt-row-expand',
|
|
104
|
+
showRowSelectionColumn(tableOptions) && 'mrt-row-select',
|
|
105
|
+
showRowNumbersColumn(tableOptions) && 'mrt-row-numbers',
|
|
106
|
+
].filter(Boolean) as MRT_DisplayColumnIds[];
|
|
107
|
+
|
|
108
|
+
export const getTrailingDisplayColumnIds = <TData extends MRT_RowData>(
|
|
109
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
110
|
+
) =>
|
|
111
|
+
[
|
|
112
|
+
tableOptions.positionActionsColumn === 'last' &&
|
|
113
|
+
showRowActionsColumn(tableOptions) &&
|
|
114
|
+
'mrt-row-actions',
|
|
115
|
+
tableOptions.positionExpandColumn === 'last' &&
|
|
116
|
+
showRowExpandColumn(tableOptions) &&
|
|
117
|
+
'mrt-row-expand',
|
|
118
|
+
showRowSpacerColumn(tableOptions) && 'mrt-row-spacer',
|
|
119
|
+
].filter(Boolean) as MRT_DisplayColumnIds[];
|
|
120
|
+
|
|
121
|
+
export const getDefaultColumnOrderIds = <TData extends MRT_RowData>(
|
|
122
|
+
tableOptions: MRT_StatefulTableOptions<TData>,
|
|
123
|
+
reset = false,
|
|
124
|
+
) => {
|
|
125
|
+
const {
|
|
126
|
+
state: { columnOrder: currentColumnOrderIds = [] },
|
|
127
|
+
} = tableOptions;
|
|
128
|
+
|
|
129
|
+
const leadingDisplayColIds: string[] =
|
|
130
|
+
getLeadingDisplayColumnIds(tableOptions);
|
|
131
|
+
const trailingDisplayColIds: string[] =
|
|
132
|
+
getTrailingDisplayColumnIds(tableOptions);
|
|
133
|
+
|
|
134
|
+
const defaultColumnDefIds = getAllLeafColumnDefs(tableOptions.columns).map(
|
|
135
|
+
(columnDef) => getColumnId(columnDef),
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
let allLeafColumnDefIds = reset
|
|
139
|
+
? defaultColumnDefIds
|
|
140
|
+
: Array.from(new Set([...currentColumnOrderIds, ...defaultColumnDefIds]));
|
|
141
|
+
|
|
142
|
+
allLeafColumnDefIds = allLeafColumnDefIds.filter(
|
|
143
|
+
(colId) =>
|
|
144
|
+
!leadingDisplayColIds.includes(colId) &&
|
|
145
|
+
!trailingDisplayColIds.includes(colId),
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
return [
|
|
149
|
+
...leadingDisplayColIds,
|
|
150
|
+
...allLeafColumnDefIds,
|
|
151
|
+
...trailingDisplayColIds,
|
|
152
|
+
];
|
|
153
|
+
};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { type ChangeEvent, type MouseEvent } from 'react';
|
|
2
|
+
|
|
3
|
+
import { rankGlobalFuzzy } from '../fns/sortingFns';
|
|
4
|
+
import {
|
|
5
|
+
type MRT_Row,
|
|
6
|
+
type MRT_RowData,
|
|
7
|
+
type MRT_TableInstance,
|
|
8
|
+
} from '../types';
|
|
9
|
+
import { parseFromValuesOrFunc } from './utils';
|
|
10
|
+
|
|
11
|
+
export const getMRT_Rows = <TData extends MRT_RowData>(
|
|
12
|
+
table: MRT_TableInstance<TData>,
|
|
13
|
+
all?: boolean,
|
|
14
|
+
): MRT_Row<TData>[] => {
|
|
15
|
+
const {
|
|
16
|
+
getCenterRows,
|
|
17
|
+
getPrePaginationRowModel,
|
|
18
|
+
getRowModel,
|
|
19
|
+
getState,
|
|
20
|
+
getTopRows,
|
|
21
|
+
options: {
|
|
22
|
+
createDisplayMode,
|
|
23
|
+
enablePagination,
|
|
24
|
+
enableRowPinning,
|
|
25
|
+
manualPagination,
|
|
26
|
+
positionCreatingRow,
|
|
27
|
+
rowPinningDisplayMode,
|
|
28
|
+
},
|
|
29
|
+
} = table;
|
|
30
|
+
const { creatingRow, pagination } = getState();
|
|
31
|
+
|
|
32
|
+
const isRankingRows = getIsRankingRows(table);
|
|
33
|
+
|
|
34
|
+
let rows: MRT_Row<TData>[] = [];
|
|
35
|
+
if (!isRankingRows) {
|
|
36
|
+
rows =
|
|
37
|
+
!enableRowPinning || rowPinningDisplayMode?.includes('sticky')
|
|
38
|
+
? all
|
|
39
|
+
? getPrePaginationRowModel().rows
|
|
40
|
+
: getRowModel().rows
|
|
41
|
+
: getCenterRows();
|
|
42
|
+
} else {
|
|
43
|
+
// fuzzy ranking adjustments
|
|
44
|
+
rows = getPrePaginationRowModel().rows.sort((a, b) =>
|
|
45
|
+
rankGlobalFuzzy(a, b),
|
|
46
|
+
);
|
|
47
|
+
if (enablePagination && !manualPagination && !all) {
|
|
48
|
+
const start = pagination.pageIndex * pagination.pageSize;
|
|
49
|
+
rows = rows.slice(start, start + pagination.pageSize);
|
|
50
|
+
}
|
|
51
|
+
if (enableRowPinning && !rowPinningDisplayMode?.includes('sticky')) {
|
|
52
|
+
// "re-center-ize" the rows (no top or bottom pinned rows unless sticky)
|
|
53
|
+
rows = rows.filter((row) => !row.getIsPinned());
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// row pinning adjustments
|
|
57
|
+
if (enableRowPinning && rowPinningDisplayMode?.includes('sticky')) {
|
|
58
|
+
const centerPinnedRowIds = rows
|
|
59
|
+
.filter((row) => row.getIsPinned())
|
|
60
|
+
.map((r) => r.id);
|
|
61
|
+
|
|
62
|
+
rows = [
|
|
63
|
+
...getTopRows().filter((row) => !centerPinnedRowIds.includes(row.id)),
|
|
64
|
+
...rows,
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
// blank inserted creating row adjustments
|
|
68
|
+
if (
|
|
69
|
+
positionCreatingRow !== undefined &&
|
|
70
|
+
creatingRow &&
|
|
71
|
+
createDisplayMode === 'row'
|
|
72
|
+
) {
|
|
73
|
+
const creatingRowIndex = !isNaN(+positionCreatingRow)
|
|
74
|
+
? +positionCreatingRow
|
|
75
|
+
: positionCreatingRow === 'top'
|
|
76
|
+
? 0
|
|
77
|
+
: rows.length;
|
|
78
|
+
rows = [
|
|
79
|
+
...rows.slice(0, creatingRowIndex),
|
|
80
|
+
creatingRow,
|
|
81
|
+
...rows.slice(creatingRowIndex),
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return rows;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const getCanRankRows = <TData extends MRT_RowData>(
|
|
89
|
+
table: MRT_TableInstance<TData>,
|
|
90
|
+
) => {
|
|
91
|
+
const {
|
|
92
|
+
getState,
|
|
93
|
+
options: {
|
|
94
|
+
enableGlobalFilterRankedResults,
|
|
95
|
+
manualExpanding,
|
|
96
|
+
manualFiltering,
|
|
97
|
+
manualGrouping,
|
|
98
|
+
manualSorting,
|
|
99
|
+
},
|
|
100
|
+
} = table;
|
|
101
|
+
const { expanded, globalFilterFn } = getState();
|
|
102
|
+
|
|
103
|
+
return (
|
|
104
|
+
!manualExpanding &&
|
|
105
|
+
!manualFiltering &&
|
|
106
|
+
!manualGrouping &&
|
|
107
|
+
!manualSorting &&
|
|
108
|
+
enableGlobalFilterRankedResults &&
|
|
109
|
+
globalFilterFn === 'fuzzy' &&
|
|
110
|
+
expanded !== true &&
|
|
111
|
+
!Object.values(expanded).some(Boolean)
|
|
112
|
+
);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export const getIsRankingRows = <TData extends MRT_RowData>(
|
|
116
|
+
table: MRT_TableInstance<TData>,
|
|
117
|
+
) => {
|
|
118
|
+
const { globalFilter, sorting } = table.getState();
|
|
119
|
+
|
|
120
|
+
return (
|
|
121
|
+
getCanRankRows(table) &&
|
|
122
|
+
globalFilter &&
|
|
123
|
+
!Object.values(sorting).some(Boolean)
|
|
124
|
+
);
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export const getIsRowSelected = <TData extends MRT_RowData>({
|
|
128
|
+
row,
|
|
129
|
+
table,
|
|
130
|
+
}: {
|
|
131
|
+
row: MRT_Row<TData>;
|
|
132
|
+
table: MRT_TableInstance<TData>;
|
|
133
|
+
}) => {
|
|
134
|
+
const {
|
|
135
|
+
options: { enableRowSelection },
|
|
136
|
+
} = table;
|
|
137
|
+
|
|
138
|
+
return (
|
|
139
|
+
row.getIsSelected() ||
|
|
140
|
+
(parseFromValuesOrFunc(enableRowSelection, row) &&
|
|
141
|
+
row.getCanSelectSubRows() &&
|
|
142
|
+
row.getIsAllSubRowsSelected())
|
|
143
|
+
);
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
export const getMRT_RowSelectionHandler =
|
|
147
|
+
<TData extends MRT_RowData>({
|
|
148
|
+
renderedRowIndex = 0,
|
|
149
|
+
row,
|
|
150
|
+
table,
|
|
151
|
+
}: {
|
|
152
|
+
renderedRowIndex?: number;
|
|
153
|
+
row: MRT_Row<TData>;
|
|
154
|
+
table: MRT_TableInstance<TData>;
|
|
155
|
+
}) =>
|
|
156
|
+
(
|
|
157
|
+
event: ChangeEvent<HTMLInputElement> | MouseEvent<HTMLTableRowElement>,
|
|
158
|
+
value?: boolean,
|
|
159
|
+
) => {
|
|
160
|
+
const {
|
|
161
|
+
getState,
|
|
162
|
+
options: {
|
|
163
|
+
enableBatchRowSelection,
|
|
164
|
+
enableMultiRowSelection,
|
|
165
|
+
enableRowPinning,
|
|
166
|
+
manualPagination,
|
|
167
|
+
rowPinningDisplayMode,
|
|
168
|
+
},
|
|
169
|
+
refs: { lastSelectedRowId: lastSelectedRowId },
|
|
170
|
+
} = table;
|
|
171
|
+
const {
|
|
172
|
+
pagination: { pageIndex, pageSize },
|
|
173
|
+
} = getState();
|
|
174
|
+
|
|
175
|
+
const paginationOffset = manualPagination ? 0 : pageSize * pageIndex;
|
|
176
|
+
|
|
177
|
+
const wasCurrentRowChecked = getIsRowSelected({ row, table });
|
|
178
|
+
|
|
179
|
+
// toggle selection of this row
|
|
180
|
+
row.toggleSelected(value ?? !wasCurrentRowChecked);
|
|
181
|
+
|
|
182
|
+
const changedRowIds = new Set<string>([row.id]);
|
|
183
|
+
|
|
184
|
+
// if shift key is pressed, select all rows between last selected and this one
|
|
185
|
+
if (
|
|
186
|
+
enableBatchRowSelection &&
|
|
187
|
+
enableMultiRowSelection &&
|
|
188
|
+
(event as any).nativeEvent.shiftKey &&
|
|
189
|
+
lastSelectedRowId.current !== null
|
|
190
|
+
) {
|
|
191
|
+
const rows = getMRT_Rows(table, true);
|
|
192
|
+
|
|
193
|
+
const lastIndex = rows.findIndex(
|
|
194
|
+
(r) => r.id === lastSelectedRowId.current,
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
if (lastIndex !== -1) {
|
|
198
|
+
const isLastIndexChecked = getIsRowSelected({
|
|
199
|
+
row: rows?.[lastIndex],
|
|
200
|
+
table,
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
const currentIndex = renderedRowIndex + paginationOffset;
|
|
204
|
+
const [start, end] =
|
|
205
|
+
lastIndex < currentIndex
|
|
206
|
+
? [lastIndex, currentIndex]
|
|
207
|
+
: [currentIndex, lastIndex];
|
|
208
|
+
|
|
209
|
+
// toggle selection of all rows between last selected and this one
|
|
210
|
+
// but only if the last selected row is not the same as the current one
|
|
211
|
+
if (wasCurrentRowChecked !== isLastIndexChecked) {
|
|
212
|
+
for (let i = start; i <= end; i++) {
|
|
213
|
+
rows[i].toggleSelected(!wasCurrentRowChecked);
|
|
214
|
+
changedRowIds.add(rows[i].id);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// record the last selected row id
|
|
221
|
+
lastSelectedRowId.current = row.id;
|
|
222
|
+
|
|
223
|
+
// if all sub rows were selected, unselect them
|
|
224
|
+
if (row.getCanSelectSubRows() && row.getIsAllSubRowsSelected()) {
|
|
225
|
+
row.subRows?.forEach((r) => r.toggleSelected(false));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (enableRowPinning && rowPinningDisplayMode?.includes('select')) {
|
|
229
|
+
changedRowIds.forEach((rowId) => {
|
|
230
|
+
const rowToTogglePin = table.getRow(rowId);
|
|
231
|
+
rowToTogglePin.pin(
|
|
232
|
+
!wasCurrentRowChecked //was not previously pinned or selected
|
|
233
|
+
? rowPinningDisplayMode?.includes('bottom')
|
|
234
|
+
? 'bottom'
|
|
235
|
+
: 'top'
|
|
236
|
+
: false,
|
|
237
|
+
);
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
export const getMRT_SelectAllHandler =
|
|
243
|
+
<TData extends MRT_RowData>({ table }: { table: MRT_TableInstance<TData> }) =>
|
|
244
|
+
(
|
|
245
|
+
event: ChangeEvent<HTMLInputElement> | MouseEvent<HTMLButtonElement>,
|
|
246
|
+
value?: boolean,
|
|
247
|
+
forceAll?: boolean,
|
|
248
|
+
) => {
|
|
249
|
+
const {
|
|
250
|
+
options: { enableRowPinning, rowPinningDisplayMode, selectAllMode },
|
|
251
|
+
refs: { lastSelectedRowId },
|
|
252
|
+
} = table;
|
|
253
|
+
|
|
254
|
+
if (selectAllMode === 'all' || forceAll) {
|
|
255
|
+
table.toggleAllRowsSelected(value ?? (event as any).target.checked);
|
|
256
|
+
} else {
|
|
257
|
+
table.toggleAllPageRowsSelected(value ?? (event as any).target.checked);
|
|
258
|
+
}
|
|
259
|
+
if (enableRowPinning && rowPinningDisplayMode?.includes('select')) {
|
|
260
|
+
table.setRowPinning({ bottom: [], top: [] });
|
|
261
|
+
}
|
|
262
|
+
lastSelectedRowId.current = null;
|
|
263
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type MRT_Cell,
|
|
3
|
+
type MRT_Column,
|
|
4
|
+
type MRT_Header,
|
|
5
|
+
type MRT_Row,
|
|
6
|
+
type MRT_RowData,
|
|
7
|
+
type MRT_TableInstance,
|
|
8
|
+
} from '../types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* TanStack Table keeps one table, row, cell, column and header instance for as
|
|
12
|
+
* long as the data and column definitions stay the same. The React Compiler
|
|
13
|
+
* caches a call such as `row.getIsSelected()` on the identity of `row`, so a
|
|
14
|
+
* compiled consumer component would keep the first result forever.
|
|
15
|
+
*
|
|
16
|
+
* A view is a `Proxy` around the TanStack instance. Reads, writes, method
|
|
17
|
+
* calls and object spreads all reach the live instance, and only the identity
|
|
18
|
+
* is new. `useMantineReactTable` returns a new table view whenever table state
|
|
19
|
+
* or options change, and row, cell, column and header views are cached per
|
|
20
|
+
* table view, so they change exactly when the table does.
|
|
21
|
+
*/
|
|
22
|
+
const viewsByTable = new WeakMap<object, WeakMap<object, object>>();
|
|
23
|
+
const targetsByView = new WeakMap<object, object>();
|
|
24
|
+
|
|
25
|
+
/** Returns the TanStack instance behind a view, or the object itself. */
|
|
26
|
+
export const getMRT_ViewTarget = <T extends object>(viewOrTarget: T): T =>
|
|
27
|
+
(targetsByView.get(viewOrTarget) as T | undefined) ?? viewOrTarget;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Creates a view of a TanStack instance.
|
|
31
|
+
* @param overrides - properties the view answers itself instead of the instance
|
|
32
|
+
*/
|
|
33
|
+
export const createMRT_View = <T extends object>(
|
|
34
|
+
viewOrTarget: T,
|
|
35
|
+
overrides?: Partial<T>,
|
|
36
|
+
): T => {
|
|
37
|
+
const target = getMRT_ViewTarget(viewOrTarget);
|
|
38
|
+
const view = new Proxy(
|
|
39
|
+
target,
|
|
40
|
+
overrides
|
|
41
|
+
? {
|
|
42
|
+
get: (instance, key) =>
|
|
43
|
+
key in overrides
|
|
44
|
+
? overrides[key as keyof T]
|
|
45
|
+
: instance[key as keyof T],
|
|
46
|
+
}
|
|
47
|
+
: {},
|
|
48
|
+
);
|
|
49
|
+
targetsByView.set(view, target);
|
|
50
|
+
return view;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const getView = <T extends object>(
|
|
54
|
+
table: object,
|
|
55
|
+
viewOrTarget: T,
|
|
56
|
+
getOverrides?: (target: T) => Partial<T>,
|
|
57
|
+
): T => {
|
|
58
|
+
const target = getMRT_ViewTarget(viewOrTarget);
|
|
59
|
+
let views = viewsByTable.get(table);
|
|
60
|
+
if (!views) {
|
|
61
|
+
views = new WeakMap();
|
|
62
|
+
viewsByTable.set(table, views);
|
|
63
|
+
}
|
|
64
|
+
let view = views.get(target) as T | undefined;
|
|
65
|
+
if (!view) {
|
|
66
|
+
view = createMRT_View(target, getOverrides?.(target));
|
|
67
|
+
views.set(target, view);
|
|
68
|
+
}
|
|
69
|
+
return view;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const getMRT_RowView = <TData extends MRT_RowData>(
|
|
73
|
+
table: MRT_TableInstance<TData>,
|
|
74
|
+
row: MRT_Row<TData>,
|
|
75
|
+
): MRT_Row<TData> => getView(table, row);
|
|
76
|
+
|
|
77
|
+
export const getMRT_ColumnView = <TData extends MRT_RowData, TValue = unknown>(
|
|
78
|
+
table: MRT_TableInstance<TData>,
|
|
79
|
+
column: MRT_Column<TData, TValue>,
|
|
80
|
+
): MRT_Column<TData, TValue> => getView(table, column);
|
|
81
|
+
|
|
82
|
+
export const getMRT_CellView = <TData extends MRT_RowData, TValue = unknown>(
|
|
83
|
+
table: MRT_TableInstance<TData>,
|
|
84
|
+
cell: MRT_Cell<TData, TValue>,
|
|
85
|
+
): MRT_Cell<TData, TValue> =>
|
|
86
|
+
getView(table, cell, (target) => ({
|
|
87
|
+
column: getMRT_ColumnView(table, target.column),
|
|
88
|
+
row: getMRT_RowView(table, target.row),
|
|
89
|
+
}));
|
|
90
|
+
|
|
91
|
+
export const getMRT_HeaderView = <TData extends MRT_RowData>(
|
|
92
|
+
table: MRT_TableInstance<TData>,
|
|
93
|
+
header: MRT_Header<TData>,
|
|
94
|
+
): MRT_Header<TData> =>
|
|
95
|
+
getView(table, header, (target) => ({
|
|
96
|
+
column: getMRT_ColumnView(table, target.column),
|
|
97
|
+
}));
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type MantineTheme } from '@mantine/core';
|
|
2
|
+
|
|
3
|
+
import { type MantineShade } from '../types';
|
|
4
|
+
|
|
5
|
+
export const parseCSSVarId = (id: string) => id.replace(/[^a-zA-Z0-9]/g, '_');
|
|
6
|
+
|
|
7
|
+
export const getPrimaryShade = (theme: MantineTheme): number =>
|
|
8
|
+
typeof theme.primaryShade === 'number'
|
|
9
|
+
? theme.primaryShade
|
|
10
|
+
: (theme.primaryShade?.dark ?? 7);
|
|
11
|
+
|
|
12
|
+
export const getPrimaryColor = (
|
|
13
|
+
theme: MantineTheme,
|
|
14
|
+
shade?: MantineShade,
|
|
15
|
+
): string => theme.colors[theme.primaryColor][shade ?? getPrimaryShade(theme)];
|
|
16
|
+
|
|
17
|
+
export function dataVariable(
|
|
18
|
+
name: string,
|
|
19
|
+
value: boolean | number | string | undefined,
|
|
20
|
+
) {
|
|
21
|
+
const key = `data-${name}`;
|
|
22
|
+
switch (typeof value) {
|
|
23
|
+
case 'boolean':
|
|
24
|
+
return value ? { [key]: '' } : null;
|
|
25
|
+
case 'number':
|
|
26
|
+
return { [key]: `${value}` };
|
|
27
|
+
case 'string':
|
|
28
|
+
return { [key]: value };
|
|
29
|
+
default:
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|