@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 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` [![pro](https://mui.com/r/x-pro-svg)](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` [![premium](https://mui.com/r/x-premium-svg)](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` [![pro](https://mui.com/r/x-pro-svg)](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` [![pro](https://mui.com/r/x-pro-svg)](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` [![premium](https://mui.com/r/x-premium-svg)](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` [![pro](https://mui.com/r/x-pro-svg)](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` [![premium](https://mui.com/r/x-premium-svg)](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
- prevCellModesModel.current[id][field].mode = _gridEditRowModel.GridCellModes.Edit;
370
- // Revert the mode in the cellModesModel prop back to "edit"
371
- updateFieldInCellModesModel(id, field, {
372
- mode: _gridEditRowModel.GridCellModes.Edit
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.updateRows([finalRowUpdate]);
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.updateRows([rowUpdate]);
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
- prevCellModesModel.current[id][field].mode = GridCellModes.Edit;
363
- // Revert the mode in the cellModesModel prop back to "edit"
364
- updateFieldInCellModesModel(id, field, {
365
- mode: GridCellModes.Edit
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.updateRows([finalRowUpdate]);
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.updateRows([rowUpdate]);
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.type !== 'group') {
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.type !== 'group') {
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/facebook/react/issues/15317 to get more information
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/facebook/react/issues/15317 to get more information
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
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v9.7.0
2
+ * @mui/x-data-grid v9.8.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
package/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v9.7.0
2
+ * @mui/x-data-grid v9.8.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
package/locales/jaJP.js CHANGED
@@ -10,8 +10,8 @@ const jaJPGrid = {
10
10
  // Root
11
11
  noRowsLabel: '行がありません。',
12
12
  noResultsOverlayLabel: '結果がありません。',
13
- // noColumnsOverlayLabel: 'No columns',
14
- // noColumnsOverlayManageColumns: 'Manage columns',
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
- // columnsManagementDeleteIconLabel: 'Clear',
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
- // columnMenuAriaLabel: (columnName: string) => `${columnName} column menu`,
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
- // noColumnsOverlayLabel: 'No columns',
8
- // noColumnsOverlayManageColumns: 'Manage columns',
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
- // columnsManagementDeleteIconLabel: 'Clear',
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
- // columnMenuAriaLabel: (columnName: string) => `${columnName} column menu`,
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.7.0",
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.7.0",
47
- "@mui/x-virtualizer": "0.5.0"
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",