material-react-table 2.0.0-alpha.0 → 2.0.0-alpha.1

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 (98) hide show
  1. package/dist/cjs/index.js +437 -384
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/body/MRT_TableBodyRow.d.ts +3 -2
  4. package/dist/cjs/types/body/MRT_TableBodyRowPinButton.d.ts +7 -0
  5. package/dist/cjs/types/body/index.d.ts +1 -0
  6. package/dist/cjs/types/buttons/MRT_RowPinButton.d.ts +9 -0
  7. package/dist/cjs/types/buttons/index.d.ts +2 -1
  8. package/dist/cjs/types/column.utils.d.ts +1 -0
  9. package/dist/cjs/types/types.d.ts +15 -9
  10. package/dist/esm/material-react-table.esm.js +433 -383
  11. package/dist/esm/material-react-table.esm.js.map +1 -1
  12. package/dist/esm/types/body/MRT_TableBodyRow.d.ts +3 -2
  13. package/dist/esm/types/body/MRT_TableBodyRowPinButton.d.ts +7 -0
  14. package/dist/esm/types/body/index.d.ts +1 -0
  15. package/dist/esm/types/buttons/MRT_RowPinButton.d.ts +9 -0
  16. package/dist/esm/types/buttons/index.d.ts +2 -1
  17. package/dist/esm/types/column.utils.d.ts +1 -0
  18. package/dist/esm/types/types.d.ts +15 -9
  19. package/dist/index.d.ts +68 -47
  20. package/locales/en.esm.js +1 -0
  21. package/locales/en.esm.js.map +1 -1
  22. package/locales/en.js +1 -0
  23. package/locales/en.js.map +1 -1
  24. package/package.json +9 -9
  25. package/src/body/MRT_TableBody.tsx +178 -74
  26. package/src/body/MRT_TableBodyCell.tsx +23 -21
  27. package/src/body/MRT_TableBodyRow.tsx +104 -16
  28. package/src/body/MRT_TableBodyRowGrabHandle.tsx +5 -4
  29. package/src/body/MRT_TableBodyRowPinButton.tsx +46 -0
  30. package/src/body/MRT_TableDetailPanel.tsx +13 -19
  31. package/src/body/index.ts +2 -1
  32. package/src/buttons/MRT_CopyButton.tsx +14 -20
  33. package/src/buttons/MRT_ExpandAllButton.tsx +5 -7
  34. package/src/buttons/MRT_ExpandButton.tsx +6 -7
  35. package/src/buttons/MRT_GrabHandleButton.tsx +2 -3
  36. package/src/buttons/MRT_RowPinButton.tsx +74 -0
  37. package/src/buttons/MRT_ToggleRowActionMenuButton.tsx +2 -3
  38. package/src/buttons/index.ts +2 -1
  39. package/src/column.utils.ts +11 -5
  40. package/src/footer/MRT_TableFooter.tsx +13 -7
  41. package/src/footer/MRT_TableFooterCell.tsx +7 -20
  42. package/src/footer/MRT_TableFooterRow.tsx +6 -7
  43. package/src/head/MRT_TableHead.tsx +11 -7
  44. package/src/head/MRT_TableHeadCell.tsx +9 -20
  45. package/src/head/MRT_TableHeadCellColumnActionsButton.tsx +10 -18
  46. package/src/head/MRT_TableHeadCellGrabHandle.tsx +6 -13
  47. package/src/head/MRT_TableHeadRow.tsx +6 -7
  48. package/src/hooks/useMRT_DisplayColumns.tsx +13 -0
  49. package/src/hooks/useMRT_TableInstance.ts +6 -0
  50. package/src/hooks/useMRT_TableOptions.ts +6 -2
  51. package/src/inputs/MRT_EditCellTextField.tsx +14 -22
  52. package/src/inputs/MRT_FilterCheckbox.tsx +11 -23
  53. package/src/inputs/MRT_FilterRangeSlider.tsx +6 -23
  54. package/src/inputs/MRT_FilterTextField.tsx +9 -25
  55. package/src/inputs/MRT_GlobalFilterTextField.tsx +4 -4
  56. package/src/inputs/MRT_SelectCheckbox.tsx +31 -17
  57. package/src/locales/en.ts +1 -1
  58. package/src/menus/MRT_RowActionMenu.tsx +11 -12
  59. package/src/modals/MRT_EditRowModal.tsx +5 -13
  60. package/src/table/MRT_Table.tsx +8 -13
  61. package/src/table/MRT_TableContainer.tsx +6 -12
  62. package/src/table/MRT_TablePaper.tsx +9 -13
  63. package/src/toolbar/MRT_BottomToolbar.tsx +14 -20
  64. package/src/toolbar/MRT_LinearProgressBar.tsx +5 -4
  65. package/src/toolbar/MRT_TablePagination.tsx +5 -7
  66. package/src/toolbar/MRT_ToolbarAlertBanner.tsx +8 -11
  67. package/src/toolbar/MRT_TopToolbar.tsx +8 -14
  68. package/src/types.ts +25 -8
  69. package/locales/tr.d.ts +0 -2
  70. package/locales/tr.esm.d.ts +0 -2
  71. package/locales/tr.esm.js +0 -93
  72. package/locales/tr.esm.js.map +0 -1
  73. package/locales/tr.js +0 -97
  74. package/locales/tr.js.map +0 -1
  75. package/locales/uk.d.ts +0 -2
  76. package/locales/uk.esm.d.ts +0 -2
  77. package/locales/uk.esm.js +0 -93
  78. package/locales/uk.esm.js.map +0 -1
  79. package/locales/uk.js +0 -97
  80. package/locales/uk.js.map +0 -1
  81. package/locales/vi.d.ts +0 -2
  82. package/locales/vi.esm.d.ts +0 -2
  83. package/locales/vi.esm.js +0 -93
  84. package/locales/vi.esm.js.map +0 -1
  85. package/locales/vi.js +0 -97
  86. package/locales/vi.js.map +0 -1
  87. package/locales/zh-Hans.d.ts +0 -2
  88. package/locales/zh-Hans.esm.d.ts +0 -2
  89. package/locales/zh-Hans.esm.js +0 -93
  90. package/locales/zh-Hans.esm.js.map +0 -1
  91. package/locales/zh-Hans.js +0 -97
  92. package/locales/zh-Hans.js.map +0 -1
  93. package/locales/zh-Hant.d.ts +0 -2
  94. package/locales/zh-Hant.esm.d.ts +0 -2
  95. package/locales/zh-Hant.esm.js +0 -93
  96. package/locales/zh-Hant.esm.js.map +0 -1
  97. package/locales/zh-Hant.js +0 -97
  98. package/locales/zh-Hant.js.map +0 -1
@@ -7,6 +7,7 @@ import {
7
7
  type MRT_HeaderGroup,
8
8
  type MRT_TableInstance,
9
9
  } from '../types';
10
+ import { parseFromValuesOrFunc } from '../column.utils';
10
11
 
11
12
  interface Props<TData extends Record<string, any>> {
12
13
  headerGroup: MRT_HeaderGroup<TData>;
@@ -27,10 +28,10 @@ export const MRT_TableHeadRow = <TData extends Record<string, any>>({
27
28
  options: { layoutMode, muiTableHeadRowProps },
28
29
  } = table;
29
30
 
30
- const tableRowProps =
31
- muiTableHeadRowProps instanceof Function
32
- ? muiTableHeadRowProps({ headerGroup, table })
33
- : muiTableHeadRowProps;
31
+ const tableRowProps = parseFromValuesOrFunc(muiTableHeadRowProps, {
32
+ headerGroup,
33
+ table,
34
+ });
34
35
 
35
36
  return (
36
37
  <TableRow
@@ -40,9 +41,7 @@ export const MRT_TableHeadRow = <TData extends Record<string, any>>({
40
41
  boxShadow: `4px 0 8px ${alpha(theme.palette.common.black, 0.1)}`,
41
42
  display: layoutMode === 'grid' ? 'flex' : 'table-row',
42
43
  top: 0,
43
- ...(tableRowProps?.sx instanceof Function
44
- ? tableRowProps?.sx(theme)
45
- : (tableRowProps?.sx as any)),
44
+ ...(parseFromValuesOrFunc(tableRowProps?.sx, theme) as any),
46
45
  })}
47
46
  >
48
47
  {virtualPaddingLeft ? (
@@ -1,5 +1,6 @@
1
1
  import { type RefObject, useMemo } from 'react';
2
2
  import { showExpandColumn } from '../column.utils';
3
+ import { MRT_TableBodyRowPinButton } from '../body/MRT_TableBodyRowPinButton';
3
4
  import { MRT_TableBodyRowGrabHandle } from '../body';
4
5
  import { MRT_ExpandAllButton } from '../buttons/MRT_ExpandAllButton';
5
6
  import { MRT_ExpandButton } from '../buttons/MRT_ExpandButton';
@@ -30,6 +31,18 @@ export const useMRT_DisplayColumns = <TData extends Record<string, any>>({
30
31
  () =>
31
32
  (
32
33
  [
34
+ (tableOptions.state?.columnOrder ?? columnOrder).includes(
35
+ 'mrt-row-pin',
36
+ ) && {
37
+ Cell: ({ row, table }) => (
38
+ <MRT_TableBodyRowPinButton row={row} table={table} />
39
+ ),
40
+ header: tableOptions.localization.pin,
41
+ size: 60,
42
+ ...tableOptions.defaultDisplayColumn,
43
+ ...tableOptions.displayColumnDefOptions?.['mrt-row-pin'],
44
+ id: 'mrt-row-pin',
45
+ },
33
46
  (tableOptions.state?.columnOrder ?? columnOrder).includes(
34
47
  'mrt-row-drag',
35
48
  ) && {
@@ -50,6 +50,8 @@ export const useMRT_TableInstance: <TData extends Record<string, any>>(
50
50
  const tableHeadCellRefs = useRef<Record<string, HTMLTableCellElement>>({});
51
51
  const tablePaperRef = useRef<HTMLDivElement>(null);
52
52
  const topToolbarRef = useRef<HTMLDivElement>(null);
53
+ const tableHeadRef = useRef<HTMLTableSectionElement>(null);
54
+ const tableFooterRef = useRef<HTMLTableSectionElement>(null);
53
55
 
54
56
  const initialState: Partial<MRT_TableState<TData>> = useMemo(() => {
55
57
  const initState = tableOptions.initialState ?? {};
@@ -251,6 +253,10 @@ export const useMRT_TableInstance: <TData extends Record<string, any>>(
251
253
  tablePaperRef,
252
254
  // @ts-ignore
253
255
  topToolbarRef,
256
+ // @ts-ignore
257
+ tableFooterRef,
258
+ // @ts-ignore
259
+ tableHeadRef,
254
260
  };
255
261
 
256
262
  const setCreatingRow = (row: MRT_Updater<MRT_Row<TData> | null | true>) => {
@@ -22,6 +22,7 @@ export const useMRT_TableOptions: <TData extends Record<string, any>>(
22
22
  enableColumnActions = true,
23
23
  enableColumnFilters = true,
24
24
  enableColumnOrdering = false,
25
+ enableColumnPinning = false,
25
26
  enableColumnResizing = false,
26
27
  enableDensityToggle = true,
27
28
  enableExpandAll = true,
@@ -36,7 +37,7 @@ export const useMRT_TableOptions: <TData extends Record<string, any>>(
36
37
  enableMultiRowSelection = true,
37
38
  enableMultiSort = true,
38
39
  enablePagination = true,
39
- enableColumnPinning = false,
40
+ enableRowPinning = false,
40
41
  enableRowSelection = false,
41
42
  enableSelectAll = true,
42
43
  enableSorting = true,
@@ -61,6 +62,7 @@ export const useMRT_TableOptions: <TData extends Record<string, any>>(
61
62
  positionToolbarAlertBanner = 'top',
62
63
  positionToolbarDropZone = 'top',
63
64
  rowNumberMode = 'static',
65
+ rowPinningDisplayMode = 'sticky',
64
66
  selectAllMode = 'page',
65
67
  sortingFns,
66
68
  ...rest
@@ -123,6 +125,7 @@ export const useMRT_TableOptions: <TData extends Record<string, any>>(
123
125
  enableColumnActions,
124
126
  enableColumnFilters,
125
127
  enableColumnOrdering,
128
+ enableColumnPinning,
126
129
  enableColumnResizing,
127
130
  enableDensityToggle,
128
131
  enableExpandAll,
@@ -137,7 +140,7 @@ export const useMRT_TableOptions: <TData extends Record<string, any>>(
137
140
  enableMultiRowSelection,
138
141
  enableMultiSort,
139
142
  enablePagination,
140
- enableColumnPinning,
143
+ enableRowPinning,
141
144
  enableRowSelection,
142
145
  enableSelectAll,
143
146
  enableSorting,
@@ -162,6 +165,7 @@ export const useMRT_TableOptions: <TData extends Record<string, any>>(
162
165
  positionToolbarAlertBanner,
163
166
  positionToolbarDropZone,
164
167
  rowNumberMode,
168
+ rowPinningDisplayMode,
165
169
  selectAllMode,
166
170
  sortingFns: _sortingFns,
167
171
  ...rest,
@@ -7,6 +7,7 @@ import {
7
7
  import TextField from '@mui/material/TextField';
8
8
  import MenuItem from '@mui/material/MenuItem';
9
9
  import { type TextFieldProps } from '@mui/material/TextField';
10
+ import { parseFromValuesOrFunc } from '../column.utils';
10
11
  import { type MRT_Cell, type MRT_TableInstance } from '../types';
11
12
 
12
13
  interface Props<TData extends Record<string, any>> {
@@ -36,24 +37,19 @@ export const MRT_EditCellTextField = <TData extends Record<string, any>>({
36
37
 
37
38
  const [value, setValue] = useState(() => cell.getValue<string>());
38
39
 
39
- const mTableBodyCellEditTextFieldProps =
40
- muiEditTextFieldProps instanceof Function
41
- ? muiEditTextFieldProps({ cell, column, row, table })
42
- : muiEditTextFieldProps;
43
-
44
- const mcTableBodyCellEditTextFieldProps =
45
- columnDef.muiEditTextFieldProps instanceof Function
46
- ? columnDef.muiEditTextFieldProps({
47
- cell,
48
- column,
49
- row,
50
- table,
51
- })
52
- : columnDef.muiEditTextFieldProps;
53
-
54
40
  const textFieldProps: TextFieldProps = {
55
- ...mTableBodyCellEditTextFieldProps,
56
- ...mcTableBodyCellEditTextFieldProps,
41
+ ...parseFromValuesOrFunc(muiEditTextFieldProps, {
42
+ cell,
43
+ column,
44
+ row,
45
+ table,
46
+ }),
47
+ ...parseFromValuesOrFunc(columnDef.muiEditTextFieldProps, {
48
+ cell,
49
+ column,
50
+ row,
51
+ table,
52
+ }),
57
53
  };
58
54
 
59
55
  const saveInputValueToRowCache = (newValue: string) => {
@@ -93,11 +89,7 @@ export const MRT_EditCellTextField = <TData extends Record<string, any>>({
93
89
 
94
90
  return (
95
91
  <TextField
96
- disabled={
97
- (columnDef.enableEditing instanceof Function
98
- ? columnDef.enableEditing(row)
99
- : columnDef.enableEditing) === false
100
- }
92
+ disabled={parseFromValuesOrFunc(columnDef.enableEditing, row) === false}
101
93
  fullWidth
102
94
  inputRef={(inputRef) => {
103
95
  if (inputRef) {
@@ -1,8 +1,8 @@
1
1
  import Checkbox from '@mui/material/Checkbox';
2
2
  import FormControlLabel from '@mui/material/FormControlLabel';
3
3
  import Tooltip from '@mui/material/Tooltip';
4
- import { type CheckboxProps } from '@mui/material/Checkbox';
5
4
  import { type MRT_Column, type MRT_TableInstance } from '../types';
5
+ import { parseFromValuesOrFunc } from '../column.utils';
6
6
 
7
7
  interface Props<TData extends Record<string, any>> {
8
8
  column: MRT_Column<TData>;
@@ -20,26 +20,16 @@ export const MRT_FilterCheckbox = <TData extends Record<string, any>>({
20
20
  const { density } = getState();
21
21
  const { columnDef } = column;
22
22
 
23
- const mTableHeadCellFilterCheckboxProps =
24
- muiFilterCheckboxProps instanceof Function
25
- ? muiFilterCheckboxProps({
26
- column,
27
- table,
28
- })
29
- : muiFilterCheckboxProps;
30
-
31
- const mcTableHeadCellFilterCheckboxProps =
32
- columnDef.muiFilterCheckboxProps instanceof Function
33
- ? columnDef.muiFilterCheckboxProps({
34
- column,
35
- table,
36
- })
37
- : columnDef.muiFilterCheckboxProps;
38
-
39
23
  const checkboxProps = {
40
- ...mTableHeadCellFilterCheckboxProps,
41
- ...mcTableHeadCellFilterCheckboxProps,
42
- } as CheckboxProps;
24
+ ...parseFromValuesOrFunc(muiFilterCheckboxProps, {
25
+ column,
26
+ table,
27
+ }),
28
+ ...parseFromValuesOrFunc(columnDef.muiFilterCheckboxProps, {
29
+ column,
30
+ table,
31
+ }),
32
+ };
43
33
 
44
34
  const filterLabel = localization.filterByColumn?.replace(
45
35
  '{column}',
@@ -80,9 +70,7 @@ export const MRT_FilterCheckbox = <TData extends Record<string, any>>({
80
70
  sx={(theme) => ({
81
71
  height: '2.5rem',
82
72
  width: '2.5rem',
83
- ...(checkboxProps?.sx instanceof Function
84
- ? checkboxProps.sx(theme)
85
- : (checkboxProps?.sx as any)),
73
+ ...(parseFromValuesOrFunc(checkboxProps?.sx, theme) as any),
86
74
  })}
87
75
  />
88
76
  }
@@ -1,8 +1,9 @@
1
- import Slider, { type SliderProps } from '@mui/material/Slider';
1
+ import Slider from '@mui/material/Slider';
2
2
  import Stack from '@mui/material/Stack';
3
3
  import FormHelperText from '@mui/material/FormHelperText';
4
4
  import { type MRT_TableInstance, type MRT_Header } from '../types';
5
5
  import { useEffect, useRef, useState } from 'react';
6
+ import { parseFromValuesOrFunc } from '../column.utils';
6
7
 
7
8
  interface Props<TData extends Record<string, any>> {
8
9
  header: MRT_Header<TData>;
@@ -25,26 +26,10 @@ export const MRT_FilterRangeSlider = <TData extends Record<string, any>>({
25
26
  const showChangeModeButton =
26
27
  enableColumnFilterModes && columnDef.enableColumnFilterModes !== false;
27
28
 
28
- const mFilterSliderProps =
29
- muiFilterSliderProps instanceof Function
30
- ? muiFilterSliderProps({
31
- column,
32
- table,
33
- })
34
- : muiFilterSliderProps;
35
-
36
- const mcFilterSliderProps =
37
- columnDef.muiFilterSliderProps instanceof Function
38
- ? columnDef.muiFilterSliderProps({
39
- column,
40
- table,
41
- })
42
- : columnDef.muiFilterSliderProps;
43
-
44
29
  const sliderProps = {
45
- ...mFilterSliderProps,
46
- ...mcFilterSliderProps,
47
- } as SliderProps;
30
+ ...parseFromValuesOrFunc(muiFilterSliderProps, { column, table }),
31
+ ...parseFromValuesOrFunc(columnDef.muiFilterSliderProps, { column, table }),
32
+ };
48
33
 
49
34
  let [min, max] =
50
35
  sliderProps.min !== undefined && sliderProps.max !== undefined
@@ -114,9 +99,7 @@ export const MRT_FilterRangeSlider = <TData extends Record<string, any>>({
114
99
  mt: !showChangeModeButton ? '10px' : '6px',
115
100
  px: '4px',
116
101
  width: 'calc(100% - 8px)',
117
- ...(sliderProps?.sx instanceof Function
118
- ? sliderProps.sx(theme)
119
- : (sliderProps?.sx as any)),
102
+ ...(parseFromValuesOrFunc(sliderProps?.sx, theme) as any),
120
103
  })}
121
104
  />
122
105
  {showChangeModeButton ? (
@@ -19,6 +19,7 @@ import { debounce } from '@mui/material/utils';
19
19
  import { MRT_FilterOptionMenu } from '../menus/MRT_FilterOptionMenu';
20
20
  import { type TextFieldProps } from '@mui/material/TextField';
21
21
  import { type MRT_Header, type MRT_TableInstance } from '../types';
22
+ import { parseFromValuesOrFunc } from '../column.utils';
22
23
 
23
24
  interface Props<TData extends Record<string, any>> {
24
25
  header: MRT_Header<TData>;
@@ -46,28 +47,13 @@ export const MRT_FilterTextField = <TData extends Record<string, any>>({
46
47
  const { column } = header;
47
48
  const { columnDef } = column;
48
49
 
49
- const mTableHeadCellFilterTextFieldProps =
50
- muiFilterTextFieldProps instanceof Function
51
- ? muiFilterTextFieldProps({
52
- column,
53
- table,
54
- rangeFilterIndex,
55
- })
56
- : muiFilterTextFieldProps;
57
-
58
- const mcTableHeadCellFilterTextFieldProps =
59
- columnDef.muiFilterTextFieldProps instanceof Function
60
- ? columnDef.muiFilterTextFieldProps({
61
- column,
62
- table,
63
- rangeFilterIndex,
64
- })
65
- : columnDef.muiFilterTextFieldProps;
66
-
67
- const textFieldProps = {
68
- ...mTableHeadCellFilterTextFieldProps,
69
- ...mcTableHeadCellFilterTextFieldProps,
70
- } as TextFieldProps;
50
+ const textFieldProps: TextFieldProps = {
51
+ ...parseFromValuesOrFunc(muiFilterTextFieldProps, { column, table }),
52
+ ...parseFromValuesOrFunc(columnDef.muiFilterTextFieldProps, {
53
+ column,
54
+ table,
55
+ }),
56
+ };
71
57
 
72
58
  const isRangeFilter =
73
59
  columnDef.filterVariant === 'range' || rangeFilterIndex !== undefined;
@@ -358,9 +344,7 @@ export const MRT_FilterTextField = <TData extends Record<string, any>>({
358
344
  '& .MuiSelect-icon': {
359
345
  mr: '1.5rem',
360
346
  },
361
- ...(textFieldProps?.sx instanceof Function
362
- ? textFieldProps.sx(theme)
363
- : (textFieldProps?.sx as any)),
347
+ ...(parseFromValuesOrFunc(textFieldProps?.sx, theme) as any),
364
348
  })}
365
349
  >
366
350
  {(isSelectFilter || isMultiSelectFilter) && (
@@ -14,6 +14,7 @@ import Tooltip from '@mui/material/Tooltip';
14
14
  import { debounce } from '@mui/material/utils';
15
15
  import { MRT_FilterOptionMenu } from '../menus/MRT_FilterOptionMenu';
16
16
  import { type MRT_TableInstance } from '../types';
17
+ import { parseFromValuesOrFunc } from '../column.utils';
17
18
 
18
19
  interface Props<TData extends Record<string, any>> {
19
20
  table: MRT_TableInstance<TData>;
@@ -36,10 +37,9 @@ export const MRT_GlobalFilterTextField = <TData extends Record<string, any>>({
36
37
  } = table;
37
38
  const { globalFilter, showGlobalFilter } = getState();
38
39
 
39
- const textFieldProps =
40
- muiSearchTextFieldProps instanceof Function
41
- ? muiSearchTextFieldProps({ table })
42
- : muiSearchTextFieldProps;
40
+ const textFieldProps = parseFromValuesOrFunc(muiSearchTextFieldProps, {
41
+ table,
42
+ });
43
43
 
44
44
  const isMounted = useRef(false);
45
45
  const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
@@ -1,9 +1,10 @@
1
1
  import { type MouseEvent } from 'react';
2
- import Checkbox from '@mui/material/Checkbox';
2
+ import Checkbox, { type CheckboxProps } from '@mui/material/Checkbox';
3
3
  import Tooltip from '@mui/material/Tooltip';
4
- import Radio from '@mui/material/Radio';
4
+ import Radio, { type RadioProps } from '@mui/material/Radio';
5
5
  import { type Theme } from '@mui/material/styles';
6
6
  import { type MRT_Row, type MRT_TableInstance } from '../types';
7
+ import { parseFromValuesOrFunc } from '../column.utils';
7
8
 
8
9
  interface Props<TData extends Record<string, any>> {
9
10
  row?: MRT_Row<TData>;
@@ -21,6 +22,8 @@ export const MRT_SelectCheckbox = <TData extends Record<string, any>>({
21
22
  options: {
22
23
  localization,
23
24
  enableMultiRowSelection,
25
+ rowPinningDisplayMode,
26
+ enableRowPinning,
24
27
  muiSelectCheckboxProps,
25
28
  muiSelectAllCheckboxProps,
26
29
  selectAllMode,
@@ -29,12 +32,8 @@ export const MRT_SelectCheckbox = <TData extends Record<string, any>>({
29
32
  const { density, isLoading } = getState();
30
33
 
31
34
  const checkboxProps = !row
32
- ? muiSelectAllCheckboxProps instanceof Function
33
- ? muiSelectAllCheckboxProps({ table })
34
- : muiSelectAllCheckboxProps
35
- : muiSelectCheckboxProps instanceof Function
36
- ? muiSelectCheckboxProps({ row, table })
37
- : muiSelectCheckboxProps;
35
+ ? parseFromValuesOrFunc(muiSelectAllCheckboxProps, { table })
36
+ : parseFromValuesOrFunc(muiSelectCheckboxProps, { row, table });
38
37
 
39
38
  const allRowsSelected = selectAll
40
39
  ? selectAllMode === 'page'
@@ -50,11 +49,27 @@ export const MRT_SelectCheckbox = <TData extends Record<string, any>>({
50
49
  ? localization.toggleSelectAll
51
50
  : localization.toggleSelectRow,
52
51
  },
53
- onChange: row
54
- ? row.getToggleSelectedHandler()
55
- : selectAllMode === 'all'
56
- ? table.getToggleAllRowsSelectedHandler()
57
- : table.getToggleAllPageRowsSelectedHandler(),
52
+ onChange: (event) => {
53
+ event.stopPropagation();
54
+ row
55
+ ? row.getToggleSelectedHandler()(event)
56
+ : selectAllMode === 'all'
57
+ ? table.getToggleAllRowsSelectedHandler()(event)
58
+ : table.getToggleAllPageRowsSelectedHandler()(event);
59
+ if (enableRowPinning && rowPinningDisplayMode?.includes('select')) {
60
+ if (row) {
61
+ row.pin(
62
+ !row.getIsPinned() && event.target.checked
63
+ ? rowPinningDisplayMode?.includes('bottom')
64
+ ? 'bottom'
65
+ : 'top'
66
+ : false,
67
+ );
68
+ } else {
69
+ table.setRowPinning({ bottom: [], top: [] });
70
+ }
71
+ }
72
+ },
58
73
  size: (density === 'compact' ? 'small' : 'medium') as 'small' | 'medium',
59
74
  ...checkboxProps,
60
75
  onClick: (e: MouseEvent<HTMLButtonElement>) => {
@@ -65,12 +80,11 @@ export const MRT_SelectCheckbox = <TData extends Record<string, any>>({
65
80
  height: density === 'compact' ? '1.75rem' : '2.5rem',
66
81
  width: density === 'compact' ? '1.75rem' : '2.5rem',
67
82
  m: density !== 'compact' ? '-0.4rem' : undefined,
68
- ...(checkboxProps?.sx instanceof Function
69
- ? checkboxProps.sx(theme)
70
- : (checkboxProps?.sx as any)),
83
+ zIndex: 0,
84
+ ...parseFromValuesOrFunc(checkboxProps?.sx, theme),
71
85
  }),
72
86
  title: undefined,
73
- };
87
+ } as CheckboxProps | RadioProps;
74
88
 
75
89
  return (
76
90
  <Tooltip
package/src/locales/en.ts CHANGED
@@ -14,7 +14,6 @@ export const MRT_Localization_EN: MRT_Localization = {
14
14
  collapseAll: 'Collapse all',
15
15
  columnActions: 'Column Actions',
16
16
  copiedToClipboard: 'Copied to clipboard',
17
-
18
17
  dropToGroupBy: 'Drop to group by {column}',
19
18
  edit: 'Edit',
20
19
  expand: 'Expand',
@@ -60,6 +59,7 @@ export const MRT_Localization_EN: MRT_Localization = {
60
59
  noResultsFound: 'No results found',
61
60
  of: 'of',
62
61
  or: 'or',
62
+ pin: 'Pin',
63
63
  pinToLeft: 'Pin to left',
64
64
  pinToRight: 'Pin to right',
65
65
  resetColumnSize: 'Reset column size',
@@ -8,6 +8,7 @@ import {
8
8
  commonMenuItemStyles,
9
9
  } from './MRT_ColumnActionMenu';
10
10
  import { type MRT_Row, type MRT_TableInstance } from '../types';
11
+ import { parseFromValuesOrFunc } from '../column.utils';
11
12
 
12
13
  interface Props<TData extends Record<string, any>> {
13
14
  anchorEl: HTMLElement | null;
@@ -45,18 +46,16 @@ export const MRT_RowActionMenu = <TData extends Record<string, any>>({
45
46
  dense: density === 'compact',
46
47
  }}
47
48
  >
48
- {enableEditing instanceof Function
49
- ? enableEditing(row)
50
- : enableEditing && (
51
- <MenuItem onClick={handleEdit} sx={commonMenuItemStyles}>
52
- <Box sx={commonListItemStyles}>
53
- <ListItemIcon>
54
- <EditIcon />
55
- </ListItemIcon>
56
- {localization.edit}
57
- </Box>
58
- </MenuItem>
59
- )}
49
+ {parseFromValuesOrFunc(enableEditing, row) && (
50
+ <MenuItem onClick={handleEdit} sx={commonMenuItemStyles}>
51
+ <Box sx={commonListItemStyles}>
52
+ <ListItemIcon>
53
+ <EditIcon />
54
+ </ListItemIcon>
55
+ {localization.edit}
56
+ </Box>
57
+ </MenuItem>
58
+ )}
60
59
  {renderRowActionMenuItems?.({
61
60
  row,
62
61
  table,
@@ -6,6 +6,7 @@ import Stack from '@mui/material/Stack';
6
6
  import { MRT_EditActionButtons } from '../buttons/MRT_EditActionButtons';
7
7
  import { MRT_EditCellTextField } from '../inputs/MRT_EditCellTextField';
8
8
  import { type MRT_Row, type MRT_TableInstance } from '../types';
9
+ import { parseFromValuesOrFunc } from '../column.utils';
9
10
 
10
11
  interface Props<TData extends Record<string, any>> {
11
12
  open: boolean;
@@ -33,19 +34,10 @@ export const MRT_EditRowModal = <TData extends Record<string, any>>({
33
34
  const { creatingRow, editingRow } = getState();
34
35
  const row = (creatingRow ?? editingRow) as MRT_Row<TData>;
35
36
 
36
- const createModalProps =
37
- muiCreateRowModalProps instanceof Function
38
- ? muiCreateRowModalProps({ row, table })
39
- : muiCreateRowModalProps;
40
-
41
- const editModalProps =
42
- muiEditRowModalProps instanceof Function
43
- ? muiEditRowModalProps({ row, table })
44
- : muiEditRowModalProps;
45
-
46
37
  const dialogProps = {
47
- ...editModalProps,
48
- ...(creatingRow && createModalProps),
38
+ ...parseFromValuesOrFunc(muiEditRowModalProps, { row, table }),
39
+ ...(creatingRow &&
40
+ parseFromValuesOrFunc(muiCreateRowModalProps, { row, table })),
49
41
  };
50
42
 
51
43
  const internalEditComponents = row
@@ -90,7 +82,7 @@ export const MRT_EditRowModal = <TData extends Record<string, any>>({
90
82
  })) ?? (
91
83
  <>
92
84
  <DialogTitle sx={{ textAlign: 'center' }}>
93
- {(creatingRow && localization.create) || localization.edit}
85
+ {localization.edit}
94
86
  </DialogTitle>
95
87
  <DialogContent>
96
88
  <form onSubmit={(e) => e.preventDefault()}>
@@ -9,7 +9,7 @@ import Table from '@mui/material/Table';
9
9
  import { MRT_TableHead } from '../head/MRT_TableHead';
10
10
  import { Memo_MRT_TableBody, MRT_TableBody } from '../body/MRT_TableBody';
11
11
  import { MRT_TableFooter } from '../footer/MRT_TableFooter';
12
- import { parseCSSVarId } from '../column.utils';
12
+ import { parseCSSVarId, parseFromValuesOrFunc } from '../column.utils';
13
13
  import { type MRT_TableInstance } from '../types';
14
14
 
15
15
  interface Props<TData extends Record<string, any>> {
@@ -46,15 +46,12 @@ export const MRT_Table = <TData extends Record<string, any>>({
46
46
  isFullScreen,
47
47
  } = getState();
48
48
 
49
- const tableProps =
50
- muiTableProps instanceof Function
51
- ? muiTableProps({ table })
52
- : muiTableProps;
49
+ const tableProps = parseFromValuesOrFunc(muiTableProps, { table });
53
50
 
54
- const vProps =
55
- columnVirtualizerOptions instanceof Function
56
- ? columnVirtualizerOptions({ table })
57
- : columnVirtualizerOptions;
51
+ const columnVirtualizerProps = parseFromValuesOrFunc(
52
+ columnVirtualizerOptions,
53
+ { table },
54
+ );
58
55
 
59
56
  const columnSizeVars = useMemo(() => {
60
57
  const headers = getFlatHeaders();
@@ -115,7 +112,7 @@ export const MRT_Table = <TData extends Record<string, any>>({
115
112
  ],
116
113
  [leftPinnedIndexes, rightPinnedIndexes],
117
114
  ),
118
- ...vProps,
115
+ ...columnVirtualizerProps,
119
116
  })
120
117
  : undefined;
121
118
 
@@ -155,9 +152,7 @@ export const MRT_Table = <TData extends Record<string, any>>({
155
152
  display: layoutMode === 'grid' ? 'grid' : 'table',
156
153
  tableLayout:
157
154
  layoutMode !== 'grid' && enableColumnResizing ? 'fixed' : undefined,
158
- ...(tableProps?.sx instanceof Function
159
- ? tableProps.sx(theme)
160
- : (tableProps?.sx as any)),
155
+ ...(parseFromValuesOrFunc(tableProps?.sx, theme) as any),
161
156
  })}
162
157
  style={{ ...columnSizeVars, ...tableProps?.style }}
163
158
  >
@@ -3,6 +3,7 @@ import TableContainer from '@mui/material/TableContainer';
3
3
  import { MRT_Table } from './MRT_Table';
4
4
  import { MRT_EditRowModal } from '../modals';
5
5
  import { type MRT_TableInstance } from '../types';
6
+ import { parseFromValuesOrFunc } from '../column.utils';
6
7
 
7
8
  const useIsomorphicLayoutEffect =
8
9
  typeof window !== 'undefined' ? useLayoutEffect : useEffect;
@@ -24,18 +25,13 @@ export const MRT_TableContainer = <TData extends Record<string, any>>({
24
25
  },
25
26
  refs: { tableContainerRef, bottomToolbarRef, topToolbarRef },
26
27
  } = table;
27
- const {
28
- isFullScreen,
29
- creatingRow,
30
- editingRow,
31
- } = getState();
28
+ const { isFullScreen, creatingRow, editingRow } = getState();
32
29
 
33
30
  const [totalToolbarHeight, setTotalToolbarHeight] = useState(0);
34
31
 
35
- const tableContainerProps =
36
- muiTableContainerProps instanceof Function
37
- ? muiTableContainerProps({ table })
38
- : muiTableContainerProps;
32
+ const tableContainerProps = parseFromValuesOrFunc(muiTableContainerProps, {
33
+ table,
34
+ });
39
35
 
40
36
  useIsomorphicLayoutEffect(() => {
41
37
  const topToolbarHeight =
@@ -72,9 +68,7 @@ export const MRT_TableContainer = <TData extends Record<string, any>>({
72
68
  ? `clamp(350px, calc(100vh - ${totalToolbarHeight}px), 9999px)`
73
69
  : undefined,
74
70
  overflow: 'auto',
75
- ...(tableContainerProps?.sx instanceof Function
76
- ? tableContainerProps.sx(theme)
77
- : (tableContainerProps?.sx as any)),
71
+ ...(parseFromValuesOrFunc(tableContainerProps?.sx, theme) as any),
78
72
  })}
79
73
  style={{
80
74
  maxHeight: isFullScreen