material-react-table 2.3.0 → 2.4.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/dist/index.d.ts +47 -33
- package/dist/index.esm.js +67 -44
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +67 -44
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/src/body/MRT_TableBody.tsx +11 -17
- package/src/body/MRT_TableBodyRow.tsx +6 -7
- package/src/buttons/MRT_EditActionButtons.tsx +12 -9
- package/src/footer/MRT_TableFooter.tsx +8 -7
- package/src/footer/MRT_TableFooterRow.tsx +5 -4
- package/src/head/MRT_TableHead.tsx +8 -7
- package/src/head/MRT_TableHeadCellColumnActionsButton.tsx +3 -1
- package/src/head/MRT_TableHeadRow.tsx +5 -4
- package/src/hooks/useMRT_ColumnVirtualizer.ts +9 -10
- package/src/hooks/useMRT_RowVirtualizer.ts +11 -9
- package/src/hooks/useMRT_Rows.ts +1 -8
- package/src/inputs/MRT_FilterTextField.tsx +69 -6
- package/src/inputs/MRT_SelectCheckbox.tsx +2 -1
- package/src/menus/MRT_FilterOptionMenu.tsx +1 -1
- package/src/table/MRT_Table.tsx +3 -11
- package/src/toolbar/MRT_TablePagination.tsx +33 -24
- package/src/types.ts +53 -10
package/package.json
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"version": "2.
|
2
|
+
"version": "2.4.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.",
|
@@ -66,8 +66,8 @@
|
|
66
66
|
"@emotion/react": "^11.11.3",
|
67
67
|
"@emotion/styled": "^11.11.0",
|
68
68
|
"@faker-js/faker": "^8.3.1",
|
69
|
-
"@mui/icons-material": "^5.15.
|
70
|
-
"@mui/material": "^5.15.
|
69
|
+
"@mui/icons-material": "^5.15.3",
|
70
|
+
"@mui/material": "^5.15.3",
|
71
71
|
"@mui/x-date-pickers": "^6.18.6",
|
72
72
|
"@rollup/plugin-typescript": "^11.1.5",
|
73
73
|
"@size-limit/preset-small-lib": "^11.0.1",
|
@@ -113,8 +113,8 @@
|
|
113
113
|
"react-dom": ">=18.0"
|
114
114
|
},
|
115
115
|
"dependencies": {
|
116
|
-
"@tanstack/match-sorter-utils": "8.
|
117
|
-
"@tanstack/react-table": "8.11.
|
116
|
+
"@tanstack/match-sorter-utils": "8.11.3",
|
117
|
+
"@tanstack/react-table": "8.11.3",
|
118
118
|
"@tanstack/react-virtual": "3.0.1",
|
119
119
|
"highlight-words": "1.2.2"
|
120
120
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { memo, useMemo } from 'react';
|
2
|
-
import { type VirtualItem
|
2
|
+
import { type VirtualItem } from '@tanstack/react-virtual';
|
3
3
|
import TableBody, { type TableBodyProps } from '@mui/material/TableBody';
|
4
4
|
import Typography from '@mui/material/Typography';
|
5
5
|
import { MRT_TableBodyRow, Memo_MRT_TableBodyRow } from './MRT_TableBodyRow';
|
@@ -7,25 +7,22 @@ import { parseFromValuesOrFunc } from '../column.utils';
|
|
7
7
|
import { useMRT_RowVirtualizer } from '../hooks';
|
8
8
|
import { useMRT_Rows } from '../hooks/useMRT_Rows';
|
9
9
|
import {
|
10
|
+
type MRT_ColumnVirtualizer,
|
10
11
|
type MRT_Row,
|
11
12
|
type MRT_RowData,
|
12
13
|
type MRT_TableInstance,
|
13
14
|
} from '../types';
|
14
15
|
|
15
16
|
interface Props<TData extends MRT_RowData> extends TableBodyProps {
|
16
|
-
columnVirtualizer?:
|
17
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
17
18
|
table: MRT_TableInstance<TData>;
|
18
19
|
virtualColumns?: VirtualItem[];
|
19
|
-
virtualPaddingLeft?: number;
|
20
|
-
virtualPaddingRight?: number;
|
21
20
|
}
|
22
21
|
|
23
22
|
export const MRT_TableBody = <TData extends MRT_RowData>({
|
24
23
|
columnVirtualizer,
|
25
24
|
table,
|
26
25
|
virtualColumns,
|
27
|
-
virtualPaddingLeft,
|
28
|
-
virtualPaddingRight,
|
29
26
|
...rest
|
30
27
|
}: Props<TData>) => {
|
31
28
|
const {
|
@@ -62,17 +59,16 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
|
|
62
59
|
const tableFooterHeight =
|
63
60
|
(enableStickyFooter && tableFooterRef.current?.clientHeight) || 0;
|
64
61
|
|
65
|
-
const pinnedRowIds = useMemo(
|
66
|
-
()
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
);
|
62
|
+
const pinnedRowIds = useMemo(() => {
|
63
|
+
if (!rowPinning.bottom?.length && !rowPinning.top?.length) return [];
|
64
|
+
return getRowModel()
|
65
|
+
.rows.filter((row) => row.getIsPinned())
|
66
|
+
.map((r) => r.id);
|
67
|
+
}, [rowPinning, getRowModel().rows]);
|
72
68
|
|
73
|
-
const rows = useMRT_Rows(table);
|
69
|
+
const rows = useMRT_Rows(table, pinnedRowIds);
|
74
70
|
|
75
|
-
const rowVirtualizer = useMRT_RowVirtualizer(table);
|
71
|
+
const rowVirtualizer = useMRT_RowVirtualizer(table, rows);
|
76
72
|
|
77
73
|
const virtualRows = rowVirtualizer
|
78
74
|
? rowVirtualizer.getVirtualItems()
|
@@ -83,8 +79,6 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
|
|
83
79
|
numRows: rows.length,
|
84
80
|
table,
|
85
81
|
virtualColumns,
|
86
|
-
virtualPaddingLeft,
|
87
|
-
virtualPaddingRight,
|
88
82
|
};
|
89
83
|
|
90
84
|
const CreatingRow = creatingRow && createDisplayMode === 'row' && (
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { type DragEvent, memo, useMemo, useRef } from 'react';
|
2
|
-
import { type VirtualItem
|
2
|
+
import { type VirtualItem } from '@tanstack/react-virtual';
|
3
3
|
import TableRow from '@mui/material/TableRow';
|
4
4
|
import {
|
5
5
|
type Theme,
|
@@ -14,13 +14,14 @@ import { parseFromValuesOrFunc } from '../column.utils';
|
|
14
14
|
import { getMRTTheme } from '../style.utils';
|
15
15
|
import {
|
16
16
|
type MRT_Cell,
|
17
|
+
type MRT_ColumnVirtualizer,
|
17
18
|
type MRT_Row,
|
18
19
|
type MRT_RowData,
|
19
20
|
type MRT_TableInstance,
|
20
21
|
} from '../types';
|
21
22
|
|
22
23
|
interface Props<TData extends MRT_RowData> {
|
23
|
-
columnVirtualizer?:
|
24
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
24
25
|
measureElement?: (element: HTMLTableRowElement) => void;
|
25
26
|
numRows?: number;
|
26
27
|
pinnedRowIds?: string[];
|
@@ -28,8 +29,6 @@ interface Props<TData extends MRT_RowData> {
|
|
28
29
|
rowIndex: number;
|
29
30
|
table: MRT_TableInstance<TData>;
|
30
31
|
virtualColumns?: VirtualItem[];
|
31
|
-
virtualPaddingLeft?: number;
|
32
|
-
virtualPaddingRight?: number;
|
33
32
|
virtualRow?: VirtualItem;
|
34
33
|
}
|
35
34
|
|
@@ -42,8 +41,6 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
|
|
42
41
|
rowIndex,
|
43
42
|
table,
|
44
43
|
virtualColumns,
|
45
|
-
virtualPaddingLeft,
|
46
|
-
virtualPaddingRight,
|
47
44
|
virtualRow,
|
48
45
|
}: Props<TData>) => {
|
49
46
|
const theme = useTheme();
|
@@ -75,6 +72,8 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
|
|
75
72
|
rowPinning,
|
76
73
|
} = getState();
|
77
74
|
|
75
|
+
const { virtualPaddingLeft, virtualPaddingRight } = columnVirtualizer ?? {};
|
76
|
+
|
78
77
|
const isPinned = enableRowPinning && row.getIsPinned();
|
79
78
|
|
80
79
|
const tableRowProps = parseFromValuesOrFunc(muiTableBodyRowProps, {
|
@@ -219,7 +218,7 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
|
|
219
218
|
rowIndex,
|
220
219
|
rowRef,
|
221
220
|
table,
|
222
|
-
|
221
|
+
virtualColumnIndex: columnVirtualizer
|
223
222
|
? (cellOrVirtualCell as VirtualItem).index
|
224
223
|
: undefined,
|
225
224
|
};
|
@@ -98,15 +98,18 @@ export const MRT_EditActionButtons = <TData extends MRT_RowData>({
|
|
98
98
|
<CancelIcon />
|
99
99
|
</IconButton>
|
100
100
|
</Tooltip>
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
101
|
+
{((isCreating && onCreatingRowSave) ||
|
102
|
+
(isEditing && onEditingRowSave)) && (
|
103
|
+
<Tooltip title={localization.save}>
|
104
|
+
<IconButton
|
105
|
+
aria-label={localization.save}
|
106
|
+
color="info"
|
107
|
+
onClick={handleSubmitRow}
|
108
|
+
>
|
109
|
+
{isSaving ? <CircularProgress size={18} /> : <SaveIcon />}
|
110
|
+
</IconButton>
|
111
|
+
</Tooltip>
|
112
|
+
)}
|
110
113
|
</>
|
111
114
|
) : (
|
112
115
|
<>
|
@@ -2,20 +2,22 @@ import { type VirtualItem } from '@tanstack/react-virtual';
|
|
2
2
|
import TableFooter, { type TableFooterProps } from '@mui/material/TableFooter';
|
3
3
|
import { MRT_TableFooterRow } from './MRT_TableFooterRow';
|
4
4
|
import { parseFromValuesOrFunc } from '../column.utils';
|
5
|
-
import {
|
5
|
+
import {
|
6
|
+
type MRT_ColumnVirtualizer,
|
7
|
+
type MRT_RowData,
|
8
|
+
type MRT_TableInstance,
|
9
|
+
} from '../types';
|
6
10
|
|
7
11
|
interface Props<TData extends MRT_RowData> extends TableFooterProps {
|
12
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
8
13
|
table: MRT_TableInstance<TData>;
|
9
14
|
virtualColumns?: VirtualItem[];
|
10
|
-
virtualPaddingLeft?: number;
|
11
|
-
virtualPaddingRight?: number;
|
12
15
|
}
|
13
16
|
|
14
17
|
export const MRT_TableFooter = <TData extends MRT_RowData>({
|
18
|
+
columnVirtualizer,
|
15
19
|
table,
|
16
20
|
virtualColumns,
|
17
|
-
virtualPaddingLeft,
|
18
|
-
virtualPaddingRight,
|
19
21
|
...rest
|
20
22
|
}: Props<TData>) => {
|
21
23
|
const {
|
@@ -62,12 +64,11 @@ export const MRT_TableFooter = <TData extends MRT_RowData>({
|
|
62
64
|
>
|
63
65
|
{getFooterGroups().map((footerGroup) => (
|
64
66
|
<MRT_TableFooterRow
|
67
|
+
columnVirtualizer={columnVirtualizer}
|
65
68
|
footerGroup={footerGroup as any}
|
66
69
|
key={footerGroup.id}
|
67
70
|
table={table}
|
68
71
|
virtualColumns={virtualColumns}
|
69
|
-
virtualPaddingLeft={virtualPaddingLeft}
|
70
|
-
virtualPaddingRight={virtualPaddingRight}
|
71
72
|
/>
|
72
73
|
))}
|
73
74
|
</TableFooter>
|
@@ -4,6 +4,7 @@ import { MRT_TableFooterCell } from './MRT_TableFooterCell';
|
|
4
4
|
import { parseFromValuesOrFunc } from '../column.utils';
|
5
5
|
import { getMRTTheme } from '../style.utils';
|
6
6
|
import {
|
7
|
+
type MRT_ColumnVirtualizer,
|
7
8
|
type MRT_Header,
|
8
9
|
type MRT_HeaderGroup,
|
9
10
|
type MRT_RowData,
|
@@ -11,25 +12,25 @@ import {
|
|
11
12
|
} from '../types';
|
12
13
|
|
13
14
|
interface Props<TData extends MRT_RowData> extends TableRowProps {
|
15
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
14
16
|
footerGroup: MRT_HeaderGroup<TData>;
|
15
17
|
table: MRT_TableInstance<TData>;
|
16
18
|
virtualColumns?: VirtualItem[];
|
17
|
-
virtualPaddingLeft?: number;
|
18
|
-
virtualPaddingRight?: number;
|
19
19
|
}
|
20
20
|
|
21
21
|
export const MRT_TableFooterRow = <TData extends MRT_RowData>({
|
22
|
+
columnVirtualizer,
|
22
23
|
footerGroup,
|
23
24
|
table,
|
24
25
|
virtualColumns,
|
25
|
-
virtualPaddingLeft,
|
26
|
-
virtualPaddingRight,
|
27
26
|
...rest
|
28
27
|
}: Props<TData>) => {
|
29
28
|
const {
|
30
29
|
options: { layoutMode, muiTableFooterRowProps },
|
31
30
|
} = table;
|
32
31
|
|
32
|
+
const { virtualPaddingLeft, virtualPaddingRight } = columnVirtualizer ?? {};
|
33
|
+
|
33
34
|
// if no content in row, skip row
|
34
35
|
if (
|
35
36
|
!footerGroup.headers?.some(
|
@@ -3,20 +3,22 @@ import TableHead, { type TableHeadProps } from '@mui/material/TableHead';
|
|
3
3
|
import { MRT_TableHeadRow } from './MRT_TableHeadRow';
|
4
4
|
import { parseFromValuesOrFunc } from '../column.utils';
|
5
5
|
import { MRT_ToolbarAlertBanner } from '../toolbar';
|
6
|
-
import {
|
6
|
+
import {
|
7
|
+
type MRT_ColumnVirtualizer,
|
8
|
+
type MRT_RowData,
|
9
|
+
type MRT_TableInstance,
|
10
|
+
} from '../types';
|
7
11
|
|
8
12
|
interface Props<TData extends MRT_RowData> extends TableHeadProps {
|
13
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
9
14
|
table: MRT_TableInstance<TData>;
|
10
15
|
virtualColumns?: VirtualItem[];
|
11
|
-
virtualPaddingLeft?: number;
|
12
|
-
virtualPaddingRight?: number;
|
13
16
|
}
|
14
17
|
|
15
18
|
export const MRT_TableHead = <TData extends MRT_RowData>({
|
19
|
+
columnVirtualizer,
|
16
20
|
table,
|
17
21
|
virtualColumns,
|
18
|
-
virtualPaddingLeft,
|
19
|
-
virtualPaddingRight,
|
20
22
|
...rest
|
21
23
|
}: Props<TData>) => {
|
22
24
|
const {
|
@@ -79,12 +81,11 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
|
|
79
81
|
) : (
|
80
82
|
getHeaderGroups().map((headerGroup) => (
|
81
83
|
<MRT_TableHeadRow
|
84
|
+
columnVirtualizer={columnVirtualizer}
|
82
85
|
headerGroup={headerGroup as any}
|
83
86
|
key={headerGroup.id}
|
84
87
|
table={table}
|
85
88
|
virtualColumns={virtualColumns}
|
86
|
-
virtualPaddingLeft={virtualPaddingLeft}
|
87
|
-
virtualPaddingRight={virtualPaddingRight}
|
88
89
|
/>
|
89
90
|
))
|
90
91
|
)}
|
@@ -77,7 +77,9 @@ export const MRT_TableHeadCellColumnActionsButton = <
|
|
77
77
|
})}
|
78
78
|
title={undefined}
|
79
79
|
>
|
80
|
-
|
80
|
+
{iconButtonProps?.children ?? (
|
81
|
+
<MoreVertIcon style={{ transform: 'scale(0.9)' }} />
|
82
|
+
)}
|
81
83
|
</IconButton>
|
82
84
|
</Tooltip>
|
83
85
|
{anchorEl && (
|
@@ -5,6 +5,7 @@ import { MRT_TableHeadCell } from './MRT_TableHeadCell';
|
|
5
5
|
import { parseFromValuesOrFunc } from '../column.utils';
|
6
6
|
import { getMRTTheme } from '../style.utils';
|
7
7
|
import {
|
8
|
+
type MRT_ColumnVirtualizer,
|
8
9
|
type MRT_Header,
|
9
10
|
type MRT_HeaderGroup,
|
10
11
|
type MRT_RowData,
|
@@ -12,25 +13,25 @@ import {
|
|
12
13
|
} from '../types';
|
13
14
|
|
14
15
|
interface Props<TData extends MRT_RowData> extends TableRowProps {
|
16
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
15
17
|
headerGroup: MRT_HeaderGroup<TData>;
|
16
18
|
table: MRT_TableInstance<TData>;
|
17
19
|
virtualColumns?: VirtualItem[];
|
18
|
-
virtualPaddingLeft?: number;
|
19
|
-
virtualPaddingRight?: number;
|
20
20
|
}
|
21
21
|
|
22
22
|
export const MRT_TableHeadRow = <TData extends MRT_RowData>({
|
23
|
+
columnVirtualizer,
|
23
24
|
headerGroup,
|
24
25
|
table,
|
25
26
|
virtualColumns,
|
26
|
-
virtualPaddingLeft,
|
27
|
-
virtualPaddingRight,
|
28
27
|
...rest
|
29
28
|
}: Props<TData>) => {
|
30
29
|
const {
|
31
30
|
options: { layoutMode, muiTableHeadRowProps },
|
32
31
|
} = table;
|
33
32
|
|
33
|
+
const { virtualPaddingLeft, virtualPaddingRight } = columnVirtualizer ?? {};
|
34
|
+
|
34
35
|
const tableRowProps = {
|
35
36
|
...parseFromValuesOrFunc(muiTableHeadRowProps, {
|
36
37
|
headerGroup,
|
@@ -1,14 +1,17 @@
|
|
1
1
|
import { useCallback, useMemo } from 'react';
|
2
2
|
import {
|
3
3
|
type Range,
|
4
|
-
type Virtualizer,
|
5
4
|
useVirtualizer,
|
6
5
|
} from '@tanstack/react-virtual';
|
7
6
|
import {
|
8
7
|
extraIndexRangeExtractor,
|
9
8
|
parseFromValuesOrFunc,
|
10
9
|
} from '../column.utils';
|
11
|
-
import {
|
10
|
+
import {
|
11
|
+
type MRT_ColumnVirtualizer,
|
12
|
+
type MRT_RowData,
|
13
|
+
type MRT_TableInstance,
|
14
|
+
} from '../types';
|
12
15
|
|
13
16
|
export const useMRT_ColumnVirtualizer = <
|
14
17
|
TData extends MRT_RowData,
|
@@ -16,12 +19,7 @@ export const useMRT_ColumnVirtualizer = <
|
|
16
19
|
TItemElement extends Element = HTMLTableCellElement,
|
17
20
|
>(
|
18
21
|
table: MRT_TableInstance<TData>,
|
19
|
-
):
|
20
|
-
| (Virtualizer<TScrollElement, TItemElement> & {
|
21
|
-
virtualPaddingLeft?: number;
|
22
|
-
virtualPaddingRight?: number;
|
23
|
-
})
|
24
|
-
| undefined => {
|
22
|
+
): MRT_ColumnVirtualizer | undefined => {
|
25
23
|
const {
|
26
24
|
getState,
|
27
25
|
options: {
|
@@ -59,8 +57,9 @@ export const useMRT_ColumnVirtualizer = <
|
|
59
57
|
|
60
58
|
//get first 16 column widths and average them if calc is needed
|
61
59
|
const averageColumnWidth = useMemo(() => {
|
62
|
-
if (!enableColumnVirtualization || columnVirtualizerProps?.estimateSize)
|
60
|
+
if (!enableColumnVirtualization || columnVirtualizerProps?.estimateSize) {
|
63
61
|
return 0;
|
62
|
+
}
|
64
63
|
const columnsWidths =
|
65
64
|
table
|
66
65
|
.getRowModel()
|
@@ -98,7 +97,7 @@ export const useMRT_ColumnVirtualizer = <
|
|
98
97
|
[leftPinnedIndexes, rightPinnedIndexes, draggingColumnIndex],
|
99
98
|
),
|
100
99
|
...columnVirtualizerProps,
|
101
|
-
}) as unknown as
|
100
|
+
}) as unknown as MRT_ColumnVirtualizer<TScrollElement, TItemElement>)
|
102
101
|
: undefined;
|
103
102
|
|
104
103
|
if (columnVirtualizerInstanceRef && columnVirtualizer) {
|
@@ -1,14 +1,15 @@
|
|
1
1
|
import { useCallback } from 'react';
|
2
|
-
import {
|
3
|
-
type Range,
|
4
|
-
type Virtualizer,
|
5
|
-
useVirtualizer,
|
6
|
-
} from '@tanstack/react-virtual';
|
2
|
+
import { type Range, useVirtualizer } from '@tanstack/react-virtual';
|
7
3
|
import {
|
8
4
|
extraIndexRangeExtractor,
|
9
5
|
parseFromValuesOrFunc,
|
10
6
|
} from '../column.utils';
|
11
|
-
import {
|
7
|
+
import {
|
8
|
+
type MRT_Row,
|
9
|
+
type MRT_RowData,
|
10
|
+
type MRT_RowVirtualizer,
|
11
|
+
type MRT_TableInstance,
|
12
|
+
} from '../types';
|
12
13
|
|
13
14
|
export const useMRT_RowVirtualizer = <
|
14
15
|
TData extends MRT_RowData,
|
@@ -16,7 +17,8 @@ export const useMRT_RowVirtualizer = <
|
|
16
17
|
TItemElement extends Element = HTMLTableRowElement,
|
17
18
|
>(
|
18
19
|
table: MRT_TableInstance<TData>,
|
19
|
-
|
20
|
+
rows?: MRT_Row<TData>[],
|
21
|
+
): MRT_RowVirtualizer<TScrollElement, TItemElement> | undefined => {
|
20
22
|
const {
|
21
23
|
getRowModel,
|
22
24
|
getState,
|
@@ -35,7 +37,7 @@ export const useMRT_RowVirtualizer = <
|
|
35
37
|
|
36
38
|
const rowVirtualizer = enableRowVirtualization
|
37
39
|
? (useVirtualizer({
|
38
|
-
count: getRowModel().rows.length,
|
40
|
+
count: rows?.length ?? getRowModel().rows.length,
|
39
41
|
estimateSize: () =>
|
40
42
|
density === 'compact' ? 37 : density === 'comfortable' ? 58 : 73,
|
41
43
|
getScrollElement: () => tableContainerRef.current,
|
@@ -52,7 +54,7 @@ export const useMRT_RowVirtualizer = <
|
|
52
54
|
[draggingRow],
|
53
55
|
),
|
54
56
|
...rowVirtualizerProps,
|
55
|
-
}) as unknown as
|
57
|
+
}) as unknown as MRT_RowVirtualizer<TScrollElement, TItemElement>)
|
56
58
|
: undefined;
|
57
59
|
|
58
60
|
if (rowVirtualizerInstanceRef && rowVirtualizer) {
|
package/src/hooks/useMRT_Rows.ts
CHANGED
@@ -9,6 +9,7 @@ import {
|
|
9
9
|
|
10
10
|
export const useMRT_Rows = <TData extends MRT_RowData>(
|
11
11
|
table: MRT_TableInstance<TData>,
|
12
|
+
pinnedRowIds: string[] = [],
|
12
13
|
): MRT_Row<TData>[] => {
|
13
14
|
const {
|
14
15
|
getBottomRows,
|
@@ -49,14 +50,6 @@ export const useMRT_Rows = <TData extends MRT_RowData>(
|
|
49
50
|
],
|
50
51
|
);
|
51
52
|
|
52
|
-
const pinnedRowIds = useMemo(
|
53
|
-
() =>
|
54
|
-
getRowModel()
|
55
|
-
.rows.filter((row) => row.getIsPinned())
|
56
|
-
.map((r) => r.id),
|
57
|
-
[rowPinning, table.getRowModel().rows],
|
58
|
-
);
|
59
|
-
|
60
53
|
const rows = useMemo(() => {
|
61
54
|
let rows: MRT_Row<TData>[] = [];
|
62
55
|
if (!shouldRankRows) {
|
@@ -21,6 +21,14 @@ import {
|
|
21
21
|
DatePicker,
|
22
22
|
type DatePickerProps,
|
23
23
|
} from '@mui/x-date-pickers/DatePicker';
|
24
|
+
import {
|
25
|
+
DateTimePicker,
|
26
|
+
type DateTimePickerProps,
|
27
|
+
} from '@mui/x-date-pickers/DateTimePicker';
|
28
|
+
import {
|
29
|
+
TimePicker,
|
30
|
+
type TimePickerProps,
|
31
|
+
} from '@mui/x-date-pickers/TimePicker';
|
24
32
|
import { getValueAndLabel, parseFromValuesOrFunc } from '../column.utils';
|
25
33
|
import { MRT_FilterOptionMenu } from '../menus/MRT_FilterOptionMenu';
|
26
34
|
import {
|
@@ -50,7 +58,9 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
|
|
50
58
|
manualFiltering,
|
51
59
|
muiFilterAutocompleteProps,
|
52
60
|
muiFilterDatePickerProps,
|
61
|
+
muiFilterDateTimePickerProps,
|
53
62
|
muiFilterTextFieldProps,
|
63
|
+
muiFilterTimePickerProps,
|
54
64
|
},
|
55
65
|
refs: { filterInputRefs },
|
56
66
|
setColumnFilterFns,
|
@@ -84,7 +94,24 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
|
|
84
94
|
}),
|
85
95
|
};
|
86
96
|
|
87
|
-
const
|
97
|
+
const dateTimePickerProps: DateTimePickerProps<any> = {
|
98
|
+
...parseFromValuesOrFunc(muiFilterDateTimePickerProps, { column, table }),
|
99
|
+
...parseFromValuesOrFunc(columnDef.muiFilterDateTimePickerProps, {
|
100
|
+
column,
|
101
|
+
table,
|
102
|
+
}),
|
103
|
+
};
|
104
|
+
|
105
|
+
const timePickerProps: TimePickerProps<any> = {
|
106
|
+
...parseFromValuesOrFunc(muiFilterTimePickerProps, { column, table }),
|
107
|
+
...parseFromValuesOrFunc(columnDef.muiFilterTimePickerProps, {
|
108
|
+
column,
|
109
|
+
table,
|
110
|
+
}),
|
111
|
+
};
|
112
|
+
|
113
|
+
const isDateFilter =
|
114
|
+
filterVariant?.startsWith('date') || filterVariant?.startsWith('time');
|
88
115
|
const isAutocompleteFilter = filterVariant === 'autocomplete';
|
89
116
|
const isRangeFilter =
|
90
117
|
filterVariant?.includes('range') || rangeFilterIndex !== undefined;
|
@@ -350,14 +377,50 @@ export const MRT_FilterTextField = <TData extends MRT_RowData>({
|
|
350
377
|
}),
|
351
378
|
};
|
352
379
|
|
380
|
+
const commonDatePickerProps = {
|
381
|
+
onChange: (newDate: any) => {
|
382
|
+
handleChange(newDate);
|
383
|
+
},
|
384
|
+
value: filterValue || null,
|
385
|
+
};
|
386
|
+
|
353
387
|
return (
|
354
388
|
<>
|
355
|
-
{
|
356
|
-
<
|
357
|
-
|
358
|
-
|
389
|
+
{filterVariant?.startsWith('time') ? (
|
390
|
+
<TimePicker
|
391
|
+
{...commonDatePickerProps}
|
392
|
+
{...timePickerProps}
|
393
|
+
slotProps={{
|
394
|
+
field: {
|
395
|
+
clearable: true,
|
396
|
+
onClear: () => handleClear(),
|
397
|
+
...timePickerProps?.slotProps?.field,
|
398
|
+
},
|
399
|
+
textField: {
|
400
|
+
...commonTextFieldProps,
|
401
|
+
...timePickerProps?.slotProps?.textField,
|
402
|
+
},
|
403
|
+
}}
|
404
|
+
/>
|
405
|
+
) : filterVariant?.startsWith('datetime') ? (
|
406
|
+
<DateTimePicker
|
407
|
+
{...commonDatePickerProps}
|
408
|
+
{...dateTimePickerProps}
|
409
|
+
slotProps={{
|
410
|
+
field: {
|
411
|
+
clearable: true,
|
412
|
+
onClear: () => handleClear(),
|
413
|
+
...dateTimePickerProps?.slotProps?.field,
|
414
|
+
},
|
415
|
+
textField: {
|
416
|
+
...commonTextFieldProps,
|
417
|
+
...dateTimePickerProps?.slotProps?.textField,
|
418
|
+
},
|
359
419
|
}}
|
360
|
-
|
420
|
+
/>
|
421
|
+
) : filterVariant?.startsWith('date') ? (
|
422
|
+
<DatePicker
|
423
|
+
{...commonDatePickerProps}
|
361
424
|
{...datePickerProps}
|
362
425
|
slotProps={{
|
363
426
|
field: {
|
@@ -51,7 +51,8 @@ export const MRT_SelectCheckbox = <TData extends MRT_RowData>({
|
|
51
51
|
|
52
52
|
const commonProps = {
|
53
53
|
checked: selectAll ? allRowsSelected : row?.getIsSelected(),
|
54
|
-
disabled:
|
54
|
+
disabled:
|
55
|
+
isLoading || (row && !row.getCanSelect()) || row?.id === 'mrt-row-create',
|
55
56
|
inputProps: {
|
56
57
|
'aria-label': selectAll
|
57
58
|
? localization.toggleSelectAll
|
@@ -103,7 +103,7 @@ export const mrtFilterOptions = (
|
|
103
103
|
const rangeModes = ['between', 'betweenInclusive', 'inNumberRange'];
|
104
104
|
const emptyModes = ['empty', 'notEmpty'];
|
105
105
|
const arrModes = ['arrIncludesSome', 'arrIncludesAll', 'arrIncludes'];
|
106
|
-
const rangeVariants = ['range-slider', 'date-range', 'range'];
|
106
|
+
const rangeVariants = ['range-slider', 'date-range', 'datetime-range', 'range'];
|
107
107
|
|
108
108
|
interface Props<TData extends MRT_RowData> extends Partial<MenuProps> {
|
109
109
|
anchorEl: HTMLElement | null;
|
package/src/table/MRT_Table.tsx
CHANGED
@@ -53,22 +53,14 @@ export const MRT_Table = <TData extends MRT_RowData>({
|
|
53
53
|
|
54
54
|
const columnVirtualizer = useMRT_ColumnVirtualizer(table);
|
55
55
|
|
56
|
-
const { virtualPaddingLeft, virtualPaddingRight } = columnVirtualizer ?? {};
|
57
|
-
|
58
56
|
const virtualColumns = columnVirtualizer
|
59
57
|
? columnVirtualizer.getVirtualItems()
|
60
58
|
: undefined;
|
61
59
|
|
62
60
|
const commonTableGroupProps = {
|
61
|
+
columnVirtualizer,
|
63
62
|
table,
|
64
63
|
virtualColumns,
|
65
|
-
virtualPaddingLeft,
|
66
|
-
virtualPaddingRight,
|
67
|
-
};
|
68
|
-
|
69
|
-
const commonTableBodyProps = {
|
70
|
-
...commonTableGroupProps,
|
71
|
-
columnVirtualizer,
|
72
64
|
};
|
73
65
|
|
74
66
|
return (
|
@@ -84,9 +76,9 @@ export const MRT_Table = <TData extends MRT_RowData>({
|
|
84
76
|
>
|
85
77
|
{enableTableHead && <MRT_TableHead {...commonTableGroupProps} />}
|
86
78
|
{memoMode === 'table-body' || columnSizingInfo.isResizingColumn ? (
|
87
|
-
<Memo_MRT_TableBody {...
|
79
|
+
<Memo_MRT_TableBody {...commonTableGroupProps} />
|
88
80
|
) : (
|
89
|
-
<MRT_TableBody {...
|
81
|
+
<MRT_TableBody {...commonTableGroupProps} />
|
90
82
|
)}
|
91
83
|
{enableTableFooter && <MRT_TableFooter {...commonTableGroupProps} />}
|
92
84
|
</Table>
|