material-react-table 2.11.3 → 2.12.0

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.11.3",
2
+ "version": "2.12.0",
3
3
  "license": "MIT",
4
4
  "name": "material-react-table",
5
5
  "description": "A fully featured Material UI V5 implementation of TanStack React Table V8, written from the ground up in TypeScript.",
@@ -71,17 +71,17 @@
71
71
  "@mui/x-date-pickers": "^6.19.4",
72
72
  "@rollup/plugin-typescript": "^11.1.6",
73
73
  "@size-limit/preset-small-lib": "^11.0.2",
74
- "@storybook/addon-a11y": "^7.6.15",
75
- "@storybook/addon-essentials": "^7.6.15",
76
- "@storybook/addon-interactions": "^7.6.15",
77
- "@storybook/addon-links": "^7.6.15",
78
- "@storybook/addon-storysource": "^7.6.15",
79
- "@storybook/blocks": "^7.6.15",
80
- "@storybook/react": "^7.6.15",
81
- "@storybook/react-vite": "^7.6.15",
74
+ "@storybook/addon-a11y": "^7.6.16",
75
+ "@storybook/addon-essentials": "^7.6.16",
76
+ "@storybook/addon-interactions": "^7.6.16",
77
+ "@storybook/addon-links": "^7.6.16",
78
+ "@storybook/addon-storysource": "^7.6.16",
79
+ "@storybook/blocks": "^7.6.16",
80
+ "@storybook/react": "^7.6.16",
81
+ "@storybook/react-vite": "^7.6.16",
82
82
  "@storybook/testing-library": "^0.2.2",
83
- "@types/node": "^20.11.17",
84
- "@types/react": "^18.2.55",
83
+ "@types/node": "^20.11.19",
84
+ "@types/react": "^18.2.56",
85
85
  "@types/react-dom": "^18.2.19",
86
86
  "@typescript-eslint/eslint-plugin": "^7.0.1",
87
87
  "@typescript-eslint/parser": "^7.0.1",
@@ -99,11 +99,11 @@
99
99
  "rollup-plugin-dts": "^6.1.0",
100
100
  "rollup-plugin-peer-deps-external": "^2.2.4",
101
101
  "size-limit": "^11.0.2",
102
- "storybook": "^7.6.15",
102
+ "storybook": "^7.6.16",
103
103
  "storybook-dark-mode": "^3.0.3",
104
104
  "tslib": "^2.6.2",
105
105
  "typescript": "^5.3.3",
106
- "vite": "^5.1.1"
106
+ "vite": "^5.1.3"
107
107
  },
108
108
  "peerDependencies": {
109
109
  "@emotion/react": ">=11.11",
@@ -111,13 +111,13 @@
111
111
  "@mui/icons-material": ">=5.11",
112
112
  "@mui/material": ">=5.13",
113
113
  "@mui/x-date-pickers": ">=6.15.0",
114
- "react": ">=18.0",
115
- "react-dom": ">=18.0"
114
+ "react": ">=17.0",
115
+ "react-dom": ">=17.0"
116
116
  },
117
117
  "dependencies": {
118
118
  "@tanstack/match-sorter-utils": "8.11.8",
119
119
  "@tanstack/react-table": "8.12.0",
120
- "@tanstack/react-virtual": "3.0.4",
120
+ "@tanstack/react-virtual": "3.1.1",
121
121
  "highlight-words": "1.2.2"
122
122
  }
123
123
  }
@@ -210,6 +210,12 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
210
210
  }
211
211
  };
212
212
 
213
+ const handleDragOver = (e: DragEvent) => {
214
+ if (columnDef.enableColumnOrdering !== false) {
215
+ e.preventDefault();
216
+ }
217
+ };
218
+
213
219
  const handleContextMenu = (e: MouseEvent<HTMLTableCellElement>) => {
214
220
  tableCellProps?.onContextMenu?.(e);
215
221
  if (isRightClickable) {
@@ -228,6 +234,7 @@ export const MRT_TableBodyCell = <TData extends MRT_RowData>({
228
234
  onContextMenu={handleContextMenu}
229
235
  onDoubleClick={handleDoubleClick}
230
236
  onDragEnter={handleDragEnter}
237
+ onDragOver={handleDragOver}
231
238
  sx={(theme) => ({
232
239
  '&:hover': {
233
240
  outline:
@@ -140,6 +140,10 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
140
140
  }
141
141
  };
142
142
 
143
+ const handleDragOver = (e: DragEvent) => {
144
+ e.preventDefault();
145
+ };
146
+
143
147
  const rowRef = useRef<HTMLTableRowElement | null>(null);
144
148
 
145
149
  const cellHighlightColor = isRowSelected
@@ -164,6 +168,7 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
164
168
  data-pinned={!!isRowPinned || undefined}
165
169
  data-selected={isRowSelected || undefined}
166
170
  onDragEnter={handleDragEnter}
171
+ onDragOver={handleDragOver}
167
172
  ref={(node: HTMLTableRowElement) => {
168
173
  if (node) {
169
174
  rowRef.current = node;
@@ -34,7 +34,6 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
34
34
  getState,
35
35
  getVisibleLeafColumns,
36
36
  options: {
37
- enableRowVirtualization,
38
37
  layoutMode,
39
38
  mrtTheme: { baseBackgroundColor },
40
39
  muiDetailPanelProps,
@@ -93,14 +92,12 @@ export const MRT_TableDetailPanel = <TData extends MRT_RowData>({
93
92
  borderBottom: !row.getIsExpanded() ? 'none' : undefined,
94
93
  display: layoutMode?.startsWith('grid') ? 'flex' : undefined,
95
94
  py: !!DetailPanel && row.getIsExpanded() ? '1rem' : 0,
96
- transition: !enableRowVirtualization
97
- ? 'all 150ms ease-in-out'
98
- : undefined,
95
+ transition: !virtualRow ? 'all 150ms ease-in-out' : undefined,
99
96
  width: `100%`,
100
97
  ...(parseFromValuesOrFunc(tableCellProps?.sx, theme) as any),
101
98
  })}
102
99
  >
103
- {enableRowVirtualization ? (
100
+ {virtualRow ? (
104
101
  row.getIsExpanded() && DetailPanel
105
102
  ) : (
106
103
  <Collapse in={row.getIsExpanded()} mountOnEnter unmountOnExit>
@@ -20,8 +20,6 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
20
20
  ...rest
21
21
  }: MRT_TableHeadProps<TData>) => {
22
22
  const {
23
- getHeaderGroups,
24
- getSelectedRowModel,
25
23
  getState,
26
24
  options: {
27
25
  enableStickyHeader,
@@ -60,7 +58,7 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
60
58
  })}
61
59
  >
62
60
  {positionToolbarAlertBanner === 'head-overlay' &&
63
- (showAlertBanner || getSelectedRowModel().rows.length > 0) ? (
61
+ (showAlertBanner || table.getSelectedRowModel().rows.length > 0) ? (
64
62
  <tr
65
63
  style={{
66
64
  display: layoutMode?.startsWith('grid') ? 'grid' : undefined,
@@ -77,14 +75,16 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
77
75
  </th>
78
76
  </tr>
79
77
  ) : (
80
- getHeaderGroups().map((headerGroup) => (
81
- <MRT_TableHeadRow
82
- columnVirtualizer={columnVirtualizer}
83
- headerGroup={headerGroup as any}
84
- key={headerGroup.id}
85
- table={table}
86
- />
87
- ))
78
+ table
79
+ .getHeaderGroups()
80
+ .map((headerGroup) => (
81
+ <MRT_TableHeadRow
82
+ columnVirtualizer={columnVirtualizer}
83
+ headerGroup={headerGroup as any}
84
+ key={headerGroup.id}
85
+ table={table}
86
+ />
87
+ ))
88
88
  )}
89
89
  </TableHead>
90
90
  );
@@ -141,6 +141,12 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
141
141
  }
142
142
  };
143
143
 
144
+ const handleDragOver = (e: DragEvent) => {
145
+ if (columnDef.enableColumnOrdering !== false) {
146
+ e.preventDefault();
147
+ }
148
+ };
149
+
144
150
  const HeaderElement =
145
151
  parseFromValuesOrFunc(columnDef.Header, {
146
152
  column,
@@ -161,6 +167,7 @@ export const MRT_TableHeadCell = <TData extends MRT_RowData>({
161
167
  data-index={staticColumnIndex}
162
168
  data-pinned={!!isColumnPinned || undefined}
163
169
  onDragEnter={handleDragEnter}
170
+ onDragOver={handleDragOver}
164
171
  ref={(node: HTMLTableCellElement) => {
165
172
  if (node) {
166
173
  tableHeadCellRefs.current[column.id] = node;
@@ -4,6 +4,7 @@ import {
4
4
  type MRT_RowData,
5
5
  type MRT_TableInstance,
6
6
  } from '../../types';
7
+ import { getColumnFilterInfo } from '../../utils/column.utils';
7
8
  import { MRT_FilterCheckbox } from '../inputs/MRT_FilterCheckbox';
8
9
  import { MRT_FilterRangeFields } from '../inputs/MRT_FilterRangeFields';
9
10
  import { MRT_FilterRangeSlider } from '../inputs/MRT_FilterRangeSlider';
@@ -28,6 +29,7 @@ export const MRT_TableHeadCellFilterContainer = <TData extends MRT_RowData>({
28
29
  const { showColumnFilters } = getState();
29
30
  const { column } = header;
30
31
  const { columnDef } = column;
32
+ const { isRangeFilter } = getColumnFilterInfo({ header, table });
31
33
 
32
34
  return (
33
35
  <Collapse
@@ -40,10 +42,7 @@ export const MRT_TableHeadCellFilterContainer = <TData extends MRT_RowData>({
40
42
  <MRT_FilterCheckbox column={column} table={table} />
41
43
  ) : columnDef.filterVariant === 'range-slider' ? (
42
44
  <MRT_FilterRangeSlider header={header} table={table} />
43
- ) : columnDef.filterVariant?.includes('range') ||
44
- ['between', 'betweenInclusive', 'inNumberRange'].includes(
45
- columnDef._filterFn,
46
- ) ? (
45
+ ) : isRangeFilter ? (
47
46
  <MRT_FilterRangeFields header={header} table={table} />
48
47
  ) : (
49
48
  <MRT_FilterTextField header={header} table={table} />
@@ -10,7 +10,11 @@ import {
10
10
  type MRT_RowData,
11
11
  type MRT_TableInstance,
12
12
  } from '../../types';
13
- import { parseFromValuesOrFunc } from '../../utils/utils';
13
+ import {
14
+ getColumnFilterInfo,
15
+ useDropdownOptions,
16
+ } from '../../utils/column.utils';
17
+ import { getValueAndLabel, parseFromValuesOrFunc } from '../../utils/utils';
14
18
 
15
19
  export interface MRT_TableHeadCellFilterLabelProps<TData extends MRT_RowData>
16
20
  extends IconButtonProps {
@@ -35,20 +39,32 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
35
39
  const { column } = header;
36
40
  const { columnDef } = column;
37
41
 
38
- const filterValue = column.getFilterValue();
42
+ const filterValue = column.getFilterValue() as [string, string] | string;
39
43
 
40
44
  const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
41
45
 
46
+ const {
47
+ currentFilterOption,
48
+ isMultiSelectFilter,
49
+ isRangeFilter,
50
+ isSelectFilter,
51
+ } = getColumnFilterInfo({ header, table });
52
+
53
+ const dropdownOptions = useDropdownOptions({ header, table });
54
+
55
+ const getSelectLabel = (index?: number) =>
56
+ getValueAndLabel(
57
+ dropdownOptions?.find(
58
+ (option) =>
59
+ getValueAndLabel(option).value ===
60
+ (index !== undefined ? filterValue[index] : filterValue),
61
+ ),
62
+ ).label;
63
+
42
64
  const isFilterActive =
43
65
  (Array.isArray(filterValue) && filterValue.some(Boolean)) ||
44
66
  (!!filterValue && !Array.isArray(filterValue));
45
67
 
46
- const isRangeFilter =
47
- columnDef.filterVariant?.includes('range') ||
48
- ['between', 'betweenInclusive', 'inNumberRange'].includes(
49
- columnDef._filterFn,
50
- );
51
- const currentFilterOption = columnDef._filterFn;
52
68
  const filterTooltip =
53
69
  columnFilterDisplayMode === 'popover' && !isFilterActive
54
70
  ? localization.filterByColumn?.replace(
@@ -73,10 +89,16 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
73
89
  '{filterValue}',
74
90
  `"${
75
91
  Array.isArray(filterValue)
76
- ? (filterValue as [string, string]).join(
77
- `" ${isRangeFilter ? localization.and : localization.or} "`,
78
- )
79
- : (filterValue as string)
92
+ ? (filterValue as [string, string])
93
+ .map((value, index) =>
94
+ isMultiSelectFilter ? getSelectLabel(index) : value,
95
+ )
96
+ .join(
97
+ `" ${isRangeFilter ? localization.and : localization.or} "`,
98
+ )
99
+ : isSelectFilter
100
+ ? getSelectLabel()
101
+ : (filterValue as string)
80
102
  }"`,
81
103
  )
82
104
  .replace('" "', '');
@@ -126,31 +148,33 @@ export const MRT_TableHeadCellFilterLabel = <TData extends MRT_RowData = {}>({
126
148
  </Tooltip>
127
149
  </Box>
128
150
  </Grow>
129
- <Popover
130
- anchorEl={anchorEl}
131
- anchorOrigin={{
132
- horizontal: 'center',
133
- vertical: 'top',
134
- }}
135
- disableScrollLock
136
- onClick={(event) => event.stopPropagation()}
137
- onClose={(event) => {
138
- //@ts-ignore
139
- event.stopPropagation();
140
- setAnchorEl(null);
141
- }}
142
- onKeyDown={(event) => event.key === 'Enter' && setAnchorEl(null)}
143
- open={!!anchorEl}
144
- slotProps={{ paper: { sx: { overflow: 'visible' } } }}
145
- transformOrigin={{
146
- horizontal: 'center',
147
- vertical: 'bottom',
148
- }}
149
- >
150
- <Box sx={{ p: '1rem' }}>
151
- <MRT_TableHeadCellFilterContainer header={header} table={table} />
152
- </Box>
153
- </Popover>
151
+ {columnFilterDisplayMode === 'popover' && (
152
+ <Popover
153
+ anchorEl={anchorEl}
154
+ anchorOrigin={{
155
+ horizontal: 'center',
156
+ vertical: 'top',
157
+ }}
158
+ disableScrollLock
159
+ onClick={(event) => event.stopPropagation()}
160
+ onClose={(event) => {
161
+ //@ts-ignore
162
+ event.stopPropagation();
163
+ setAnchorEl(null);
164
+ }}
165
+ onKeyDown={(event) => event.key === 'Enter' && setAnchorEl(null)}
166
+ open={!!anchorEl}
167
+ slotProps={{ paper: { sx: { overflow: 'visible' } } }}
168
+ transformOrigin={{
169
+ horizontal: 'center',
170
+ vertical: 'bottom',
171
+ }}
172
+ >
173
+ <Box sx={{ p: '1rem' }}>
174
+ <MRT_TableHeadCellFilterContainer header={header} table={table} />
175
+ </Box>
176
+ </Popover>
177
+ )}
154
178
  </>
155
179
  );
156
180
  };
@@ -28,8 +28,14 @@ export const MRT_FilterRangeFields = <TData extends MRT_RowData>({
28
28
  ...(parseFromValuesOrFunc(rest?.sx, theme) as any),
29
29
  })}
30
30
  >
31
- <MRT_FilterTextField header={header} rangeFilterIndex={0} table={table} />
32
- <MRT_FilterTextField header={header} rangeFilterIndex={1} table={table} />
31
+ {[0, 1].map((rangeFilterIndex) => (
32
+ <MRT_FilterTextField
33
+ header={header}
34
+ key={rangeFilterIndex}
35
+ rangeFilterIndex={rangeFilterIndex}
36
+ table={table}
37
+ />
38
+ ))}
33
39
  </Box>
34
40
  );
35
41
  };
@@ -3,7 +3,6 @@ import {
3
3
  type MouseEvent,
4
4
  useCallback,
5
5
  useEffect,
6
- useMemo,
7
6
  useRef,
8
7
  useState,
9
8
  } from 'react';
@@ -35,6 +34,10 @@ import {
35
34
  type MRT_RowData,
36
35
  type MRT_TableInstance,
37
36
  } from '../../types';
37
+ import {
38
+ getColumnFilterInfo,
39
+ useDropdownOptions,
40
+ } from '../../utils/column.utils';
38
41
  import { getValueAndLabel, parseFromValuesOrFunc } from '../../utils/utils';
39
42
  import { MRT_FilterOptionMenu } from '../menus/MRT_FilterOptionMenu';
40
43
 
@@ -53,7 +56,6 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
53
56
  }: MRT_FilterTextFieldProps<TData>) => {
54
57
  const {
55
58
  options: {
56
- columnFilterModeOptions,
57
59
  enableColumnFilterModes,
58
60
  icons: { CloseIcon, FilterListIcon },
59
61
  localization,
@@ -112,17 +114,20 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
112
114
  }),
113
115
  };
114
116
 
115
- const isDateFilter =
116
- filterVariant?.startsWith('date') || filterVariant?.startsWith('time');
117
- const isAutocompleteFilter = filterVariant === 'autocomplete';
118
- const isRangeFilter =
119
- filterVariant?.includes('range') || rangeFilterIndex !== undefined;
120
- const isSelectFilter = filterVariant === 'select';
121
- const isMultiSelectFilter = filterVariant === 'multi-select';
122
- const isTextboxFilter =
123
- ['autocomplete', 'text'].includes(filterVariant!) ||
124
- (!isSelectFilter && !isMultiSelectFilter);
125
- const currentFilterOption = columnDef._filterFn;
117
+ const {
118
+ allowedColumnFilterOptions,
119
+ currentFilterOption,
120
+ facetedUniqueValues,
121
+ isAutocompleteFilter,
122
+ isDateFilter,
123
+ isMultiSelectFilter,
124
+ isRangeFilter,
125
+ isSelectFilter,
126
+ isTextboxFilter,
127
+ } = getColumnFilterInfo({ header, table });
128
+
129
+ const dropdownOptions = useDropdownOptions({ header, table });
130
+
126
131
  const filterChipLabel = ['empty', 'notEmpty'].includes(currentFilterOption)
127
132
  ? //@ts-ignore
128
133
  localization[
@@ -132,6 +137,7 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
132
137
  }`
133
138
  ]
134
139
  : '';
140
+
135
141
  const filterPlaceholder = !isRangeFilter
136
142
  ? textFieldProps?.placeholder ??
137
143
  localization.filterByColumn?.replace('{column}', String(columnDef.header))
@@ -140,16 +146,14 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
140
146
  : rangeFilterIndex === 1
141
147
  ? localization.max
142
148
  : '';
143
- const allowedColumnFilterOptions =
144
- columnDef?.columnFilterModeOptions ?? columnFilterModeOptions;
145
- const showChangeModeButton =
149
+
150
+ const showChangeModeButton = !!(
146
151
  enableColumnFilterModes &&
147
152
  columnDef.enableColumnFilterModes !== false &&
148
153
  !rangeFilterIndex &&
149
154
  (allowedColumnFilterOptions === undefined ||
150
- !!allowedColumnFilterOptions?.length);
151
-
152
- const facetedUniqueValues = column.getFacetedUniqueValues();
155
+ !!allowedColumnFilterOptions?.length)
156
+ );
153
157
 
154
158
  const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
155
159
  const [filterValue, setFilterValue] = useState<string | string[]>(() =>
@@ -257,23 +261,6 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
257
261
  );
258
262
  }
259
263
 
260
- const dropdownOptions = useMemo(
261
- () =>
262
- columnDef.filterSelectOptions ??
263
- ((isSelectFilter || isMultiSelectFilter || isAutocompleteFilter) &&
264
- facetedUniqueValues
265
- ? Array.from(facetedUniqueValues.keys())
266
- .filter((value) => value !== null && value !== undefined)
267
- .sort((a, b) => a.localeCompare(b))
268
- : undefined),
269
- [
270
- columnDef.filterSelectOptions,
271
- facetedUniqueValues,
272
- isMultiSelectFilter,
273
- isSelectFilter,
274
- ],
275
- );
276
-
277
264
  const endAdornment =
278
265
  !isAutocompleteFilter && !isDateFilter && !filterChipLabel ? (
279
266
  <InputAdornment
@@ -447,8 +434,12 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
447
434
  ) : isAutocompleteFilter ? (
448
435
  <Autocomplete
449
436
  freeSolo
450
- getOptionLabel={(option) => getValueAndLabel(option).label}
451
- onChange={(_e, newValue) => handleAutocompleteChange(newValue)}
437
+ getOptionLabel={(option: DropdownOption) =>
438
+ getValueAndLabel(option).label
439
+ }
440
+ onChange={(_e, newValue: DropdownOption) =>
441
+ handleAutocompleteChange(newValue)
442
+ }
452
443
  options={
453
444
  dropdownOptions?.map((option) => getValueAndLabel(option)) ?? []
454
445
  }
@@ -48,16 +48,16 @@ export const MRT_TablePaper = <TData extends MRT_RowData>({
48
48
  ...(isFullScreen
49
49
  ? {
50
50
  bottom: 0,
51
- height: '100vh',
51
+ height: '100dvh',
52
52
  left: 0,
53
53
  margin: 0,
54
- maxHeight: '100vh',
55
- maxWidth: '100vw',
54
+ maxHeight: '100dvh',
55
+ maxWidth: '100dvw',
56
56
  padding: 0,
57
57
  position: 'fixed',
58
58
  right: 0,
59
59
  top: 0,
60
- width: '100vw',
60
+ width: '100dvw',
61
61
  zIndex: 999,
62
62
  }
63
63
  : {}),
@@ -29,6 +29,10 @@ export const MRT_ToolbarDropZone = <TData extends MRT_RowData>({
29
29
  setHoveredColumn({ id: 'drop-zone' });
30
30
  };
31
31
 
32
+ const handleDragOver = (e: DragEvent) => {
33
+ e.preventDefault();
34
+ };
35
+
32
36
  useEffect(() => {
33
37
  if (table.options.state?.showToolbarDropZone !== undefined) {
34
38
  setShowToolbarDropZone(
@@ -45,6 +49,7 @@ export const MRT_ToolbarDropZone = <TData extends MRT_RowData>({
45
49
  <Box
46
50
  className="Mui-ToolbarDropZone"
47
51
  onDragEnter={handleDragEnter}
52
+ onDragOver={handleDragOver}
48
53
  {...rest}
49
54
  sx={(theme) => ({
50
55
  alignItems: 'center',
@@ -8,7 +8,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
8
8
 
9
9
  export const getMRT_RowActionsColumnDef = <TData extends MRT_RowData>(
10
10
  tableOptions: MRT_StatefulTableOptions<TData>,
11
- ): MRT_ColumnDef<TData> | null => {
11
+ ): MRT_ColumnDef<TData> => {
12
12
  return {
13
13
  Cell: ({ cell, row, staticRowIndex, table }) => (
14
14
  <MRT_ToggleRowActionMenuButton
@@ -9,7 +9,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
9
9
 
10
10
  export const getMRT_RowDragColumnDef = <TData extends MRT_RowData>(
11
11
  tableOptions: MRT_StatefulTableOptions<TData>,
12
- ): MRT_ColumnDef<TData> | null => {
12
+ ): MRT_ColumnDef<TData> => {
13
13
  return {
14
14
  Cell: ({ row, rowRef, table }) => (
15
15
  <MRT_TableBodyRowGrabHandle
@@ -13,7 +13,7 @@ import { getCommonTooltipProps } from '../../utils/style.utils';
13
13
 
14
14
  export const getMRT_RowExpandColumnDef = <TData extends MRT_RowData>(
15
15
  tableOptions: MRT_StatefulTableOptions<TData>,
16
- ): MRT_ColumnDef<TData> | null => {
16
+ ): MRT_ColumnDef<TData> => {
17
17
  const {
18
18
  defaultColumn,
19
19
  enableExpandAll,
@@ -7,7 +7,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
7
7
 
8
8
  export const getMRT_RowNumbersColumnDef = <TData extends MRT_RowData>(
9
9
  tableOptions: MRT_StatefulTableOptions<TData>,
10
- ): MRT_ColumnDef<TData> | null => {
10
+ ): MRT_ColumnDef<TData> => {
11
11
  const { localization, rowNumberDisplayMode } = tableOptions;
12
12
  const {
13
13
  pagination: { pageIndex, pageSize },
@@ -8,7 +8,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
8
8
 
9
9
  export const getMRT_RowPinningColumnDef = <TData extends MRT_RowData>(
10
10
  tableOptions: MRT_StatefulTableOptions<TData>,
11
- ): MRT_ColumnDef<TData> | null => {
11
+ ): MRT_ColumnDef<TData> => {
12
12
  return {
13
13
  Cell: ({ row, table }) => (
14
14
  <MRT_TableBodyRowPinButton row={row} table={table} />
@@ -8,7 +8,7 @@ import { defaultDisplayColumnProps } from '../../utils/displayColumn.utils';
8
8
 
9
9
  export const getMRT_RowSelectColumnDef = <TData extends MRT_RowData>(
10
10
  tableOptions: MRT_StatefulTableOptions<TData>,
11
- ): MRT_ColumnDef<TData> | null => {
11
+ ): MRT_ColumnDef<TData> => {
12
12
  const { enableMultiRowSelection, enableSelectAll } = tableOptions;
13
13
 
14
14
  return {
@@ -17,7 +17,7 @@ const blankColProps = {
17
17
 
18
18
  export const getMRT_RowSpacerColumnDef = <TData extends MRT_RowData>(
19
19
  tableOptions: MRT_StatefulTableOptions<TData>,
20
- ): MRT_ColumnDef<TData> | null => {
20
+ ): MRT_ColumnDef<TData> => {
21
21
  return {
22
22
  ...defaultDisplayColumnProps({
23
23
  id: 'mrt-row-spacer',