@mui/x-data-grid 5.8.0 → 5.9.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.
Files changed (242) hide show
  1. package/CHANGELOG.md +141 -63
  2. package/DataGrid/DataGrid.js +1 -1
  3. package/DataGrid/useDataGridComponent.js +3 -1
  4. package/LICENSE +21 -0
  5. package/README.md +1 -1
  6. package/components/GridRow.d.ts +4 -0
  7. package/components/GridRow.js +49 -23
  8. package/components/base/GridOverlays.js +4 -3
  9. package/components/cell/GridActionsCell.d.ts +5 -1
  10. package/components/cell/GridActionsCell.js +170 -21
  11. package/components/cell/GridActionsCellItem.d.ts +66 -4
  12. package/components/cell/GridActionsCellItem.js +7 -5
  13. package/components/cell/GridCell.d.ts +1 -0
  14. package/components/cell/GridCell.js +28 -7
  15. package/components/cell/GridEditInputCell.js +1 -1
  16. package/components/cell/GridEditSingleSelectCell.js +22 -13
  17. package/components/columnHeaders/GridColumnHeaderItem.js +4 -7
  18. package/components/columnHeaders/GridColumnHeaders.d.ts +0 -1
  19. package/components/columnHeaders/GridColumnHeaders.js +1 -1
  20. package/components/columnSelection/GridCellCheckboxRenderer.d.ts +3 -3
  21. package/components/columnSelection/GridCellCheckboxRenderer.js +20 -3
  22. package/components/panel/GridPanel.js +1 -0
  23. package/components/panel/filterPanel/GridFilterForm.js +14 -10
  24. package/components/panel/filterPanel/GridFilterInputBoolean.js +13 -8
  25. package/components/panel/filterPanel/GridFilterInputSingleSelect.js +22 -15
  26. package/components/panel/filterPanel/GridFilterInputValue.js +22 -15
  27. package/components/toolbar/GridToolbarDensitySelector.js +1 -1
  28. package/components/toolbar/GridToolbarFilterButton.d.ts +1 -1
  29. package/components/virtualization/GridVirtualScroller.js +2 -0
  30. package/components/virtualization/GridVirtualScrollerContent.js +1 -3
  31. package/constants/gridDetailPanelToggleField.d.ts +1 -0
  32. package/constants/gridDetailPanelToggleField.js +2 -0
  33. package/hooks/core/pipeProcessing/gridPipeProcessingApi.d.ts +32 -15
  34. package/hooks/core/pipeProcessing/index.d.ts +1 -0
  35. package/hooks/core/pipeProcessing/index.js +2 -1
  36. package/hooks/core/pipeProcessing/useGridPipeProcessing.d.ts +8 -3
  37. package/hooks/core/pipeProcessing/useGridPipeProcessing.js +53 -19
  38. package/hooks/core/pipeProcessing/useGridRegisterPipeApplier.d.ts +3 -0
  39. package/hooks/core/pipeProcessing/useGridRegisterPipeApplier.js +27 -0
  40. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.d.ts +0 -3
  41. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +0 -4
  42. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +0 -1
  43. package/hooks/features/columnHeaders/useGridColumnHeaders.js +76 -10
  44. package/hooks/features/columns/gridColumnsInterfaces.d.ts +3 -1
  45. package/hooks/features/columns/gridColumnsUtils.d.ts +19 -1
  46. package/hooks/features/columns/gridColumnsUtils.js +61 -8
  47. package/hooks/features/columns/useGridColumnSpanning.d.ts +7 -0
  48. package/hooks/features/columns/useGridColumnSpanning.js +109 -0
  49. package/hooks/features/columns/useGridColumns.js +24 -18
  50. package/hooks/features/dimensions/useGridDimensions.js +3 -3
  51. package/hooks/features/editRows/useGridCellEditing.new.js +18 -10
  52. package/hooks/features/editRows/useGridEditing.new.js +7 -3
  53. package/hooks/features/editRows/useGridRowEditing.new.js +23 -15
  54. package/hooks/features/filter/useGridFilter.js +14 -9
  55. package/hooks/features/focus/useGridFocus.js +19 -9
  56. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.d.ts +1 -0
  57. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +39 -7
  58. package/hooks/features/rows/gridRowsSelector.d.ts +1 -0
  59. package/hooks/features/rows/gridRowsSelector.js +1 -0
  60. package/hooks/features/rows/gridRowsState.d.ts +4 -0
  61. package/hooks/features/rows/useGridRows.d.ts +2 -2
  62. package/hooks/features/rows/useGridRows.js +5 -4
  63. package/hooks/features/rows/useGridRowsMeta.js +6 -13
  64. package/hooks/features/scroll/useGridScroll.d.ts +2 -0
  65. package/hooks/features/scroll/useGridScroll.js +25 -3
  66. package/hooks/features/selection/useGridSelection.js +3 -2
  67. package/hooks/features/sorting/useGridSorting.js +10 -10
  68. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +7 -0
  69. package/hooks/features/virtualization/useGridVirtualScroller.js +54 -27
  70. package/index.js +1 -1
  71. package/internals/index.d.ts +1 -0
  72. package/internals/index.js +1 -0
  73. package/legacy/DataGrid/DataGrid.js +1 -1
  74. package/legacy/DataGrid/useDataGridComponent.js +3 -1
  75. package/legacy/components/GridRow.js +47 -23
  76. package/legacy/components/base/GridOverlays.js +4 -3
  77. package/legacy/components/cell/GridActionsCell.js +188 -27
  78. package/legacy/components/cell/GridActionsCellItem.js +7 -5
  79. package/legacy/components/cell/GridCell.js +29 -7
  80. package/legacy/components/cell/GridEditInputCell.js +1 -1
  81. package/legacy/components/cell/GridEditSingleSelectCell.js +33 -24
  82. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +4 -7
  83. package/legacy/components/columnHeaders/GridColumnHeaders.js +2 -3
  84. package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +21 -3
  85. package/legacy/components/panel/GridPanel.js +1 -0
  86. package/legacy/components/panel/filterPanel/GridFilterForm.js +14 -10
  87. package/legacy/components/panel/filterPanel/GridFilterInputBoolean.js +13 -8
  88. package/legacy/components/panel/filterPanel/GridFilterInputSingleSelect.js +22 -17
  89. package/legacy/components/panel/filterPanel/GridFilterInputValue.js +22 -17
  90. package/legacy/components/toolbar/GridToolbarDensitySelector.js +1 -1
  91. package/legacy/components/virtualization/GridVirtualScroller.js +2 -0
  92. package/legacy/components/virtualization/GridVirtualScrollerContent.js +1 -3
  93. package/legacy/constants/gridDetailPanelToggleField.js +2 -0
  94. package/legacy/hooks/core/pipeProcessing/index.js +2 -1
  95. package/legacy/hooks/core/pipeProcessing/useGridPipeProcessing.js +60 -24
  96. package/legacy/hooks/core/pipeProcessing/useGridRegisterPipeApplier.js +27 -0
  97. package/legacy/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +0 -4
  98. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +89 -10
  99. package/legacy/hooks/features/columns/gridColumnsUtils.js +79 -22
  100. package/legacy/hooks/features/columns/useGridColumnSpanning.js +107 -0
  101. package/legacy/hooks/features/columns/useGridColumns.js +24 -18
  102. package/legacy/hooks/features/dimensions/useGridDimensions.js +3 -3
  103. package/legacy/hooks/features/editRows/useGridCellEditing.new.js +14 -8
  104. package/legacy/hooks/features/editRows/useGridEditing.new.js +7 -3
  105. package/legacy/hooks/features/editRows/useGridRowEditing.new.js +32 -24
  106. package/legacy/hooks/features/filter/useGridFilter.js +14 -9
  107. package/legacy/hooks/features/focus/useGridFocus.js +19 -9
  108. package/legacy/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +39 -6
  109. package/legacy/hooks/features/rows/gridRowsSelector.js +3 -0
  110. package/legacy/hooks/features/rows/useGridRows.js +5 -4
  111. package/legacy/hooks/features/rows/useGridRowsMeta.js +6 -13
  112. package/legacy/hooks/features/scroll/useGridScroll.js +25 -3
  113. package/legacy/hooks/features/selection/useGridSelection.js +3 -2
  114. package/legacy/hooks/features/sorting/useGridSorting.js +5 -7
  115. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +65 -37
  116. package/legacy/index.js +1 -1
  117. package/legacy/internals/index.js +1 -0
  118. package/legacy/locales/huHU.js +120 -0
  119. package/legacy/locales/index.js +1 -0
  120. package/legacy/models/api/gridColumnSpanning.js +1 -0
  121. package/legacy/models/events/gridEvents.js +2 -3
  122. package/legacy/models/gridColumnSpanning.js +1 -0
  123. package/locales/huHU.d.ts +2 -0
  124. package/locales/huHU.js +108 -0
  125. package/locales/index.d.ts +1 -0
  126. package/locales/index.js +1 -0
  127. package/models/api/gridApiCommon.d.ts +2 -1
  128. package/models/api/gridColumnSpanning.d.ts +28 -0
  129. package/models/api/gridColumnSpanning.js +1 -0
  130. package/models/api/gridEditingApi.d.ts +49 -3
  131. package/models/colDef/gridColDef.d.ts +5 -0
  132. package/models/events/gridEventLookup.d.ts +3 -8
  133. package/models/events/gridEvents.d.ts +9 -14
  134. package/models/events/gridEvents.js +2 -3
  135. package/models/gridColumnSpanning.d.ts +12 -0
  136. package/models/gridColumnSpanning.js +1 -0
  137. package/models/gridEditRowModel.d.ts +1 -1
  138. package/models/params/gridCellParams.d.ts +12 -2
  139. package/models/params/gridRowParams.d.ts +5 -0
  140. package/models/props/DataGridProps.d.ts +1 -1
  141. package/modern/DataGrid/DataGrid.js +1 -1
  142. package/modern/DataGrid/useDataGridComponent.js +3 -1
  143. package/modern/components/GridRow.js +47 -21
  144. package/modern/components/base/GridOverlays.js +4 -3
  145. package/modern/components/cell/GridActionsCell.js +168 -21
  146. package/modern/components/cell/GridActionsCellItem.js +7 -5
  147. package/modern/components/cell/GridCell.js +28 -7
  148. package/modern/components/cell/GridEditInputCell.js +1 -1
  149. package/modern/components/cell/GridEditSingleSelectCell.js +20 -11
  150. package/modern/components/columnHeaders/GridColumnHeaderItem.js +4 -7
  151. package/modern/components/columnHeaders/GridColumnHeaders.js +1 -1
  152. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +20 -3
  153. package/modern/components/panel/GridPanel.js +1 -0
  154. package/modern/components/panel/filterPanel/GridFilterForm.js +10 -6
  155. package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +11 -6
  156. package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +20 -13
  157. package/modern/components/panel/filterPanel/GridFilterInputValue.js +20 -13
  158. package/modern/components/toolbar/GridToolbarDensitySelector.js +1 -1
  159. package/modern/components/virtualization/GridVirtualScroller.js +2 -0
  160. package/modern/components/virtualization/GridVirtualScrollerContent.js +1 -3
  161. package/modern/constants/gridDetailPanelToggleField.js +2 -0
  162. package/modern/hooks/core/pipeProcessing/index.js +2 -1
  163. package/modern/hooks/core/pipeProcessing/useGridPipeProcessing.js +53 -19
  164. package/modern/hooks/core/pipeProcessing/useGridRegisterPipeApplier.js +27 -0
  165. package/modern/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +0 -4
  166. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +76 -10
  167. package/modern/hooks/features/columns/gridColumnsUtils.js +61 -8
  168. package/modern/hooks/features/columns/useGridColumnSpanning.js +107 -0
  169. package/modern/hooks/features/columns/useGridColumns.js +24 -18
  170. package/modern/hooks/features/dimensions/useGridDimensions.js +3 -3
  171. package/modern/hooks/features/editRows/useGridCellEditing.new.js +18 -10
  172. package/modern/hooks/features/editRows/useGridEditing.new.js +7 -3
  173. package/modern/hooks/features/editRows/useGridRowEditing.new.js +23 -15
  174. package/modern/hooks/features/filter/useGridFilter.js +14 -9
  175. package/modern/hooks/features/focus/useGridFocus.js +19 -9
  176. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +37 -7
  177. package/modern/hooks/features/rows/gridRowsSelector.js +1 -0
  178. package/modern/hooks/features/rows/useGridRows.js +5 -4
  179. package/modern/hooks/features/rows/useGridRowsMeta.js +6 -13
  180. package/modern/hooks/features/scroll/useGridScroll.js +23 -3
  181. package/modern/hooks/features/selection/useGridSelection.js +3 -2
  182. package/modern/hooks/features/sorting/useGridSorting.js +10 -10
  183. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +54 -23
  184. package/modern/index.js +1 -1
  185. package/modern/internals/index.js +1 -0
  186. package/modern/locales/huHU.js +108 -0
  187. package/modern/locales/index.js +1 -0
  188. package/modern/models/api/gridColumnSpanning.js +1 -0
  189. package/modern/models/events/gridEvents.js +2 -3
  190. package/modern/models/gridColumnSpanning.js +1 -0
  191. package/node/DataGrid/DataGrid.js +1 -1
  192. package/node/DataGrid/useDataGridComponent.js +4 -1
  193. package/node/components/GridRow.js +50 -23
  194. package/node/components/base/GridOverlays.js +3 -2
  195. package/node/components/cell/GridActionsCell.js +172 -21
  196. package/node/components/cell/GridActionsCellItem.js +7 -4
  197. package/node/components/cell/GridCell.js +28 -7
  198. package/node/components/cell/GridEditInputCell.js +1 -1
  199. package/node/components/cell/GridEditSingleSelectCell.js +23 -13
  200. package/node/components/columnHeaders/GridColumnHeaderItem.js +4 -7
  201. package/node/components/columnHeaders/GridColumnHeaders.js +1 -1
  202. package/node/components/columnSelection/GridCellCheckboxRenderer.js +20 -3
  203. package/node/components/panel/GridPanel.js +1 -0
  204. package/node/components/panel/filterPanel/GridFilterForm.js +15 -10
  205. package/node/components/panel/filterPanel/GridFilterInputBoolean.js +14 -8
  206. package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +23 -15
  207. package/node/components/panel/filterPanel/GridFilterInputValue.js +23 -15
  208. package/node/components/toolbar/GridToolbarDensitySelector.js +1 -1
  209. package/node/components/virtualization/GridVirtualScroller.js +2 -0
  210. package/node/components/virtualization/GridVirtualScrollerContent.js +1 -3
  211. package/node/constants/gridDetailPanelToggleField.js +9 -0
  212. package/node/hooks/core/pipeProcessing/index.js +13 -0
  213. package/node/hooks/core/pipeProcessing/useGridPipeProcessing.js +51 -20
  214. package/node/hooks/core/pipeProcessing/useGridRegisterPipeApplier.js +42 -0
  215. package/node/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +0 -3
  216. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +80 -10
  217. package/node/hooks/features/columns/gridColumnsUtils.js +65 -9
  218. package/node/hooks/features/columns/useGridColumnSpanning.js +130 -0
  219. package/node/hooks/features/columns/useGridColumns.js +23 -17
  220. package/node/hooks/features/dimensions/useGridDimensions.js +3 -3
  221. package/node/hooks/features/editRows/useGridCellEditing.new.js +18 -10
  222. package/node/hooks/features/editRows/useGridEditing.new.js +6 -2
  223. package/node/hooks/features/editRows/useGridRowEditing.new.js +21 -14
  224. package/node/hooks/features/filter/useGridFilter.js +14 -9
  225. package/node/hooks/features/focus/useGridFocus.js +19 -9
  226. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +40 -7
  227. package/node/hooks/features/rows/gridRowsSelector.js +3 -1
  228. package/node/hooks/features/rows/useGridRows.js +5 -4
  229. package/node/hooks/features/rows/useGridRowsMeta.js +6 -14
  230. package/node/hooks/features/scroll/useGridScroll.js +26 -2
  231. package/node/hooks/features/selection/useGridSelection.js +4 -2
  232. package/node/hooks/features/sorting/useGridSorting.js +10 -10
  233. package/node/hooks/features/virtualization/useGridVirtualScroller.js +59 -27
  234. package/node/index.js +1 -1
  235. package/node/internals/index.js +8 -0
  236. package/node/locales/huHU.js +118 -0
  237. package/node/locales/index.js +13 -0
  238. package/node/models/api/gridColumnSpanning.js +5 -0
  239. package/node/models/events/gridEvents.js +2 -3
  240. package/node/models/gridColumnSpanning.js +5 -0
  241. package/package.json +4 -4
  242. package/utils/domUtils.d.ts +2 -2
@@ -41,6 +41,8 @@ var _gridCheckboxSelectionColDef = require("../colDef/gridCheckboxSelectionColDe
41
41
 
42
42
  var _gridActionsColDef = require("../colDef/gridActionsColDef");
43
43
 
44
+ var _gridDetailPanelToggleField = require("../constants/gridDetailPanelToggleField");
45
+
44
46
  var _jsxRuntime = require("react/jsx-runtime");
45
47
 
46
48
  const _excluded = ["selected", "rowId", "row", "index", "style", "rowHeight", "className", "visibleColumns", "renderedColumns", "containerWidth", "firstColumnToRender", "lastColumnToRender", "cellFocus", "cellTabIndex", "editRowsState", "isLastVisible", "onClick", "onDoubleClick", "onMouseEnter", "onMouseLeave"];
@@ -87,6 +89,7 @@ function GridRow(props) {
87
89
  const {
88
90
  selected,
89
91
  rowId,
92
+ row,
90
93
  index,
91
94
  style: styleProp,
92
95
  rowHeight,
@@ -157,7 +160,7 @@ function GridRow(props) {
157
160
  } // User opened a detail panel
158
161
 
159
162
 
160
- if (field === '__detail_panel_toggle__') {
163
+ if (field === _gridDetailPanelToggleField.GRID_DETAIL_PANEL_TOGGLE_FIELD) {
161
164
  return;
162
165
  } // User is editing a cell
163
166
 
@@ -198,7 +201,8 @@ function GridRow(props) {
198
201
  const indexRelativeToCurrentPage = index - currentPage.range.firstRowIndex;
199
202
  const rowParams = (0, _extends2.default)({}, apiRef.current.getRowParams(rowId), {
200
203
  isFirstVisible: indexRelativeToCurrentPage === 0,
201
- isLastVisible: indexRelativeToCurrentPage === currentPage.rows.length - 1
204
+ isLastVisible: indexRelativeToCurrentPage === currentPage.rows.length - 1,
205
+ indexRelativeToCurrentPage
202
206
  });
203
207
  rowClassName = rootProps.getRowClassName(rowParams);
204
208
  }
@@ -206,8 +210,6 @@ function GridRow(props) {
206
210
  const cells = [];
207
211
 
208
212
  for (let i = 0; i < renderedColumns.length; i += 1) {
209
- var _rootProps$components;
210
-
211
213
  const column = renderedColumns[i];
212
214
  const indexRelativeToAllColumns = firstColumnToRender + i;
213
215
  const isLastColumn = indexRelativeToAllColumns === visibleColumns.length - 1;
@@ -236,7 +238,16 @@ function GridRow(props) {
236
238
  if (editCellState != null && column.renderEditCell) {
237
239
  var _rootProps$classes2;
238
240
 
239
- const params = (0, _extends2.default)({}, cellParams, editCellState, {
241
+ let updatedRow = row;
242
+
243
+ if (apiRef.current.unstable_getRowWithUpdatedValues) {
244
+ // Only the new editing API has this method
245
+ updatedRow = apiRef.current.unstable_getRowWithUpdatedValues(rowId, column.field);
246
+ }
247
+
248
+ const params = (0, _extends2.default)({}, cellParams, {
249
+ row: updatedRow
250
+ }, editCellState, {
240
251
  api: apiRef.current
241
252
  });
242
253
  content = column.renderEditCell(params); // TODO move to GridCell
@@ -251,24 +262,35 @@ function GridRow(props) {
251
262
 
252
263
  const hasFocus = cellFocus !== null && cellFocus.id === rowId && cellFocus.field === column.field;
253
264
  const tabIndex = cellTabIndex !== null && cellTabIndex.id === rowId && cellTabIndex.field === column.field && cellParams.cellMode === 'view' ? 0 : -1;
254
- cells.push( /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.Cell, (0, _extends2.default)({
255
- value: cellParams.value,
256
- field: column.field,
257
- width: column.computedWidth,
258
- rowId: rowId,
259
- height: rowHeight,
260
- showRightBorder: showRightBorder,
261
- formattedValue: cellParams.formattedValue,
262
- align: column.align || 'left',
263
- cellMode: cellParams.cellMode,
264
- colIndex: indexRelativeToAllColumns,
265
- isEditable: cellParams.isEditable,
266
- hasFocus: hasFocus,
267
- tabIndex: tabIndex,
268
- className: (0, _clsx.default)(classNames)
269
- }, (_rootProps$components = rootProps.componentsProps) == null ? void 0 : _rootProps$components.cell, {
270
- children: content
271
- }), column.field));
265
+ const cellColSpanInfo = apiRef.current.unstable_getCellColSpanInfo(rowId, indexRelativeToAllColumns);
266
+
267
+ if (cellColSpanInfo && !cellColSpanInfo.spannedByColSpan) {
268
+ var _rootProps$components;
269
+
270
+ const {
271
+ colSpan,
272
+ width
273
+ } = cellColSpanInfo.cellProps;
274
+ cells.push( /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.Cell, (0, _extends2.default)({
275
+ value: cellParams.value,
276
+ field: column.field,
277
+ width: width,
278
+ rowId: rowId,
279
+ height: rowHeight,
280
+ showRightBorder: showRightBorder,
281
+ formattedValue: cellParams.formattedValue,
282
+ align: column.align || 'left',
283
+ cellMode: cellParams.cellMode,
284
+ colIndex: indexRelativeToAllColumns,
285
+ isEditable: cellParams.isEditable,
286
+ hasFocus: hasFocus,
287
+ tabIndex: tabIndex,
288
+ className: (0, _clsx.default)(classNames),
289
+ colSpan: colSpan
290
+ }, (_rootProps$components = rootProps.componentsProps) == null ? void 0 : _rootProps$components.cell, {
291
+ children: content
292
+ }), column.field));
293
+ }
272
294
  }
273
295
 
274
296
  const emptyCellWidth = containerWidth - columnsTotalWidth;
@@ -302,6 +324,11 @@ process.env.NODE_ENV !== "production" ? GridRow.propTypes = {
302
324
  containerWidth: _propTypes.default.number.isRequired,
303
325
  editRowsState: _propTypes.default.object.isRequired,
304
326
  firstColumnToRender: _propTypes.default.number.isRequired,
327
+
328
+ /**
329
+ * Index of the row in the whole sorted and filtered dataset.
330
+ * If some rows above have expanded children, this index also take those children into account.
331
+ */
305
332
  index: _propTypes.default.number.isRequired,
306
333
  isLastVisible: _propTypes.default.bool,
307
334
  lastColumnToRender: _propTypes.default.number.isRequired,
@@ -78,8 +78,9 @@ function GridOverlays() {
78
78
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
79
79
  const totalRowCount = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridRowCountSelector);
80
80
  const visibleRowCount = (0, _useGridSelector.useGridSelector)(apiRef, _gridFilterSelector.gridVisibleRowCountSelector);
81
- const showNoRowsOverlay = !rootProps.loading && totalRowCount === 0;
82
- const showNoResultsOverlay = !rootProps.loading && totalRowCount > 0 && visibleRowCount === 0;
81
+ const loading = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridRowsLoadingSelector);
82
+ const showNoRowsOverlay = !loading && totalRowCount === 0;
83
+ const showNoResultsOverlay = !loading && totalRowCount > 0 && visibleRowCount === 0;
83
84
  let overlay = null;
84
85
 
85
86
  if (showNoRowsOverlay) {
@@ -9,6 +9,8 @@ exports.renderActionsCell = exports.GridActionsCell = void 0;
9
9
 
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
 
12
+ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
13
+
12
14
  var React = _interopRequireWildcard(require("react"));
13
15
 
14
16
  var _propTypes = _interopRequireDefault(require("prop-types"));
@@ -25,8 +27,12 @@ var _GridMenu = require("../menu/GridMenu");
25
27
 
26
28
  var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
27
29
 
30
+ var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
31
+
28
32
  var _jsxRuntime = require("react/jsx-runtime");
29
33
 
34
+ const _excluded = ["colDef", "id", "api", "hasFocus", "isEditable", "field", "value", "formattedValue", "row", "rowNode", "cellMode", "getValue", "tabIndex", "position", "focusElementRef"];
35
+
30
36
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31
37
 
32
38
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -34,20 +40,25 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
34
40
  const hasActions = colDef => typeof colDef.getActions === 'function';
35
41
 
36
42
  const GridActionsCell = props => {
43
+ const {
44
+ colDef,
45
+ id,
46
+ hasFocus,
47
+ tabIndex,
48
+ position = 'bottom-end',
49
+ focusElementRef
50
+ } = props,
51
+ other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
52
+ const [focusedButtonIndex, setFocusedButtonIndex] = React.useState(-1);
37
53
  const [open, setOpen] = React.useState(false);
54
+ const apiRef = (0, _useGridApiContext.useGridApiContext)();
55
+ const rootRef = React.useRef(null);
38
56
  const buttonRef = React.useRef(null);
57
+ const ignoreCallToFocus = React.useRef(false);
39
58
  const touchRippleRefs = React.useRef({});
40
59
  const menuId = (0, _utils.unstable_useId)();
41
60
  const buttonId = (0, _utils.unstable_useId)();
42
61
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
43
- const {
44
- colDef,
45
- id,
46
- api,
47
- hasFocus,
48
- position = 'bottom-end'
49
- } = props; // TODO apply the rest to the root element
50
-
51
62
  React.useLayoutEffect(() => {
52
63
  if (!hasFocus) {
53
64
  Object.entries(touchRippleRefs.current).forEach(([index, ref]) => {
@@ -57,56 +68,144 @@ const GridActionsCell = props => {
57
68
  });
58
69
  }
59
70
  }, [hasFocus]);
71
+ React.useEffect(() => {
72
+ if (focusedButtonIndex >= 0) {
73
+ var _rootRef$current;
74
+
75
+ const child = (_rootRef$current = rootRef.current) == null ? void 0 : _rootRef$current.children[focusedButtonIndex];
76
+ child.focus();
77
+ }
78
+ }, [focusedButtonIndex]);
79
+ React.useEffect(() => {
80
+ if (!hasFocus) {
81
+ setFocusedButtonIndex(-1);
82
+ ignoreCallToFocus.current = false;
83
+ }
84
+ }, [hasFocus]);
85
+ React.useImperativeHandle(focusElementRef, () => ({
86
+ focus() {
87
+ // If ignoreCallToFocus is true, then one of the buttons was clicked and the focus is already set
88
+ if (!ignoreCallToFocus.current) {
89
+ setFocusedButtonIndex(0);
90
+ }
91
+ }
92
+
93
+ }), []);
60
94
 
61
95
  if (!hasActions(colDef)) {
62
96
  throw new Error('MUI: Missing the `getActions` property in the `GridColDef`.');
63
97
  }
64
98
 
65
- const showMenu = () => setOpen(true);
66
-
67
- const hideMenu = () => setOpen(false);
68
-
69
- const options = colDef.getActions(api.getRowParams(id));
99
+ const options = colDef.getActions(apiRef.current.getRowParams(id));
70
100
  const iconButtons = options.filter(option => !option.props.showInMenu);
71
101
  const menuButtons = options.filter(option => option.props.showInMenu);
102
+ const numberOfButtons = iconButtons.length + (menuButtons.length ? 1 : 0);
103
+
104
+ const showMenu = () => {
105
+ setOpen(true);
106
+ setFocusedButtonIndex(numberOfButtons - 1);
107
+ ignoreCallToFocus.current = true;
108
+ };
109
+
110
+ const hideMenu = () => {
111
+ setOpen(false);
112
+ };
72
113
 
73
114
  const handleTouchRippleRef = index => instance => {
74
115
  touchRippleRefs.current[index] = instance;
75
116
  };
76
117
 
77
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
118
+ const handleButtonClick = (index, onClick) => event => {
119
+ setFocusedButtonIndex(index);
120
+ ignoreCallToFocus.current = true;
121
+
122
+ if (onClick) {
123
+ onClick(event);
124
+ }
125
+ };
126
+
127
+ const handleRootKeyDown = event => {
128
+ if (numberOfButtons <= 1) {
129
+ return;
130
+ }
131
+
132
+ let newIndex = focusedButtonIndex;
133
+
134
+ if (event.key === 'ArrowRight') {
135
+ newIndex += 1;
136
+ } else if (event.key === 'ArrowLeft') {
137
+ newIndex -= 1;
138
+ }
139
+
140
+ if (newIndex < 0 || newIndex >= numberOfButtons) {
141
+ return; // We're already in the first or last item = do nothing and let the grid listen the event
142
+ }
143
+
144
+ if (newIndex !== focusedButtonIndex) {
145
+ event.preventDefault(); // Prevent scrolling
146
+
147
+ event.stopPropagation(); // Don't stop propagation for other keys, e.g. ArrowUp
148
+
149
+ setFocusedButtonIndex(newIndex);
150
+ }
151
+ };
152
+
153
+ const handleListKeyDown = event => {
154
+ if (event.key === 'Tab') {
155
+ event.preventDefault();
156
+ }
157
+
158
+ if (['Tab', 'Enter', 'Escape'].includes(event.key)) {
159
+ hideMenu();
160
+ }
161
+ };
162
+
163
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", (0, _extends2.default)({
164
+ role: "menu",
165
+ ref: rootRef,
166
+ tabIndex: -1,
78
167
  className: _gridClasses.gridClasses.actionsCell,
168
+ onKeyDown: handleRootKeyDown
169
+ }, other, {
79
170
  children: [iconButtons.map((button, index) => /*#__PURE__*/React.cloneElement(button, {
80
171
  key: index,
81
- touchRippleRef: handleTouchRippleRef(index)
82
- })), menuButtons.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
172
+ touchRippleRef: handleTouchRippleRef(index),
173
+ onClick: handleButtonClick(index, button.props.onClick),
174
+ tabIndex: focusedButtonIndex === index ? tabIndex : -1
175
+ })), menuButtons.length > 0 && buttonId && /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
83
176
  ref: buttonRef,
84
177
  id: buttonId,
85
- "aria-label": api.getLocaleText('actionsCellMore'),
178
+ "aria-label": apiRef.current.getLocaleText('actionsCellMore'),
86
179
  "aria-controls": menuId,
87
180
  "aria-expanded": open ? 'true' : undefined,
88
181
  "aria-haspopup": "true",
182
+ role: "menuitem",
89
183
  size: "small",
90
184
  onClick: showMenu,
185
+ touchRippleRef: handleTouchRippleRef(buttonId),
186
+ tabIndex: focusedButtonIndex === iconButtons.length ? tabIndex : -1,
91
187
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.MoreActionsIcon, {
92
188
  fontSize: "small"
93
189
  })
94
190
  }), menuButtons.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridMenu.GridMenu, {
95
- id: menuId,
96
191
  onClickAway: hideMenu,
97
192
  onClick: hideMenu,
98
193
  open: open,
99
194
  target: buttonRef.current,
100
195
  position: position,
101
- "aria-labelledby": buttonId,
102
196
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuList.default, {
197
+ id: menuId,
103
198
  className: _gridClasses.gridClasses.menuList,
199
+ onKeyDown: handleListKeyDown,
200
+ "aria-labelledby": buttonId,
201
+ variant: "menu",
202
+ autoFocusItem: true,
104
203
  children: menuButtons.map((button, index) => /*#__PURE__*/React.cloneElement(button, {
105
204
  key: index
106
205
  }))
107
206
  })
108
207
  })]
109
- });
208
+ }));
110
209
  };
111
210
 
112
211
  exports.GridActionsCell = GridActionsCell;
@@ -122,11 +221,42 @@ process.env.NODE_ENV !== "production" ? GridActionsCell.propTypes = {
122
221
  */
123
222
  api: _propTypes.default.any.isRequired,
124
223
 
224
+ /**
225
+ * The mode of the cell.
226
+ */
227
+ cellMode: _propTypes.default.oneOf(['edit', 'view']).isRequired,
228
+
125
229
  /**
126
230
  * The column of the row that the current cell belongs to.
127
231
  */
128
232
  colDef: _propTypes.default.object.isRequired,
129
233
 
234
+ /**
235
+ * The column field of the cell that triggered the event.
236
+ */
237
+ field: _propTypes.default.string.isRequired,
238
+
239
+ /**
240
+ * A ref allowing to set imperative focus.
241
+ * It can be passed to the element that should receive focus.
242
+ * @ignore - do not document.
243
+ */
244
+ focusElementRef: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.shape({
245
+ current: _propTypes.default.shape({
246
+ focus: _propTypes.default.func.isRequired
247
+ })
248
+ })]),
249
+ formattedValue: _propTypes.default.any,
250
+
251
+ /**
252
+ * Get the cell value of a row and field.
253
+ * @param {GridRowId} id The row id.
254
+ * @param {string} field The field.
255
+ * @returns {any} The cell value.
256
+ * @deprecated Use `params.row` to directly access the fields you want instead.
257
+ */
258
+ getValue: _propTypes.default.func.isRequired,
259
+
130
260
  /**
131
261
  * If true, the cell is the active element.
132
262
  */
@@ -136,7 +266,28 @@ process.env.NODE_ENV !== "production" ? GridActionsCell.propTypes = {
136
266
  * The grid row id.
137
267
  */
138
268
  id: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]).isRequired,
139
- position: _propTypes.default.oneOf(['bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top'])
269
+
270
+ /**
271
+ * If true, the cell is editable.
272
+ */
273
+ isEditable: _propTypes.default.bool,
274
+ position: _propTypes.default.oneOf(['bottom-end', 'bottom-start', 'bottom', 'left-end', 'left-start', 'left', 'right-end', 'right-start', 'right', 'top-end', 'top-start', 'top']),
275
+
276
+ /**
277
+ * The row model of the row that the current cell belongs to.
278
+ */
279
+ row: _propTypes.default.object.isRequired,
280
+
281
+ /**
282
+ * The node of the row that the current cell belongs to.
283
+ */
284
+ rowNode: _propTypes.default.object.isRequired,
285
+
286
+ /**
287
+ * the tabIndex value.
288
+ */
289
+ tabIndex: _propTypes.default.oneOf([-1, 0]).isRequired,
290
+ value: _propTypes.default.any
140
291
  } : void 0;
141
292
 
142
293
  const renderActionsCell = params => /*#__PURE__*/(0, _jsxRuntime.jsx)(GridActionsCell, (0, _extends2.default)({}, params));
@@ -29,7 +29,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
29
29
 
30
30
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
31
 
32
- const GridActionsCellItem = props => {
32
+ const GridActionsCellItem = /*#__PURE__*/React.forwardRef((props, ref) => {
33
33
  const {
34
34
  label,
35
35
  icon,
@@ -46,7 +46,9 @@ const GridActionsCellItem = props => {
46
46
 
47
47
  if (!showInMenu) {
48
48
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, (0, _extends2.default)({
49
+ ref: ref,
49
50
  size: "small",
51
+ role: "menuitem",
50
52
  "aria-label": label
51
53
  }, other, {
52
54
  onClick: handleClick,
@@ -56,14 +58,15 @@ const GridActionsCellItem = props => {
56
58
  }));
57
59
  }
58
60
 
59
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, (0, _extends2.default)({}, other, {
61
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, (0, _extends2.default)({
62
+ ref: ref
63
+ }, other, {
60
64
  onClick: onClick,
61
65
  children: [icon && /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemIcon.default, {
62
66
  children: icon
63
67
  }), label]
64
68
  }));
65
- };
66
-
69
+ });
67
70
  exports.GridActionsCellItem = GridActionsCellItem;
68
71
  process.env.NODE_ENV !== "production" ? GridActionsCellItem.propTypes = {
69
72
  // ----------------------------- Warning --------------------------------
@@ -33,7 +33,7 @@ var _gridFocusStateSelector = require("../../hooks/features/focus/gridFocusState
33
33
 
34
34
  var _jsxRuntime = require("react/jsx-runtime");
35
35
 
36
- const _excluded = ["align", "children", "colIndex", "cellMode", "field", "formattedValue", "hasFocus", "height", "isEditable", "rowId", "tabIndex", "value", "width", "className", "showRightBorder", "extendRowFullWidth", "row", "onClick", "onDoubleClick", "onMouseDown", "onMouseUp", "onKeyDown", "onDragEnter", "onDragOver"];
36
+ const _excluded = ["align", "children", "colIndex", "colDef", "cellMode", "field", "formattedValue", "hasFocus", "height", "isEditable", "rowId", "tabIndex", "value", "width", "className", "showRightBorder", "extendRowFullWidth", "row", "colSpan", "onClick", "onDoubleClick", "onMouseDown", "onMouseUp", "onKeyDown", "onDragEnter", "onDragOver"];
37
37
 
38
38
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
39
39
 
@@ -91,6 +91,7 @@ function GridCell(props) {
91
91
  width,
92
92
  className,
93
93
  showRightBorder,
94
+ colSpan,
94
95
  onClick,
95
96
  onDoubleClick,
96
97
  onMouseDown,
@@ -102,6 +103,7 @@ function GridCell(props) {
102
103
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
103
104
  const valueToRender = formattedValue == null ? value : formattedValue;
104
105
  const cellRef = React.useRef(null);
106
+ const focusElementRef = React.useRef(null);
105
107
  const apiRef = (0, _useGridApiContext.useGridApiContext)();
106
108
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
107
109
  const ownerState = {
@@ -152,7 +154,7 @@ function GridCell(props) {
152
154
 
153
155
  if (cellRef.current && !cellRef.current.contains(doc.activeElement)) {
154
156
  const focusableElement = cellRef.current.querySelector('[tabindex="0"]');
155
- const elementToFocus = focusableElement || cellRef.current;
157
+ const elementToFocus = focusElementRef.current || focusableElement || cellRef.current;
156
158
 
157
159
  if (doesSupportPreventScroll()) {
158
160
  elementToFocus.focus({
@@ -186,6 +188,26 @@ function GridCell(props) {
186
188
  };
187
189
  }
188
190
 
191
+ const column = apiRef.current.getColumn(field);
192
+ const managesOwnFocus = column.type === 'actions';
193
+
194
+ const renderChildren = () => {
195
+ if (children == null) {
196
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
197
+ className: classes.content,
198
+ children: valueToRender == null ? void 0 : valueToRender.toString()
199
+ });
200
+ }
201
+
202
+ if ( /*#__PURE__*/React.isValidElement(children) && managesOwnFocus) {
203
+ return /*#__PURE__*/React.cloneElement(children, {
204
+ focusElementRef
205
+ });
206
+ }
207
+
208
+ return children;
209
+ };
210
+
189
211
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _extends2.default)({
190
212
  ref: cellRef,
191
213
  className: (0, _clsx.default)(className, classes.root),
@@ -193,8 +215,9 @@ function GridCell(props) {
193
215
  "data-field": field,
194
216
  "data-colindex": colIndex,
195
217
  "aria-colindex": colIndex + 1,
218
+ "aria-colspan": colSpan,
196
219
  style: style,
197
- tabIndex: cellMode === 'view' || !isEditable ? tabIndex : -1,
220
+ tabIndex: (cellMode === 'view' || !isEditable) && !managesOwnFocus ? tabIndex : -1,
198
221
  onClick: publish(_models.GridEvents.cellClick, onClick),
199
222
  onDoubleClick: publish(_models.GridEvents.cellDoubleClick, onDoubleClick),
200
223
  onMouseDown: publish(_models.GridEvents.cellMouseDown, onMouseDown),
@@ -204,10 +227,7 @@ function GridCell(props) {
204
227
  onDragOver: publish(_models.GridEvents.cellDragOver, onDragOver)
205
228
  }, other, {
206
229
  onFocus: handleFocus,
207
- children: children != null ? children : /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
208
- className: classes.content,
209
- children: valueToRender == null ? void 0 : valueToRender.toString()
210
- })
230
+ children: renderChildren()
211
231
  }));
212
232
  }
213
233
 
@@ -221,6 +241,7 @@ process.env.NODE_ENV !== "production" ? GridCell.propTypes = {
221
241
  children: _propTypes.default.node,
222
242
  className: _propTypes.default.string,
223
243
  colIndex: _propTypes.default.number.isRequired,
244
+ colSpan: _propTypes.default.number,
224
245
  field: _propTypes.default.string.isRequired,
225
246
  formattedValue: _propTypes.default.any,
226
247
  hasFocus: _propTypes.default.bool,
@@ -145,7 +145,7 @@ process.env.NODE_ENV !== "production" ? GridEditInputCell.propTypes = {
145
145
  /**
146
146
  * The cell value formatted with the column valueFormatter.
147
147
  */
148
- formattedValue: _propTypes.default.any.isRequired,
148
+ formattedValue: _propTypes.default.any,
149
149
 
150
150
  /**
151
151
  * Get the cell value of a row and field.
@@ -28,6 +28,8 @@ var _gridEditRowModel = require("../../models/gridEditRowModel");
28
28
 
29
29
  var _gridEvents = require("../../models/events/gridEvents");
30
30
 
31
+ var _filterPanelUtils = require("../panel/filterPanel/filterPanelUtils");
32
+
31
33
  var _jsxRuntime = require("react/jsx-runtime");
32
34
 
33
35
  const _excluded = ["id", "value", "formattedValue", "api", "field", "row", "rowNode", "colDef", "cellMode", "isEditable", "tabIndex", "className", "getValue", "hasFocus", "isValidating", "isProcessingProps", "error"];
@@ -36,16 +38,19 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
36
38
 
37
39
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
38
40
 
39
- const renderSingleSelectOptions = option => typeof option === 'object' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
40
- value: option.value,
41
- children: option.label
42
- }, option.value) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuItem.default, {
43
- value: option,
44
- children: option
45
- }, option);
41
+ const renderSingleSelectOptions = (option, OptionComponent) => {
42
+ const isOptionTypeObject = typeof option === 'object';
43
+ const key = isOptionTypeObject ? option.value : option;
44
+ const value = isOptionTypeObject ? option.value : option;
45
+ const content = isOptionTypeObject ? option.label : option;
46
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(OptionComponent, {
47
+ value: value,
48
+ children: content
49
+ }, key);
50
+ };
46
51
 
47
52
  function GridEditSingleSelectCell(props) {
48
- var _rootProps$components;
53
+ var _rootProps$components, _baseSelectProps$nati, _rootProps$components2;
49
54
 
50
55
  const {
51
56
  id,
@@ -62,6 +67,8 @@ function GridEditSingleSelectCell(props) {
62
67
  const inputRef = React.useRef();
63
68
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
64
69
  const [open, setOpen] = React.useState(rootProps.editMode === 'cell');
70
+ const baseSelectProps = ((_rootProps$components = rootProps.componentsProps) == null ? void 0 : _rootProps$components.baseSelect) || {};
71
+ const isSelectNative = (_baseSelectProps$nati = baseSelectProps.native) != null ? _baseSelectProps$nati : false;
65
72
  let valueOptionsFormatted;
66
73
 
67
74
  if (typeof colDef.valueOptions === 'function') {
@@ -96,11 +103,13 @@ function GridEditSingleSelectCell(props) {
96
103
  var _rootProps$experiment;
97
104
 
98
105
  setOpen(false);
99
- const target = event.target;
106
+ const target = event.target; // NativeSelect casts the value to a string.
107
+
108
+ const formattedTargetValue = (0, _filterPanelUtils.getValueFromValueOptions)(target.value, valueOptionsFormatted);
100
109
  const isValid = await api.setEditCellValue({
101
110
  id,
102
111
  field,
103
- value: target.value
112
+ value: formattedTargetValue
104
113
  }, event);
105
114
 
106
115
  if ((_rootProps$experiment = rootProps.experimentalFeatures) != null && _rootProps$experiment.newEditingApi) {
@@ -169,9 +178,10 @@ function GridEditSingleSelectCell(props) {
169
178
  onClose: handleClose
170
179
  },
171
180
  error: error,
181
+ native: isSelectNative,
172
182
  fullWidth: true
173
- }, other, (_rootProps$components = rootProps.componentsProps) == null ? void 0 : _rootProps$components.baseSelect, {
174
- children: valueOptionsFormatted.map(renderSingleSelectOptions)
183
+ }, other, (_rootProps$components2 = rootProps.componentsProps) == null ? void 0 : _rootProps$components2.baseSelect, {
184
+ children: valueOptionsFormatted.map(valueOptions => renderSingleSelectOptions(valueOptions, isSelectNative ? 'option' : _MenuItem.default))
175
185
  }));
176
186
  }
177
187
 
@@ -205,7 +215,7 @@ process.env.NODE_ENV !== "production" ? GridEditSingleSelectCell.propTypes = {
205
215
  /**
206
216
  * The cell value formatted with the column valueFormatter.
207
217
  */
208
- formattedValue: _propTypes.default.any.isRequired,
218
+ formattedValue: _propTypes.default.any,
209
219
 
210
220
  /**
211
221
  * Get the cell value of a row and field.
@@ -179,14 +179,11 @@ function GridColumnHeaderItem(props) {
179
179
 
180
180
  if (hasFocus && !columnMenuState.open) {
181
181
  const focusableElement = headerCellRef.current.querySelector('[tabindex="0"]');
182
-
183
- if (focusableElement) {
184
- focusableElement.focus();
185
- } else {
186
- headerCellRef.current.focus();
187
- }
182
+ const elementToFocus = focusableElement || headerCellRef.current;
183
+ elementToFocus == null ? void 0 : elementToFocus.focus();
184
+ apiRef.current.columnHeadersContainerElementRef.current.scrollLeft = 0;
188
185
  }
189
- });
186
+ }, [apiRef, hasFocus]);
190
187
  const headerClassName = typeof column.headerClassName === 'function' ? column.headerClassName({
191
188
  field: column.field,
192
189
  colDef: column