@mui/x-data-grid 5.11.1 → 5.12.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.
Files changed (331) hide show
  1. package/CHANGELOG.md +199 -20
  2. package/DataGrid/DataGrid.js +26 -1
  3. package/README.md +2 -2
  4. package/colDef/gridCheckboxSelectionColDef.d.ts +1 -0
  5. package/colDef/gridCheckboxSelectionColDef.js +2 -1
  6. package/colDef/gridDateOperators.d.ts +1 -1
  7. package/colDef/gridNumericColDef.js +1 -1
  8. package/components/GridRow.d.ts +1 -1
  9. package/components/GridRow.js +51 -12
  10. package/components/cell/GridActionsCellItem.d.ts +1 -1
  11. package/components/cell/GridCell.d.ts +2 -1
  12. package/components/cell/GridCell.js +12 -7
  13. package/components/columnHeaders/GridColumnHeaderItem.js +9 -6
  14. package/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  15. package/components/columnSelection/GridHeaderCheckbox.js +0 -1
  16. package/components/containers/GridRootStyles.js +8 -3
  17. package/components/menu/GridMenu.js +9 -2
  18. package/components/panel/GridColumnsPanel.js +12 -7
  19. package/components/panel/GridPanelWrapper.d.ts +1 -1
  20. package/components/panel/GridPanelWrapper.js +3 -3
  21. package/components/panel/filterPanel/GridFilterForm.d.ts +61 -4
  22. package/components/panel/filterPanel/GridFilterForm.js +88 -8
  23. package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
  24. package/components/panel/filterPanel/GridFilterPanel.d.ts +8 -5
  25. package/components/panel/filterPanel/GridFilterPanel.js +26 -11
  26. package/components/toolbar/GridToolbarColumnsButton.js +0 -1
  27. package/components/toolbar/GridToolbarDensitySelector.js +0 -1
  28. package/components/toolbar/GridToolbarExportContainer.js +0 -1
  29. package/components/toolbar/GridToolbarFilterButton.d.ts +1 -1
  30. package/components/toolbar/GridToolbarFilterButton.js +0 -1
  31. package/components/toolbar/GridToolbarQuickFilter.d.ts +7 -0
  32. package/components/toolbar/GridToolbarQuickFilter.js +57 -4
  33. package/constants/defaultGridSlotsComponents.js +2 -1
  34. package/constants/gridClasses.d.ts +4 -0
  35. package/constants/gridClasses.js +1 -1
  36. package/constants/localeTextConstants.js +1 -0
  37. package/hooks/core/useGridStateInitialization.js +19 -6
  38. package/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
  39. package/hooks/features/columns/gridColumnsInterfaces.d.ts +3 -0
  40. package/hooks/features/columns/useGridColumnSpanning.d.ts +1 -1
  41. package/hooks/features/columns/useGridColumnSpanning.js +1 -1
  42. package/hooks/features/columns/useGridColumns.d.ts +1 -1
  43. package/hooks/features/columns/useGridColumns.js +13 -15
  44. package/hooks/features/dimensions/gridDimensionsApi.d.ts +5 -0
  45. package/hooks/features/dimensions/useGridDimensions.js +9 -8
  46. package/hooks/features/editRows/useGridCellEditing.new.js +11 -4
  47. package/hooks/features/editRows/useGridEditing.old.js +1 -1
  48. package/hooks/features/editRows/useGridRowEditing.new.js +10 -4
  49. package/hooks/features/events/useGridEvents.d.ts +1 -1
  50. package/hooks/features/events/useGridEvents.js +2 -0
  51. package/hooks/features/filter/gridFilterSelector.d.ts +5 -0
  52. package/hooks/features/filter/gridFilterSelector.js +6 -0
  53. package/hooks/features/filter/gridFilterState.d.ts +1 -1
  54. package/hooks/features/filter/gridFilterUtils.d.ts +10 -2
  55. package/hooks/features/filter/gridFilterUtils.js +3 -6
  56. package/hooks/features/filter/useGridFilter.d.ts +1 -1
  57. package/hooks/features/filter/useGridFilter.js +29 -12
  58. package/hooks/features/pagination/useGridPage.js +1 -1
  59. package/hooks/features/pagination/useGridPageSize.js +1 -1
  60. package/hooks/features/rows/useGridRowsMeta.d.ts +1 -1
  61. package/hooks/features/rows/useGridRowsMeta.js +133 -67
  62. package/hooks/features/selection/useGridSelection.js +1 -1
  63. package/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  64. package/hooks/features/sorting/useGridSorting.d.ts +1 -1
  65. package/hooks/features/sorting/useGridSorting.js +1 -1
  66. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +2 -1
  67. package/hooks/features/virtualization/useGridVirtualScroller.js +65 -11
  68. package/index.js +1 -1
  69. package/internals/index.d.ts +1 -0
  70. package/legacy/DataGrid/DataGrid.js +26 -1
  71. package/legacy/colDef/gridCheckboxSelectionColDef.js +2 -1
  72. package/legacy/colDef/gridNumericColDef.js +1 -1
  73. package/legacy/components/GridRow.js +56 -12
  74. package/legacy/components/cell/GridCell.js +12 -7
  75. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +11 -6
  76. package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  77. package/legacy/components/columnSelection/GridHeaderCheckbox.js +0 -1
  78. package/legacy/components/containers/GridRootStyles.js +10 -7
  79. package/legacy/components/menu/GridMenu.js +9 -2
  80. package/legacy/components/panel/GridColumnsPanel.js +14 -7
  81. package/legacy/components/panel/GridPanelWrapper.js +3 -3
  82. package/legacy/components/panel/filterPanel/GridFilterForm.js +89 -8
  83. package/legacy/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
  84. package/legacy/components/panel/filterPanel/GridFilterPanel.js +28 -12
  85. package/legacy/components/toolbar/GridToolbarColumnsButton.js +0 -1
  86. package/legacy/components/toolbar/GridToolbarDensitySelector.js +0 -1
  87. package/legacy/components/toolbar/GridToolbarExportContainer.js +0 -1
  88. package/legacy/components/toolbar/GridToolbarFilterButton.js +0 -1
  89. package/legacy/components/toolbar/GridToolbarQuickFilter.js +67 -6
  90. package/legacy/constants/defaultGridSlotsComponents.js +2 -1
  91. package/legacy/constants/gridClasses.js +1 -1
  92. package/legacy/constants/localeTextConstants.js +1 -0
  93. package/legacy/hooks/core/useGridStateInitialization.js +18 -6
  94. package/legacy/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
  95. package/legacy/hooks/features/columns/useGridColumnSpanning.js +1 -1
  96. package/legacy/hooks/features/columns/useGridColumns.js +13 -15
  97. package/legacy/hooks/features/dimensions/useGridDimensions.js +9 -8
  98. package/legacy/hooks/features/editRows/useGridCellEditing.new.js +14 -7
  99. package/legacy/hooks/features/editRows/useGridEditing.old.js +1 -1
  100. package/legacy/hooks/features/editRows/useGridRowEditing.new.js +10 -4
  101. package/legacy/hooks/features/events/useGridEvents.js +2 -0
  102. package/legacy/hooks/features/filter/gridFilterSelector.js +8 -0
  103. package/legacy/hooks/features/filter/gridFilterUtils.js +4 -7
  104. package/legacy/hooks/features/filter/useGridFilter.js +33 -12
  105. package/legacy/hooks/features/pagination/useGridPage.js +1 -1
  106. package/legacy/hooks/features/pagination/useGridPageSize.js +1 -1
  107. package/legacy/hooks/features/rows/useGridRowsMeta.js +133 -66
  108. package/legacy/hooks/features/selection/useGridSelection.js +1 -1
  109. package/legacy/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  110. package/legacy/hooks/features/sorting/useGridSorting.js +1 -1
  111. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +84 -26
  112. package/legacy/index.js +1 -1
  113. package/legacy/locales/arSD.js +1 -0
  114. package/legacy/locales/bgBG.js +1 -0
  115. package/legacy/locales/csCZ.js +1 -0
  116. package/legacy/locales/daDK.js +1 -0
  117. package/legacy/locales/deDE.js +1 -0
  118. package/legacy/locales/elGR.js +1 -0
  119. package/legacy/locales/esES.js +1 -0
  120. package/legacy/locales/faIR.js +1 -0
  121. package/legacy/locales/fiFI.js +1 -0
  122. package/legacy/locales/frFR.js +1 -0
  123. package/legacy/locales/heIL.js +10 -9
  124. package/legacy/locales/huHU.js +1 -0
  125. package/legacy/locales/itIT.js +1 -0
  126. package/legacy/locales/jaJP.js +29 -24
  127. package/legacy/locales/koKR.js +1 -0
  128. package/legacy/locales/nbNO.js +128 -0
  129. package/legacy/locales/nlNL.js +1 -0
  130. package/legacy/locales/plPL.js +1 -0
  131. package/legacy/locales/ptBR.js +1 -0
  132. package/legacy/locales/ruRU.js +7 -6
  133. package/legacy/locales/skSK.js +1 -0
  134. package/legacy/locales/trTR.js +8 -7
  135. package/legacy/locales/ukUA.js +1 -0
  136. package/legacy/locales/viVN.js +1 -0
  137. package/legacy/locales/zhCN.js +1 -0
  138. package/legacy/models/events/gridEvents.js +2 -0
  139. package/legacy/models/gridApiCaches.js +1 -0
  140. package/legacy/models/params/gridMenuParams.js +1 -0
  141. package/legacy/models/params/index.js +2 -1
  142. package/locales/arSD.js +1 -0
  143. package/locales/bgBG.js +1 -0
  144. package/locales/csCZ.js +1 -0
  145. package/locales/daDK.js +1 -0
  146. package/locales/deDE.js +1 -0
  147. package/locales/elGR.js +1 -0
  148. package/locales/esES.js +1 -0
  149. package/locales/faIR.js +1 -0
  150. package/locales/fiFI.js +1 -0
  151. package/locales/frFR.js +1 -0
  152. package/locales/heIL.js +10 -9
  153. package/locales/huHU.js +1 -0
  154. package/locales/itIT.js +1 -0
  155. package/locales/jaJP.js +25 -24
  156. package/locales/koKR.js +1 -0
  157. package/locales/nbNO.d.ts +2 -0
  158. package/locales/nbNO.js +116 -0
  159. package/locales/nlNL.js +1 -0
  160. package/locales/plPL.js +1 -0
  161. package/locales/ptBR.js +1 -0
  162. package/locales/ruRU.js +7 -6
  163. package/locales/skSK.js +1 -0
  164. package/locales/trTR.js +8 -7
  165. package/locales/ukUA.js +1 -0
  166. package/locales/viVN.js +1 -0
  167. package/locales/zhCN.js +1 -0
  168. package/models/api/gridCallbackDetails.d.ts +6 -1
  169. package/models/api/gridCoreApi.d.ts +2 -6
  170. package/models/api/gridFilterApi.d.ts +8 -1
  171. package/models/api/gridLocaleTextApi.d.ts +1 -0
  172. package/models/api/gridRowsMetaApi.d.ts +24 -0
  173. package/models/api/gridStateApi.d.ts +14 -3
  174. package/models/colDef/gridColDef.d.ts +4 -4
  175. package/models/events/gridEventLookup.d.ts +16 -1
  176. package/models/events/gridEvents.d.ts +3 -1
  177. package/models/events/gridEvents.js +2 -0
  178. package/models/gridApiCaches.d.ts +6 -0
  179. package/models/gridApiCaches.js +1 -0
  180. package/models/gridIconSlotsComponent.d.ts +5 -0
  181. package/models/params/gridMenuParams.d.ts +7 -0
  182. package/models/params/gridMenuParams.js +1 -0
  183. package/models/params/gridRowParams.d.ts +1 -1
  184. package/models/params/index.d.ts +1 -0
  185. package/models/params/index.js +2 -1
  186. package/models/props/DataGridProps.d.ts +24 -2
  187. package/modern/DataGrid/DataGrid.js +26 -1
  188. package/modern/colDef/gridCheckboxSelectionColDef.js +2 -1
  189. package/modern/colDef/gridNumericColDef.js +1 -1
  190. package/modern/components/GridRow.js +51 -12
  191. package/modern/components/cell/GridCell.js +12 -7
  192. package/modern/components/columnHeaders/GridColumnHeaderItem.js +9 -6
  193. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  194. package/modern/components/columnSelection/GridHeaderCheckbox.js +0 -1
  195. package/modern/components/containers/GridRootStyles.js +8 -3
  196. package/modern/components/menu/GridMenu.js +9 -2
  197. package/modern/components/panel/GridColumnsPanel.js +12 -7
  198. package/modern/components/panel/GridPanelWrapper.js +3 -3
  199. package/modern/components/panel/filterPanel/GridFilterForm.js +88 -8
  200. package/modern/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
  201. package/modern/components/panel/filterPanel/GridFilterPanel.js +26 -11
  202. package/modern/components/toolbar/GridToolbarColumnsButton.js +0 -1
  203. package/modern/components/toolbar/GridToolbarDensitySelector.js +0 -1
  204. package/modern/components/toolbar/GridToolbarExportContainer.js +0 -1
  205. package/modern/components/toolbar/GridToolbarFilterButton.js +0 -1
  206. package/modern/components/toolbar/GridToolbarQuickFilter.js +57 -4
  207. package/modern/constants/defaultGridSlotsComponents.js +2 -1
  208. package/modern/constants/gridClasses.js +1 -1
  209. package/modern/constants/localeTextConstants.js +1 -0
  210. package/modern/hooks/core/useGridStateInitialization.js +19 -6
  211. package/modern/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
  212. package/modern/hooks/features/columns/useGridColumnSpanning.js +1 -1
  213. package/modern/hooks/features/columns/useGridColumns.js +12 -14
  214. package/modern/hooks/features/dimensions/useGridDimensions.js +9 -8
  215. package/modern/hooks/features/editRows/useGridCellEditing.new.js +10 -3
  216. package/modern/hooks/features/editRows/useGridEditing.old.js +1 -1
  217. package/modern/hooks/features/editRows/useGridRowEditing.new.js +9 -3
  218. package/modern/hooks/features/events/useGridEvents.js +2 -0
  219. package/modern/hooks/features/filter/gridFilterSelector.js +6 -0
  220. package/modern/hooks/features/filter/gridFilterUtils.js +3 -6
  221. package/modern/hooks/features/filter/useGridFilter.js +29 -12
  222. package/modern/hooks/features/pagination/useGridPage.js +1 -1
  223. package/modern/hooks/features/pagination/useGridPageSize.js +1 -1
  224. package/modern/hooks/features/rows/useGridRowsMeta.js +129 -59
  225. package/modern/hooks/features/selection/useGridSelection.js +1 -1
  226. package/modern/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  227. package/modern/hooks/features/sorting/useGridSorting.js +1 -1
  228. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +65 -11
  229. package/modern/index.js +1 -1
  230. package/modern/locales/arSD.js +1 -0
  231. package/modern/locales/bgBG.js +1 -0
  232. package/modern/locales/csCZ.js +1 -0
  233. package/modern/locales/daDK.js +1 -0
  234. package/modern/locales/deDE.js +1 -0
  235. package/modern/locales/elGR.js +1 -0
  236. package/modern/locales/esES.js +1 -0
  237. package/modern/locales/faIR.js +1 -0
  238. package/modern/locales/fiFI.js +1 -0
  239. package/modern/locales/frFR.js +1 -0
  240. package/modern/locales/heIL.js +10 -9
  241. package/modern/locales/huHU.js +1 -0
  242. package/modern/locales/itIT.js +1 -0
  243. package/modern/locales/jaJP.js +25 -24
  244. package/modern/locales/koKR.js +1 -0
  245. package/modern/locales/nbNO.js +116 -0
  246. package/modern/locales/nlNL.js +1 -0
  247. package/modern/locales/plPL.js +1 -0
  248. package/modern/locales/ptBR.js +1 -0
  249. package/modern/locales/ruRU.js +7 -6
  250. package/modern/locales/skSK.js +1 -0
  251. package/modern/locales/trTR.js +8 -7
  252. package/modern/locales/ukUA.js +1 -0
  253. package/modern/locales/viVN.js +1 -0
  254. package/modern/locales/zhCN.js +1 -0
  255. package/modern/models/events/gridEvents.js +2 -0
  256. package/modern/models/gridApiCaches.js +1 -0
  257. package/modern/models/params/gridMenuParams.js +1 -0
  258. package/modern/models/params/index.js +2 -1
  259. package/node/DataGrid/DataGrid.js +26 -1
  260. package/node/colDef/gridCheckboxSelectionColDef.js +4 -2
  261. package/node/colDef/gridNumericColDef.js +1 -1
  262. package/node/components/GridRow.js +53 -12
  263. package/node/components/cell/GridCell.js +12 -7
  264. package/node/components/columnHeaders/GridColumnHeaderItem.js +9 -6
  265. package/node/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  266. package/node/components/columnSelection/GridHeaderCheckbox.js +0 -1
  267. package/node/components/containers/GridRootStyles.js +8 -3
  268. package/node/components/menu/GridMenu.js +10 -2
  269. package/node/components/panel/GridColumnsPanel.js +12 -7
  270. package/node/components/panel/GridPanelWrapper.js +5 -3
  271. package/node/components/panel/filterPanel/GridFilterForm.js +91 -9
  272. package/node/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
  273. package/node/components/panel/filterPanel/GridFilterPanel.js +28 -11
  274. package/node/components/toolbar/GridToolbarColumnsButton.js +0 -1
  275. package/node/components/toolbar/GridToolbarDensitySelector.js +0 -1
  276. package/node/components/toolbar/GridToolbarExportContainer.js +0 -1
  277. package/node/components/toolbar/GridToolbarFilterButton.js +0 -1
  278. package/node/components/toolbar/GridToolbarQuickFilter.js +61 -4
  279. package/node/constants/defaultGridSlotsComponents.js +2 -1
  280. package/node/constants/gridClasses.js +1 -1
  281. package/node/constants/localeTextConstants.js +1 -0
  282. package/node/hooks/core/useGridStateInitialization.js +19 -6
  283. package/node/hooks/features/columnMenu/useGridColumnMenu.js +23 -0
  284. package/node/hooks/features/columns/useGridColumnSpanning.js +11 -16
  285. package/node/hooks/features/columns/useGridColumns.js +13 -15
  286. package/node/hooks/features/dimensions/useGridDimensions.js +9 -8
  287. package/node/hooks/features/editRows/useGridCellEditing.new.js +11 -4
  288. package/node/hooks/features/editRows/useGridEditing.old.js +1 -1
  289. package/node/hooks/features/editRows/useGridRowEditing.new.js +10 -4
  290. package/node/hooks/features/events/useGridEvents.js +2 -0
  291. package/node/hooks/features/filter/gridFilterSelector.js +9 -2
  292. package/node/hooks/features/filter/gridFilterUtils.js +4 -5
  293. package/node/hooks/features/filter/useGridFilter.js +28 -11
  294. package/node/hooks/features/pagination/useGridPage.js +1 -1
  295. package/node/hooks/features/pagination/useGridPageSize.js +1 -1
  296. package/node/hooks/features/rows/useGridRowsMeta.js +136 -69
  297. package/node/hooks/features/selection/useGridSelection.js +1 -1
  298. package/node/hooks/features/selection/useGridSelectionPreProcessors.js +7 -5
  299. package/node/hooks/features/sorting/useGridSorting.js +1 -1
  300. package/node/hooks/features/virtualization/useGridVirtualScroller.js +65 -12
  301. package/node/index.js +1 -1
  302. package/node/locales/arSD.js +1 -0
  303. package/node/locales/bgBG.js +1 -0
  304. package/node/locales/csCZ.js +1 -0
  305. package/node/locales/daDK.js +1 -0
  306. package/node/locales/deDE.js +1 -0
  307. package/node/locales/elGR.js +1 -0
  308. package/node/locales/esES.js +1 -0
  309. package/node/locales/faIR.js +1 -0
  310. package/node/locales/fiFI.js +1 -0
  311. package/node/locales/frFR.js +1 -0
  312. package/node/locales/heIL.js +10 -9
  313. package/node/locales/huHU.js +1 -0
  314. package/node/locales/itIT.js +1 -0
  315. package/node/locales/jaJP.js +25 -24
  316. package/node/locales/koKR.js +1 -0
  317. package/node/locales/nbNO.js +126 -0
  318. package/node/locales/nlNL.js +1 -0
  319. package/node/locales/plPL.js +1 -0
  320. package/node/locales/ptBR.js +1 -0
  321. package/node/locales/ruRU.js +7 -6
  322. package/node/locales/skSK.js +1 -0
  323. package/node/locales/trTR.js +8 -7
  324. package/node/locales/ukUA.js +1 -0
  325. package/node/locales/viVN.js +1 -0
  326. package/node/locales/zhCN.js +1 -0
  327. package/node/models/events/gridEvents.js +2 -0
  328. package/node/models/gridApiCaches.js +5 -0
  329. package/node/models/params/gridMenuParams.js +5 -0
  330. package/node/models/params/index.js +13 -0
  331. package/package.json +6 -5
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { TextFieldProps } from '@mui/material/TextField';
3
+ import { GridFilterModel } from '../../models/gridFilterModel';
3
4
  export declare type GridToolbarQuickFilterProps = TextFieldProps & {
4
5
  /**
5
6
  * Function responsible for parsing text input in an array of independent values for quick filtering.
@@ -7,6 +8,12 @@ export declare type GridToolbarQuickFilterProps = TextFieldProps & {
7
8
  * @returns {any[]} The array of value on which quick filter is applied
8
9
  */
9
10
  quickFilterParser?: (input: string) => any[];
11
+ /**
12
+ * Function responsible for formatting values of quick filter in a string when the model is modified
13
+ * @param {any[]} values The new values passed to the quick filter model
14
+ * @returns {string} The string to display in the text field
15
+ */
16
+ quickFilterFormatter?: (values: GridFilterModel['quickFilterValues']) => string;
10
17
  /**
11
18
  * The debounce time in milliseconds.
12
19
  * @default 500
@@ -1,13 +1,17 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- const _excluded = ["quickFilterParser", "debounceMs"];
3
+ const _excluded = ["quickFilterParser", "quickFilterFormatter", "debounceMs"];
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import TextField from '@mui/material/TextField';
7
+ import IconButton from '@mui/material/IconButton';
7
8
  import { styled } from '@mui/material/styles';
8
9
  import { debounce } from '@mui/material/utils';
9
10
  import { useGridApiContext } from '../../hooks/utils/useGridApiContext';
10
11
  import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
12
+ import { useGridSelector } from '../../hooks/utils/useGridSelector';
13
+ import { gridQuickFilterValuesSelector } from '../../hooks/features/filter';
14
+ import { isDeepEqual } from '../../utils/utils';
11
15
  import { jsx as _jsx } from "react/jsx-runtime";
12
16
  const GridToolbarQuickFilterRoot = styled(TextField, {
13
17
  name: 'MuiDataGrid',
@@ -18,28 +22,55 @@ const GridToolbarQuickFilterRoot = styled(TextField, {
18
22
  }) => ({
19
23
  width: 'auto',
20
24
  paddingBottom: theme.spacing(0.5),
21
- '& .MuiSvgIcon-root': {
22
- marginRight: theme.spacing(0.5)
25
+ '& input': {
26
+ marginLeft: theme.spacing(0.5)
23
27
  },
24
28
  '& .MuiInput-underline:before': {
25
29
  borderBottom: `1px solid ${theme.palette.divider}`
30
+ },
31
+ [`& input[type=search]::-ms-clear,
32
+ & input[type=search]::-ms-reveal`]: {
33
+ /* clears the 'X' icon from IE */
34
+ display: 'none',
35
+ width: 0,
36
+ height: 0
37
+ },
38
+ [`& input[type="search"]::-webkit-search-decoration,
39
+ & input[type="search"]::-webkit-search-cancel-button,
40
+ & input[type="search"]::-webkit-search-results-button,
41
+ & input[type="search"]::-webkit-search-results-decoration`]: {
42
+ /* clears the 'X' icon from Chrome */
43
+ display: 'none'
26
44
  }
27
45
  }));
28
46
 
29
47
  const defaultSearchValueParser = searchText => searchText.split(' ').filter(word => word !== '');
30
48
 
49
+ const defaultSearchValueFormatter = values => values.join(' ');
50
+
31
51
  function GridToolbarQuickFilter(props) {
32
52
  var _rootProps$components;
33
53
 
34
54
  const {
35
55
  quickFilterParser = defaultSearchValueParser,
56
+ quickFilterFormatter = defaultSearchValueFormatter,
36
57
  debounceMs = 500
37
58
  } = props,
38
59
  other = _objectWithoutPropertiesLoose(props, _excluded);
39
60
 
40
61
  const apiRef = useGridApiContext();
41
62
  const rootProps = useGridRootProps();
42
- const [searchValue, setSearchValue] = React.useState('');
63
+ const quickFilterValues = useGridSelector(apiRef, gridQuickFilterValuesSelector);
64
+ const [searchValue, setSearchValue] = React.useState(() => quickFilterFormatter(quickFilterValues != null ? quickFilterValues : []));
65
+ const [prevQuickFilterValues, setPrevQuickFilterValues] = React.useState(quickFilterValues);
66
+ React.useEffect(() => {
67
+ if (!isDeepEqual(prevQuickFilterValues, quickFilterValues)) {
68
+ // The model of quick filter value has been updated
69
+ setPrevQuickFilterValues(quickFilterValues); // Update the input value if needed to match the new model
70
+
71
+ setSearchValue(prevSearchValue => isDeepEqual(quickFilterParser(prevSearchValue), quickFilterValues) ? prevSearchValue : quickFilterFormatter(quickFilterValues != null ? quickFilterValues : []));
72
+ }
73
+ }, [prevQuickFilterValues, quickFilterValues, quickFilterFormatter, quickFilterParser]);
43
74
  const updateSearchValue = React.useCallback(newSearchValue => {
44
75
  apiRef.current.setQuickFilterValues(quickFilterParser(newSearchValue));
45
76
  }, [apiRef, quickFilterParser]);
@@ -49,6 +80,10 @@ function GridToolbarQuickFilter(props) {
49
80
  setSearchValue(newSearchValue);
50
81
  debouncedUpdateSearchValue(newSearchValue);
51
82
  }, [debouncedUpdateSearchValue]);
83
+ const handleSearchReset = React.useCallback(() => {
84
+ setSearchValue('');
85
+ updateSearchValue('');
86
+ }, [updateSearchValue]);
52
87
  return /*#__PURE__*/_jsx(GridToolbarQuickFilterRoot, _extends({
53
88
  as: rootProps.components.BaseTextField,
54
89
  variant: "standard",
@@ -60,6 +95,17 @@ function GridToolbarQuickFilter(props) {
60
95
  InputProps: {
61
96
  startAdornment: /*#__PURE__*/_jsx(rootProps.components.QuickFilterIcon, {
62
97
  fontSize: "small"
98
+ }),
99
+ endAdornment: /*#__PURE__*/_jsx(IconButton, {
100
+ "aria-label": apiRef.current.getLocaleText('toolbarQuickFilterDeleteIconLabel'),
101
+ size: "small",
102
+ sx: {
103
+ visibility: searchValue ? 'visible' : 'hidden'
104
+ },
105
+ onClick: handleSearchReset,
106
+ children: /*#__PURE__*/_jsx(rootProps.components.QuickFilterClearIcon, {
107
+ fontSize: "small"
108
+ })
63
109
  })
64
110
  }
65
111
  }, other, (_rootProps$components = rootProps.componentsProps) == null ? void 0 : _rootProps$components.baseTextField));
@@ -77,6 +123,13 @@ process.env.NODE_ENV !== "production" ? GridToolbarQuickFilter.propTypes = {
77
123
  */
78
124
  debounceMs: PropTypes.number,
79
125
 
126
+ /**
127
+ * Function responsible for formatting values of quick filter in a string when the model is modified
128
+ * @param {any[]} values The new values passed to the quick filter model
129
+ * @returns {string} The string to display in the text field
130
+ */
131
+ quickFilterFormatter: PropTypes.func,
132
+
80
133
  /**
81
134
  * Function responsible for parsing text input in an array of independent values for quick filtering.
82
135
  * @param {string} input The value entered by the user
@@ -35,7 +35,8 @@ const DEFAULT_GRID_ICON_SLOTS_COMPONENTS = {
35
35
  DetailPanelExpandIcon: GridAddIcon,
36
36
  DetailPanelCollapseIcon: GridRemoveIcon,
37
37
  RowReorderIcon: GridDragIcon,
38
- QuickFilterIcon: GridSearchIcon
38
+ QuickFilterIcon: GridSearchIcon,
39
+ QuickFilterClearIcon: GridCloseIcon
39
40
  };
40
41
  /**
41
42
  * TODO: Differentiate community and pro value and interface
@@ -347,6 +347,10 @@ export interface GridClasses {
347
347
  * Styles applied to the last visible row element on every page of the grid.
348
348
  */
349
349
  'row--lastVisible': string;
350
+ /**
351
+ * Styles applied to the row if it has dynamic row height.
352
+ */
353
+ 'row--dynamicHeight': string;
350
354
  /**
351
355
  * Styles applied to the row element.
352
356
  */
@@ -2,4 +2,4 @@ import { generateUtilityClasses, generateUtilityClass } from '@mui/material';
2
2
  export function getDataGridUtilityClass(slot) {
3
3
  return generateUtilityClass('MuiDataGrid', slot);
4
4
  }
5
- export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'autoHeight', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--withRenderer', 'cell', 'cellContent', 'cellCheckbox', 'checkboxInput', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderDropZone', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeaders', 'columnHeadersInner', 'columnHeadersInner--scrollable', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsPanel', 'columnsPanelRow', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filterForm', 'filterFormDeleteIcon', 'filterFormLinkOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'iconButtonContainer', 'iconSeparator', 'main', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'row', 'row--editable', 'row--editing', 'row--lastVisible', 'row--dragging', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'pinnedColumns--left', 'pinnedColumns--right', 'pinnedColumnHeaders', 'pinnedColumnHeaders--left', 'pinnedColumnHeaders--right', 'withBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle']);
5
+ export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'autoHeight', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--withRenderer', 'cell', 'cellContent', 'cellCheckbox', 'checkboxInput', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderDropZone', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeaders', 'columnHeadersInner', 'columnHeadersInner--scrollable', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsPanel', 'columnsPanelRow', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filterForm', 'filterFormDeleteIcon', 'filterFormLinkOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'iconButtonContainer', 'iconSeparator', 'main', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'row', 'row--editable', 'row--editing', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'pinnedColumns--left', 'pinnedColumns--right', 'pinnedColumnHeaders', 'pinnedColumnHeaders--left', 'pinnedColumnHeaders--right', 'withBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle']);
@@ -105,6 +105,7 @@ export const GRID_DEFAULT_LOCALE_TEXT = {
105
105
  groupColumn: name => `Group by ${name}`,
106
106
  unGroupColumn: name => `Stop grouping by ${name}`,
107
107
  // Master/detail
108
+ detailPanelToggle: 'Detail panel toggle',
108
109
  expandDetailPanel: 'Expand',
109
110
  collapseDetailPanel: 'Collapse',
110
111
  // Used core components translation keys
@@ -8,7 +8,7 @@ import { isFunction } from '../../utils/utils';
8
8
  export const useGridStateInitialization = (apiRef, props) => {
9
9
  const controlStateMapRef = React.useRef({});
10
10
  const [, rawForceUpdate] = React.useState();
11
- const updateControlState = React.useCallback(controlStateItem => {
11
+ const registerControlState = React.useCallback(controlStateItem => {
12
12
  const {
13
13
  stateId
14
14
  } = controlStateItem,
@@ -18,7 +18,7 @@ export const useGridStateInitialization = (apiRef, props) => {
18
18
  stateId
19
19
  });
20
20
  }, []);
21
- const setState = React.useCallback(state => {
21
+ const setState = React.useCallback((state, reason) => {
22
22
  let newState;
23
23
 
24
24
  if (isFunction(state)) {
@@ -79,23 +79,36 @@ export const useGridStateInitialization = (apiRef, props) => {
79
79
 
80
80
  if (controlState.propOnChange && hasPropChanged) {
81
81
  const details = props.signature === GridSignature.DataGridPro ? {
82
- api: apiRef.current
83
- } : {};
82
+ api: apiRef.current,
83
+ reason
84
+ } : {
85
+ reason
86
+ };
84
87
  controlState.propOnChange(model, details);
85
88
  }
86
89
 
87
90
  if (!ignoreSetState) {
88
- apiRef.current.publishEvent(controlState.changeEvent, model);
91
+ apiRef.current.publishEvent(controlState.changeEvent, model, {
92
+ reason
93
+ });
89
94
  }
90
95
  }
91
96
 
92
97
  return !ignoreSetState;
93
98
  }, [apiRef, props.signature]);
99
+ const updateControlState = React.useCallback((key, state, reason) => {
100
+ return apiRef.current.setState(previousState => {
101
+ return _extends({}, previousState, {
102
+ [key]: state(previousState[key])
103
+ });
104
+ }, reason);
105
+ }, [apiRef]);
94
106
  const forceUpdate = React.useCallback(() => rawForceUpdate(() => apiRef.current.state), [apiRef]);
95
107
  const stateApi = {
96
108
  setState,
97
109
  forceUpdate,
98
- unstable_updateControlState: updateControlState
110
+ unstable_updateControlState: updateControlState,
111
+ unstable_registerControlState: registerControlState
99
112
  };
100
113
  useGridApiMethod(apiRef, stateApi, 'GridStateApi');
101
114
  };
@@ -2,6 +2,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { useGridLogger, useGridApiMethod, useGridApiEventHandler } from '../../utils';
4
4
  import { gridColumnMenuSelector } from './columnMenuSelector';
5
+ import { gridClasses } from '../../../constants/gridClasses';
5
6
  export const columnMenuStateInitializer = state => _extends({}, state, {
6
7
  columnMenu: {
7
8
  open: false
@@ -77,7 +78,28 @@ export const useGridColumnMenu = apiRef => {
77
78
  * EVENTS
78
79
  */
79
80
 
81
+ const handleColumnHeaderFocus = React.useCallback((params, event) => {
82
+ // Check if the column menu button received focus
83
+ if (!event.target.classList.contains(gridClasses.menuIconButton)) {
84
+ return;
85
+ } // Check if there's an element which lost focus
86
+
87
+
88
+ if (!event.relatedTarget) {
89
+ return;
90
+ } // `true` if the focus was on the column menu itself, not on any item
91
+
92
+
93
+ const columnMenuLostFocus = event.relatedTarget.classList.contains(gridClasses.menuList); // `true` if the focus was on an item from the column menu
94
+
95
+ const columnMenuItemLostFocus = event.relatedTarget.getAttribute('role') === 'menuitem';
96
+
97
+ if (columnMenuLostFocus || columnMenuItemLostFocus) {
98
+ apiRef.current.setColumnHeaderFocus(params.field);
99
+ }
100
+ }, [apiRef]);
80
101
  useGridApiEventHandler(apiRef, 'columnResizeStart', hideColumnMenu);
102
+ useGridApiEventHandler(apiRef, 'columnHeaderFocus', handleColumnHeaderFocus);
81
103
  useGridApiEventHandler(apiRef, 'virtualScrollerWheel', apiRef.current.hideColumnMenu);
82
104
  useGridApiEventHandler(apiRef, 'virtualScrollerTouchMove', apiRef.current.hideColumnMenu);
83
105
  };
@@ -15,6 +15,9 @@ export interface GridColumnsState {
15
15
  lookup: GridColumnLookup;
16
16
  columnVisibilityModel: GridColumnVisibilityModel;
17
17
  }
18
+ export interface GridColumnsInternalCache {
19
+ isUsingColumnVisibilityModel: boolean;
20
+ }
18
21
  export declare type GridColumnDimensions = {
19
22
  [key in GridColumnDimensionProperties]?: number;
20
23
  };
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import * as React from 'react';
2
2
  import { GridApiCommunity } from '../../../models/api/gridApiCommunity';
3
3
  /**
4
4
  * @requires useGridColumns (method, event)
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import * as React from 'react';
2
2
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
3
3
  import { useGridApiEventHandler } from '../../utils/useGridApiEventHandler';
4
4
 
@@ -8,4 +8,4 @@ export declare const columnsStateInitializer: GridStateInitializer<Pick<DataGrid
8
8
  * @requires useGridDimensions (method, event) - can be after
9
9
  * TODO: Impossible priority - useGridParamsApi also needs to be after useGridColumns
10
10
  */
11
- export declare function useGridColumns(apiRef: React.MutableRefObject<GridApiCommunity>, props: Pick<DataGridProcessedProps, 'initialState' | 'columns' | 'onColumnVisibilityChange' | 'columnVisibilityModel' | 'onColumnVisibilityModelChange' | 'columnTypes' | 'classes' | 'components' | 'componentsProps'>): void;
11
+ export declare function useGridColumns(apiRef: React.MutableRefObject<GridApiCommunity>, props: Pick<DataGridProcessedProps, 'columns' | 'onColumnVisibilityChange' | 'columnVisibilityModel' | 'onColumnVisibilityModelChange' | 'columnTypes' | 'components' | 'componentsProps'>): void;
@@ -12,6 +12,9 @@ export const columnsStateInitializer = (state, props, apiRef) => {
12
12
  var _props$initialState, _props$initialState$c, _props$initialState2, _ref, _props$columnVisibili, _props$initialState3, _props$initialState3$;
13
13
 
14
14
  const isUsingColumnVisibilityModel = !!props.columnVisibilityModel || !!((_props$initialState = props.initialState) != null && (_props$initialState$c = _props$initialState.columns) != null && _props$initialState$c.columnVisibilityModel);
15
+ apiRef.current.unstable_caches.columns = {
16
+ isUsingColumnVisibilityModel
17
+ };
15
18
  const columnsTypes = computeColumnTypes(props.columnTypes);
16
19
  const columnsState = createColumnsState({
17
20
  apiRef,
@@ -33,19 +36,13 @@ export const columnsStateInitializer = (state, props, apiRef) => {
33
36
  */
34
37
 
35
38
  export function useGridColumns(apiRef, props) {
36
- var _props$initialState4, _props$initialState4$, _props$componentsProp2;
39
+ var _props$componentsProp2;
37
40
 
38
41
  const logger = useGridLogger(apiRef, 'useGridColumns');
39
42
  const columnTypes = React.useMemo(() => computeColumnTypes(props.columnTypes), [props.columnTypes]);
40
43
  const previousColumnsProp = React.useRef(props.columns);
41
44
  const previousColumnTypesProp = React.useRef(columnTypes);
42
- /**
43
- * If `initialState.columns.columnVisibilityModel` or `columnVisibilityModel` was defined during the 1st render, we are directly updating the model
44
- * If not, we keep the old behavior and update the `GridColDef.hide` option (which will update the state model through the `GridColDef.hide` => `columnVisibilityModel` sync in `createColumnsState`
45
- */
46
-
47
- const isUsingColumnVisibilityModel = React.useRef(!!props.columnVisibilityModel || !!((_props$initialState4 = props.initialState) != null && (_props$initialState4$ = _props$initialState4.columns) != null && _props$initialState4$.columnVisibilityModel));
48
- apiRef.current.unstable_updateControlState({
45
+ apiRef.current.unstable_registerControlState({
49
46
  stateId: 'visibleColumns',
50
47
  propModel: props.columnVisibilityModel,
51
48
  propOnChange: props.onColumnVisibilityModelChange,
@@ -108,7 +105,7 @@ export function useGridColumns(apiRef, props) {
108
105
  // We keep updating the `hide` option of `GridColDef` when not controlling the model to avoid any breaking change.
109
106
  // `updateColumns` take care of updating the model itself if needs be.
110
107
  // TODO v6: stop using the `hide` field even when the model is not defined
111
- if (isUsingColumnVisibilityModel.current) {
108
+ if (apiRef.current.unstable_caches.columns.isUsingColumnVisibilityModel) {
112
109
  var _columnVisibilityMode;
113
110
 
114
111
  const columnVisibilityModel = gridColumnVisibilityModelSelector(apiRef);
@@ -147,7 +144,8 @@ export function useGridColumns(apiRef, props) {
147
144
 
148
145
  logger.debug(`Moving column ${field} to index ${targetIndexPosition}`);
149
146
  const updatedColumns = [...allColumns];
150
- updatedColumns.splice(targetIndexPosition, 0, updatedColumns.splice(oldIndexPosition, 1)[0]);
147
+ const fieldRemoved = updatedColumns.splice(oldIndexPosition, 1)[0];
148
+ updatedColumns.splice(targetIndexPosition, 0, fieldRemoved);
151
149
  setGridColumnsState(_extends({}, gridColumnsSelector(apiRef.current.state), {
152
150
  all: updatedColumns
153
151
  }));
@@ -197,7 +195,7 @@ export function useGridColumns(apiRef, props) {
197
195
  const stateExportPreProcessing = React.useCallback(prevState => {
198
196
  const columnsStateToExport = {};
199
197
 
200
- if (isUsingColumnVisibilityModel.current) {
198
+ if (apiRef.current.unstable_caches.columns.isUsingColumnVisibilityModel) {
201
199
  const columnVisibilityModelToExport = gridColumnVisibilityModelSelector(apiRef);
202
200
  const hasHiddenColumns = Object.values(columnVisibilityModelToExport).some(value => value === false);
203
201
 
@@ -236,7 +234,7 @@ export function useGridColumns(apiRef, props) {
236
234
  const stateRestorePreProcessing = React.useCallback((params, context) => {
237
235
  var _context$stateToResto;
238
236
 
239
- const columnVisibilityModelToImport = isUsingColumnVisibilityModel.current ? (_context$stateToResto = context.stateToRestore.columns) == null ? void 0 : _context$stateToResto.columnVisibilityModel : undefined;
237
+ const columnVisibilityModelToImport = apiRef.current.unstable_caches.columns.isUsingColumnVisibilityModel ? (_context$stateToResto = context.stateToRestore.columns) == null ? void 0 : _context$stateToResto.columnVisibilityModel : undefined;
240
238
  const initialState = context.stateToRestore.columns;
241
239
 
242
240
  if (columnVisibilityModelToImport == null && initialState == null) {
@@ -248,7 +246,7 @@ export function useGridColumns(apiRef, props) {
248
246
  columnTypes,
249
247
  columnsToUpsert: [],
250
248
  initialState,
251
- shouldRegenColumnVisibilityModelFromColumns: !isUsingColumnVisibilityModel.current,
249
+ shouldRegenColumnVisibilityModelFromColumns: !apiRef.current.unstable_caches.columns.isUsingColumnVisibilityModel,
252
250
  currentColumnVisibilityModel: columnVisibilityModelToImport,
253
251
  keepOnlyColumnsToUpsert: false
254
252
  });
@@ -299,7 +297,7 @@ export function useGridColumns(apiRef, props) {
299
297
  columnTypes,
300
298
  columnsToUpsert: [],
301
299
  initialState: undefined,
302
- shouldRegenColumnVisibilityModelFromColumns: !isUsingColumnVisibilityModel.current,
300
+ shouldRegenColumnVisibilityModelFromColumns: !apiRef.current.unstable_caches.columns.isUsingColumnVisibilityModel,
303
301
  keepOnlyColumnsToUpsert: false
304
302
  });
305
303
  setGridColumnsState(columnsState);
@@ -329,7 +327,7 @@ export function useGridColumns(apiRef, props) {
329
327
  columnTypes,
330
328
  initialState: undefined,
331
329
  // If the user provides a model, we don't want to set it in the state here because it has it's dedicated `useEffect` which calls `setColumnVisibilityModel`
332
- shouldRegenColumnVisibilityModelFromColumns: !isUsingColumnVisibilityModel.current,
330
+ shouldRegenColumnVisibilityModelFromColumns: !apiRef.current.unstable_caches.columns.isUsingColumnVisibilityModel,
333
331
  columnsToUpsert: props.columns,
334
332
  keepOnlyColumnsToUpsert: true
335
333
  });
@@ -16,6 +16,11 @@ export interface GridDimensions {
16
16
  * Indicates if a scroll is currently needed to go from the beginning of the first row to the end of the last row.
17
17
  */
18
18
  hasScrollY: boolean;
19
+ /**
20
+ * Size of the scrollbar used to scroll the rows in pixel.
21
+ * It is defined even when the scrollbar is currently not needed.
22
+ */
23
+ scrollBarSize: number;
19
24
  }
20
25
  export interface GridDimensionsApi {
21
26
  /**
@@ -37,7 +37,7 @@ const hasScroll = ({
37
37
 
38
38
  export function useGridDimensions(apiRef, props) {
39
39
  const logger = useGridLogger(apiRef, 'useResizeContainer');
40
- const warningShown = React.useRef(false);
40
+ const errorShown = React.useRef(false);
41
41
  const rootDimensionsRef = React.useRef(null);
42
42
  const fullDimensionsRef = React.useRef(null);
43
43
  const rowsMeta = useGridSelector(apiRef, gridRowsMetaSelector);
@@ -94,7 +94,8 @@ export function useGridDimensions(apiRef, props) {
94
94
  viewportOuterSize,
95
95
  viewportInnerSize,
96
96
  hasScrollX,
97
- hasScrollY
97
+ hasScrollY,
98
+ scrollBarSize
98
99
  };
99
100
  const prevDimensions = fullDimensionsRef.current;
100
101
  fullDimensionsRef.current = newFullDimensions;
@@ -144,14 +145,14 @@ export function useGridDimensions(apiRef, props) {
144
145
 
145
146
  const isJSDOM = /jsdom/.test(window.navigator.userAgent);
146
147
 
147
- if (size.height === 0 && !warningShown.current && !props.autoHeight && !isJSDOM) {
148
- logger.warn(['The parent of the grid has an empty height.', 'You need to make sure the container has an intrinsic height.', 'The grid displays with a height of 0px.', '', 'You can find a solution in the docs:', 'https://mui.com/x/react-data-grid/layout/'].join('\n'));
149
- warningShown.current = true;
148
+ if (size.height === 0 && !errorShown.current && !props.autoHeight && !isJSDOM) {
149
+ logger.error(['The parent DOM element of the data grid has an empty height.', 'Please make sure that this element has an intrinsic height.', 'The grid displays with a height of 0px.', '', 'More details: https://mui.com/r/x-data-grid-no-dimensions.'].join('\n'));
150
+ errorShown.current = true;
150
151
  }
151
152
 
152
- if (size.width === 0 && !warningShown.current && !isJSDOM) {
153
- logger.warn(['The parent of the grid has an empty width.', 'You need to make sure the container has an intrinsic width.', 'The grid displays with a width of 0px.', '', 'You can find a solution in the docs:', 'https://mui.com/x/react-data-grid/layout/'].join('\n'));
154
- warningShown.current = true;
153
+ if (size.width === 0 && !errorShown.current && !isJSDOM) {
154
+ logger.error(['The parent DOM element of the data grid has an empty width.', 'Please make sure that this element has an intrinsic width.', 'The grid displays with a width of 0px.', '', 'More details: https://mui.com/r/x-data-grid-no-dimensions.'].join('\n'));
155
+ errorShown.current = true;
155
156
  }
156
157
 
157
158
  if (isTestEnvironment) {
@@ -303,6 +303,9 @@ export const useGridCellEditing = (apiRef, props) => {
303
303
  } = editingState[id][field];
304
304
 
305
305
  if (error || isProcessingProps) {
306
+ // Attempt to change cell mode to "view" was not successful
307
+ // Update previous mode to allow another attempt
308
+ prevCellModesModel.current[id][field].mode = GridCellModes.Edit;
306
309
  return;
307
310
  }
308
311
 
@@ -310,6 +313,8 @@ export const useGridCellEditing = (apiRef, props) => {
310
313
 
311
314
  if (processRowUpdate) {
312
315
  const handleError = errorThrown => {
316
+ prevCellModesModel.current[id][field].mode = GridCellModes.Edit;
317
+
313
318
  if (onProcessRowUpdateError) {
314
319
  onProcessRowUpdateError(errorThrown);
315
320
  } else {
@@ -413,12 +418,15 @@ export const useGridCellEditing = (apiRef, props) => {
413
418
  }
414
419
  }, [cellModesModelProp, updateCellModesModel]);
415
420
  React.useEffect(() => {
416
- const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef);
421
+ const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef); // Update the ref here because updateStateToStopCellEditMode may change it later
422
+
423
+ const copyOfPrevCellModes = prevCellModesModel.current;
424
+ prevCellModesModel.current = cellModesModel;
417
425
  Object.entries(cellModesModel).forEach(([id, fields]) => {
418
426
  Object.entries(fields).forEach(([field, params]) => {
419
- var _prevCellModesModel$c, _prevCellModesModel$c2, _idToIdLookup$id;
427
+ var _copyOfPrevCellModes$, _copyOfPrevCellModes$2, _idToIdLookup$id;
420
428
 
421
- const prevMode = ((_prevCellModesModel$c = prevCellModesModel.current[id]) == null ? void 0 : (_prevCellModesModel$c2 = _prevCellModesModel$c[field]) == null ? void 0 : _prevCellModesModel$c2.mode) || GridCellModes.View;
429
+ const prevMode = ((_copyOfPrevCellModes$ = copyOfPrevCellModes[id]) == null ? void 0 : (_copyOfPrevCellModes$2 = _copyOfPrevCellModes$[field]) == null ? void 0 : _copyOfPrevCellModes$2.mode) || GridCellModes.View;
422
430
  const originalId = (_idToIdLookup$id = idToIdLookup[id]) != null ? _idToIdLookup$id : id;
423
431
 
424
432
  if (params.mode === GridCellModes.Edit && prevMode === GridCellModes.View) {
@@ -434,6 +442,5 @@ export const useGridCellEditing = (apiRef, props) => {
434
442
  }
435
443
  });
436
444
  });
437
- prevCellModesModel.current = cellModesModel;
438
445
  }, [apiRef, cellModesModel, updateStateToStartCellEditMode, updateStateToStopCellEditMode]);
439
446
  };
@@ -23,7 +23,7 @@ export function useGridEditing(apiRef, props) {
23
23
  useCellEditing(apiRef, props);
24
24
  useGridRowEditing(apiRef, props);
25
25
  const debounceMap = React.useRef({});
26
- apiRef.current.unstable_updateControlState({
26
+ apiRef.current.unstable_registerControlState({
27
27
  stateId: 'editRows',
28
28
  propModel: props.editRowsModel,
29
29
  propOnChange: props.onEditRowsModelChange,
@@ -384,12 +384,14 @@ export const useGridRowEditing = (apiRef, props) => {
384
384
  const isSomeFieldProcessingProps = Object.values(editingState[id]).some(fieldProps => fieldProps.isProcessingProps);
385
385
 
386
386
  if (isSomeFieldProcessingProps) {
387
+ prevRowModesModel.current[id].mode = GridRowModes.Edit;
387
388
  return;
388
389
  }
389
390
 
390
391
  const hasSomeFieldWithError = Object.values(editingState[id]).some(fieldProps => fieldProps.error);
391
392
 
392
393
  if (hasSomeFieldWithError) {
394
+ prevRowModesModel.current[id].mode = GridRowModes.Edit;
393
395
  return;
394
396
  }
395
397
 
@@ -397,6 +399,8 @@ export const useGridRowEditing = (apiRef, props) => {
397
399
 
398
400
  if (processRowUpdate) {
399
401
  const handleError = errorThrown => {
402
+ prevRowModesModel.current[id].mode = GridRowModes.Edit;
403
+
400
404
  if (onProcessRowUpdateError) {
401
405
  onProcessRowUpdateError(errorThrown);
402
406
  } else {
@@ -567,11 +571,14 @@ export const useGridRowEditing = (apiRef, props) => {
567
571
  }
568
572
  }, [rowModesModelProp, updateRowModesModel]);
569
573
  React.useEffect(() => {
570
- const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef);
574
+ const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef); // Update the ref here because updateStateToStopRowEditMode may change it later
575
+
576
+ const copyOfPrevRowModesModel = prevRowModesModel.current;
577
+ prevRowModesModel.current = rowModesModel;
571
578
  Object.entries(rowModesModel).forEach(([id, params]) => {
572
- var _prevRowModesModel$cu, _idToIdLookup$id;
579
+ var _copyOfPrevRowModesMo, _idToIdLookup$id;
573
580
 
574
- const prevMode = ((_prevRowModesModel$cu = prevRowModesModel.current[id]) == null ? void 0 : _prevRowModesModel$cu.mode) || GridRowModes.View;
581
+ const prevMode = ((_copyOfPrevRowModesMo = copyOfPrevRowModesModel[id]) == null ? void 0 : _copyOfPrevRowModesMo.mode) || GridRowModes.View;
575
582
  const originalId = (_idToIdLookup$id = idToIdLookup[id]) != null ? _idToIdLookup$id : id;
576
583
 
577
584
  if (params.mode === GridRowModes.Edit && prevMode === GridRowModes.View) {
@@ -584,6 +591,5 @@ export const useGridRowEditing = (apiRef, props) => {
584
591
  }, params));
585
592
  }
586
593
  });
587
- prevRowModesModel.current = rowModesModel;
588
594
  }, [apiRef, rowModesModel, updateStateToStartRowEditMode, updateStateToStopRowEditMode]);
589
595
  };
@@ -5,4 +5,4 @@ import { DataGridProcessedProps } from '../../../models/props/DataGridProps';
5
5
  * @requires useGridFocus (event) - can be after, async only
6
6
  * @requires useGridColumns (event) - can be after, async only
7
7
  */
8
- export declare function useGridEvents(apiRef: React.MutableRefObject<GridApiCommunity>, props: Pick<DataGridProcessedProps, 'onColumnHeaderClick' | 'onColumnHeaderDoubleClick' | 'onColumnHeaderOver' | 'onColumnHeaderOut' | 'onColumnHeaderEnter' | 'onColumnHeaderLeave' | 'onColumnOrderChange' | 'onCellClick' | 'onCellDoubleClick' | 'onCellKeyDown' | 'onCellFocusOut' | 'onPreferencePanelClose' | 'onPreferencePanelOpen' | 'onRowDoubleClick' | 'onRowClick' | 'onError' | 'onStateChange'>): void;
8
+ export declare function useGridEvents(apiRef: React.MutableRefObject<GridApiCommunity>, props: Pick<DataGridProcessedProps, 'onColumnHeaderClick' | 'onColumnHeaderDoubleClick' | 'onColumnHeaderOver' | 'onColumnHeaderOut' | 'onColumnHeaderEnter' | 'onColumnHeaderLeave' | 'onColumnOrderChange' | 'onCellClick' | 'onCellDoubleClick' | 'onCellKeyDown' | 'onCellFocusOut' | 'onPreferencePanelClose' | 'onPreferencePanelOpen' | 'onRowDoubleClick' | 'onRowClick' | 'onError' | 'onStateChange' | 'onMenuOpen' | 'onMenuClose'>): void;
@@ -18,6 +18,8 @@ export function useGridEvents(apiRef, props) {
18
18
  useGridApiOptionHandler(apiRef, 'cellFocusOut', props.onCellFocusOut);
19
19
  useGridApiOptionHandler(apiRef, 'preferencePanelClose', props.onPreferencePanelClose);
20
20
  useGridApiOptionHandler(apiRef, 'preferencePanelOpen', props.onPreferencePanelOpen);
21
+ useGridApiOptionHandler(apiRef, 'menuOpen', props.onMenuOpen);
22
+ useGridApiOptionHandler(apiRef, 'menuClose', props.onMenuClose);
21
23
  useGridApiOptionHandler(apiRef, 'rowDoubleClick', props.onRowDoubleClick);
22
24
  useGridApiOptionHandler(apiRef, 'rowClick', props.onRowClick);
23
25
  useGridApiOptionHandler(apiRef, 'componentError', props.onError);
@@ -9,6 +9,11 @@ export declare const gridFilterStateSelector: (state: GridStateCommunity) => imp
9
9
  * @category Filtering
10
10
  */
11
11
  export declare const gridFilterModelSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("../../..").GridFilterModel>;
12
+ /**
13
+ * Get the current quick filter values.
14
+ * @category Filtering
15
+ */
16
+ export declare const gridQuickFilterValuesSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, any[] | undefined>;
12
17
  /**
13
18
  * @category Filtering
14
19
  * @ignore - do not document.
@@ -13,6 +13,12 @@ export const gridFilterStateSelector = state => state.filter;
13
13
  */
14
14
 
15
15
  export const gridFilterModelSelector = createSelector(gridFilterStateSelector, filterState => filterState.filterModel);
16
+ /**
17
+ * Get the current quick filter values.
18
+ * @category Filtering
19
+ */
20
+
21
+ export const gridQuickFilterValuesSelector = createSelector(gridFilterModelSelector, filterModel => filterModel.quickFilterValues);
16
22
  /**
17
23
  * @category Filtering
18
24
  * @ignore - do not document.
@@ -19,7 +19,7 @@ export interface GridFilterState {
19
19
  /**
20
20
  * Amount of descendants that are passing the filters.
21
21
  * For the Tree Data, it includes all the intermediate depth levels (= amount of children + amount of grand children + ...).
22
- * For the Row Grouping by Column, it does not include the intermediate depth levels (= amount of descendant of maximum depth).
22
+ * For the Row grouping by column, it does not include the intermediate depth levels (= amount of descendant of maximum depth).
23
23
  * If a row is not registered in this lookup, it is supposed to have no descendant passing the filters.
24
24
  */
25
25
  filteredDescendantCountLookup: Record<GridRowId, number>;