material-react-table 2.6.1 → 2.8.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.
Files changed (104) hide show
  1. package/dist/index.d.ts +390 -260
  2. package/dist/index.esm.js +1977 -1921
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.js +2372 -2318
  5. package/dist/index.js.map +1 -1
  6. package/package.json +20 -20
  7. package/src/{MaterialReactTable.tsx → components/MaterialReactTable.tsx} +3 -3
  8. package/src/{body → components/body}/MRT_TableBody.tsx +6 -28
  9. package/src/{body → components/body}/MRT_TableBodyCell.tsx +6 -23
  10. package/src/{body → components/body}/MRT_TableBodyCellValue.tsx +2 -2
  11. package/src/{body → components/body}/MRT_TableBodyRow.tsx +7 -5
  12. package/src/{body → components/body}/MRT_TableBodyRowGrabHandle.tsx +3 -3
  13. package/src/{body → components/body}/MRT_TableBodyRowPinButton.tsx +3 -3
  14. package/src/{body → components/body}/MRT_TableDetailPanel.tsx +6 -6
  15. package/src/{buttons → components/buttons}/MRT_ColumnPinningButtons.tsx +2 -2
  16. package/src/{buttons → components/buttons}/MRT_CopyButton.tsx +4 -5
  17. package/src/{buttons → components/buttons}/MRT_EditActionButtons.tsx +2 -2
  18. package/src/{buttons → components/buttons}/MRT_ExpandAllButton.tsx +4 -4
  19. package/src/{buttons → components/buttons}/MRT_ExpandButton.tsx +10 -4
  20. package/src/{buttons → components/buttons}/MRT_GrabHandleButton.tsx +4 -5
  21. package/src/{buttons → components/buttons}/MRT_RowPinButton.tsx +4 -4
  22. package/src/{buttons → components/buttons}/MRT_ShowHideColumnsButton.tsx +1 -1
  23. package/src/{buttons → components/buttons}/MRT_ToggleDensePaddingButton.tsx +1 -1
  24. package/src/{buttons → components/buttons}/MRT_ToggleFiltersButton.tsx +1 -1
  25. package/src/{buttons → components/buttons}/MRT_ToggleFullScreenButton.tsx +1 -1
  26. package/src/{buttons → components/buttons}/MRT_ToggleGlobalFilterButton.tsx +1 -1
  27. package/src/{buttons → components/buttons}/MRT_ToggleRowActionMenuButton.tsx +9 -9
  28. package/src/{footer → components/footer}/MRT_TableFooter.tsx +2 -2
  29. package/src/{footer → components/footer}/MRT_TableFooterCell.tsx +3 -3
  30. package/src/{footer → components/footer}/MRT_TableFooterRow.tsx +3 -3
  31. package/src/{head → components/head}/MRT_TableHead.tsx +3 -3
  32. package/src/{head → components/head}/MRT_TableHeadCell.tsx +3 -3
  33. package/src/{head → components/head}/MRT_TableHeadCellColumnActionsButton.tsx +5 -6
  34. package/src/{head → components/head}/MRT_TableHeadCellFilterContainer.tsx +5 -5
  35. package/src/{head → components/head}/MRT_TableHeadCellFilterLabel.tsx +2 -2
  36. package/src/{head → components/head}/MRT_TableHeadCellGrabHandle.tsx +4 -3
  37. package/src/{head → components/head}/MRT_TableHeadCellResizeHandle.tsx +2 -2
  38. package/src/{head → components/head}/MRT_TableHeadCellSortLabel.tsx +2 -2
  39. package/src/{head → components/head}/MRT_TableHeadRow.tsx +3 -3
  40. package/src/{inputs → components/inputs}/MRT_EditCellTextField.tsx +12 -4
  41. package/src/{inputs → components/inputs}/MRT_FilterCheckbox.tsx +4 -4
  42. package/src/{inputs → components/inputs}/MRT_FilterRangeFields.tsx +2 -2
  43. package/src/{inputs → components/inputs}/MRT_FilterRangeSlider.tsx +2 -2
  44. package/src/{inputs → components/inputs}/MRT_FilterTextField.tsx +3 -3
  45. package/src/{inputs → components/inputs}/MRT_GlobalFilterTextField.tsx +2 -2
  46. package/src/{inputs → components/inputs}/MRT_SelectCheckbox.tsx +4 -4
  47. package/src/{menus → components/menus}/MRT_ColumnActionMenu.tsx +9 -1
  48. package/src/{menus → components/menus}/MRT_FilterOptionMenu.tsx +9 -1
  49. package/src/{menus → components/menus}/MRT_RowActionMenu.tsx +13 -2
  50. package/src/{menus → components/menus}/MRT_ShowHideColumnsMenu.tsx +11 -5
  51. package/src/{menus → components/menus}/MRT_ShowHideColumnsMenuItems.tsx +7 -7
  52. package/src/{modals → components/modals}/MRT_EditRowModal.tsx +4 -4
  53. package/src/{table → components/table}/MRT_Table.tsx +4 -4
  54. package/src/{table → components/table}/MRT_TableContainer.tsx +3 -3
  55. package/src/{table → components/table}/MRT_TableLoadingOverlay.tsx +3 -3
  56. package/src/{table → components/table}/MRT_TablePaper.tsx +3 -3
  57. package/src/{toolbar → components/toolbar}/MRT_BottomToolbar.tsx +3 -3
  58. package/src/{toolbar → components/toolbar}/MRT_LinearProgressBar.tsx +2 -2
  59. package/src/{toolbar → components/toolbar}/MRT_TablePagination.tsx +9 -7
  60. package/src/{toolbar → components/toolbar}/MRT_ToolbarAlertBanner.tsx +3 -3
  61. package/src/{toolbar → components/toolbar}/MRT_ToolbarDropZone.tsx +2 -2
  62. package/src/{toolbar → components/toolbar}/MRT_ToolbarInternalButtons.tsx +2 -2
  63. package/src/{toolbar → components/toolbar}/MRT_TopToolbar.tsx +3 -3
  64. package/src/{filterFns.ts → fns/filterFns.ts} +1 -1
  65. package/src/{sortingFns.ts → fns/sortingFns.ts} +1 -1
  66. package/src/hooks/display-columns/getMRT_DisplayColumns.tsx +26 -0
  67. package/src/hooks/display-columns/getMRT_RowActionsColumnDef.tsx +34 -0
  68. package/src/hooks/display-columns/getMRT_RowDragColumnDef.tsx +35 -0
  69. package/src/hooks/display-columns/getMRT_RowExpandColumnDef.tsx +96 -0
  70. package/src/hooks/display-columns/getMRT_RowNumbersColumnDef.tsx +36 -0
  71. package/src/hooks/display-columns/getMRT_RowPinningColumnDef.tsx +30 -0
  72. package/src/hooks/display-columns/getMRT_RowSelectColumnDef.tsx +40 -0
  73. package/src/hooks/display-columns/getMRT_RowSpacerColumnDef.tsx +40 -0
  74. package/src/hooks/useMRT_ColumnVirtualizer.ts +2 -4
  75. package/src/hooks/useMRT_Effects.ts +7 -6
  76. package/src/hooks/useMRT_RowVirtualizer.ts +2 -4
  77. package/src/hooks/useMRT_Rows.ts +32 -6
  78. package/src/hooks/useMRT_TableInstance.ts +91 -87
  79. package/src/hooks/useMRT_TableOptions.ts +5 -3
  80. package/src/{useMaterialReactTable.ts → hooks/useMaterialReactTable.ts} +3 -3
  81. package/src/icons.ts +4 -38
  82. package/src/index.ts +88 -17
  83. package/src/types.ts +59 -26
  84. package/src/utils/column.utils.ts +173 -0
  85. package/src/utils/displayColumn.utils.ts +134 -0
  86. package/src/utils/row.utils.ts +26 -0
  87. package/src/{style.utils.ts → utils/style.utils.ts} +50 -28
  88. package/src/utils/tanstack.helpers.ts +64 -0
  89. package/src/utils/utils.ts +23 -0
  90. package/src/utils/virtualization.utils.ts +19 -0
  91. package/src/utils.ts +0 -0
  92. package/src/body/index.ts +0 -7
  93. package/src/buttons/index.ts +0 -13
  94. package/src/column.utils.ts +0 -368
  95. package/src/footer/index.ts +0 -3
  96. package/src/head/index.ts +0 -9
  97. package/src/hooks/index.ts +0 -7
  98. package/src/hooks/useMRT_DisplayColumns.tsx +0 -299
  99. package/src/inputs/index.ts +0 -7
  100. package/src/menus/index.ts +0 -5
  101. package/src/modals/index.ts +0 -1
  102. package/src/table/index.ts +0 -5
  103. package/src/toolbar/index.ts +0 -7
  104. /package/src/{aggregationFns.ts → fns/aggregationFns.ts} +0 -0
package/src/types.ts CHANGED
@@ -71,10 +71,10 @@ import {
71
71
  type DateTimePickerProps,
72
72
  type TimePickerProps,
73
73
  } from '@mui/x-date-pickers';
74
- import { type MRT_AggregationFns } from './aggregationFns';
75
- import { type MRT_FilterFns } from './filterFns';
74
+ import { type MRT_AggregationFns } from './fns/aggregationFns';
75
+ import { type MRT_FilterFns } from './fns/filterFns';
76
+ import { type MRT_SortingFns } from './fns/sortingFns';
76
77
  import { type MRT_Icons } from './icons';
77
- import { type MRT_SortingFns } from './sortingFns';
78
78
 
79
79
  export type { MRT_Icons };
80
80
  export type LiteralUnion<T extends U, U = string> =
@@ -87,6 +87,17 @@ export type Xor<A, B> =
87
87
  | Prettify<A & { [k in keyof B]?: never }>
88
88
  | Prettify<B & { [k in keyof A]?: never }>;
89
89
 
90
+ export type DropdownOption =
91
+ | {
92
+ label?: string;
93
+ /**
94
+ * @deprecated use `label` instead
95
+ */
96
+ text?: string;
97
+ value: any;
98
+ }
99
+ | string;
100
+
90
101
  export type MRT_DensityState = 'comfortable' | 'compact' | 'spacious';
91
102
 
92
103
  export type MRT_ColumnFilterFnsState = Record<string, MRT_FilterOption>;
@@ -247,6 +258,7 @@ export interface MRT_Theme {
247
258
  baseBackgroundColor?: CSSProperties['backgroundColor'];
248
259
  draggingBorderColor?: CSSProperties['borderColor'];
249
260
  matchHighlightColor?: CSSProperties['backgroundColor'];
261
+ menuBackgroundColor?: CSSProperties['backgroundColor'];
250
262
  pinnedRowBackgroundColor?: CSSProperties['backgroundColor'];
251
263
  selectedRowBackgroundColor?: CSSProperties['backgroundColor'];
252
264
  }
@@ -301,7 +313,7 @@ export type MRT_TableInstance<TData extends MRT_RowData> = Omit<
301
313
  getSelectedRowModel: () => MRT_RowModel<TData>;
302
314
  getState: () => MRT_TableState<TData>;
303
315
  getTopRows: () => MRT_Row<TData>[];
304
- options: MRT_DefinedTableOptions<TData>;
316
+ options: MRT_StatefulTableOptions<TData>;
305
317
  refs: {
306
318
  bottomToolbarRef: MutableRefObject<HTMLDivElement>;
307
319
  editInputRefs: MutableRefObject<Record<string, HTMLInputElement>>;
@@ -337,6 +349,32 @@ export type MRT_DefinedTableOptions<TData extends MRT_RowData> =
337
349
  localization: MRT_Localization;
338
350
  };
339
351
 
352
+ export type MRT_StatefulTableOptions<TData extends MRT_RowData> =
353
+ MRT_DefinedTableOptions<TData> & {
354
+ state: Pick<
355
+ MRT_TableState<TData>,
356
+ | 'columnFilterFns'
357
+ | 'columnOrder'
358
+ | 'columnSizingInfo'
359
+ | 'creatingRow'
360
+ | 'density'
361
+ | 'draggingColumn'
362
+ | 'draggingRow'
363
+ | 'editingCell'
364
+ | 'editingRow'
365
+ | 'globalFilterFn'
366
+ | 'grouping'
367
+ | 'hoveredColumn'
368
+ | 'hoveredRow'
369
+ | 'isFullScreen'
370
+ | 'pagination'
371
+ | 'showAlertBanner'
372
+ | 'showColumnFilters'
373
+ | 'showGlobalFilter'
374
+ | 'showToolbarDropZone'
375
+ >;
376
+ };
377
+
340
378
  export type MRT_TableState<TData extends MRT_RowData> = TableState & {
341
379
  columnFilterFns: MRT_ColumnFilterFnsState;
342
380
  creatingRow: MRT_Row<TData> | null;
@@ -456,17 +494,14 @@ export type MRT_ColumnDef<TData extends MRT_RowData, TValue = unknown> = Omit<
456
494
  LiteralUnion<string & MRT_FilterOption>
457
495
  > | null;
458
496
  columns?: MRT_ColumnDef<TData, TValue>[];
459
- editSelectOptions?: (
460
- | {
461
- label?: string;
462
- /**
463
- * @deprecated use `label` instead
464
- */
465
- text?: string;
466
- value: any;
467
- }
468
- | string
469
- )[];
497
+ editSelectOptions?:
498
+ | ((props: {
499
+ cell: MRT_Cell<TData, TValue>;
500
+ column: MRT_Column<TData>;
501
+ row: MRT_Row<TData>;
502
+ table: MRT_TableInstance<TData>;
503
+ }) => DropdownOption[])
504
+ | DropdownOption[];
470
505
  editVariant?: 'select' | 'text';
471
506
  enableClickToCopy?: boolean;
472
507
  enableColumnActions?: boolean;
@@ -476,17 +511,7 @@ export type MRT_ColumnDef<TData extends MRT_RowData, TValue = unknown> = Omit<
476
511
  enableEditing?: ((row: MRT_Row<TData>) => boolean) | boolean;
477
512
  enableFilterMatchHighlighting?: boolean;
478
513
  filterFn?: MRT_FilterFn<TData>;
479
- filterSelectOptions?: (
480
- | {
481
- label?: string;
482
- /**
483
- * @deprecated use `label` instead
484
- */
485
- text?: string;
486
- value: any;
487
- }
488
- | string
489
- )[];
514
+ filterSelectOptions?: DropdownOption[];
490
515
  filterVariant?:
491
516
  | 'autocomplete'
492
517
  | 'checkbox'
@@ -505,6 +530,10 @@ export type MRT_ColumnDef<TData extends MRT_RowData, TValue = unknown> = Omit<
505
530
  * footer must be a string. If you want custom JSX to render the footer, you can also specify a `Footer` option. (Capital F)
506
531
  */
507
532
  footer?: string;
533
+ /**
534
+ * If `layoutMode` is `'grid'` or `'grid-no-grow'`, you can specify the flex grow value for individual columns to still grow and take up remaining space, or set to `false`/0 to not grow.
535
+ */
536
+ grow?: boolean | number;
508
537
  /**
509
538
  * header must be a string. If you want custom JSX to render the header, you can also specify a `Header` option. (Capital H)
510
539
  */
@@ -919,6 +948,7 @@ export type MRT_TableOptions<TData extends MRT_RowData> = Omit<
919
948
  muiExpandButtonProps?:
920
949
  | ((props: {
921
950
  row: MRT_Row<TData>;
951
+ staticRowIndex?: number;
922
952
  table: MRT_TableInstance<TData>;
923
953
  }) => IconButtonProps)
924
954
  | IconButtonProps;
@@ -1122,6 +1152,7 @@ export type MRT_TableOptions<TData extends MRT_RowData> = Omit<
1122
1152
  onShowToolbarDropZoneChange?: OnChangeFn<boolean>;
1123
1153
  paginationDisplayMode?: 'custom' | 'default' | 'pages';
1124
1154
  positionActionsColumn?: 'first' | 'last';
1155
+ positionCreatingRow?: 'bottom' | 'top' | number;
1125
1156
  positionExpandColumn?: 'first' | 'last';
1126
1157
  positionGlobalFilter?: 'left' | 'none' | 'right';
1127
1158
  positionPagination?: 'both' | 'bottom' | 'none' | 'top';
@@ -1170,11 +1201,13 @@ export type MRT_TableOptions<TData extends MRT_RowData> = Omit<
1170
1201
  renderRowActionMenuItems?: (props: {
1171
1202
  closeMenu: () => void;
1172
1203
  row: MRT_Row<TData>;
1204
+ staticRowIndex?: number;
1173
1205
  table: MRT_TableInstance<TData>;
1174
1206
  }) => ReactNode[];
1175
1207
  renderRowActions?: (props: {
1176
1208
  cell: MRT_Cell<TData>;
1177
1209
  row: MRT_Row<TData>;
1210
+ staticRowIndex?: number;
1178
1211
  table: MRT_TableInstance<TData>;
1179
1212
  }) => ReactNode;
1180
1213
  renderToolbarAlertBannerContent?: (props: {
@@ -0,0 +1,173 @@
1
+ import { type Row } from '@tanstack/react-table';
2
+ import {
3
+ type MRT_Column,
4
+ type MRT_ColumnDef,
5
+ type MRT_ColumnOrderState,
6
+ type MRT_DefinedColumnDef,
7
+ type MRT_DefinedTableOptions,
8
+ type MRT_FilterOption,
9
+ type MRT_RowData,
10
+ type MRT_TableInstance,
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
+ export const prepareColumns = <TData extends MRT_RowData>({
36
+ columnDefs,
37
+ tableOptions,
38
+ }: {
39
+ columnDefs: MRT_ColumnDef<TData>[];
40
+ tableOptions: MRT_DefinedTableOptions<TData>;
41
+ }): MRT_DefinedColumnDef<TData>[] => {
42
+ const {
43
+ aggregationFns = {},
44
+ defaultDisplayColumn,
45
+ filterFns = {},
46
+ sortingFns = {},
47
+ state: { columnFilterFns = {} } = {},
48
+ } = tableOptions;
49
+ return columnDefs.map((columnDef) => {
50
+ //assign columnId
51
+ if (!columnDef.id) columnDef.id = getColumnId(columnDef);
52
+ //assign columnDefType
53
+ if (!columnDef.columnDefType) columnDef.columnDefType = 'data';
54
+ if (columnDef.columns?.length) {
55
+ columnDef.columnDefType = 'group';
56
+ //recursively prepare columns if this is a group column
57
+ columnDef.columns = prepareColumns({
58
+ columnDefs: columnDef.columns,
59
+ tableOptions,
60
+ });
61
+ } else if (columnDef.columnDefType === 'data') {
62
+ //assign aggregationFns if multiple aggregationFns are provided
63
+ if (Array.isArray(columnDef.aggregationFn)) {
64
+ const aggFns = columnDef.aggregationFn as string[];
65
+ columnDef.aggregationFn = (
66
+ columnId: string,
67
+ leafRows: Row<TData>[],
68
+ childRows: Row<TData>[],
69
+ ) =>
70
+ aggFns.map((fn) =>
71
+ aggregationFns[fn]?.(columnId, leafRows, childRows),
72
+ );
73
+ }
74
+
75
+ //assign filterFns
76
+ if (Object.keys(filterFns).includes(columnFilterFns[columnDef.id])) {
77
+ columnDef.filterFn =
78
+ filterFns[columnFilterFns[columnDef.id]] ?? filterFns.fuzzy;
79
+ (columnDef as MRT_DefinedColumnDef<TData>)._filterFn =
80
+ columnFilterFns[columnDef.id];
81
+ }
82
+
83
+ //assign sortingFns
84
+ if (Object.keys(sortingFns).includes(columnDef.sortingFn as string)) {
85
+ // @ts-ignore
86
+ columnDef.sortingFn = sortingFns[columnDef.sortingFn];
87
+ }
88
+ } else if (columnDef.columnDefType === 'display') {
89
+ columnDef = {
90
+ ...(defaultDisplayColumn as MRT_ColumnDef<TData>),
91
+ ...columnDef,
92
+ };
93
+ }
94
+ return columnDef;
95
+ }) as MRT_DefinedColumnDef<TData>[];
96
+ };
97
+
98
+ export const reorderColumn = <TData extends MRT_RowData>(
99
+ draggedColumn: MRT_Column<TData>,
100
+ targetColumn: MRT_Column<TData>,
101
+ columnOrder: MRT_ColumnOrderState,
102
+ ): MRT_ColumnOrderState => {
103
+ if (draggedColumn.getCanPin()) {
104
+ draggedColumn.pin(targetColumn.getIsPinned());
105
+ }
106
+ const newColumnOrder = [...columnOrder];
107
+ newColumnOrder.splice(
108
+ newColumnOrder.indexOf(targetColumn.id),
109
+ 0,
110
+ newColumnOrder.splice(newColumnOrder.indexOf(draggedColumn.id), 1)[0],
111
+ );
112
+ return newColumnOrder;
113
+ };
114
+
115
+ export const getDefaultColumnFilterFn = <TData extends MRT_RowData>(
116
+ columnDef: MRT_ColumnDef<TData>,
117
+ ): MRT_FilterOption => {
118
+ if (columnDef.filterVariant === 'multi-select') return 'arrIncludesSome';
119
+ if (columnDef.filterVariant?.includes('range')) return 'betweenInclusive';
120
+ if (
121
+ columnDef.filterVariant === 'select' ||
122
+ columnDef.filterVariant === 'checkbox'
123
+ )
124
+ return 'equals';
125
+ return 'fuzzy';
126
+ };
127
+
128
+ export const getIsFirstColumn = <TData extends MRT_RowData>(
129
+ column: MRT_Column<TData>,
130
+ table: MRT_TableInstance<TData>,
131
+ ) => {
132
+ const leftColumns = table.getLeftVisibleLeafColumns();
133
+ return leftColumns.length
134
+ ? leftColumns[0].id === column.id
135
+ : table.getVisibleLeafColumns()[0].id === column.id;
136
+ };
137
+
138
+ export const getIsLastColumn = <TData extends MRT_RowData>(
139
+ column: MRT_Column<TData>,
140
+ table: MRT_TableInstance<TData>,
141
+ ) => {
142
+ const rightColumns = table.getRightVisibleLeafColumns();
143
+ const columns = table.getVisibleLeafColumns();
144
+ return rightColumns.length
145
+ ? rightColumns[rightColumns.length - 1].id === column.id
146
+ : columns[columns.length - 1].id === column.id;
147
+ };
148
+
149
+ export const getIsLastLeftPinnedColumn = <TData extends MRT_RowData>(
150
+ table: MRT_TableInstance<TData>,
151
+ column: MRT_Column<TData>,
152
+ ) => {
153
+ return (
154
+ column.getIsPinned() === 'left' &&
155
+ table.getLeftLeafHeaders().length - 1 === column.getPinnedIndex()
156
+ );
157
+ };
158
+
159
+ export const getIsFirstRightPinnedColumn = <TData extends MRT_RowData>(
160
+ column: MRT_Column<TData>,
161
+ ) => {
162
+ return column.getIsPinned() === 'right' && column.getPinnedIndex() === 0;
163
+ };
164
+
165
+ export const getTotalRight = <TData extends MRT_RowData>(
166
+ table: MRT_TableInstance<TData>,
167
+ column: MRT_Column<TData>,
168
+ ) => {
169
+ return table
170
+ .getRightLeafHeaders()
171
+ .slice(column.getPinnedIndex() + 1)
172
+ .reduce((acc, col) => acc + col.getSize(), 0);
173
+ };
@@ -0,0 +1,134 @@
1
+ import {
2
+ type MRT_DefinedTableOptions,
3
+ type MRT_DisplayColumnIds,
4
+ type MRT_Localization,
5
+ type MRT_RowData,
6
+ type MRT_StatefulTableOptions,
7
+ } from '../types';
8
+ import { getAllLeafColumnDefs, getColumnId } from './column.utils';
9
+
10
+ export function defaultDisplayColumnProps<TData extends MRT_RowData>({
11
+ header,
12
+ id,
13
+ size = 60,
14
+ tableOptions,
15
+ }: {
16
+ header?: keyof MRT_Localization;
17
+ id: MRT_DisplayColumnIds;
18
+ size?: number;
19
+ tableOptions: MRT_DefinedTableOptions<TData>;
20
+ }) {
21
+ const { defaultDisplayColumn, displayColumnDefOptions, localization } =
22
+ tableOptions;
23
+ return {
24
+ ...defaultDisplayColumn,
25
+ header: header ? localization[header]! : '',
26
+ size,
27
+ ...displayColumnDefOptions?.[id],
28
+ id,
29
+ } as const;
30
+ }
31
+
32
+ export const showRowPinningColumn = <TData extends MRT_RowData>(
33
+ tableOptions: MRT_StatefulTableOptions<TData>,
34
+ ) => {
35
+ const { enableRowPinning, rowPinningDisplayMode } = tableOptions;
36
+ return enableRowPinning && !rowPinningDisplayMode?.startsWith('select');
37
+ };
38
+
39
+ export const showRowDragColumn = <TData extends MRT_RowData>(
40
+ tableOptions: MRT_StatefulTableOptions<TData>,
41
+ ) => {
42
+ const { enableRowDragging, enableRowOrdering } = tableOptions;
43
+ return enableRowDragging || enableRowOrdering;
44
+ };
45
+
46
+ export const showRowExpandColumn = <TData extends MRT_RowData>(
47
+ tableOptions: MRT_StatefulTableOptions<TData>,
48
+ ) => {
49
+ const {
50
+ enableExpanding,
51
+ enableGrouping,
52
+ renderDetailPanel,
53
+ state: { grouping },
54
+ } = tableOptions;
55
+ return !!(
56
+ enableExpanding ||
57
+ (enableGrouping && (grouping === undefined || grouping?.length)) ||
58
+ renderDetailPanel
59
+ );
60
+ };
61
+
62
+ export const showRowActionsColumn = <TData extends MRT_RowData>(
63
+ tableOptions: MRT_StatefulTableOptions<TData>,
64
+ ) => {
65
+ const {
66
+ createDisplayMode,
67
+ editDisplayMode,
68
+ enableEditing,
69
+ enableRowActions,
70
+ state: { creatingRow },
71
+ } = tableOptions;
72
+ return (
73
+ enableRowActions ||
74
+ (creatingRow && createDisplayMode === 'row') ||
75
+ (enableEditing && ['modal', 'row'].includes(editDisplayMode ?? ''))
76
+ );
77
+ };
78
+
79
+ export const showRowSelectionColumn = <TData extends MRT_RowData>(
80
+ tableOptions: MRT_StatefulTableOptions<TData>,
81
+ ) => tableOptions.enableRowSelection;
82
+
83
+ export const showRowNumbersColumn = <TData extends MRT_RowData>(
84
+ tableOptions: MRT_StatefulTableOptions<TData>,
85
+ ) => tableOptions.enableRowNumbers;
86
+
87
+ export const showRowSpacerColumn = <TData extends MRT_RowData>(
88
+ tableOptions: MRT_StatefulTableOptions<TData>,
89
+ ) => tableOptions.layoutMode === 'grid-no-grow';
90
+
91
+ export const getLeadingDisplayColumnIds = <TData extends MRT_RowData>(
92
+ tableOptions: MRT_StatefulTableOptions<TData>,
93
+ ) =>
94
+ [
95
+ showRowPinningColumn(tableOptions) && 'mrt-row-pin',
96
+ showRowDragColumn(tableOptions) && 'mrt-row-drag',
97
+ tableOptions.positionActionsColumn === 'first' &&
98
+ showRowActionsColumn(tableOptions) &&
99
+ 'mrt-row-actions',
100
+ tableOptions.positionExpandColumn === 'first' &&
101
+ showRowExpandColumn(tableOptions) &&
102
+ 'mrt-row-expand',
103
+ showRowSelectionColumn(tableOptions) && 'mrt-row-select',
104
+ showRowNumbersColumn(tableOptions) && 'mrt-row-numbers',
105
+ ].filter(Boolean) as MRT_DisplayColumnIds[];
106
+
107
+ export const getTrailingDisplayColumnIds = <TData extends MRT_RowData>(
108
+ tableOptions: MRT_StatefulTableOptions<TData>,
109
+ ) =>
110
+ [
111
+ tableOptions.positionActionsColumn === 'last' &&
112
+ showRowActionsColumn(tableOptions) &&
113
+ 'mrt-row-actions',
114
+ tableOptions.positionExpandColumn === 'last' &&
115
+ showRowExpandColumn(tableOptions) &&
116
+ 'mrt-row-expand',
117
+ showRowSpacerColumn(tableOptions) && 'mrt-row-spacer',
118
+ ].filter(Boolean) as MRT_DisplayColumnIds[];
119
+
120
+ export const getDefaultColumnOrderIds = <TData extends MRT_RowData>(
121
+ tableOptions: MRT_StatefulTableOptions<TData>,
122
+ ) => {
123
+ const leadingDisplayCols: string[] = getLeadingDisplayColumnIds(tableOptions);
124
+ const trailingDisplayCols: string[] =
125
+ getTrailingDisplayColumnIds(tableOptions);
126
+ const allLeafColumnDefs = getAllLeafColumnDefs(tableOptions.columns)
127
+ .map((columnDef) => getColumnId(columnDef))
128
+ .filter(
129
+ (columnId) =>
130
+ !leadingDisplayCols.includes(columnId) &&
131
+ !trailingDisplayCols.includes(columnId),
132
+ );
133
+ return [...leadingDisplayCols, ...allLeafColumnDefs, ...trailingDisplayCols];
134
+ };
@@ -0,0 +1,26 @@
1
+ import { type MRT_RowData, type MRT_TableInstance } from '../types';
2
+
3
+ export const getCanRankRows = <TData extends MRT_RowData>(
4
+ table: MRT_TableInstance<TData>,
5
+ ) => {
6
+ const { getState, options } = table;
7
+ const {
8
+ enableGlobalFilterRankedResults,
9
+ manualExpanding,
10
+ manualFiltering,
11
+ manualGrouping,
12
+ manualSorting,
13
+ } = options;
14
+ const { expanded, globalFilterFn } = getState();
15
+
16
+ return (
17
+ !manualExpanding &&
18
+ !manualFiltering &&
19
+ !manualGrouping &&
20
+ !manualSorting &&
21
+ enableGlobalFilterRankedResults &&
22
+ globalFilterFn === 'fuzzy' &&
23
+ expanded !== true &&
24
+ !Object.values(expanded).some(Boolean)
25
+ );
26
+ };
@@ -1,39 +1,46 @@
1
1
  import { type CSSProperties } from 'react';
2
2
  import { type TableCellProps } from '@mui/material/TableCell';
3
+ import { type TooltipProps } from '@mui/material/Tooltip';
3
4
  import { alpha, darken, lighten } from '@mui/material/styles';
4
5
  import { type Theme } from '@mui/material/styles';
5
- import {
6
- getIsFirstRightPinnedColumn,
7
- getIsLastLeftPinnedColumn,
8
- getTotalRight,
9
- parseFromValuesOrFunc,
10
- } from './column.utils';
11
6
  import {
12
7
  type MRT_Column,
13
8
  type MRT_Header,
14
9
  type MRT_RowData,
15
10
  type MRT_TableInstance,
16
- } from './types';
11
+ } from '../types';
12
+ import {
13
+ getIsFirstRightPinnedColumn,
14
+ getIsLastLeftPinnedColumn,
15
+ getTotalRight,
16
+ } from '../utils/column.utils';
17
+ import { parseFromValuesOrFunc } from './utils';
17
18
 
18
19
  export const parseCSSVarId = (id: string) => id.replace(/[^a-zA-Z0-9]/g, '_');
19
20
 
20
21
  export const getMRTTheme = <TData extends MRT_RowData>(
21
22
  table: MRT_TableInstance<TData>,
22
23
  theme: Theme,
23
- ) => ({
24
- baseBackgroundColor:
25
- theme.palette.mode === 'dark'
24
+ ) => {
25
+ const themeOverrides = parseFromValuesOrFunc(table.options.mrtTheme, theme);
26
+ const baseBackgroundColor =
27
+ themeOverrides?.baseBackgroundColor ??
28
+ (theme.palette.mode === 'dark'
26
29
  ? lighten(theme.palette.background.default, 0.05)
27
- : theme.palette.background.default,
28
- draggingBorderColor: theme.palette.primary.main,
29
- matchHighlightColor:
30
- theme.palette.mode === 'dark'
31
- ? darken(theme.palette.warning.dark, 0.25)
32
- : lighten(theme.palette.warning.light, 0.5),
33
- pinnedRowBackgroundColor: alpha(theme.palette.primary.main, 0.1),
34
- selectedRowBackgroundColor: alpha(theme.palette.primary.main, 0.2),
35
- ...parseFromValuesOrFunc(table.options.mrtTheme, theme),
36
- });
30
+ : theme.palette.background.default);
31
+ return {
32
+ baseBackgroundColor,
33
+ draggingBorderColor: theme.palette.primary.main,
34
+ matchHighlightColor:
35
+ theme.palette.mode === 'dark'
36
+ ? darken(theme.palette.warning.dark, 0.25)
37
+ : lighten(theme.palette.warning.light, 0.5),
38
+ menuBackgroundColor: lighten(baseBackgroundColor, 0.07),
39
+ pinnedRowBackgroundColor: alpha(theme.palette.primary.main, 0.1),
40
+ selectedRowBackgroundColor: alpha(theme.palette.primary.main, 0.2),
41
+ ...themeOverrides,
42
+ };
43
+ };
37
44
 
38
45
  export const getCommonMRTCellStyles = <TData extends MRT_RowData>({
39
46
  column,
@@ -51,26 +58,32 @@ export const getCommonMRTCellStyles = <TData extends MRT_RowData>({
51
58
  const {
52
59
  options: { layoutMode },
53
60
  } = table;
61
+ const { columnDef } = column;
62
+
54
63
  const widthStyles: CSSProperties = {
55
64
  minWidth: `max(calc(var(--${header ? 'header' : 'col'}-${parseCSSVarId(
56
65
  header?.id ?? column.id,
57
- )}-size) * 1px), ${column.columnDef.minSize ?? 30}px)`,
66
+ )}-size) * 1px), ${columnDef.minSize ?? 30}px)`,
58
67
  width: `calc(var(--${header ? 'header' : 'col'}-${parseCSSVarId(
59
68
  header?.id ?? column.id,
60
- )}-size) * 1px${header ? ` + ${header?.subHeaders?.length ?? 0}rem` : ''})`,
69
+ )}-size) * 1px${header && layoutMode === 'grid-no-grow' ? ` + ${header?.subHeaders?.length ?? 0}rem` : ''})`,
61
70
  };
62
71
 
63
72
  if (layoutMode === 'grid') {
64
- widthStyles.flex = `var(--${header ? 'header' : 'col'}-${parseCSSVarId(
65
- header?.id ?? column.id,
66
- )}-size) 0 auto`;
73
+ widthStyles.flex = `${
74
+ [0, false].includes(columnDef.grow!)
75
+ ? 0
76
+ : `var(--${header ? 'header' : 'col'}-${parseCSSVarId(
77
+ header?.id ?? column.id,
78
+ )}-size)`
79
+ } 0 auto`;
67
80
  } else if (layoutMode === 'grid-no-grow') {
68
- widthStyles.flex = '0 0 auto';
81
+ widthStyles.flex = `${+(columnDef.grow || 0)} 0 auto`;
69
82
  }
70
83
 
71
84
  return {
72
85
  backgroundColor:
73
- column.getIsPinned() && column.columnDef.columnDefType !== 'group'
86
+ column.getIsPinned() && columnDef.columnDefType !== 'group'
74
87
  ? alpha(
75
88
  darken(
76
89
  getMRTTheme(table, theme).baseBackgroundColor,
@@ -96,7 +109,7 @@ export const getCommonMRTCellStyles = <TData extends MRT_RowData>({
96
109
  ? 0.5
97
110
  : 1,
98
111
  position:
99
- column.getIsPinned() && column.columnDef.columnDefType !== 'group'
112
+ column.getIsPinned() && columnDef.columnDefType !== 'group'
100
113
  ? 'sticky'
101
114
  : undefined,
102
115
  right:
@@ -133,3 +146,12 @@ export const flipIconStyles = (theme: Theme) =>
133
146
  theme.direction === 'rtl'
134
147
  ? { style: { transform: 'scaleX(-1)' } }
135
148
  : undefined;
149
+
150
+ export const getCommonTooltipProps = (
151
+ placement?: TooltipProps['placement'],
152
+ ): Partial<TooltipProps> => ({
153
+ disableInteractive: true,
154
+ enterDelay: 1000,
155
+ enterNextDelay: 1000,
156
+ placement,
157
+ });
@@ -0,0 +1,64 @@
1
+ import { type ReactNode } from 'react';
2
+ import {
3
+ createRow as _createRow,
4
+ flexRender as _flexRender,
5
+ type Renderable,
6
+ } from '@tanstack/react-table';
7
+ import {
8
+ type MRT_ColumnHelper,
9
+ type MRT_DisplayColumnDef,
10
+ type MRT_GroupColumnDef,
11
+ type MRT_Row,
12
+ type MRT_RowData,
13
+ type MRT_TableInstance,
14
+ } from '../types';
15
+ import { getAllLeafColumnDefs, getColumnId } from './column.utils';
16
+
17
+ export const flexRender = _flexRender as (
18
+ Comp: Renderable<any>,
19
+ props: any,
20
+ ) => JSX.Element | ReactNode;
21
+
22
+ export function createMRTColumnHelper<
23
+ TData extends MRT_RowData,
24
+ >(): MRT_ColumnHelper<TData> {
25
+ return {
26
+ accessor: (accessor, column) => {
27
+ return typeof accessor === 'function'
28
+ ? ({
29
+ ...column,
30
+ accessorFn: accessor,
31
+ } as any)
32
+ : {
33
+ ...column,
34
+ accessorKey: accessor,
35
+ };
36
+ },
37
+ display: (column) => column as MRT_DisplayColumnDef<TData>,
38
+ group: (column) => column as MRT_GroupColumnDef<TData>,
39
+ };
40
+ }
41
+
42
+ export const createRow = <TData extends MRT_RowData>(
43
+ table: MRT_TableInstance<TData>,
44
+ originalRow?: TData,
45
+ rowIndex = -1,
46
+ depth = 0,
47
+ subRows?: MRT_Row<TData>[],
48
+ parentId?: string,
49
+ ): MRT_Row<TData> =>
50
+ _createRow(
51
+ table as any,
52
+ 'mrt-row-create',
53
+ originalRow ??
54
+ Object.assign(
55
+ {},
56
+ ...getAllLeafColumnDefs(table.options.columns).map((col) => ({
57
+ [getColumnId(col)]: '',
58
+ })),
59
+ ),
60
+ rowIndex,
61
+ depth,
62
+ subRows as any,
63
+ parentId,
64
+ ) as MRT_Row<TData>;