@mui/x-data-grid 7.28.0 → 7.28.2
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/CHANGELOG.md +92 -0
- package/components/GridRow.js +2 -7
- package/components/columnSelection/GridHeaderCheckbox.js +2 -2
- package/hooks/features/columns/useGridColumns.js +0 -2
- package/hooks/features/editing/useGridRowEditing.js +1 -1
- package/hooks/features/virtualization/useGridVirtualScroller.js +12 -1
- package/index.js +1 -1
- package/modern/components/GridRow.js +2 -7
- package/modern/components/columnSelection/GridHeaderCheckbox.js +2 -2
- package/modern/hooks/features/columns/useGridColumns.js +0 -2
- package/modern/hooks/features/editing/useGridRowEditing.js +1 -1
- package/modern/hooks/features/virtualization/useGridVirtualScroller.js +12 -1
- package/modern/index.js +1 -1
- package/node/components/GridRow.js +2 -7
- package/node/components/columnSelection/GridHeaderCheckbox.js +2 -2
- package/node/hooks/features/columns/useGridColumns.js +0 -2
- package/node/hooks/features/editing/useGridRowEditing.js +1 -1
- package/node/hooks/features/virtualization/useGridVirtualScroller.js +11 -0
- package/node/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,98 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## 7.28.2
|
|
7
|
+
|
|
8
|
+
_Mar 28, 2025_
|
|
9
|
+
|
|
10
|
+
We'd like to offer a big thanks to the 3 contributors who made this release possible. Here are some highlights ✨:
|
|
11
|
+
|
|
12
|
+
- 🐞 Bugfixes
|
|
13
|
+
|
|
14
|
+
Team members who have contributed to this release:
|
|
15
|
+
@flaviendelangle, @LukasTy, @arminmeh.
|
|
16
|
+
|
|
17
|
+
<!--/ HIGHLIGHT_ABOVE_SEPARATOR /-->
|
|
18
|
+
|
|
19
|
+
### Data Grid
|
|
20
|
+
|
|
21
|
+
#### `@mui/x-data-grid@7.28.2`
|
|
22
|
+
|
|
23
|
+
- [DataGrid] Fix error caused by trying to render rows that are not in the state anymore (#17117) @arminmeh
|
|
24
|
+
|
|
25
|
+
#### `@mui/x-data-grid-pro@7.28.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
26
|
+
|
|
27
|
+
Same changes as in `@mui/x-data-grid@7.28.2`.
|
|
28
|
+
|
|
29
|
+
#### `@mui/x-data-grid-premium@7.28.2` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
30
|
+
|
|
31
|
+
Same changes as in `@mui/x-data-grid-pro@7.28.2`.
|
|
32
|
+
|
|
33
|
+
### Date and Time Pickers
|
|
34
|
+
|
|
35
|
+
#### `@mui/x-date-pickers@7.28.2`
|
|
36
|
+
|
|
37
|
+
- [fields] Improve the check for year in `doesSectionFormatHaveLeadingZeros` (#17112) @flaviendelangle
|
|
38
|
+
|
|
39
|
+
#### `@mui/x-date-pickers-pro@7.28.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
40
|
+
|
|
41
|
+
Same changes as in `@mui/x-date-pickers@7.28.2`.
|
|
42
|
+
|
|
43
|
+
### Core
|
|
44
|
+
|
|
45
|
+
- [code-infra] Remove `test_regressions` step from React 18 pipeline (#17109) @LukasTy
|
|
46
|
+
|
|
47
|
+
## 7.28.1
|
|
48
|
+
|
|
49
|
+
_Mar 21, 2025_
|
|
50
|
+
|
|
51
|
+
We'd like to offer a big thanks to the 4 contributors who made this release possible. Here are some highlights ✨:
|
|
52
|
+
|
|
53
|
+
- 🐞 Bugfixes
|
|
54
|
+
|
|
55
|
+
Special thanks go out to the community contributors who have helped make this release possible:
|
|
56
|
+
@jyash97, @nusr.
|
|
57
|
+
|
|
58
|
+
Following are all team members who have contributed to this release:
|
|
59
|
+
@arminmeh, @KenanYusuf.
|
|
60
|
+
|
|
61
|
+
<!--/ HIGHLIGHT_ABOVE_SEPARATOR /-->
|
|
62
|
+
|
|
63
|
+
### Data Grid
|
|
64
|
+
|
|
65
|
+
#### `@mui/x-data-grid@7.28.1`
|
|
66
|
+
|
|
67
|
+
- [DataGrid] Fix error while editing rows with custom id (@arminmeh) (#17050)
|
|
68
|
+
|
|
69
|
+
#### `@mui/x-data-grid-pro@7.28.1` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
70
|
+
|
|
71
|
+
Same changes as in `@mui/x-data-grid@7.28.1`, plus:
|
|
72
|
+
|
|
73
|
+
- [DataGridPro] Fix header select checkbox state with `checkboxSelectionVisibleOnly` and `paginationMode="server"` (@arminmeh) (#17032)
|
|
74
|
+
|
|
75
|
+
#### `@mui/x-data-grid-premium@7.28.1` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
76
|
+
|
|
77
|
+
Same changes as in `@mui/x-data-grid-pro@7.28.1`, plus:
|
|
78
|
+
|
|
79
|
+
- [DataGridPremium] Update column state correctly when grouping mode is updated with one grouping column (@arminmeh) (#17074)
|
|
80
|
+
|
|
81
|
+
### Tree View
|
|
82
|
+
|
|
83
|
+
#### `@mui/x-tree-view@7.28.1`
|
|
84
|
+
|
|
85
|
+
Internal changes.
|
|
86
|
+
|
|
87
|
+
#### `@mui/x-tree-view-pro@7.28.1` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
88
|
+
|
|
89
|
+
Same changes as in `@mui/x-tree-view@7.28.1`, plus:
|
|
90
|
+
|
|
91
|
+
- [TreeView] Allow moving an item after the last children of some other item (@jyash97) (#17065)
|
|
92
|
+
|
|
93
|
+
### Docs
|
|
94
|
+
|
|
95
|
+
- [docs] Fix Data Grid advanced list view demo (#17066) @KenanYusuf
|
|
96
|
+
- [docs] Fix custom detail panel toggle state update (@nusr) (#17018)
|
|
97
|
+
|
|
6
98
|
## 7.28.0
|
|
7
99
|
|
|
8
100
|
_Mar 17, 2025_
|
package/components/GridRow.js
CHANGED
|
@@ -192,7 +192,7 @@ const GridRow = forwardRef(function GridRow(props, refProp) {
|
|
|
192
192
|
return rowStyle;
|
|
193
193
|
}, [isNotVisible, rowHeight, styleProp, heightEntry, rootProps.rowSpacingType]);
|
|
194
194
|
const rowClassNames = apiRef.current.unstable_applyPipeProcessors('rowClassName', [], rowId);
|
|
195
|
-
const ariaAttributes =
|
|
195
|
+
const ariaAttributes = getRowAriaAttributes(rowNode, index);
|
|
196
196
|
if (typeof rootProps.getRowClassName === 'function') {
|
|
197
197
|
const indexRelativeToCurrentPage = index - (currentPage.range?.firstRowIndex || 0);
|
|
198
198
|
const rowParams = _extends({}, apiRef.current.getRowParams(rowId), {
|
|
@@ -202,11 +202,6 @@ const GridRow = forwardRef(function GridRow(props, refProp) {
|
|
|
202
202
|
});
|
|
203
203
|
rowClassNames.push(rootProps.getRowClassName(rowParams));
|
|
204
204
|
}
|
|
205
|
-
|
|
206
|
-
/* Start of rendering */
|
|
207
|
-
if (!rowNode) {
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
210
205
|
const getCell = (column, indexInSection, indexRelativeToAllColumns, sectionLength, pinnedPosition = PinnedColumnPosition.NONE) => {
|
|
211
206
|
const cellColSpanInfo = apiRef.current.unstable_getCellColSpanInfo(rowId, indexRelativeToAllColumns);
|
|
212
207
|
if (cellColSpanInfo?.spannedByColSpan) {
|
|
@@ -215,7 +210,7 @@ const GridRow = forwardRef(function GridRow(props, refProp) {
|
|
|
215
210
|
const width = cellColSpanInfo?.cellProps.width ?? column.computedWidth;
|
|
216
211
|
const colSpan = cellColSpanInfo?.cellProps.colSpan ?? 1;
|
|
217
212
|
const pinnedOffset = getPinnedCellOffset(pinnedPosition, column.computedWidth, indexRelativeToAllColumns, columnPositions, columnsTotalWidth, scrollbarWidth);
|
|
218
|
-
if (rowNode
|
|
213
|
+
if (rowNode.type === 'skeletonRow') {
|
|
219
214
|
return /*#__PURE__*/_jsx(slots.skeletonCell, {
|
|
220
215
|
type: column.type,
|
|
221
216
|
width: width,
|
|
@@ -55,7 +55,7 @@ const GridHeaderCheckbox = forwardRef(function GridHeaderCheckbox(props, ref) {
|
|
|
55
55
|
|
|
56
56
|
// All the rows that could be selected / unselected by toggling this checkbox
|
|
57
57
|
const selectionCandidates = React.useMemo(() => {
|
|
58
|
-
const rowIds = !rootProps.pagination || !rootProps.checkboxSelectionVisibleOnly ? visibleRowIds : paginatedVisibleRowIds;
|
|
58
|
+
const rowIds = !rootProps.pagination || !rootProps.checkboxSelectionVisibleOnly || rootProps.paginationMode === 'server' ? visibleRowIds : paginatedVisibleRowIds;
|
|
59
59
|
|
|
60
60
|
// Convert to an object to make O(1) checking if a row exists or not
|
|
61
61
|
// TODO create selector that returns visibleRowIds/paginatedVisibleRowIds as an object
|
|
@@ -63,7 +63,7 @@ const GridHeaderCheckbox = forwardRef(function GridHeaderCheckbox(props, ref) {
|
|
|
63
63
|
acc[id] = true;
|
|
64
64
|
return acc;
|
|
65
65
|
}, {});
|
|
66
|
-
}, [rootProps.pagination, rootProps.checkboxSelectionVisibleOnly, paginatedVisibleRowIds, visibleRowIds]);
|
|
66
|
+
}, [rootProps.pagination, rootProps.paginationMode, rootProps.checkboxSelectionVisibleOnly, paginatedVisibleRowIds, visibleRowIds]);
|
|
67
67
|
|
|
68
68
|
// Amount of rows selected and that are visible in the current page
|
|
69
69
|
const currentSelectionSize = React.useMemo(() => filteredSelection.filter(id => selectionCandidates[id]).length, [filteredSelection, selectionCandidates]);
|
|
@@ -44,8 +44,6 @@ export function useGridColumns(apiRef, props) {
|
|
|
44
44
|
logger.debug('Updating columns state.');
|
|
45
45
|
apiRef.current.setState(mergeColumnsState(columnsState));
|
|
46
46
|
apiRef.current.publishEvent('columnsChange', columnsState.orderedFields);
|
|
47
|
-
apiRef.current.updateRenderContext?.();
|
|
48
|
-
apiRef.current.forceUpdate();
|
|
49
47
|
}, [logger, apiRef]);
|
|
50
48
|
|
|
51
49
|
/**
|
|
@@ -406,7 +406,7 @@ export const useGridRowEditing = (apiRef, props) => {
|
|
|
406
406
|
});
|
|
407
407
|
return;
|
|
408
408
|
}
|
|
409
|
-
const rowUpdate = apiRef.current.getRowWithUpdatedValuesFromRowEditing(
|
|
409
|
+
const rowUpdate = apiRef.current.getRowWithUpdatedValuesFromRowEditing(id);
|
|
410
410
|
if (processRowUpdate) {
|
|
411
411
|
const handleError = errorThrown => {
|
|
412
412
|
// The row might have been deleted
|
|
@@ -12,7 +12,7 @@ import { useGridRootProps } from "../../utils/useGridRootProps.js";
|
|
|
12
12
|
import { useGridSelector } from "../../utils/useGridSelector.js";
|
|
13
13
|
import { useRunOnce } from "../../utils/useRunOnce.js";
|
|
14
14
|
import { gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector, gridColumnPositionsSelector, gridHasColSpanSelector } from "../columns/gridColumnsSelector.js";
|
|
15
|
-
import { gridPinnedRowsSelector } from "../rows/gridRowsSelector.js";
|
|
15
|
+
import { gridPinnedRowsSelector, gridRowTreeSelector } from "../rows/gridRowsSelector.js";
|
|
16
16
|
import { useGridVisibleRows, getVisibleRows } from "../../utils/useGridVisibleRows.js";
|
|
17
17
|
import { useGridApiOptionHandler } from "../../utils/index.js";
|
|
18
18
|
import * as platform from "../../../utils/platform.js";
|
|
@@ -258,6 +258,7 @@ export const useGridVirtualScroller = () => {
|
|
|
258
258
|
if (!params.rows && !currentPage.range) {
|
|
259
259
|
return [];
|
|
260
260
|
}
|
|
261
|
+
const rowTree = gridRowTreeSelector(apiRef);
|
|
261
262
|
let baseRenderContext = renderContext;
|
|
262
263
|
if (params.renderContext) {
|
|
263
264
|
baseRenderContext = params.renderContext;
|
|
@@ -303,6 +304,16 @@ export const useGridVirtualScroller = () => {
|
|
|
303
304
|
id,
|
|
304
305
|
model
|
|
305
306
|
} = rowModels[rowIndexInPage];
|
|
307
|
+
|
|
308
|
+
// In certain cases, the state might already be updated and `currentPage.rows` (which sets `rowModels`)
|
|
309
|
+
// contains stale data.
|
|
310
|
+
// In that case, skip any further row processing.
|
|
311
|
+
// See:
|
|
312
|
+
// - https://github.com/mui/mui-x/issues/16638
|
|
313
|
+
// - https://github.com/mui/mui-x/issues/17022
|
|
314
|
+
if (!rowTree[id]) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
306
317
|
const rowIndex = (currentPage?.range?.firstRowIndex || 0) + rowIndexOffset + rowIndexInPage;
|
|
307
318
|
|
|
308
319
|
// NOTE: This is an expensive feature, the colSpan code could be optimized.
|
package/index.js
CHANGED
|
@@ -192,7 +192,7 @@ const GridRow = forwardRef(function GridRow(props, refProp) {
|
|
|
192
192
|
return rowStyle;
|
|
193
193
|
}, [isNotVisible, rowHeight, styleProp, heightEntry, rootProps.rowSpacingType]);
|
|
194
194
|
const rowClassNames = apiRef.current.unstable_applyPipeProcessors('rowClassName', [], rowId);
|
|
195
|
-
const ariaAttributes =
|
|
195
|
+
const ariaAttributes = getRowAriaAttributes(rowNode, index);
|
|
196
196
|
if (typeof rootProps.getRowClassName === 'function') {
|
|
197
197
|
const indexRelativeToCurrentPage = index - (currentPage.range?.firstRowIndex || 0);
|
|
198
198
|
const rowParams = _extends({}, apiRef.current.getRowParams(rowId), {
|
|
@@ -202,11 +202,6 @@ const GridRow = forwardRef(function GridRow(props, refProp) {
|
|
|
202
202
|
});
|
|
203
203
|
rowClassNames.push(rootProps.getRowClassName(rowParams));
|
|
204
204
|
}
|
|
205
|
-
|
|
206
|
-
/* Start of rendering */
|
|
207
|
-
if (!rowNode) {
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
210
205
|
const getCell = (column, indexInSection, indexRelativeToAllColumns, sectionLength, pinnedPosition = PinnedColumnPosition.NONE) => {
|
|
211
206
|
const cellColSpanInfo = apiRef.current.unstable_getCellColSpanInfo(rowId, indexRelativeToAllColumns);
|
|
212
207
|
if (cellColSpanInfo?.spannedByColSpan) {
|
|
@@ -215,7 +210,7 @@ const GridRow = forwardRef(function GridRow(props, refProp) {
|
|
|
215
210
|
const width = cellColSpanInfo?.cellProps.width ?? column.computedWidth;
|
|
216
211
|
const colSpan = cellColSpanInfo?.cellProps.colSpan ?? 1;
|
|
217
212
|
const pinnedOffset = getPinnedCellOffset(pinnedPosition, column.computedWidth, indexRelativeToAllColumns, columnPositions, columnsTotalWidth, scrollbarWidth);
|
|
218
|
-
if (rowNode
|
|
213
|
+
if (rowNode.type === 'skeletonRow') {
|
|
219
214
|
return /*#__PURE__*/_jsx(slots.skeletonCell, {
|
|
220
215
|
type: column.type,
|
|
221
216
|
width: width,
|
|
@@ -55,7 +55,7 @@ const GridHeaderCheckbox = forwardRef(function GridHeaderCheckbox(props, ref) {
|
|
|
55
55
|
|
|
56
56
|
// All the rows that could be selected / unselected by toggling this checkbox
|
|
57
57
|
const selectionCandidates = React.useMemo(() => {
|
|
58
|
-
const rowIds = !rootProps.pagination || !rootProps.checkboxSelectionVisibleOnly ? visibleRowIds : paginatedVisibleRowIds;
|
|
58
|
+
const rowIds = !rootProps.pagination || !rootProps.checkboxSelectionVisibleOnly || rootProps.paginationMode === 'server' ? visibleRowIds : paginatedVisibleRowIds;
|
|
59
59
|
|
|
60
60
|
// Convert to an object to make O(1) checking if a row exists or not
|
|
61
61
|
// TODO create selector that returns visibleRowIds/paginatedVisibleRowIds as an object
|
|
@@ -63,7 +63,7 @@ const GridHeaderCheckbox = forwardRef(function GridHeaderCheckbox(props, ref) {
|
|
|
63
63
|
acc[id] = true;
|
|
64
64
|
return acc;
|
|
65
65
|
}, {});
|
|
66
|
-
}, [rootProps.pagination, rootProps.checkboxSelectionVisibleOnly, paginatedVisibleRowIds, visibleRowIds]);
|
|
66
|
+
}, [rootProps.pagination, rootProps.paginationMode, rootProps.checkboxSelectionVisibleOnly, paginatedVisibleRowIds, visibleRowIds]);
|
|
67
67
|
|
|
68
68
|
// Amount of rows selected and that are visible in the current page
|
|
69
69
|
const currentSelectionSize = React.useMemo(() => filteredSelection.filter(id => selectionCandidates[id]).length, [filteredSelection, selectionCandidates]);
|
|
@@ -44,8 +44,6 @@ export function useGridColumns(apiRef, props) {
|
|
|
44
44
|
logger.debug('Updating columns state.');
|
|
45
45
|
apiRef.current.setState(mergeColumnsState(columnsState));
|
|
46
46
|
apiRef.current.publishEvent('columnsChange', columnsState.orderedFields);
|
|
47
|
-
apiRef.current.updateRenderContext?.();
|
|
48
|
-
apiRef.current.forceUpdate();
|
|
49
47
|
}, [logger, apiRef]);
|
|
50
48
|
|
|
51
49
|
/**
|
|
@@ -406,7 +406,7 @@ export const useGridRowEditing = (apiRef, props) => {
|
|
|
406
406
|
});
|
|
407
407
|
return;
|
|
408
408
|
}
|
|
409
|
-
const rowUpdate = apiRef.current.getRowWithUpdatedValuesFromRowEditing(
|
|
409
|
+
const rowUpdate = apiRef.current.getRowWithUpdatedValuesFromRowEditing(id);
|
|
410
410
|
if (processRowUpdate) {
|
|
411
411
|
const handleError = errorThrown => {
|
|
412
412
|
// The row might have been deleted
|
|
@@ -12,7 +12,7 @@ import { useGridRootProps } from "../../utils/useGridRootProps.js";
|
|
|
12
12
|
import { useGridSelector } from "../../utils/useGridSelector.js";
|
|
13
13
|
import { useRunOnce } from "../../utils/useRunOnce.js";
|
|
14
14
|
import { gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector, gridColumnPositionsSelector, gridHasColSpanSelector } from "../columns/gridColumnsSelector.js";
|
|
15
|
-
import { gridPinnedRowsSelector } from "../rows/gridRowsSelector.js";
|
|
15
|
+
import { gridPinnedRowsSelector, gridRowTreeSelector } from "../rows/gridRowsSelector.js";
|
|
16
16
|
import { useGridVisibleRows, getVisibleRows } from "../../utils/useGridVisibleRows.js";
|
|
17
17
|
import { useGridApiOptionHandler } from "../../utils/index.js";
|
|
18
18
|
import * as platform from "../../../utils/platform.js";
|
|
@@ -258,6 +258,7 @@ export const useGridVirtualScroller = () => {
|
|
|
258
258
|
if (!params.rows && !currentPage.range) {
|
|
259
259
|
return [];
|
|
260
260
|
}
|
|
261
|
+
const rowTree = gridRowTreeSelector(apiRef);
|
|
261
262
|
let baseRenderContext = renderContext;
|
|
262
263
|
if (params.renderContext) {
|
|
263
264
|
baseRenderContext = params.renderContext;
|
|
@@ -303,6 +304,16 @@ export const useGridVirtualScroller = () => {
|
|
|
303
304
|
id,
|
|
304
305
|
model
|
|
305
306
|
} = rowModels[rowIndexInPage];
|
|
307
|
+
|
|
308
|
+
// In certain cases, the state might already be updated and `currentPage.rows` (which sets `rowModels`)
|
|
309
|
+
// contains stale data.
|
|
310
|
+
// In that case, skip any further row processing.
|
|
311
|
+
// See:
|
|
312
|
+
// - https://github.com/mui/mui-x/issues/16638
|
|
313
|
+
// - https://github.com/mui/mui-x/issues/17022
|
|
314
|
+
if (!rowTree[id]) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
306
317
|
const rowIndex = (currentPage?.range?.firstRowIndex || 0) + rowIndexOffset + rowIndexInPage;
|
|
307
318
|
|
|
308
319
|
// NOTE: This is an expensive feature, the colSpan code could be optimized.
|
package/modern/index.js
CHANGED
|
@@ -199,7 +199,7 @@ const GridRow = (0, _forwardRef.forwardRef)(function GridRow(props, refProp) {
|
|
|
199
199
|
return rowStyle;
|
|
200
200
|
}, [isNotVisible, rowHeight, styleProp, heightEntry, rootProps.rowSpacingType]);
|
|
201
201
|
const rowClassNames = apiRef.current.unstable_applyPipeProcessors('rowClassName', [], rowId);
|
|
202
|
-
const ariaAttributes =
|
|
202
|
+
const ariaAttributes = getRowAriaAttributes(rowNode, index);
|
|
203
203
|
if (typeof rootProps.getRowClassName === 'function') {
|
|
204
204
|
const indexRelativeToCurrentPage = index - (currentPage.range?.firstRowIndex || 0);
|
|
205
205
|
const rowParams = (0, _extends2.default)({}, apiRef.current.getRowParams(rowId), {
|
|
@@ -209,11 +209,6 @@ const GridRow = (0, _forwardRef.forwardRef)(function GridRow(props, refProp) {
|
|
|
209
209
|
});
|
|
210
210
|
rowClassNames.push(rootProps.getRowClassName(rowParams));
|
|
211
211
|
}
|
|
212
|
-
|
|
213
|
-
/* Start of rendering */
|
|
214
|
-
if (!rowNode) {
|
|
215
|
-
return null;
|
|
216
|
-
}
|
|
217
212
|
const getCell = (column, indexInSection, indexRelativeToAllColumns, sectionLength, pinnedPosition = _constants.PinnedColumnPosition.NONE) => {
|
|
218
213
|
const cellColSpanInfo = apiRef.current.unstable_getCellColSpanInfo(rowId, indexRelativeToAllColumns);
|
|
219
214
|
if (cellColSpanInfo?.spannedByColSpan) {
|
|
@@ -222,7 +217,7 @@ const GridRow = (0, _forwardRef.forwardRef)(function GridRow(props, refProp) {
|
|
|
222
217
|
const width = cellColSpanInfo?.cellProps.width ?? column.computedWidth;
|
|
223
218
|
const colSpan = cellColSpanInfo?.cellProps.colSpan ?? 1;
|
|
224
219
|
const pinnedOffset = (0, _getPinnedCellOffset.getPinnedCellOffset)(pinnedPosition, column.computedWidth, indexRelativeToAllColumns, columnPositions, columnsTotalWidth, scrollbarWidth);
|
|
225
|
-
if (rowNode
|
|
220
|
+
if (rowNode.type === 'skeletonRow') {
|
|
226
221
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(slots.skeletonCell, {
|
|
227
222
|
type: column.type,
|
|
228
223
|
width: width,
|
|
@@ -63,7 +63,7 @@ const GridHeaderCheckbox = exports.GridHeaderCheckbox = (0, _forwardRef.forwardR
|
|
|
63
63
|
|
|
64
64
|
// All the rows that could be selected / unselected by toggling this checkbox
|
|
65
65
|
const selectionCandidates = React.useMemo(() => {
|
|
66
|
-
const rowIds = !rootProps.pagination || !rootProps.checkboxSelectionVisibleOnly ? visibleRowIds : paginatedVisibleRowIds;
|
|
66
|
+
const rowIds = !rootProps.pagination || !rootProps.checkboxSelectionVisibleOnly || rootProps.paginationMode === 'server' ? visibleRowIds : paginatedVisibleRowIds;
|
|
67
67
|
|
|
68
68
|
// Convert to an object to make O(1) checking if a row exists or not
|
|
69
69
|
// TODO create selector that returns visibleRowIds/paginatedVisibleRowIds as an object
|
|
@@ -71,7 +71,7 @@ const GridHeaderCheckbox = exports.GridHeaderCheckbox = (0, _forwardRef.forwardR
|
|
|
71
71
|
acc[id] = true;
|
|
72
72
|
return acc;
|
|
73
73
|
}, {});
|
|
74
|
-
}, [rootProps.pagination, rootProps.checkboxSelectionVisibleOnly, paginatedVisibleRowIds, visibleRowIds]);
|
|
74
|
+
}, [rootProps.pagination, rootProps.paginationMode, rootProps.checkboxSelectionVisibleOnly, paginatedVisibleRowIds, visibleRowIds]);
|
|
75
75
|
|
|
76
76
|
// Amount of rows selected and that are visible in the current page
|
|
77
77
|
const currentSelectionSize = React.useMemo(() => filteredSelection.filter(id => selectionCandidates[id]).length, [filteredSelection, selectionCandidates]);
|
|
@@ -54,8 +54,6 @@ function useGridColumns(apiRef, props) {
|
|
|
54
54
|
logger.debug('Updating columns state.');
|
|
55
55
|
apiRef.current.setState(mergeColumnsState(columnsState));
|
|
56
56
|
apiRef.current.publishEvent('columnsChange', columnsState.orderedFields);
|
|
57
|
-
apiRef.current.updateRenderContext?.();
|
|
58
|
-
apiRef.current.forceUpdate();
|
|
59
57
|
}, [logger, apiRef]);
|
|
60
58
|
|
|
61
59
|
/**
|
|
@@ -414,7 +414,7 @@ const useGridRowEditing = (apiRef, props) => {
|
|
|
414
414
|
});
|
|
415
415
|
return;
|
|
416
416
|
}
|
|
417
|
-
const rowUpdate = apiRef.current.getRowWithUpdatedValuesFromRowEditing(
|
|
417
|
+
const rowUpdate = apiRef.current.getRowWithUpdatedValuesFromRowEditing(id);
|
|
418
418
|
if (processRowUpdate) {
|
|
419
419
|
const handleError = errorThrown => {
|
|
420
420
|
// The row might have been deleted
|
|
@@ -269,6 +269,7 @@ const useGridVirtualScroller = () => {
|
|
|
269
269
|
if (!params.rows && !currentPage.range) {
|
|
270
270
|
return [];
|
|
271
271
|
}
|
|
272
|
+
const rowTree = (0, _gridRowsSelector.gridRowTreeSelector)(apiRef);
|
|
272
273
|
let baseRenderContext = renderContext;
|
|
273
274
|
if (params.renderContext) {
|
|
274
275
|
baseRenderContext = params.renderContext;
|
|
@@ -314,6 +315,16 @@ const useGridVirtualScroller = () => {
|
|
|
314
315
|
id,
|
|
315
316
|
model
|
|
316
317
|
} = rowModels[rowIndexInPage];
|
|
318
|
+
|
|
319
|
+
// In certain cases, the state might already be updated and `currentPage.rows` (which sets `rowModels`)
|
|
320
|
+
// contains stale data.
|
|
321
|
+
// In that case, skip any further row processing.
|
|
322
|
+
// See:
|
|
323
|
+
// - https://github.com/mui/mui-x/issues/16638
|
|
324
|
+
// - https://github.com/mui/mui-x/issues/17022
|
|
325
|
+
if (!rowTree[id]) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
317
328
|
const rowIndex = (currentPage?.range?.firstRowIndex || 0) + rowIndexOffset + rowIndexInPage;
|
|
318
329
|
|
|
319
330
|
// NOTE: This is an expensive feature, the colSpan code could be optimized.
|
package/node/index.js
CHANGED