material-react-table 2.3.1 → 2.4.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.
- package/dist/index.d.ts +78 -49
- package/dist/index.esm.js +118 -91
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +118 -91
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/src/body/MRT_TableBody.tsx +16 -29
- package/src/body/MRT_TableBodyRow.tsx +6 -8
- package/src/buttons/MRT_EditActionButtons.tsx +12 -9
- package/src/column.utils.ts +2 -1
- package/src/footer/MRT_TableFooter.tsx +8 -11
- package/src/footer/MRT_TableFooterRow.tsx +6 -7
- package/src/head/MRT_TableHead.tsx +8 -11
- package/src/head/MRT_TableHeadCellColumnActionsButton.tsx +3 -1
- package/src/head/MRT_TableHeadRow.tsx +6 -7
- package/src/hooks/useMRT_ColumnVirtualizer.ts +38 -36
- package/src/hooks/useMRT_RowVirtualizer.ts +18 -12
- package/src/hooks/useMRT_Rows.ts +1 -8
- package/src/inputs/MRT_FilterTextField.tsx +69 -6
- package/src/menus/MRT_ColumnActionMenu.tsx +8 -1
- package/src/menus/MRT_FilterOptionMenu.tsx +1 -1
- package/src/style.utils.ts +0 -19
- package/src/table/MRT_Table.tsx +3 -16
- package/src/toolbar/MRT_TablePagination.tsx +54 -33
- package/src/types.ts +86 -26
package/package.json
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
"version": "2.
|
2
|
+
"version": "2.4.1",
|
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,9 +113,9 @@
|
|
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
|
}
|
121
|
-
}
|
121
|
+
}
|
@@ -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,20 @@ 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
|
-
virtualColumns?: VirtualItem[];
|
19
|
-
virtualPaddingLeft?: number;
|
20
|
-
virtualPaddingRight?: number;
|
21
19
|
}
|
22
20
|
|
23
21
|
export const MRT_TableBody = <TData extends MRT_RowData>({
|
24
22
|
columnVirtualizer,
|
25
23
|
table,
|
26
|
-
virtualColumns,
|
27
|
-
virtualPaddingLeft,
|
28
|
-
virtualPaddingRight,
|
29
24
|
...rest
|
30
25
|
}: Props<TData>) => {
|
31
26
|
const {
|
@@ -62,29 +57,23 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
|
|
62
57
|
const tableFooterHeight =
|
63
58
|
(enableStickyFooter && tableFooterRef.current?.clientHeight) || 0;
|
64
59
|
|
65
|
-
const pinnedRowIds = useMemo(
|
66
|
-
()
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
);
|
60
|
+
const pinnedRowIds = useMemo(() => {
|
61
|
+
if (!rowPinning.bottom?.length && !rowPinning.top?.length) return [];
|
62
|
+
return getRowModel()
|
63
|
+
.rows.filter((row) => row.getIsPinned())
|
64
|
+
.map((r) => r.id);
|
65
|
+
}, [rowPinning, getRowModel().rows]);
|
72
66
|
|
73
|
-
const rows = useMRT_Rows(table);
|
67
|
+
const rows = useMRT_Rows(table, pinnedRowIds);
|
74
68
|
|
75
|
-
const rowVirtualizer = useMRT_RowVirtualizer(table);
|
69
|
+
const rowVirtualizer = useMRT_RowVirtualizer(table, rows);
|
76
70
|
|
77
|
-
const virtualRows = rowVirtualizer
|
78
|
-
? rowVirtualizer.getVirtualItems()
|
79
|
-
: undefined;
|
71
|
+
const { virtualRows } = rowVirtualizer ?? {};
|
80
72
|
|
81
73
|
const commonRowProps = {
|
82
74
|
columnVirtualizer,
|
83
75
|
numRows: rows.length,
|
84
76
|
table,
|
85
|
-
virtualColumns,
|
86
|
-
virtualPaddingLeft,
|
87
|
-
virtualPaddingRight,
|
88
77
|
};
|
89
78
|
|
90
79
|
const CreatingRow = creatingRow && createDisplayMode === 'row' && (
|
@@ -192,13 +181,11 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
|
|
192
181
|
? (rowOrVirtualRow as VirtualItem)
|
193
182
|
: undefined,
|
194
183
|
};
|
184
|
+
const key = `${row.id}-${row.index}`;
|
195
185
|
return memoMode === 'rows' ? (
|
196
|
-
<Memo_MRT_TableBodyRow
|
197
|
-
key={`${row.id}-${row.index}`}
|
198
|
-
{...props}
|
199
|
-
/>
|
186
|
+
<Memo_MRT_TableBodyRow key={key} {...props} />
|
200
187
|
) : (
|
201
|
-
<MRT_TableBodyRow key={
|
188
|
+
<MRT_TableBodyRow key={key} {...props} />
|
202
189
|
);
|
203
190
|
})}
|
204
191
|
</>
|
@@ -223,7 +210,7 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
|
|
223
210
|
rowIndex,
|
224
211
|
};
|
225
212
|
return memoMode === 'rows' ? (
|
226
|
-
<Memo_MRT_TableBodyRow key={
|
213
|
+
<Memo_MRT_TableBodyRow key={row.id} {...props} />
|
227
214
|
) : (
|
228
215
|
<MRT_TableBodyRow key={row.id} {...props} />
|
229
216
|
);
|
@@ -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,22 +14,20 @@ 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[];
|
27
28
|
row: MRT_Row<TData>;
|
28
29
|
rowIndex: number;
|
29
30
|
table: MRT_TableInstance<TData>;
|
30
|
-
virtualColumns?: VirtualItem[];
|
31
|
-
virtualPaddingLeft?: number;
|
32
|
-
virtualPaddingRight?: number;
|
33
31
|
virtualRow?: VirtualItem;
|
34
32
|
}
|
35
33
|
|
@@ -41,9 +39,6 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
|
|
41
39
|
row,
|
42
40
|
rowIndex,
|
43
41
|
table,
|
44
|
-
virtualColumns,
|
45
|
-
virtualPaddingLeft,
|
46
|
-
virtualPaddingRight,
|
47
42
|
virtualRow,
|
48
43
|
}: Props<TData>) => {
|
49
44
|
const theme = useTheme();
|
@@ -75,6 +70,9 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
|
|
75
70
|
rowPinning,
|
76
71
|
} = getState();
|
77
72
|
|
73
|
+
const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
|
74
|
+
columnVirtualizer ?? {};
|
75
|
+
|
78
76
|
const isPinned = enableRowPinning && row.getIsPinned();
|
79
77
|
|
80
78
|
const tableRowProps = parseFromValuesOrFunc(muiTableBodyRowProps, {
|
@@ -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
|
<>
|
package/src/column.utils.ts
CHANGED
@@ -314,9 +314,10 @@ export const createRow = <TData extends MRT_RowData>(
|
|
314
314
|
|
315
315
|
export const extraIndexRangeExtractor = (
|
316
316
|
range: Range,
|
317
|
-
draggingIndex
|
317
|
+
draggingIndex?: number,
|
318
318
|
) => {
|
319
319
|
const newIndexes = defaultRangeExtractor(range);
|
320
|
+
if (draggingIndex === undefined) return newIndexes;
|
320
321
|
if (
|
321
322
|
draggingIndex >= 0 &&
|
322
323
|
draggingIndex < Math.max(range.startIndex - range.overscan, 0)
|
@@ -1,21 +1,20 @@
|
|
1
|
-
import { type VirtualItem } from '@tanstack/react-virtual';
|
2
1
|
import TableFooter, { type TableFooterProps } from '@mui/material/TableFooter';
|
3
2
|
import { MRT_TableFooterRow } from './MRT_TableFooterRow';
|
4
3
|
import { parseFromValuesOrFunc } from '../column.utils';
|
5
|
-
import {
|
4
|
+
import {
|
5
|
+
type MRT_ColumnVirtualizer,
|
6
|
+
type MRT_RowData,
|
7
|
+
type MRT_TableInstance,
|
8
|
+
} from '../types';
|
6
9
|
|
7
10
|
interface Props<TData extends MRT_RowData> extends TableFooterProps {
|
11
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
8
12
|
table: MRT_TableInstance<TData>;
|
9
|
-
virtualColumns?: VirtualItem[];
|
10
|
-
virtualPaddingLeft?: number;
|
11
|
-
virtualPaddingRight?: number;
|
12
13
|
}
|
13
14
|
|
14
15
|
export const MRT_TableFooter = <TData extends MRT_RowData>({
|
16
|
+
columnVirtualizer,
|
15
17
|
table,
|
16
|
-
virtualColumns,
|
17
|
-
virtualPaddingLeft,
|
18
|
-
virtualPaddingRight,
|
19
18
|
...rest
|
20
19
|
}: Props<TData>) => {
|
21
20
|
const {
|
@@ -62,12 +61,10 @@ export const MRT_TableFooter = <TData extends MRT_RowData>({
|
|
62
61
|
>
|
63
62
|
{getFooterGroups().map((footerGroup) => (
|
64
63
|
<MRT_TableFooterRow
|
64
|
+
columnVirtualizer={columnVirtualizer}
|
65
65
|
footerGroup={footerGroup as any}
|
66
66
|
key={footerGroup.id}
|
67
67
|
table={table}
|
68
|
-
virtualColumns={virtualColumns}
|
69
|
-
virtualPaddingLeft={virtualPaddingLeft}
|
70
|
-
virtualPaddingRight={virtualPaddingRight}
|
71
68
|
/>
|
72
69
|
))}
|
73
70
|
</TableFooter>
|
@@ -1,9 +1,9 @@
|
|
1
|
-
import { type VirtualItem } from '@tanstack/react-virtual';
|
2
1
|
import TableRow, { type TableRowProps } from '@mui/material/TableRow';
|
3
2
|
import { MRT_TableFooterCell } from './MRT_TableFooterCell';
|
4
3
|
import { parseFromValuesOrFunc } from '../column.utils';
|
5
4
|
import { getMRTTheme } from '../style.utils';
|
6
5
|
import {
|
6
|
+
type MRT_ColumnVirtualizer,
|
7
7
|
type MRT_Header,
|
8
8
|
type MRT_HeaderGroup,
|
9
9
|
type MRT_RowData,
|
@@ -11,25 +11,24 @@ import {
|
|
11
11
|
} from '../types';
|
12
12
|
|
13
13
|
interface Props<TData extends MRT_RowData> extends TableRowProps {
|
14
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
14
15
|
footerGroup: MRT_HeaderGroup<TData>;
|
15
16
|
table: MRT_TableInstance<TData>;
|
16
|
-
virtualColumns?: VirtualItem[];
|
17
|
-
virtualPaddingLeft?: number;
|
18
|
-
virtualPaddingRight?: number;
|
19
17
|
}
|
20
18
|
|
21
19
|
export const MRT_TableFooterRow = <TData extends MRT_RowData>({
|
20
|
+
columnVirtualizer,
|
22
21
|
footerGroup,
|
23
22
|
table,
|
24
|
-
virtualColumns,
|
25
|
-
virtualPaddingLeft,
|
26
|
-
virtualPaddingRight,
|
27
23
|
...rest
|
28
24
|
}: Props<TData>) => {
|
29
25
|
const {
|
30
26
|
options: { layoutMode, muiTableFooterRowProps },
|
31
27
|
} = table;
|
32
28
|
|
29
|
+
const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
|
30
|
+
columnVirtualizer ?? {};
|
31
|
+
|
33
32
|
// if no content in row, skip row
|
34
33
|
if (
|
35
34
|
!footerGroup.headers?.some(
|
@@ -1,22 +1,21 @@
|
|
1
|
-
import { type VirtualItem } from '@tanstack/react-virtual';
|
2
1
|
import TableHead, { type TableHeadProps } from '@mui/material/TableHead';
|
3
2
|
import { MRT_TableHeadRow } from './MRT_TableHeadRow';
|
4
3
|
import { parseFromValuesOrFunc } from '../column.utils';
|
5
4
|
import { MRT_ToolbarAlertBanner } from '../toolbar';
|
6
|
-
import {
|
5
|
+
import {
|
6
|
+
type MRT_ColumnVirtualizer,
|
7
|
+
type MRT_RowData,
|
8
|
+
type MRT_TableInstance,
|
9
|
+
} from '../types';
|
7
10
|
|
8
11
|
interface Props<TData extends MRT_RowData> extends TableHeadProps {
|
12
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
9
13
|
table: MRT_TableInstance<TData>;
|
10
|
-
virtualColumns?: VirtualItem[];
|
11
|
-
virtualPaddingLeft?: number;
|
12
|
-
virtualPaddingRight?: number;
|
13
14
|
}
|
14
15
|
|
15
16
|
export const MRT_TableHead = <TData extends MRT_RowData>({
|
17
|
+
columnVirtualizer,
|
16
18
|
table,
|
17
|
-
virtualColumns,
|
18
|
-
virtualPaddingLeft,
|
19
|
-
virtualPaddingRight,
|
20
19
|
...rest
|
21
20
|
}: Props<TData>) => {
|
22
21
|
const {
|
@@ -79,12 +78,10 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
|
|
79
78
|
) : (
|
80
79
|
getHeaderGroups().map((headerGroup) => (
|
81
80
|
<MRT_TableHeadRow
|
81
|
+
columnVirtualizer={columnVirtualizer}
|
82
82
|
headerGroup={headerGroup as any}
|
83
83
|
key={headerGroup.id}
|
84
84
|
table={table}
|
85
|
-
virtualColumns={virtualColumns}
|
86
|
-
virtualPaddingLeft={virtualPaddingLeft}
|
87
|
-
virtualPaddingRight={virtualPaddingRight}
|
88
85
|
/>
|
89
86
|
))
|
90
87
|
)}
|
@@ -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 && (
|
@@ -1,10 +1,10 @@
|
|
1
|
-
import { type VirtualItem } from '@tanstack/react-virtual';
|
2
1
|
import { alpha } from '@mui/material';
|
3
2
|
import TableRow, { type TableRowProps } from '@mui/material/TableRow';
|
4
3
|
import { MRT_TableHeadCell } from './MRT_TableHeadCell';
|
5
4
|
import { parseFromValuesOrFunc } from '../column.utils';
|
6
5
|
import { getMRTTheme } from '../style.utils';
|
7
6
|
import {
|
7
|
+
type MRT_ColumnVirtualizer,
|
8
8
|
type MRT_Header,
|
9
9
|
type MRT_HeaderGroup,
|
10
10
|
type MRT_RowData,
|
@@ -12,25 +12,24 @@ import {
|
|
12
12
|
} from '../types';
|
13
13
|
|
14
14
|
interface Props<TData extends MRT_RowData> extends TableRowProps {
|
15
|
+
columnVirtualizer?: MRT_ColumnVirtualizer;
|
15
16
|
headerGroup: MRT_HeaderGroup<TData>;
|
16
17
|
table: MRT_TableInstance<TData>;
|
17
|
-
virtualColumns?: VirtualItem[];
|
18
|
-
virtualPaddingLeft?: number;
|
19
|
-
virtualPaddingRight?: number;
|
20
18
|
}
|
21
19
|
|
22
20
|
export const MRT_TableHeadRow = <TData extends MRT_RowData>({
|
21
|
+
columnVirtualizer,
|
23
22
|
headerGroup,
|
24
23
|
table,
|
25
|
-
virtualColumns,
|
26
|
-
virtualPaddingLeft,
|
27
|
-
virtualPaddingRight,
|
28
24
|
...rest
|
29
25
|
}: Props<TData>) => {
|
30
26
|
const {
|
31
27
|
options: { layoutMode, muiTableHeadRowProps },
|
32
28
|
} = table;
|
33
29
|
|
30
|
+
const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
|
31
|
+
columnVirtualizer ?? {};
|
32
|
+
|
34
33
|
const tableRowProps = {
|
35
34
|
...parseFromValuesOrFunc(muiTableHeadRowProps, {
|
36
35
|
headerGroup,
|
@@ -1,14 +1,14 @@
|
|
1
1
|
import { useCallback, useMemo } 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_ColumnVirtualizer,
|
9
|
+
type MRT_RowData,
|
10
|
+
type MRT_TableInstance,
|
11
|
+
} from '../types';
|
12
12
|
|
13
13
|
export const useMRT_ColumnVirtualizer = <
|
14
14
|
TData extends MRT_RowData,
|
@@ -16,12 +16,7 @@ export const useMRT_ColumnVirtualizer = <
|
|
16
16
|
TItemElement extends Element = HTMLTableCellElement,
|
17
17
|
>(
|
18
18
|
table: MRT_TableInstance<TData>,
|
19
|
-
):
|
20
|
-
| (Virtualizer<TScrollElement, TItemElement> & {
|
21
|
-
virtualPaddingLeft?: number;
|
22
|
-
virtualPaddingRight?: number;
|
23
|
-
})
|
24
|
-
| undefined => {
|
19
|
+
): MRT_ColumnVirtualizer | undefined => {
|
25
20
|
const {
|
26
21
|
getState,
|
27
22
|
options: {
|
@@ -51,7 +46,8 @@ export const useMRT_ColumnVirtualizer = <
|
|
51
46
|
.map(
|
52
47
|
(c) =>
|
53
48
|
table.getVisibleLeafColumns().length - c.getPinnedIndex() - 1,
|
54
|
-
)
|
49
|
+
)
|
50
|
+
.sort((a, b) => a - b),
|
55
51
|
]
|
56
52
|
: [[], []],
|
57
53
|
[columnPinning, enableColumnVirtualization, enableColumnPinning],
|
@@ -59,8 +55,9 @@ export const useMRT_ColumnVirtualizer = <
|
|
59
55
|
|
60
56
|
//get first 16 column widths and average them if calc is needed
|
61
57
|
const averageColumnWidth = useMemo(() => {
|
62
|
-
if (!enableColumnVirtualization || columnVirtualizerProps?.estimateSize)
|
58
|
+
if (!enableColumnVirtualization || columnVirtualizerProps?.estimateSize) {
|
63
59
|
return 0;
|
60
|
+
}
|
64
61
|
const columnsWidths =
|
65
62
|
table
|
66
63
|
.getRowModel()
|
@@ -70,9 +67,11 @@ export const useMRT_ColumnVirtualizer = <
|
|
70
67
|
return columnsWidths.reduce((a, b) => a + b, 0) / columnsWidths.length;
|
71
68
|
}, [table.getRowModel().rows, columnPinning, columnVisibility]);
|
72
69
|
|
73
|
-
const draggingColumnIndex =
|
74
|
-
|
75
|
-
|
70
|
+
const draggingColumnIndex = draggingColumn?.id
|
71
|
+
? table
|
72
|
+
.getVisibleLeafColumns()
|
73
|
+
.findIndex((c) => c.id === draggingColumn?.id)
|
74
|
+
: undefined;
|
76
75
|
|
77
76
|
const columnVirtualizer = enableColumnVirtualization
|
78
77
|
? (useVirtualizer({
|
@@ -98,27 +97,30 @@ export const useMRT_ColumnVirtualizer = <
|
|
98
97
|
[leftPinnedIndexes, rightPinnedIndexes, draggingColumnIndex],
|
99
98
|
),
|
100
99
|
...columnVirtualizerProps,
|
101
|
-
}) as unknown as
|
102
|
-
: undefined;
|
103
|
-
|
104
|
-
if (columnVirtualizerInstanceRef && columnVirtualizer) {
|
105
|
-
//@ts-ignore
|
106
|
-
columnVirtualizerInstanceRef.current = columnVirtualizer;
|
107
|
-
}
|
108
|
-
|
109
|
-
const virtualColumns = columnVirtualizer
|
110
|
-
? columnVirtualizer.getVirtualItems()
|
100
|
+
}) as unknown as MRT_ColumnVirtualizer<TScrollElement, TItemElement>)
|
111
101
|
: undefined;
|
112
102
|
|
113
|
-
if (columnVirtualizer
|
114
|
-
|
115
|
-
columnVirtualizer.
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
103
|
+
if (columnVirtualizer) {
|
104
|
+
const virtualColumns = columnVirtualizer.getVirtualItems();
|
105
|
+
columnVirtualizer.virtualColumns = virtualColumns;
|
106
|
+
if (virtualColumns.length) {
|
107
|
+
columnVirtualizer.virtualPaddingLeft =
|
108
|
+
(virtualColumns[leftPinnedIndexes.length]?.start ?? 0) -
|
109
|
+
(virtualColumns[leftPinnedIndexes.length - 1]?.end ?? 0);
|
110
|
+
columnVirtualizer.virtualPaddingRight =
|
111
|
+
columnVirtualizer.getTotalSize() -
|
112
|
+
(virtualColumns[virtualColumns.length - rightPinnedIndexes.length - 1]
|
113
|
+
?.end ?? 0) -
|
114
|
+
(rightPinnedIndexes.length
|
115
|
+
? columnVirtualizer.getTotalSize() -
|
116
|
+
(virtualColumns[virtualColumns.length - rightPinnedIndexes.length]
|
117
|
+
?.start ?? 0)
|
118
|
+
: 0);
|
119
|
+
}
|
120
|
+
if (columnVirtualizerInstanceRef) {
|
121
|
+
//@ts-ignore
|
122
|
+
columnVirtualizerInstanceRef.current = columnVirtualizer;
|
123
|
+
}
|
122
124
|
}
|
123
125
|
|
124
126
|
return columnVirtualizer as any;
|
@@ -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,12 +54,16 @@ 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
|
-
if (
|
59
|
-
|
60
|
-
|
60
|
+
if (rowVirtualizer) {
|
61
|
+
const virtualRows = rowVirtualizer.getVirtualItems();
|
62
|
+
rowVirtualizer.virtualRows = virtualRows;
|
63
|
+
if (rowVirtualizerInstanceRef) {
|
64
|
+
//@ts-ignore
|
65
|
+
rowVirtualizerInstanceRef.current = rowVirtualizer;
|
66
|
+
}
|
61
67
|
}
|
62
68
|
|
63
69
|
return 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) {
|