Skip to content

Commit

Permalink
Merge branch 'v2' into patch-1
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinVandy committed Jan 5, 2024
2 parents eeb8fe2 + c93b423 commit a8fb70c
Show file tree
Hide file tree
Showing 17 changed files with 96 additions and 118 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@ import { useRef } from 'react';
import {
MaterialReactTable,
useMaterialReactTable,
type MRT_Virtualizer,
type MRT_ColumnVirtualizer,
} from 'material-react-table';
import { fakeColumns, fakeData } from './makeData';

const Example = () => {
//optionally access the underlying virtualizer instance
const columnVirtualizerInstanceRef =
useRef<MRT_Virtualizer<HTMLDivElement, HTMLTableCellElement>>(null);
const columnVirtualizerInstanceRef = useRef<MRT_ColumnVirtualizer>(null);

const table = useMaterialReactTable({
columnVirtualizerInstanceRef, //optional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
useMaterialReactTable,
type MRT_ColumnDef,
type MRT_SortingState,
type MRT_Virtualizer,
type MRT_RowVirtualizer,
} from 'material-react-table';
import { makeData, type Person } from './makeData';

Expand Down Expand Up @@ -58,8 +58,7 @@ const Example = () => {
);

//optionally access the underlying virtualizer instance
const rowVirtualizerInstanceRef =
useRef<MRT_Virtualizer<HTMLDivElement, HTMLTableRowElement>>(null);
const rowVirtualizerInstanceRef = useRef<MRT_RowVirtualizer>(null);

const [data, setData] = useState<Person[]>([]);
const [isLoading, setIsLoading] = useState(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
type MRT_ColumnDef,
type MRT_ColumnFiltersState,
type MRT_SortingState,
type MRT_Virtualizer,
type MRT_RowVirtualizer,
} from 'material-react-table';
import { Typography } from '@mui/material';
import {
Expand Down Expand Up @@ -64,8 +64,7 @@ const fetchSize = 25;

const Example = () => {
const tableContainerRef = useRef<HTMLDivElement>(null); //we can get access to the underlying TableContainer element and react to its scroll events
const rowVirtualizerInstanceRef =
useRef<MRT_Virtualizer<HTMLDivElement, HTMLTableRowElement>>(null); //we can get access to the underlying Virtualizer instance and call its scrollToIndex method
const rowVirtualizerInstanceRef = useRef<MRT_RowVirtualizer>(null); //we can get access to the underlying Virtualizer instance and call its scrollToIndex method

const [columnFilters, setColumnFilters] = useState<MRT_ColumnFiltersState>(
[],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
useMaterialReactTable,
type MRT_ColumnDef,
type MRT_SortingState,
type MRT_Virtualizer,
type MRT_RowVirtualizer,
} from 'material-react-table';
import { makeData, type Person } from './makeData';

Expand Down Expand Up @@ -90,8 +90,7 @@ const Example = () => {
);

//optionally access the underlying virtualizer instance
const rowVirtualizerInstanceRef =
useRef<MRT_Virtualizer<HTMLDivElement, HTMLTableRowElement>>(null);
const rowVirtualizerInstanceRef = useRef<MRT_RowVirtualizer>(null);

const [data, setData] = useState<Person[]>([]);
const [isLoading, setIsLoading] = useState(true);
Expand Down
17 changes: 5 additions & 12 deletions packages/material-react-table/src/body/MRT_TableBody.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,11 @@ import {
interface Props<TData extends MRT_RowData> extends TableBodyProps {
columnVirtualizer?: MRT_ColumnVirtualizer;
table: MRT_TableInstance<TData>;
virtualColumns?: VirtualItem[];
}

export const MRT_TableBody = <TData extends MRT_RowData>({
columnVirtualizer,
table,
virtualColumns,
...rest
}: Props<TData>) => {
const {
Expand Down Expand Up @@ -70,15 +68,12 @@ export const MRT_TableBody = <TData extends MRT_RowData>({

const rowVirtualizer = useMRT_RowVirtualizer(table, rows);

const virtualRows = rowVirtualizer
? rowVirtualizer.getVirtualItems()
: undefined;
const { virtualRows } = rowVirtualizer ?? {};

const commonRowProps = {
columnVirtualizer,
numRows: rows.length,
table,
virtualColumns,
};

const CreatingRow = creatingRow && createDisplayMode === 'row' && (
Expand Down Expand Up @@ -186,13 +181,11 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
? (rowOrVirtualRow as VirtualItem)
: undefined,
};
const key = `${row.id}-${row.index}`;
return memoMode === 'rows' ? (
<Memo_MRT_TableBodyRow
key={`${row.id}-${row.index}`}
{...props}
/>
<Memo_MRT_TableBodyRow key={key} {...props} />
) : (
<MRT_TableBodyRow key={`${row.id}-${row.index}`} {...props} />
<MRT_TableBodyRow key={key} {...props} />
);
})}
</>
Expand All @@ -217,7 +210,7 @@ export const MRT_TableBody = <TData extends MRT_RowData>({
rowIndex,
};
return memoMode === 'rows' ? (
<Memo_MRT_TableBodyRow key={`${row.id}`} {...props} />
<Memo_MRT_TableBodyRow key={row.id} {...props} />
) : (
<MRT_TableBodyRow key={row.id} {...props} />
);
Expand Down
5 changes: 2 additions & 3 deletions packages/material-react-table/src/body/MRT_TableBodyRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ interface Props<TData extends MRT_RowData> {
row: MRT_Row<TData>;
rowIndex: number;
table: MRT_TableInstance<TData>;
virtualColumns?: VirtualItem[];
virtualRow?: VirtualItem;
}

Expand All @@ -40,7 +39,6 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
row,
rowIndex,
table,
virtualColumns,
virtualRow,
}: Props<TData>) => {
const theme = useTheme();
Expand Down Expand Up @@ -72,7 +70,8 @@ export const MRT_TableBodyRow = <TData extends MRT_RowData>({
rowPinning,
} = getState();

const { virtualPaddingLeft, virtualPaddingRight } = columnVirtualizer ?? {};
const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
columnVirtualizer ?? {};

const isPinned = enableRowPinning && row.getIsPinned();

Expand Down
3 changes: 2 additions & 1 deletion packages/material-react-table/src/column.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -314,9 +314,10 @@ export const createRow = <TData extends MRT_RowData>(

export const extraIndexRangeExtractor = (
range: Range,
draggingIndex: number,
draggingIndex?: number,
) => {
const newIndexes = defaultRangeExtractor(range);
if (draggingIndex === undefined) return newIndexes;
if (
draggingIndex >= 0 &&
draggingIndex < Math.max(range.startIndex - range.overscan, 0)
Expand Down
4 changes: 0 additions & 4 deletions packages/material-react-table/src/footer/MRT_TableFooter.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { type VirtualItem } from '@tanstack/react-virtual';
import TableFooter, { type TableFooterProps } from '@mui/material/TableFooter';
import { MRT_TableFooterRow } from './MRT_TableFooterRow';
import { parseFromValuesOrFunc } from '../column.utils';
Expand All @@ -11,13 +10,11 @@ import {
interface Props<TData extends MRT_RowData> extends TableFooterProps {
columnVirtualizer?: MRT_ColumnVirtualizer;
table: MRT_TableInstance<TData>;
virtualColumns?: VirtualItem[];
}

export const MRT_TableFooter = <TData extends MRT_RowData>({
columnVirtualizer,
table,
virtualColumns,
...rest
}: Props<TData>) => {
const {
Expand Down Expand Up @@ -68,7 +65,6 @@ export const MRT_TableFooter = <TData extends MRT_RowData>({
footerGroup={footerGroup as any}
key={footerGroup.id}
table={table}
virtualColumns={virtualColumns}
/>
))}
</TableFooter>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { type VirtualItem } from '@tanstack/react-virtual';
import TableRow, { type TableRowProps } from '@mui/material/TableRow';
import { MRT_TableFooterCell } from './MRT_TableFooterCell';
import { parseFromValuesOrFunc } from '../column.utils';
Expand All @@ -15,21 +14,20 @@ interface Props<TData extends MRT_RowData> extends TableRowProps {
columnVirtualizer?: MRT_ColumnVirtualizer;
footerGroup: MRT_HeaderGroup<TData>;
table: MRT_TableInstance<TData>;
virtualColumns?: VirtualItem[];
}

export const MRT_TableFooterRow = <TData extends MRT_RowData>({
columnVirtualizer,
footerGroup,
table,
virtualColumns,
...rest
}: Props<TData>) => {
const {
options: { layoutMode, muiTableFooterRowProps },
} = table;

const { virtualPaddingLeft, virtualPaddingRight } = columnVirtualizer ?? {};
const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
columnVirtualizer ?? {};

// if no content in row, skip row
if (
Expand Down
4 changes: 0 additions & 4 deletions packages/material-react-table/src/head/MRT_TableHead.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { type VirtualItem } from '@tanstack/react-virtual';
import TableHead, { type TableHeadProps } from '@mui/material/TableHead';
import { MRT_TableHeadRow } from './MRT_TableHeadRow';
import { parseFromValuesOrFunc } from '../column.utils';
Expand All @@ -12,13 +11,11 @@ import {
interface Props<TData extends MRT_RowData> extends TableHeadProps {
columnVirtualizer?: MRT_ColumnVirtualizer;
table: MRT_TableInstance<TData>;
virtualColumns?: VirtualItem[];
}

export const MRT_TableHead = <TData extends MRT_RowData>({
columnVirtualizer,
table,
virtualColumns,
...rest
}: Props<TData>) => {
const {
Expand Down Expand Up @@ -85,7 +82,6 @@ export const MRT_TableHead = <TData extends MRT_RowData>({
headerGroup={headerGroup as any}
key={headerGroup.id}
table={table}
virtualColumns={virtualColumns}
/>
))
)}
Expand Down
6 changes: 2 additions & 4 deletions packages/material-react-table/src/head/MRT_TableHeadRow.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { type VirtualItem } from '@tanstack/react-virtual';
import { alpha } from '@mui/material';
import TableRow, { type TableRowProps } from '@mui/material/TableRow';
import { MRT_TableHeadCell } from './MRT_TableHeadCell';
Expand All @@ -16,21 +15,20 @@ interface Props<TData extends MRT_RowData> extends TableRowProps {
columnVirtualizer?: MRT_ColumnVirtualizer;
headerGroup: MRT_HeaderGroup<TData>;
table: MRT_TableInstance<TData>;
virtualColumns?: VirtualItem[];
}

export const MRT_TableHeadRow = <TData extends MRT_RowData>({
columnVirtualizer,
headerGroup,
table,
virtualColumns,
...rest
}: Props<TData>) => {
const {
options: { layoutMode, muiTableHeadRowProps },
} = table;

const { virtualPaddingLeft, virtualPaddingRight } = columnVirtualizer ?? {};
const { virtualColumns, virtualPaddingLeft, virtualPaddingRight } =
columnVirtualizer ?? {};

const tableRowProps = {
...parseFromValuesOrFunc(muiTableHeadRowProps, {
Expand Down
55 changes: 29 additions & 26 deletions packages/material-react-table/src/hooks/useMRT_ColumnVirtualizer.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import { useCallback, useMemo } from 'react';
import {
type Range,
useVirtualizer,
} from '@tanstack/react-virtual';
import { type Range, useVirtualizer } from '@tanstack/react-virtual';
import {
extraIndexRangeExtractor,
parseFromValuesOrFunc,
Expand Down Expand Up @@ -49,7 +46,8 @@ export const useMRT_ColumnVirtualizer = <
.map(
(c) =>
table.getVisibleLeafColumns().length - c.getPinnedIndex() - 1,
),
)
.sort((a, b) => a - b),
]
: [[], []],
[columnPinning, enableColumnVirtualization, enableColumnPinning],
Expand All @@ -69,9 +67,11 @@ export const useMRT_ColumnVirtualizer = <
return columnsWidths.reduce((a, b) => a + b, 0) / columnsWidths.length;
}, [table.getRowModel().rows, columnPinning, columnVisibility]);

const draggingColumnIndex = table
.getVisibleLeafColumns()
.findIndex((c) => c.id === draggingColumn?.id);
const draggingColumnIndex = draggingColumn?.id
? table
.getVisibleLeafColumns()
.findIndex((c) => c.id === draggingColumn?.id)
: undefined;

const columnVirtualizer = enableColumnVirtualization
? (useVirtualizer({
Expand Down Expand Up @@ -100,24 +100,27 @@ export const useMRT_ColumnVirtualizer = <
}) as unknown as MRT_ColumnVirtualizer<TScrollElement, TItemElement>)
: undefined;

if (columnVirtualizerInstanceRef && columnVirtualizer) {
//@ts-ignore
columnVirtualizerInstanceRef.current = columnVirtualizer;
}

const virtualColumns = columnVirtualizer
? columnVirtualizer.getVirtualItems()
: undefined;

if (columnVirtualizer && virtualColumns?.length) {
// @ts-ignore
columnVirtualizer.virtualPaddingLeft =
virtualColumns[leftPinnedIndexes!.length]?.start ?? 0;
// @ts-ignore
columnVirtualizer.virtualPaddingRight =
columnVirtualizer.getTotalSize() -
(virtualColumns[virtualColumns.length - 1 - rightPinnedIndexes!.length]
?.end ?? 0);
if (columnVirtualizer) {
const virtualColumns = columnVirtualizer.getVirtualItems();
columnVirtualizer.virtualColumns = virtualColumns;
if (virtualColumns.length) {
columnVirtualizer.virtualPaddingLeft =
(virtualColumns[leftPinnedIndexes.length]?.start ?? 0) -
(virtualColumns[leftPinnedIndexes.length - 1]?.end ?? 0);
columnVirtualizer.virtualPaddingRight =
columnVirtualizer.getTotalSize() -
(virtualColumns[virtualColumns.length - rightPinnedIndexes.length - 1]
?.end ?? 0) -
(rightPinnedIndexes.length
? columnVirtualizer.getTotalSize() -
(virtualColumns[virtualColumns.length - rightPinnedIndexes.length]
?.start ?? 0)
: 0);
}
if (columnVirtualizerInstanceRef) {
//@ts-ignore
columnVirtualizerInstanceRef.current = columnVirtualizer;
}
}

return columnVirtualizer as any;
Expand Down
10 changes: 7 additions & 3 deletions packages/material-react-table/src/hooks/useMRT_RowVirtualizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,13 @@ export const useMRT_RowVirtualizer = <
}) as unknown as MRT_RowVirtualizer<TScrollElement, TItemElement>)
: undefined;

if (rowVirtualizerInstanceRef && rowVirtualizer) {
//@ts-ignore
rowVirtualizerInstanceRef.current = rowVirtualizer;
if (rowVirtualizer) {
const virtualRows = rowVirtualizer.getVirtualItems();
rowVirtualizer.virtualRows = virtualRows;
if (rowVirtualizerInstanceRef) {
//@ts-ignore
rowVirtualizerInstanceRef.current = rowVirtualizer;
}
}

return rowVirtualizer;
Expand Down
Loading

0 comments on commit a8fb70c

Please sign in to comment.