material-react-table 1.1.0-beta.1 → 1.1.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.
@@ -45,7 +45,7 @@ export declare const MRT_TableRoot: <TData extends Record<string, any> = {}>(pro
45
45
  icons?: Partial<import("..").MRT_Icons> | undefined;
46
46
  initialState?: Partial<MRT_TableState<TData>> | undefined;
47
47
  localization?: Partial<MRT_Localization> | undefined;
48
- memoMode?: "row" | "cell" | "table-body" | undefined;
48
+ memoMode?: "rows" | "cells" | "table-body" | undefined;
49
49
  muiBottomToolbarProps?: import("@mui/material").ToolbarProps<"div", {}> | (({ table }: {
50
50
  table: MRT_TableInstance<TData>;
51
51
  }) => import("@mui/material").ToolbarProps<"div", {}>) | undefined;
package/dist/index.d.ts CHANGED
@@ -564,7 +564,7 @@ declare type MaterialReactTableProps<TData extends Record<string, any> = {}> = O
564
564
  * @warning This will break some dynamic rendering features. See the memoization guide for more info:
565
565
  * @link https://www.material-react-table.com/docs/guides/memoize-components
566
566
  */
567
- memoMode?: 'cell' | 'row' | 'table-body';
567
+ memoMode?: 'cells' | 'rows' | 'table-body';
568
568
  muiBottomToolbarProps?: ToolbarProps | (({ table }: {
569
569
  table: MRT_TableInstance<TData>;
570
570
  }) => ToolbarProps);
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.1.0-beta.1",
2
+ "version": "1.1.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.",
@@ -680,7 +680,7 @@ export type MaterialReactTableProps<TData extends Record<string, any> = {}> =
680
680
  * @warning This will break some dynamic rendering features. See the memoization guide for more info:
681
681
  * @link https://www.material-react-table.com/docs/guides/memoize-components
682
682
  */
683
- memoMode?: 'cell' | 'row' | 'table-body';
683
+ memoMode?: 'cells' | 'rows' | 'table-body';
684
684
  muiBottomToolbarProps?:
685
685
  | ToolbarProps
686
686
  | (({ table }: { table: MRT_TableInstance<TData> }) => ToolbarProps);
@@ -151,6 +151,7 @@ export const MRT_TableBody: FC<Props> = ({ table }) => {
151
151
  : (rowOrVirtualRow as MRT_Row);
152
152
  const props = {
153
153
  key: row.id,
154
+ numRows: rows.length,
154
155
  row,
155
156
  rowIndex: enableRowVirtualization
156
157
  ? rowOrVirtualRow.index
@@ -158,7 +159,7 @@ export const MRT_TableBody: FC<Props> = ({ table }) => {
158
159
  table,
159
160
  virtualRow: enableRowVirtualization ? rowOrVirtualRow : null,
160
161
  };
161
- return memoMode === 'row' ? (
162
+ return memoMode === 'rows' ? (
162
163
  <Memo_MRT_TableBodyRow {...props} />
163
164
  ) : (
164
165
  <MRT_TableBodyRow {...props} />
@@ -176,4 +177,7 @@ export const MRT_TableBody: FC<Props> = ({ table }) => {
176
177
  );
177
178
  };
178
179
 
179
- export const Memo_MRT_TableBody = memo(MRT_TableBody, () => true);
180
+ export const Memo_MRT_TableBody = memo(
181
+ MRT_TableBody,
182
+ (prev, next) => prev.table.options.data === next.table.options.data,
183
+ );
@@ -5,6 +5,7 @@ import React, {
5
5
  MouseEvent,
6
6
  RefObject,
7
7
  useEffect,
8
+ useMemo,
8
9
  useState,
9
10
  } from 'react';
10
11
  import { darken, lighten, Skeleton, TableCell, useTheme } from '@mui/material';
@@ -18,6 +19,7 @@ import type { MRT_Cell, MRT_TableInstance } from '..';
18
19
  interface Props {
19
20
  cell: MRT_Cell;
20
21
  enableHover?: boolean;
22
+ numRows: number;
21
23
  rowIndex: number;
22
24
  rowRef: RefObject<HTMLTableRowElement>;
23
25
  table: MRT_TableInstance;
@@ -26,6 +28,7 @@ interface Props {
26
28
  export const MRT_TableBodyCell: FC<Props> = ({
27
29
  cell,
28
30
  enableHover,
31
+ numRows,
29
32
  rowIndex,
30
33
  rowRef,
31
34
  table,
@@ -39,7 +42,6 @@ export const MRT_TableBodyCell: FC<Props> = ({
39
42
  enableColumnOrdering,
40
43
  enableEditing,
41
44
  enableGrouping,
42
- enablePagination,
43
45
  enableRowNumbers,
44
46
  muiTableBodyCellProps,
45
47
  muiTableBodyCellSkeletonProps,
@@ -82,17 +84,6 @@ export const MRT_TableBodyCell: FC<Props> = ({
82
84
  ? muiTableBodyCellSkeletonProps({ cell, column, row, table })
83
85
  : muiTableBodyCellSkeletonProps;
84
86
 
85
- const isEditable =
86
- (enableEditing || columnDef.enableEditing) &&
87
- columnDef.enableEditing !== false;
88
-
89
- const isEditing =
90
- isEditable &&
91
- editingMode !== 'modal' &&
92
- (editingMode === 'table' ||
93
- editingRow?.id === row.id ||
94
- editingCell?.id === cell.id);
95
-
96
87
  const [skeletonWidth, setSkeletonWidth] = useState(0);
97
88
  useEffect(
98
89
  () =>
@@ -106,9 +97,42 @@ export const MRT_TableBodyCell: FC<Props> = ({
106
97
  )
107
98
  : 100,
108
99
  ),
109
- [isLoading, showSkeletons],
100
+ [],
101
+ );
102
+
103
+ const draggingBorder = useMemo(
104
+ () =>
105
+ draggingColumn?.id === column.id
106
+ ? `1px dashed ${theme.palette.text.secondary}`
107
+ : hoveredColumn?.id === column.id
108
+ ? `2px dashed ${theme.palette.primary.main}`
109
+ : undefined,
110
+ [draggingColumn, hoveredColumn],
110
111
  );
111
112
 
113
+ const draggingBorders = useMemo(
114
+ () =>
115
+ draggingBorder
116
+ ? {
117
+ borderLeft: draggingBorder,
118
+ borderRight: draggingBorder,
119
+ borderBottom: rowIndex === numRows - 1 ? draggingBorder : undefined,
120
+ }
121
+ : undefined,
122
+ [draggingBorder, numRows],
123
+ );
124
+
125
+ const isEditable =
126
+ (enableEditing || columnDef.enableEditing) &&
127
+ columnDef.enableEditing !== false;
128
+
129
+ const isEditing =
130
+ isEditable &&
131
+ editingMode !== 'modal' &&
132
+ (editingMode === 'table' ||
133
+ editingRow?.id === row.id ||
134
+ editingCell?.id === cell.id);
135
+
112
136
  const handleDoubleClick = (event: MouseEvent<HTMLTableCellElement>) => {
113
137
  tableCellProps?.onDoubleClick?.(event);
114
138
  if (
@@ -139,29 +163,6 @@ export const MRT_TableBodyCell: FC<Props> = ({
139
163
  }
140
164
  };
141
165
 
142
- const draggingBorder =
143
- draggingColumn?.id === column.id
144
- ? `1px dashed ${theme.palette.text.secondary}`
145
- : hoveredColumn?.id === column.id
146
- ? `2px dashed ${theme.palette.primary.main}`
147
- : undefined;
148
-
149
- const draggingBorders = draggingBorder
150
- ? {
151
- borderLeft: draggingBorder,
152
- borderRight: draggingBorder,
153
- borderBottom:
154
- row.index ===
155
- (enablePagination
156
- ? table.getRowModel()
157
- : table.getPrePaginationRowModel()
158
- ).rows.length -
159
- 1
160
- ? draggingBorder
161
- : undefined,
162
- }
163
- : undefined;
164
-
165
166
  return (
166
167
  <TableCell
167
168
  {...tableCellProps}
@@ -1,10 +1,11 @@
1
- import React, { DragEvent, FC, memo, useRef } from 'react';
1
+ import React, { DragEvent, FC, memo, useMemo, useRef } from 'react';
2
2
  import { darken, lighten, TableRow, useTheme } from '@mui/material';
3
3
  import { Memo_MRT_TableBodyCell, MRT_TableBodyCell } from './MRT_TableBodyCell';
4
4
  import { MRT_TableDetailPanel } from './MRT_TableDetailPanel';
5
5
  import type { MRT_Row, MRT_TableInstance } from '..';
6
6
 
7
7
  interface Props {
8
+ numRows: number;
8
9
  row: MRT_Row;
9
10
  rowIndex: number;
10
11
  table: MRT_TableInstance;
@@ -12,6 +13,7 @@ interface Props {
12
13
  }
13
14
 
14
15
  export const MRT_TableBodyRow: FC<Props> = ({
16
+ numRows,
15
17
  row,
16
18
  rowIndex,
17
19
  table,
@@ -45,12 +47,15 @@ export const MRT_TableBodyRow: FC<Props> = ({
45
47
 
46
48
  const rowRef = useRef<HTMLTableRowElement | null>(null);
47
49
 
48
- const draggingBorder =
49
- draggingRow?.id === row.id
50
- ? `1px dashed ${theme.palette.text.secondary}`
51
- : hoveredRow?.id === row.id
52
- ? `2px dashed ${theme.palette.primary.main}`
53
- : undefined;
50
+ const draggingBorder = useMemo(
51
+ () =>
52
+ draggingRow?.id === row.id
53
+ ? `1px dashed ${theme.palette.text.secondary}`
54
+ : hoveredRow?.id === row.id
55
+ ? `2px dashed ${theme.palette.primary.main}`
56
+ : undefined,
57
+ [draggingRow, hoveredRow],
58
+ );
54
59
 
55
60
  const draggingBorders = draggingBorder
56
61
  ? {
@@ -90,16 +95,17 @@ export const MRT_TableBodyRow: FC<Props> = ({
90
95
  ...draggingBorders,
91
96
  })}
92
97
  >
93
- {row?.getVisibleCells()?.map?.((cell) => {
98
+ {row.getVisibleCells().map((cell) => {
94
99
  const props = {
95
100
  cell,
96
101
  enableHover: tableRowProps?.hover !== false,
97
102
  key: cell.id,
103
+ numRows,
98
104
  rowIndex,
99
105
  rowRef,
100
106
  table,
101
107
  };
102
- return memoMode === 'cell' &&
108
+ return memoMode === 'cells' &&
103
109
  cell.column.columnDef.columnDefType === 'data' &&
104
110
  !draggingColumn &&
105
111
  !draggingRow &&
@@ -1,4 +1,4 @@
1
- import React, { DragEvent, FC, ReactNode } from 'react';
1
+ import React, { DragEvent, FC, ReactNode, useMemo } from 'react';
2
2
  import { Box, TableCell, Theme, useTheme } from '@mui/material';
3
3
  import { MRT_TableHeadCellColumnActionsButton } from './MRT_TableHeadCellColumnActionsButton';
4
4
  import { MRT_TableHeadCellFilterContainer } from './MRT_TableHeadCellFilterContainer';
@@ -54,6 +54,24 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, table }) => {
54
54
  ...mcTableHeadCellProps,
55
55
  };
56
56
 
57
+ const draggingBorder = useMemo(
58
+ () =>
59
+ draggingColumn?.id === column.id
60
+ ? `1px dashed ${theme.palette.text.secondary}`
61
+ : hoveredColumn?.id === column.id
62
+ ? `2px dashed ${theme.palette.primary.main}`
63
+ : undefined,
64
+ [draggingColumn, hoveredColumn],
65
+ );
66
+
67
+ const draggingBorders = draggingBorder
68
+ ? {
69
+ borderLeft: draggingBorder,
70
+ borderRight: draggingBorder,
71
+ borderTop: draggingBorder,
72
+ }
73
+ : undefined;
74
+
57
75
  const handleDragEnter = (_e: DragEvent) => {
58
76
  if (enableGrouping && hoveredColumn?.id === 'drop-zone') {
59
77
  setHoveredColumn(null);
@@ -65,21 +83,6 @@ export const MRT_TableHeadCell: FC<Props> = ({ header, table }) => {
65
83
  }
66
84
  };
67
85
 
68
- const draggingBorder =
69
- draggingColumn?.id === column.id
70
- ? `1px dashed ${theme.palette.text.secondary}`
71
- : hoveredColumn?.id === column.id
72
- ? `2px dashed ${theme.palette.primary.main}`
73
- : undefined;
74
-
75
- const draggingBorders = draggingBorder
76
- ? {
77
- borderLeft: draggingBorder,
78
- borderRight: draggingBorder,
79
- borderTop: draggingBorder,
80
- }
81
- : undefined;
82
-
83
86
  const headerElement = ((columnDef?.Header instanceof Function
84
87
  ? columnDef?.Header?.({
85
88
  column,