@mui/x-data-grid 9.7.0 → 9.8.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/CHANGELOG.md +130 -1
- package/hooks/features/editing/useGridCellEditing.js +14 -7
- package/hooks/features/editing/useGridCellEditing.mjs +14 -7
- package/hooks/features/rows/gridRowsUtils.js +1 -1
- package/hooks/features/rows/gridRowsUtils.mjs +1 -1
- package/hooks/utils/useGridEvent.js +1 -1
- package/hooks/utils/useGridEvent.mjs +1 -1
- package/index.js +1 -1
- package/index.mjs +1 -1
- package/locales/jaJP.js +4 -5
- package/locales/jaJP.mjs +4 -5
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,135 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 9.8.0
|
|
4
|
+
|
|
5
|
+
_Jul 2, 2026_
|
|
6
|
+
|
|
7
|
+
We'd like to extend a big thank you to the 18 contributors who made this release possible. Here are some highlights ✨:
|
|
8
|
+
|
|
9
|
+
- 🗺️ New [`MapImagePlot`](https://mui.com/x/react-charts/map/) for rendering raster base maps, with `onItemClick` support on map shapes (Premium)
|
|
10
|
+
- 📊 New [`usePolarGeometry`](https://mui.com/x/react-charts/hooks/use-polar-geometry/) hook to build custom radial overlays
|
|
11
|
+
- 🐞 Bugfixes
|
|
12
|
+
- 📚 Documentation improvements
|
|
13
|
+
|
|
14
|
+
Special thanks go out to these community members for their valuable contributions:
|
|
15
|
+
@Anexus5919, @aromanio, @greymoth-jp, @mustafajw07, @timbuckley, @voidmatcha
|
|
16
|
+
|
|
17
|
+
The following team members contributed to this release:
|
|
18
|
+
@alexfauquette, @arminmeh, @cherniavskii, @flaviendelangle, @Janpot, @JCQuintas, @joserodolfofreitas, @LukasTy, @mapache-salvaje, @michelengelen, @rita-codes, @sai6855
|
|
19
|
+
|
|
20
|
+
### Data Grid
|
|
21
|
+
|
|
22
|
+
#### `@mui/x-data-grid@9.8.0`
|
|
23
|
+
|
|
24
|
+
- [DataGrid] Prevent cell editing from resurrecting a deleted row (#22958) @Anexus5919
|
|
25
|
+
- [DataGrid] Avoid reading `type` of `undefined` in `gridRowUtils` (#21808) @timbuckley
|
|
26
|
+
- [DataGrid] Improved get started tutorial (#22911) @joserodolfofreitas
|
|
27
|
+
- [l10n] Improve Japanese (ja-JP) locale (#23001) @greymoth-jp
|
|
28
|
+
|
|
29
|
+
#### `@mui/x-data-grid-pro@9.8.0` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
30
|
+
|
|
31
|
+
Same changes as in `@mui/x-data-grid@9.8.0`.
|
|
32
|
+
|
|
33
|
+
#### `@mui/x-data-grid-premium@9.8.0` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
34
|
+
|
|
35
|
+
Same changes as in `@mui/x-data-grid-pro@9.8.0`, plus:
|
|
36
|
+
|
|
37
|
+
- [DataGridPremium] Escape `singleSelect` values in Excel export with `escapeFormulas` enabled (#22851) @Anexus5919
|
|
38
|
+
|
|
39
|
+
### Date and Time Pickers
|
|
40
|
+
|
|
41
|
+
#### `@mui/x-date-pickers@9.8.0`
|
|
42
|
+
|
|
43
|
+
- [pickers] Fix localized digit crash (#22995) @alexfauquette
|
|
44
|
+
- [pickers] Flag the first and last visible day cell across year boundaries (#22981) @Anexus5919
|
|
45
|
+
- [pickers] Use calendar day tokens in `AdapterMomentHijri` and `AdapterMomentJalaali` formats (#22974) @Anexus5919
|
|
46
|
+
- [pickers] Use the Hijri day token in `AdapterMomentHijri` `normalDateWithWeekday` (#22972) @Anexus5919
|
|
47
|
+
- [l10n] Improve Romanian (ro-RO) locale (#22969) @aromanio
|
|
48
|
+
|
|
49
|
+
#### `@mui/x-date-pickers-pro@9.8.0` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
50
|
+
|
|
51
|
+
Same changes as in `@mui/x-date-pickers@9.8.0`, plus:
|
|
52
|
+
|
|
53
|
+
- [DateRangeCalendar] Fix auto month-switch across the year boundary (#22987) @Anexus5919
|
|
54
|
+
|
|
55
|
+
### Charts
|
|
56
|
+
|
|
57
|
+
#### `@mui/x-charts@9.8.0`
|
|
58
|
+
|
|
59
|
+
- [charts] Decouple `d3-geo` from the universal tooltip (#23011) @sai6855
|
|
60
|
+
- [charts] Deduplicate `getGroupingConfig` (#22889) @sai6855
|
|
61
|
+
- [charts] Expose `usePolarGeometry` hook for radial overlays (#22892) @mustafajw07
|
|
62
|
+
|
|
63
|
+
#### `@mui/x-charts-pro@9.8.0` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
64
|
+
|
|
65
|
+
Same changes as in `@mui/x-charts@9.8.0`.
|
|
66
|
+
|
|
67
|
+
#### `@mui/x-charts-premium@9.8.0` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
68
|
+
|
|
69
|
+
Same changes as in `@mui/x-charts-pro@9.8.0`, plus:
|
|
70
|
+
|
|
71
|
+
- [charts-premium] Add `onItemClick` support for the Map shapes (#22876) @sai6855
|
|
72
|
+
- [charts-premium] Replace `dataIndex` with `name` in map identifier (#22891) @sai6855
|
|
73
|
+
- [charts-premium] Share helper function (#23030) @alexfauquette
|
|
74
|
+
- [charts-premium] Extract shared WebGL utilities across bar/scatter/heatmap renderers (#22466) @sai6855
|
|
75
|
+
- [charts-premium] Add `MapImagePlot` for raster base maps (#22977) @JCQuintas
|
|
76
|
+
|
|
77
|
+
### Tree View
|
|
78
|
+
|
|
79
|
+
#### `@mui/x-tree-view@9.8.0`
|
|
80
|
+
|
|
81
|
+
- [TreeView] Fix extra selection event when clicking a collapsed parent item (#22249) @michelengelen
|
|
82
|
+
- [TreeView] Enforce top-level type imports (#23034) @Janpot
|
|
83
|
+
|
|
84
|
+
#### `@mui/x-tree-view-pro@9.8.0` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
85
|
+
|
|
86
|
+
Same changes as in `@mui/x-tree-view@9.8.0`.
|
|
87
|
+
|
|
88
|
+
### Scheduler
|
|
89
|
+
|
|
90
|
+
#### `@mui/x-scheduler@9.0.0-beta.4`
|
|
91
|
+
|
|
92
|
+
- [scheduler] Enforce top-level type imports (#22931) @Janpot
|
|
93
|
+
- [scheduler] Keep the occurrence date when editing only one recurring event (#23007) @Anexus5919
|
|
94
|
+
- [scheduler] Track bundle size of scheduler packages (#22682) @flaviendelangle
|
|
95
|
+
- [scheduler] Add `viewConfig` prop to limit displayed hours in the day and week views (#22929) @flaviendelangle
|
|
96
|
+
|
|
97
|
+
#### `@mui/x-scheduler-premium@9.0.0-beta.4` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
98
|
+
|
|
99
|
+
Same changes as in `@mui/x-scheduler@9.0.0-beta.4`, plus:
|
|
100
|
+
|
|
101
|
+
- [scheduler] Collapsible resources in the timeline (#22920) @rita-codes
|
|
102
|
+
|
|
103
|
+
### Codemod
|
|
104
|
+
|
|
105
|
+
#### `@mui/x-codemod@9.8.0`
|
|
106
|
+
|
|
107
|
+
Internal changes.
|
|
108
|
+
|
|
109
|
+
### Docs
|
|
110
|
+
|
|
111
|
+
- [docs] Add recipe for conditional master-detail panels (#22971) @michelengelen
|
|
112
|
+
- [docs] Add recipe for describing active filters in the toolbar (#22970) @michelengelen
|
|
113
|
+
- [docs] Add recipe for triggering clipboard copy from a button (#22967) @michelengelen
|
|
114
|
+
- [docs] Clarify that `fieldRef.current.focusField()` is the canonical way to focus a field (#22937) @michelengelen
|
|
115
|
+
- [docs][scheduler] Another copyediting pass across the Scheduler docs (#22619) @mapache-salvaje
|
|
116
|
+
- [docs][charts] Add map example for arbitrary GeoJSON shapes (#22976) @JCQuintas
|
|
117
|
+
- [docs][charts] Double point count in `ScatterAsyncRenderer` demo (#22906) @JCQuintas
|
|
118
|
+
|
|
119
|
+
### Core
|
|
120
|
+
|
|
121
|
+
- [code-infra] Fix tracking branch bug in release script (#22956) @michelengelen
|
|
122
|
+
- [code-infra] Remove mark-duplicate workflow (#22994) @cherniavskii
|
|
123
|
+
- [code-infra] Revert `nanoid@3.3.15` `minimumReleaseAge` exemption (#22953) @LukasTy
|
|
124
|
+
|
|
125
|
+
### Miscellaneous
|
|
126
|
+
|
|
127
|
+
- [internals] Fix `ERR_UNSUPPORTED_DIR_IMPORT` for `core-js-pure` in Node ESM (#22985) @michelengelen
|
|
128
|
+
- [internals] Harden `useDisposable` React internals read with safeReact (#22986) @rita-codes
|
|
129
|
+
- [internals] Replace core-js `DisposableStack` ponyfill with a minimal fallback (#23002) @sai6855
|
|
130
|
+
- [test] Assert the edited `dateTime` cell value in the e2e edit test (#22982) @voidmatcha
|
|
131
|
+
- [virtualizer] Remeasure scrollbars when layout changes (#22914) @arminmeh
|
|
132
|
+
|
|
3
133
|
## 9.7.0
|
|
4
134
|
|
|
5
135
|
_Jun 25, 2026_
|
|
@@ -178,7 +308,6 @@ Same changes as in `@mui/x-charts-pro@9.6.0`, plus:
|
|
|
178
308
|
- [charts-premium] Support maps tooltip positioned on items (#22648) @alexfauquette
|
|
179
309
|
- [docs] Show how to export maps (#22837) @alexfauquette
|
|
180
310
|
|
|
181
|
-
|
|
182
311
|
### Tree View
|
|
183
312
|
|
|
184
313
|
#### `@mui/x-tree-view@9.6.0`
|
|
@@ -366,11 +366,14 @@ const useGridCellEditing = (apiRef, props) => {
|
|
|
366
366
|
}
|
|
367
367
|
} else if (processRowUpdate) {
|
|
368
368
|
const handleError = errorThrown => {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
mode
|
|
373
|
-
|
|
369
|
+
// The row might have been deleted
|
|
370
|
+
if (prevCellModesModel.current[id]?.[field]) {
|
|
371
|
+
prevCellModesModel.current[id][field].mode = _gridEditRowModel.GridCellModes.Edit;
|
|
372
|
+
// Revert the mode in the cellModesModel prop back to "edit"
|
|
373
|
+
updateFieldInCellModesModel(id, field, {
|
|
374
|
+
mode: _gridEditRowModel.GridCellModes.Edit
|
|
375
|
+
});
|
|
376
|
+
}
|
|
374
377
|
if (onProcessRowUpdateError) {
|
|
375
378
|
onProcessRowUpdateError(errorThrown);
|
|
376
379
|
} else if (process.env.NODE_ENV !== 'production') {
|
|
@@ -381,14 +384,18 @@ const useGridCellEditing = (apiRef, props) => {
|
|
|
381
384
|
Promise.resolve(processRowUpdate(rowUpdate, row, {
|
|
382
385
|
rowId: id
|
|
383
386
|
})).then(finalRowUpdate => {
|
|
384
|
-
apiRef.current.
|
|
387
|
+
if (apiRef.current.getRow(id)) {
|
|
388
|
+
apiRef.current.updateRows([finalRowUpdate]);
|
|
389
|
+
}
|
|
385
390
|
finishCellEditMode();
|
|
386
391
|
}).catch(handleError);
|
|
387
392
|
} catch (errorThrown) {
|
|
388
393
|
handleError(errorThrown);
|
|
389
394
|
}
|
|
390
395
|
} else {
|
|
391
|
-
apiRef.current.
|
|
396
|
+
if (apiRef.current.getRow(id)) {
|
|
397
|
+
apiRef.current.updateRows([rowUpdate]);
|
|
398
|
+
}
|
|
392
399
|
finishCellEditMode();
|
|
393
400
|
}
|
|
394
401
|
});
|
|
@@ -359,11 +359,14 @@ export const useGridCellEditing = (apiRef, props) => {
|
|
|
359
359
|
}
|
|
360
360
|
} else if (processRowUpdate) {
|
|
361
361
|
const handleError = errorThrown => {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
mode
|
|
366
|
-
|
|
362
|
+
// The row might have been deleted
|
|
363
|
+
if (prevCellModesModel.current[id]?.[field]) {
|
|
364
|
+
prevCellModesModel.current[id][field].mode = GridCellModes.Edit;
|
|
365
|
+
// Revert the mode in the cellModesModel prop back to "edit"
|
|
366
|
+
updateFieldInCellModesModel(id, field, {
|
|
367
|
+
mode: GridCellModes.Edit
|
|
368
|
+
});
|
|
369
|
+
}
|
|
367
370
|
if (onProcessRowUpdateError) {
|
|
368
371
|
onProcessRowUpdateError(errorThrown);
|
|
369
372
|
} else if (process.env.NODE_ENV !== 'production') {
|
|
@@ -374,14 +377,18 @@ export const useGridCellEditing = (apiRef, props) => {
|
|
|
374
377
|
Promise.resolve(processRowUpdate(rowUpdate, row, {
|
|
375
378
|
rowId: id
|
|
376
379
|
})).then(finalRowUpdate => {
|
|
377
|
-
apiRef.current.
|
|
380
|
+
if (apiRef.current.getRow(id)) {
|
|
381
|
+
apiRef.current.updateRows([finalRowUpdate]);
|
|
382
|
+
}
|
|
378
383
|
finishCellEditMode();
|
|
379
384
|
}).catch(handleError);
|
|
380
385
|
} catch (errorThrown) {
|
|
381
386
|
handleError(errorThrown);
|
|
382
387
|
}
|
|
383
388
|
} else {
|
|
384
|
-
apiRef.current.
|
|
389
|
+
if (apiRef.current.getRow(id)) {
|
|
390
|
+
apiRef.current.updateRows([rowUpdate]);
|
|
391
|
+
}
|
|
385
392
|
finishCellEditMode();
|
|
386
393
|
}
|
|
387
394
|
});
|
|
@@ -155,7 +155,7 @@ const isAutogeneratedRowNode = rowNode => rowNode.type === 'skeletonRow' || rowN
|
|
|
155
155
|
exports.isAutogeneratedRowNode = isAutogeneratedRowNode;
|
|
156
156
|
const getTreeNodeDescendants = (tree, parentId, skipAutoGeneratedRows, directChildrenOnly) => {
|
|
157
157
|
const node = tree[parentId];
|
|
158
|
-
if (node
|
|
158
|
+
if (node?.type !== 'group') {
|
|
159
159
|
return [];
|
|
160
160
|
}
|
|
161
161
|
const validDescendants = [];
|
|
@@ -137,7 +137,7 @@ export const isAutogeneratedRow = row => GRID_ID_AUTOGENERATED in row;
|
|
|
137
137
|
export const isAutogeneratedRowNode = rowNode => rowNode.type === 'skeletonRow' || rowNode.type === 'footer' || rowNode.type === 'group' && rowNode.isAutoGenerated || rowNode.type === 'pinnedRow' && rowNode.isAutoGenerated;
|
|
138
138
|
export const getTreeNodeDescendants = (tree, parentId, skipAutoGeneratedRows, directChildrenOnly) => {
|
|
139
139
|
const node = tree[parentId];
|
|
140
|
-
if (node
|
|
140
|
+
if (node?.type !== 'group') {
|
|
141
141
|
return [];
|
|
142
142
|
}
|
|
143
143
|
const validDescendants = [];
|
|
@@ -13,7 +13,7 @@ var React = _interopRequireWildcard(require("react"));
|
|
|
13
13
|
var _TimerBasedCleanupTracking = require("../../utils/cleanupTracking/TimerBasedCleanupTracking");
|
|
14
14
|
var _FinalizationRegistryBasedCleanupTracking = require("../../utils/cleanupTracking/FinalizationRegistryBasedCleanupTracking");
|
|
15
15
|
// Based on https://github.com/Bnaya/use-dispose-uncommitted/blob/main/src/finalization-registry-based-impl.ts
|
|
16
|
-
// Check https://github.com/
|
|
16
|
+
// Check https://github.com/react/react/issues/15317 to get more information
|
|
17
17
|
|
|
18
18
|
// We use class to make it easier to detect in heap snapshots by name
|
|
19
19
|
class ObjectToBeRetainedByReact {
|
|
@@ -4,7 +4,7 @@ import * as React from 'react';
|
|
|
4
4
|
import { TimerBasedCleanupTracking } from "../../utils/cleanupTracking/TimerBasedCleanupTracking.mjs";
|
|
5
5
|
import { FinalizationRegistryBasedCleanupTracking } from "../../utils/cleanupTracking/FinalizationRegistryBasedCleanupTracking.mjs";
|
|
6
6
|
// Based on https://github.com/Bnaya/use-dispose-uncommitted/blob/main/src/finalization-registry-based-impl.ts
|
|
7
|
-
// Check https://github.com/
|
|
7
|
+
// Check https://github.com/react/react/issues/15317 to get more information
|
|
8
8
|
|
|
9
9
|
// We use class to make it easier to detect in heap snapshots by name
|
|
10
10
|
class ObjectToBeRetainedByReact {
|
package/index.js
CHANGED
package/index.mjs
CHANGED
package/locales/jaJP.js
CHANGED
|
@@ -10,8 +10,8 @@ const jaJPGrid = {
|
|
|
10
10
|
// Root
|
|
11
11
|
noRowsLabel: '行がありません。',
|
|
12
12
|
noResultsOverlayLabel: '結果がありません。',
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
noColumnsOverlayLabel: '列がありません。',
|
|
14
|
+
noColumnsOverlayManageColumns: '列管理',
|
|
15
15
|
// emptyPivotOverlayLabel: 'Add fields to rows, columns, and values to create a pivot table',
|
|
16
16
|
|
|
17
17
|
// Density selector toolbar button text
|
|
@@ -56,8 +56,7 @@ const jaJPGrid = {
|
|
|
56
56
|
columnsManagementNoColumns: 'カラムなし',
|
|
57
57
|
columnsManagementShowHideAllText: 'すべて表示/非表示',
|
|
58
58
|
columnsManagementReset: 'リセット',
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
columnsManagementDeleteIconLabel: 'クリア',
|
|
61
60
|
// Filter panel text
|
|
62
61
|
filterPanelAddFilter: 'フィルター追加',
|
|
63
62
|
filterPanelRemoveAll: 'すべて削除',
|
|
@@ -120,7 +119,7 @@ const jaJPGrid = {
|
|
|
120
119
|
filterValueFalse: '偽',
|
|
121
120
|
// Column menu text
|
|
122
121
|
columnMenuLabel: 'メニュー',
|
|
123
|
-
|
|
122
|
+
columnMenuAriaLabel: columnName => `${columnName} 列メニュー`,
|
|
124
123
|
columnMenuShowColumns: '列表示',
|
|
125
124
|
columnMenuManageColumns: '列管理',
|
|
126
125
|
columnMenuFilter: 'フィルター',
|
package/locales/jaJP.mjs
CHANGED
|
@@ -4,8 +4,8 @@ const jaJPGrid = {
|
|
|
4
4
|
// Root
|
|
5
5
|
noRowsLabel: '行がありません。',
|
|
6
6
|
noResultsOverlayLabel: '結果がありません。',
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
noColumnsOverlayLabel: '列がありません。',
|
|
8
|
+
noColumnsOverlayManageColumns: '列管理',
|
|
9
9
|
// emptyPivotOverlayLabel: 'Add fields to rows, columns, and values to create a pivot table',
|
|
10
10
|
|
|
11
11
|
// Density selector toolbar button text
|
|
@@ -50,8 +50,7 @@ const jaJPGrid = {
|
|
|
50
50
|
columnsManagementNoColumns: 'カラムなし',
|
|
51
51
|
columnsManagementShowHideAllText: 'すべて表示/非表示',
|
|
52
52
|
columnsManagementReset: 'リセット',
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
columnsManagementDeleteIconLabel: 'クリア',
|
|
55
54
|
// Filter panel text
|
|
56
55
|
filterPanelAddFilter: 'フィルター追加',
|
|
57
56
|
filterPanelRemoveAll: 'すべて削除',
|
|
@@ -114,7 +113,7 @@ const jaJPGrid = {
|
|
|
114
113
|
filterValueFalse: '偽',
|
|
115
114
|
// Column menu text
|
|
116
115
|
columnMenuLabel: 'メニュー',
|
|
117
|
-
|
|
116
|
+
columnMenuAriaLabel: columnName => `${columnName} 列メニュー`,
|
|
118
117
|
columnMenuShowColumns: '列表示',
|
|
119
118
|
columnMenuManageColumns: '列管理',
|
|
120
119
|
columnMenuFilter: 'フィルター',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-data-grid",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.8.0",
|
|
4
4
|
"author": "MUI Team",
|
|
5
5
|
"description": "The Community plan edition of the MUI X Data Grid components.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"clsx": "^2.1.1",
|
|
44
44
|
"prop-types": "^15.8.1",
|
|
45
45
|
"use-sync-external-store": "^1.6.0",
|
|
46
|
-
"@mui/x-internals": "^9.
|
|
47
|
-
"@mui/x-virtualizer": "0.5.
|
|
46
|
+
"@mui/x-internals": "^9.8.0",
|
|
47
|
+
"@mui/x-virtualizer": "0.5.1"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"@emotion/react": "^11.9.0",
|