@mui/x-data-grid 5.12.0 → 5.12.3

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 (289) hide show
  1. package/CHANGELOG.md +160 -7
  2. package/colDef/gridCheckboxSelectionColDef.d.ts +1 -0
  3. package/colDef/gridCheckboxSelectionColDef.js +2 -1
  4. package/colDef/gridDateOperators.d.ts +1 -1
  5. package/colDef/gridNumericColDef.js +1 -1
  6. package/components/cell/GridBooleanCell.js +4 -3
  7. package/components/cell/GridEditBooleanCell.js +4 -3
  8. package/components/cell/GridEditDateCell.js +4 -3
  9. package/components/cell/GridEditInputCell.js +4 -3
  10. package/components/cell/GridEditSingleSelectCell.js +9 -7
  11. package/components/columnHeaders/GridColumnHeaderItem.js +5 -3
  12. package/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  13. package/components/columnSelection/GridHeaderCheckbox.js +0 -1
  14. package/components/containers/GridRootStyles.js +4 -1
  15. package/components/panel/GridColumnsPanel.js +3 -6
  16. package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.d.ts +3 -2
  17. package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +12 -5
  18. package/components/panel/filterPanel/GridFilterPanel.js +2 -5
  19. package/components/toolbar/GridToolbarColumnsButton.js +0 -1
  20. package/components/toolbar/GridToolbarDensitySelector.js +0 -1
  21. package/components/toolbar/GridToolbarExportContainer.js +0 -1
  22. package/components/toolbar/GridToolbarFilterButton.js +0 -1
  23. package/components/toolbar/GridToolbarQuickFilter.d.ts +7 -0
  24. package/components/toolbar/GridToolbarQuickFilter.js +57 -4
  25. package/constants/defaultGridSlotsComponents.js +2 -1
  26. package/constants/localeTextConstants.js +1 -0
  27. package/hooks/core/useGridStateInitialization.js +19 -6
  28. package/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
  29. package/hooks/features/columns/useGridColumnSpanning.d.ts +1 -1
  30. package/hooks/features/columns/useGridColumnSpanning.js +1 -1
  31. package/hooks/features/columns/useGridColumns.d.ts +1 -1
  32. package/hooks/features/columns/useGridColumns.js +1 -1
  33. package/hooks/features/dimensions/gridDimensionsApi.d.ts +5 -0
  34. package/hooks/features/dimensions/useGridDimensions.js +9 -8
  35. package/hooks/features/editRows/useGridEditing.old.js +1 -1
  36. package/hooks/features/filter/gridFilterSelector.d.ts +5 -0
  37. package/hooks/features/filter/gridFilterSelector.js +6 -0
  38. package/hooks/features/filter/gridFilterState.d.ts +1 -1
  39. package/hooks/features/filter/gridFilterUtils.d.ts +1 -1
  40. package/hooks/features/filter/gridFilterUtils.js +10 -9
  41. package/hooks/features/filter/useGridFilter.d.ts +1 -1
  42. package/hooks/features/filter/useGridFilter.js +24 -7
  43. package/hooks/features/pagination/useGridPage.js +1 -1
  44. package/hooks/features/pagination/useGridPageSize.js +1 -1
  45. package/hooks/features/rows/useGridRows.js +15 -2
  46. package/hooks/features/rows/useGridRowsMeta.js +79 -77
  47. package/hooks/features/selection/useGridSelection.js +1 -1
  48. package/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  49. package/hooks/features/sorting/useGridSorting.d.ts +1 -1
  50. package/hooks/features/sorting/useGridSorting.js +1 -1
  51. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
  52. package/hooks/features/virtualization/useGridVirtualScroller.js +42 -8
  53. package/index.js +1 -1
  54. package/legacy/colDef/gridCheckboxSelectionColDef.js +2 -1
  55. package/legacy/colDef/gridNumericColDef.js +1 -1
  56. package/legacy/components/cell/GridBooleanCell.js +3 -1
  57. package/legacy/components/cell/GridEditBooleanCell.js +4 -2
  58. package/legacy/components/cell/GridEditDateCell.js +4 -2
  59. package/legacy/components/cell/GridEditInputCell.js +4 -2
  60. package/legacy/components/cell/GridEditSingleSelectCell.js +9 -7
  61. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +5 -3
  62. package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  63. package/legacy/components/columnSelection/GridHeaderCheckbox.js +0 -1
  64. package/legacy/components/containers/GridRootStyles.js +7 -5
  65. package/legacy/components/panel/GridColumnsPanel.js +5 -6
  66. package/legacy/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +12 -5
  67. package/legacy/components/panel/filterPanel/GridFilterPanel.js +3 -6
  68. package/legacy/components/toolbar/GridToolbarColumnsButton.js +0 -1
  69. package/legacy/components/toolbar/GridToolbarDensitySelector.js +0 -1
  70. package/legacy/components/toolbar/GridToolbarExportContainer.js +0 -1
  71. package/legacy/components/toolbar/GridToolbarFilterButton.js +0 -1
  72. package/legacy/components/toolbar/GridToolbarQuickFilter.js +67 -6
  73. package/legacy/constants/defaultGridSlotsComponents.js +2 -1
  74. package/legacy/constants/localeTextConstants.js +1 -0
  75. package/legacy/hooks/core/useGridStateInitialization.js +18 -6
  76. package/legacy/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
  77. package/legacy/hooks/features/columns/useGridColumnSpanning.js +1 -1
  78. package/legacy/hooks/features/columns/useGridColumns.js +1 -1
  79. package/legacy/hooks/features/dimensions/useGridDimensions.js +9 -8
  80. package/legacy/hooks/features/editRows/useGridEditing.old.js +1 -1
  81. package/legacy/hooks/features/filter/gridFilterSelector.js +8 -0
  82. package/legacy/hooks/features/filter/gridFilterUtils.js +11 -10
  83. package/legacy/hooks/features/filter/useGridFilter.js +28 -7
  84. package/legacy/hooks/features/pagination/useGridPage.js +1 -1
  85. package/legacy/hooks/features/pagination/useGridPageSize.js +1 -1
  86. package/legacy/hooks/features/rows/useGridRows.js +17 -2
  87. package/legacy/hooks/features/rows/useGridRowsMeta.js +81 -77
  88. package/legacy/hooks/features/selection/useGridSelection.js +1 -1
  89. package/legacy/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  90. package/legacy/hooks/features/sorting/useGridSorting.js +1 -1
  91. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +42 -8
  92. package/legacy/index.js +1 -1
  93. package/legacy/locales/arSD.js +1 -0
  94. package/legacy/locales/bgBG.js +1 -0
  95. package/legacy/locales/csCZ.js +1 -0
  96. package/legacy/locales/daDK.js +1 -0
  97. package/legacy/locales/deDE.js +1 -0
  98. package/legacy/locales/elGR.js +1 -0
  99. package/legacy/locales/esES.js +1 -0
  100. package/legacy/locales/faIR.js +1 -0
  101. package/legacy/locales/fiFI.js +1 -0
  102. package/legacy/locales/frFR.js +1 -0
  103. package/legacy/locales/heIL.js +1 -0
  104. package/legacy/locales/huHU.js +1 -0
  105. package/legacy/locales/index.js +1 -0
  106. package/legacy/locales/itIT.js +1 -0
  107. package/legacy/locales/jaJP.js +29 -24
  108. package/legacy/locales/koKR.js +1 -0
  109. package/legacy/locales/nbNO.js +1 -0
  110. package/legacy/locales/nlNL.js +1 -0
  111. package/legacy/locales/plPL.js +1 -0
  112. package/legacy/locales/ptBR.js +1 -0
  113. package/legacy/locales/ruRU.js +7 -6
  114. package/legacy/locales/skSK.js +1 -0
  115. package/legacy/locales/svSE.js +128 -0
  116. package/legacy/locales/trTR.js +1 -0
  117. package/legacy/locales/ukUA.js +1 -0
  118. package/legacy/locales/viVN.js +1 -0
  119. package/legacy/locales/zhCN.js +1 -0
  120. package/locales/arSD.js +1 -0
  121. package/locales/bgBG.js +1 -0
  122. package/locales/csCZ.js +1 -0
  123. package/locales/daDK.js +1 -0
  124. package/locales/deDE.js +1 -0
  125. package/locales/elGR.js +1 -0
  126. package/locales/esES.js +1 -0
  127. package/locales/faIR.js +1 -0
  128. package/locales/fiFI.js +1 -0
  129. package/locales/frFR.js +1 -0
  130. package/locales/heIL.js +1 -0
  131. package/locales/huHU.js +1 -0
  132. package/locales/index.d.ts +1 -0
  133. package/locales/index.js +1 -0
  134. package/locales/itIT.js +1 -0
  135. package/locales/jaJP.js +25 -24
  136. package/locales/koKR.js +1 -0
  137. package/locales/nbNO.js +1 -0
  138. package/locales/nlNL.js +1 -0
  139. package/locales/plPL.js +1 -0
  140. package/locales/ptBR.js +1 -0
  141. package/locales/ruRU.js +7 -6
  142. package/locales/skSK.js +1 -0
  143. package/locales/svSE.d.ts +2 -0
  144. package/locales/svSE.js +116 -0
  145. package/locales/trTR.js +1 -0
  146. package/locales/ukUA.js +1 -0
  147. package/locales/viVN.js +1 -0
  148. package/locales/zhCN.js +1 -0
  149. package/models/api/gridCallbackDetails.d.ts +6 -1
  150. package/models/api/gridFilterApi.d.ts +8 -1
  151. package/models/api/gridLocaleTextApi.d.ts +1 -0
  152. package/models/api/gridStateApi.d.ts +14 -3
  153. package/models/colDef/gridColDef.d.ts +1 -1
  154. package/models/events/gridEventLookup.d.ts +3 -0
  155. package/models/gridIconSlotsComponent.d.ts +5 -0
  156. package/models/props/DataGridProps.d.ts +1 -1
  157. package/modern/colDef/gridCheckboxSelectionColDef.js +2 -1
  158. package/modern/colDef/gridNumericColDef.js +1 -1
  159. package/modern/components/cell/GridBooleanCell.js +4 -3
  160. package/modern/components/cell/GridEditBooleanCell.js +4 -3
  161. package/modern/components/cell/GridEditDateCell.js +4 -3
  162. package/modern/components/cell/GridEditInputCell.js +4 -3
  163. package/modern/components/cell/GridEditSingleSelectCell.js +9 -7
  164. package/modern/components/columnHeaders/GridColumnHeaderItem.js +5 -3
  165. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  166. package/modern/components/columnSelection/GridHeaderCheckbox.js +0 -1
  167. package/modern/components/containers/GridRootStyles.js +4 -1
  168. package/modern/components/panel/GridColumnsPanel.js +3 -6
  169. package/modern/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +12 -5
  170. package/modern/components/panel/filterPanel/GridFilterPanel.js +2 -5
  171. package/modern/components/toolbar/GridToolbarColumnsButton.js +0 -1
  172. package/modern/components/toolbar/GridToolbarDensitySelector.js +0 -1
  173. package/modern/components/toolbar/GridToolbarExportContainer.js +0 -1
  174. package/modern/components/toolbar/GridToolbarFilterButton.js +0 -1
  175. package/modern/components/toolbar/GridToolbarQuickFilter.js +57 -4
  176. package/modern/constants/defaultGridSlotsComponents.js +2 -1
  177. package/modern/constants/localeTextConstants.js +1 -0
  178. package/modern/hooks/core/useGridStateInitialization.js +19 -6
  179. package/modern/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
  180. package/modern/hooks/features/columns/useGridColumnSpanning.js +1 -1
  181. package/modern/hooks/features/columns/useGridColumns.js +1 -1
  182. package/modern/hooks/features/dimensions/useGridDimensions.js +9 -8
  183. package/modern/hooks/features/editRows/useGridEditing.old.js +1 -1
  184. package/modern/hooks/features/filter/gridFilterSelector.js +6 -0
  185. package/modern/hooks/features/filter/gridFilterUtils.js +10 -9
  186. package/modern/hooks/features/filter/useGridFilter.js +24 -7
  187. package/modern/hooks/features/pagination/useGridPage.js +1 -1
  188. package/modern/hooks/features/pagination/useGridPageSize.js +1 -1
  189. package/modern/hooks/features/rows/useGridRows.js +15 -2
  190. package/modern/hooks/features/rows/useGridRowsMeta.js +77 -75
  191. package/modern/hooks/features/selection/useGridSelection.js +1 -1
  192. package/modern/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
  193. package/modern/hooks/features/sorting/useGridSorting.js +1 -1
  194. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +42 -8
  195. package/modern/index.js +1 -1
  196. package/modern/locales/arSD.js +1 -0
  197. package/modern/locales/bgBG.js +1 -0
  198. package/modern/locales/csCZ.js +1 -0
  199. package/modern/locales/daDK.js +1 -0
  200. package/modern/locales/deDE.js +1 -0
  201. package/modern/locales/elGR.js +1 -0
  202. package/modern/locales/esES.js +1 -0
  203. package/modern/locales/faIR.js +1 -0
  204. package/modern/locales/fiFI.js +1 -0
  205. package/modern/locales/frFR.js +1 -0
  206. package/modern/locales/heIL.js +1 -0
  207. package/modern/locales/huHU.js +1 -0
  208. package/modern/locales/index.js +1 -0
  209. package/modern/locales/itIT.js +1 -0
  210. package/modern/locales/jaJP.js +25 -24
  211. package/modern/locales/koKR.js +1 -0
  212. package/modern/locales/nbNO.js +1 -0
  213. package/modern/locales/nlNL.js +1 -0
  214. package/modern/locales/plPL.js +1 -0
  215. package/modern/locales/ptBR.js +1 -0
  216. package/modern/locales/ruRU.js +7 -6
  217. package/modern/locales/skSK.js +1 -0
  218. package/modern/locales/svSE.js +116 -0
  219. package/modern/locales/trTR.js +1 -0
  220. package/modern/locales/ukUA.js +1 -0
  221. package/modern/locales/viVN.js +1 -0
  222. package/modern/locales/zhCN.js +1 -0
  223. package/node/colDef/gridCheckboxSelectionColDef.js +4 -2
  224. package/node/colDef/gridNumericColDef.js +1 -1
  225. package/node/components/cell/GridBooleanCell.js +5 -3
  226. package/node/components/cell/GridEditBooleanCell.js +5 -3
  227. package/node/components/cell/GridEditDateCell.js +5 -3
  228. package/node/components/cell/GridEditInputCell.js +5 -3
  229. package/node/components/cell/GridEditSingleSelectCell.js +10 -7
  230. package/node/components/columnHeaders/GridColumnHeaderItem.js +5 -3
  231. package/node/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
  232. package/node/components/columnSelection/GridHeaderCheckbox.js +0 -1
  233. package/node/components/containers/GridRootStyles.js +4 -1
  234. package/node/components/panel/GridColumnsPanel.js +3 -6
  235. package/node/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +12 -5
  236. package/node/components/panel/filterPanel/GridFilterPanel.js +2 -5
  237. package/node/components/toolbar/GridToolbarColumnsButton.js +0 -1
  238. package/node/components/toolbar/GridToolbarDensitySelector.js +0 -1
  239. package/node/components/toolbar/GridToolbarExportContainer.js +0 -1
  240. package/node/components/toolbar/GridToolbarFilterButton.js +0 -1
  241. package/node/components/toolbar/GridToolbarQuickFilter.js +61 -4
  242. package/node/constants/defaultGridSlotsComponents.js +2 -1
  243. package/node/constants/localeTextConstants.js +1 -0
  244. package/node/hooks/core/useGridStateInitialization.js +19 -6
  245. package/node/hooks/features/columnMenu/useGridColumnMenu.js +23 -0
  246. package/node/hooks/features/columns/useGridColumnSpanning.js +11 -16
  247. package/node/hooks/features/columns/useGridColumns.js +1 -1
  248. package/node/hooks/features/dimensions/useGridDimensions.js +9 -8
  249. package/node/hooks/features/editRows/useGridEditing.old.js +1 -1
  250. package/node/hooks/features/filter/gridFilterSelector.js +9 -2
  251. package/node/hooks/features/filter/gridFilterUtils.js +9 -8
  252. package/node/hooks/features/filter/useGridFilter.js +24 -7
  253. package/node/hooks/features/pagination/useGridPage.js +1 -1
  254. package/node/hooks/features/pagination/useGridPageSize.js +1 -1
  255. package/node/hooks/features/rows/useGridRows.js +15 -2
  256. package/node/hooks/features/rows/useGridRowsMeta.js +80 -77
  257. package/node/hooks/features/selection/useGridSelection.js +1 -1
  258. package/node/hooks/features/selection/useGridSelectionPreProcessors.js +7 -5
  259. package/node/hooks/features/sorting/useGridSorting.js +1 -1
  260. package/node/hooks/features/virtualization/useGridVirtualScroller.js +42 -9
  261. package/node/index.js +1 -1
  262. package/node/locales/arSD.js +1 -0
  263. package/node/locales/bgBG.js +1 -0
  264. package/node/locales/csCZ.js +1 -0
  265. package/node/locales/daDK.js +1 -0
  266. package/node/locales/deDE.js +1 -0
  267. package/node/locales/elGR.js +1 -0
  268. package/node/locales/esES.js +1 -0
  269. package/node/locales/faIR.js +1 -0
  270. package/node/locales/fiFI.js +1 -0
  271. package/node/locales/frFR.js +1 -0
  272. package/node/locales/heIL.js +1 -0
  273. package/node/locales/huHU.js +1 -0
  274. package/node/locales/index.js +13 -0
  275. package/node/locales/itIT.js +1 -0
  276. package/node/locales/jaJP.js +25 -24
  277. package/node/locales/koKR.js +1 -0
  278. package/node/locales/nbNO.js +1 -0
  279. package/node/locales/nlNL.js +1 -0
  280. package/node/locales/plPL.js +1 -0
  281. package/node/locales/ptBR.js +1 -0
  282. package/node/locales/ruRU.js +7 -6
  283. package/node/locales/skSK.js +1 -0
  284. package/node/locales/svSE.js +126 -0
  285. package/node/locales/trTR.js +1 -0
  286. package/node/locales/ukUA.js +1 -0
  287. package/node/locales/viVN.js +1 -0
  288. package/node/locales/zhCN.js +1 -0
  289. package/package.json +4 -3
@@ -17,6 +17,8 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
17
17
 
18
18
  var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
19
19
 
20
+ var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
21
+
20
22
  var _styles = require("@mui/material/styles");
21
23
 
22
24
  var _utils = require("@mui/material/utils");
@@ -25,9 +27,15 @@ var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
25
27
 
26
28
  var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
27
29
 
30
+ var _useGridSelector = require("../../hooks/utils/useGridSelector");
31
+
32
+ var _filter = require("../../hooks/features/filter");
33
+
34
+ var _utils2 = require("../../utils/utils");
35
+
28
36
  var _jsxRuntime = require("react/jsx-runtime");
29
37
 
30
- const _excluded = ["quickFilterParser", "debounceMs"];
38
+ const _excluded = ["quickFilterParser", "quickFilterFormatter", "debounceMs"];
31
39
 
32
40
  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); }
33
41
 
@@ -42,27 +50,54 @@ const GridToolbarQuickFilterRoot = (0, _styles.styled)(_TextField.default, {
42
50
  }) => ({
43
51
  width: 'auto',
44
52
  paddingBottom: theme.spacing(0.5),
45
- '& .MuiSvgIcon-root': {
46
- marginRight: theme.spacing(0.5)
53
+ '& input': {
54
+ marginLeft: theme.spacing(0.5)
47
55
  },
48
56
  '& .MuiInput-underline:before': {
49
57
  borderBottom: `1px solid ${theme.palette.divider}`
58
+ },
59
+ [`& input[type=search]::-ms-clear,
60
+ & input[type=search]::-ms-reveal`]: {
61
+ /* clears the 'X' icon from IE */
62
+ display: 'none',
63
+ width: 0,
64
+ height: 0
65
+ },
66
+ [`& input[type="search"]::-webkit-search-decoration,
67
+ & input[type="search"]::-webkit-search-cancel-button,
68
+ & input[type="search"]::-webkit-search-results-button,
69
+ & input[type="search"]::-webkit-search-results-decoration`]: {
70
+ /* clears the 'X' icon from Chrome */
71
+ display: 'none'
50
72
  }
51
73
  }));
52
74
 
53
75
  const defaultSearchValueParser = searchText => searchText.split(' ').filter(word => word !== '');
54
76
 
77
+ const defaultSearchValueFormatter = values => values.join(' ');
78
+
55
79
  function GridToolbarQuickFilter(props) {
56
80
  var _rootProps$components;
57
81
 
58
82
  const {
59
83
  quickFilterParser = defaultSearchValueParser,
84
+ quickFilterFormatter = defaultSearchValueFormatter,
60
85
  debounceMs = 500
61
86
  } = props,
62
87
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
63
88
  const apiRef = (0, _useGridApiContext.useGridApiContext)();
64
89
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
65
- const [searchValue, setSearchValue] = React.useState('');
90
+ const quickFilterValues = (0, _useGridSelector.useGridSelector)(apiRef, _filter.gridQuickFilterValuesSelector);
91
+ const [searchValue, setSearchValue] = React.useState(() => quickFilterFormatter(quickFilterValues != null ? quickFilterValues : []));
92
+ const [prevQuickFilterValues, setPrevQuickFilterValues] = React.useState(quickFilterValues);
93
+ React.useEffect(() => {
94
+ if (!(0, _utils2.isDeepEqual)(prevQuickFilterValues, quickFilterValues)) {
95
+ // The model of quick filter value has been updated
96
+ setPrevQuickFilterValues(quickFilterValues); // Update the input value if needed to match the new model
97
+
98
+ setSearchValue(prevSearchValue => (0, _utils2.isDeepEqual)(quickFilterParser(prevSearchValue), quickFilterValues) ? prevSearchValue : quickFilterFormatter(quickFilterValues != null ? quickFilterValues : []));
99
+ }
100
+ }, [prevQuickFilterValues, quickFilterValues, quickFilterFormatter, quickFilterParser]);
66
101
  const updateSearchValue = React.useCallback(newSearchValue => {
67
102
  apiRef.current.setQuickFilterValues(quickFilterParser(newSearchValue));
68
103
  }, [apiRef, quickFilterParser]);
@@ -72,6 +107,10 @@ function GridToolbarQuickFilter(props) {
72
107
  setSearchValue(newSearchValue);
73
108
  debouncedUpdateSearchValue(newSearchValue);
74
109
  }, [debouncedUpdateSearchValue]);
110
+ const handleSearchReset = React.useCallback(() => {
111
+ setSearchValue('');
112
+ updateSearchValue('');
113
+ }, [updateSearchValue]);
75
114
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridToolbarQuickFilterRoot, (0, _extends2.default)({
76
115
  as: rootProps.components.BaseTextField,
77
116
  variant: "standard",
@@ -83,6 +122,17 @@ function GridToolbarQuickFilter(props) {
83
122
  InputProps: {
84
123
  startAdornment: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.QuickFilterIcon, {
85
124
  fontSize: "small"
125
+ }),
126
+ endAdornment: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
127
+ "aria-label": apiRef.current.getLocaleText('toolbarQuickFilterDeleteIconLabel'),
128
+ size: "small",
129
+ sx: {
130
+ visibility: searchValue ? 'visible' : 'hidden'
131
+ },
132
+ onClick: handleSearchReset,
133
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.QuickFilterClearIcon, {
134
+ fontSize: "small"
135
+ })
86
136
  })
87
137
  }
88
138
  }, other, (_rootProps$components = rootProps.componentsProps) == null ? void 0 : _rootProps$components.baseTextField));
@@ -100,6 +150,13 @@ process.env.NODE_ENV !== "production" ? GridToolbarQuickFilter.propTypes = {
100
150
  */
101
151
  debounceMs: _propTypes.default.number,
102
152
 
153
+ /**
154
+ * Function responsible for formatting values of quick filter in a string when the model is modified
155
+ * @param {any[]} values The new values passed to the quick filter model
156
+ * @returns {string} The string to display in the text field
157
+ */
158
+ quickFilterFormatter: _propTypes.default.func,
159
+
103
160
  /**
104
161
  * Function responsible for parsing text input in an array of independent values for quick filtering.
105
162
  * @param {string} input The value entered by the user
@@ -57,7 +57,8 @@ const DEFAULT_GRID_ICON_SLOTS_COMPONENTS = {
57
57
  DetailPanelExpandIcon: _components.GridAddIcon,
58
58
  DetailPanelCollapseIcon: _components.GridRemoveIcon,
59
59
  RowReorderIcon: _components.GridDragIcon,
60
- QuickFilterIcon: _components.GridSearchIcon
60
+ QuickFilterIcon: _components.GridSearchIcon,
61
+ QuickFilterClearIcon: _components.GridCloseIcon
61
62
  };
62
63
  /**
63
64
  * TODO: Differentiate community and pro value and interface
@@ -111,6 +111,7 @@ const GRID_DEFAULT_LOCALE_TEXT = {
111
111
  groupColumn: name => `Group by ${name}`,
112
112
  unGroupColumn: name => `Stop grouping by ${name}`,
113
113
  // Master/detail
114
+ detailPanelToggle: 'Detail panel toggle',
114
115
  expandDetailPanel: 'Expand',
115
116
  collapseDetailPanel: 'Collapse',
116
117
  // Used core components translation keys
@@ -28,7 +28,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
28
28
  const useGridStateInitialization = (apiRef, props) => {
29
29
  const controlStateMapRef = React.useRef({});
30
30
  const [, rawForceUpdate] = React.useState();
31
- const updateControlState = React.useCallback(controlStateItem => {
31
+ const registerControlState = React.useCallback(controlStateItem => {
32
32
  const {
33
33
  stateId
34
34
  } = controlStateItem,
@@ -37,7 +37,7 @@ const useGridStateInitialization = (apiRef, props) => {
37
37
  stateId
38
38
  });
39
39
  }, []);
40
- const setState = React.useCallback(state => {
40
+ const setState = React.useCallback((state, reason) => {
41
41
  let newState;
42
42
 
43
43
  if ((0, _utils2.isFunction)(state)) {
@@ -98,23 +98,36 @@ const useGridStateInitialization = (apiRef, props) => {
98
98
 
99
99
  if (controlState.propOnChange && hasPropChanged) {
100
100
  const details = props.signature === _useGridApiEventHandler.GridSignature.DataGridPro ? {
101
- api: apiRef.current
102
- } : {};
101
+ api: apiRef.current,
102
+ reason
103
+ } : {
104
+ reason
105
+ };
103
106
  controlState.propOnChange(model, details);
104
107
  }
105
108
 
106
109
  if (!ignoreSetState) {
107
- apiRef.current.publishEvent(controlState.changeEvent, model);
110
+ apiRef.current.publishEvent(controlState.changeEvent, model, {
111
+ reason
112
+ });
108
113
  }
109
114
  }
110
115
 
111
116
  return !ignoreSetState;
112
117
  }, [apiRef, props.signature]);
118
+ const updateControlState = React.useCallback((key, state, reason) => {
119
+ return apiRef.current.setState(previousState => {
120
+ return (0, _extends2.default)({}, previousState, {
121
+ [key]: state(previousState[key])
122
+ });
123
+ }, reason);
124
+ }, [apiRef]);
113
125
  const forceUpdate = React.useCallback(() => rawForceUpdate(() => apiRef.current.state), [apiRef]);
114
126
  const stateApi = {
115
127
  setState,
116
128
  forceUpdate,
117
- unstable_updateControlState: updateControlState
129
+ unstable_updateControlState: updateControlState,
130
+ unstable_registerControlState: registerControlState
118
131
  };
119
132
  (0, _utils.useGridApiMethod)(apiRef, stateApi, 'GridStateApi');
120
133
  };
@@ -15,6 +15,8 @@ var _utils = require("../../utils");
15
15
 
16
16
  var _columnMenuSelector = require("./columnMenuSelector");
17
17
 
18
+ var _gridClasses = require("../../../constants/gridClasses");
19
+
18
20
  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); }
19
21
 
20
22
  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; }
@@ -97,7 +99,28 @@ const useGridColumnMenu = apiRef => {
97
99
  * EVENTS
98
100
  */
99
101
 
102
+ const handleColumnHeaderFocus = React.useCallback((params, event) => {
103
+ // Check if the column menu button received focus
104
+ if (!event.target.classList.contains(_gridClasses.gridClasses.menuIconButton)) {
105
+ return;
106
+ } // Check if there's an element which lost focus
107
+
108
+
109
+ if (!event.relatedTarget) {
110
+ return;
111
+ } // `true` if the focus was on the column menu itself, not on any item
112
+
113
+
114
+ const columnMenuLostFocus = event.relatedTarget.classList.contains(_gridClasses.gridClasses.menuList); // `true` if the focus was on an item from the column menu
115
+
116
+ const columnMenuItemLostFocus = event.relatedTarget.getAttribute('role') === 'menuitem';
117
+
118
+ if (columnMenuLostFocus || columnMenuItemLostFocus) {
119
+ apiRef.current.setColumnHeaderFocus(params.field);
120
+ }
121
+ }, [apiRef]);
100
122
  (0, _utils.useGridApiEventHandler)(apiRef, 'columnResizeStart', hideColumnMenu);
123
+ (0, _utils.useGridApiEventHandler)(apiRef, 'columnHeaderFocus', handleColumnHeaderFocus);
101
124
  (0, _utils.useGridApiEventHandler)(apiRef, 'virtualScrollerWheel', apiRef.current.hideColumnMenu);
102
125
  (0, _utils.useGridApiEventHandler)(apiRef, 'virtualScrollerTouchMove', apiRef.current.hideColumnMenu);
103
126
  };
@@ -1,26 +1,27 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
8
6
  exports.useGridColumnSpanning = void 0;
9
7
 
10
- var _react = _interopRequireDefault(require("react"));
8
+ var React = _interopRequireWildcard(require("react"));
11
9
 
12
10
  var _useGridApiMethod = require("../../utils/useGridApiMethod");
13
11
 
14
12
  var _useGridApiEventHandler = require("../../utils/useGridApiEventHandler");
15
13
 
14
+ 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); }
15
+
16
+ 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; }
17
+
16
18
  /**
17
19
  * @requires useGridColumns (method, event)
18
20
  * @requires useGridParamsApi (method)
19
21
  */
20
22
  const useGridColumnSpanning = apiRef => {
21
- const lookup = _react.default.useRef({});
22
-
23
- const setCellColSpanInfo = _react.default.useCallback((rowId, columnIndex, cellColSpanInfo) => {
23
+ const lookup = React.useRef({});
24
+ const setCellColSpanInfo = React.useCallback((rowId, columnIndex, cellColSpanInfo) => {
24
25
  const sizes = lookup.current;
25
26
 
26
27
  if (!sizes[rowId]) {
@@ -29,15 +30,13 @@ const useGridColumnSpanning = apiRef => {
29
30
 
30
31
  sizes[rowId][columnIndex] = cellColSpanInfo;
31
32
  }, []);
32
-
33
- const getCellColSpanInfo = _react.default.useCallback((rowId, columnIndex) => {
33
+ const getCellColSpanInfo = React.useCallback((rowId, columnIndex) => {
34
34
  var _lookup$current$rowId;
35
35
 
36
36
  return (_lookup$current$rowId = lookup.current[rowId]) == null ? void 0 : _lookup$current$rowId[columnIndex];
37
37
  }, []); // Calculate `colSpan` for the cell.
38
38
 
39
-
40
- const calculateCellColSpan = _react.default.useCallback(params => {
39
+ const calculateCellColSpan = React.useCallback(params => {
41
40
  const {
42
41
  columnIndex,
43
42
  rowId,
@@ -91,8 +90,7 @@ const useGridColumnSpanning = apiRef => {
91
90
  };
92
91
  }, [apiRef, setCellColSpanInfo]); // Calculate `colSpan` for each cell in the row
93
92
 
94
-
95
- const calculateColSpan = _react.default.useCallback(({
93
+ const calculateColSpan = React.useCallback(({
96
94
  rowId,
97
95
  minFirstColumn,
98
96
  maxLastColumn
@@ -110,18 +108,15 @@ const useGridColumnSpanning = apiRef => {
110
108
  }
111
109
  }
112
110
  }, [calculateCellColSpan]);
113
-
114
111
  const columnSpanningApi = {
115
112
  unstable_getCellColSpanInfo: getCellColSpanInfo,
116
113
  unstable_calculateColSpan: calculateColSpan
117
114
  };
118
115
  (0, _useGridApiMethod.useGridApiMethod)(apiRef, columnSpanningApi, 'GridColumnSpanningAPI');
119
-
120
- const handleColumnReorderChange = _react.default.useCallback(() => {
116
+ const handleColumnReorderChange = React.useCallback(() => {
121
117
  // `colSpan` needs to be recalculated after column reordering
122
118
  lookup.current = {};
123
119
  }, []);
124
-
125
120
  (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'columnOrderChange', handleColumnReorderChange);
126
121
  };
127
122
 
@@ -69,7 +69,7 @@ function useGridColumns(apiRef, props) {
69
69
  const columnTypes = React.useMemo(() => (0, _gridColumnsUtils.computeColumnTypes)(props.columnTypes), [props.columnTypes]);
70
70
  const previousColumnsProp = React.useRef(props.columns);
71
71
  const previousColumnTypesProp = React.useRef(columnTypes);
72
- apiRef.current.unstable_updateControlState({
72
+ apiRef.current.unstable_registerControlState({
73
73
  stateId: 'visibleColumns',
74
74
  propModel: props.columnVisibilityModel,
75
75
  propOnChange: props.onColumnVisibilityModelChange,
@@ -58,7 +58,7 @@ const hasScroll = ({
58
58
 
59
59
  function useGridDimensions(apiRef, props) {
60
60
  const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useResizeContainer');
61
- const warningShown = React.useRef(false);
61
+ const errorShown = React.useRef(false);
62
62
  const rootDimensionsRef = React.useRef(null);
63
63
  const fullDimensionsRef = React.useRef(null);
64
64
  const rowsMeta = (0, _utils2.useGridSelector)(apiRef, _gridRowsMetaSelector.gridRowsMetaSelector);
@@ -115,7 +115,8 @@ function useGridDimensions(apiRef, props) {
115
115
  viewportOuterSize,
116
116
  viewportInnerSize,
117
117
  hasScrollX,
118
- hasScrollY
118
+ hasScrollY,
119
+ scrollBarSize
119
120
  };
120
121
  const prevDimensions = fullDimensionsRef.current;
121
122
  fullDimensionsRef.current = newFullDimensions;
@@ -165,14 +166,14 @@ function useGridDimensions(apiRef, props) {
165
166
 
166
167
  const isJSDOM = /jsdom/.test(window.navigator.userAgent);
167
168
 
168
- if (size.height === 0 && !warningShown.current && !props.autoHeight && !isJSDOM) {
169
- 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'));
170
- warningShown.current = true;
169
+ if (size.height === 0 && !errorShown.current && !props.autoHeight && !isJSDOM) {
170
+ 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'));
171
+ errorShown.current = true;
171
172
  }
172
173
 
173
- if (size.width === 0 && !warningShown.current && !isJSDOM) {
174
- 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'));
175
- warningShown.current = true;
174
+ if (size.width === 0 && !errorShown.current && !isJSDOM) {
175
+ 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'));
176
+ errorShown.current = true;
176
177
  }
177
178
 
178
179
  if (isTestEnvironment) {
@@ -49,7 +49,7 @@ function useGridEditing(apiRef, props) {
49
49
  (0, _useGridCellEditing.useCellEditing)(apiRef, props);
50
50
  (0, _useGridRowEditing.useGridRowEditing)(apiRef, props);
51
51
  const debounceMap = React.useRef({});
52
- apiRef.current.unstable_updateControlState({
52
+ apiRef.current.unstable_registerControlState({
53
53
  stateId: 'editRows',
54
54
  propModel: props.editRowsModel,
55
55
  propOnChange: props.onEditRowsModelChange,
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.gridVisibleTopLevelRowCountSelector = exports.gridVisibleSortedTopLevelRowEntriesSelector = exports.gridVisibleSortedRowIdsSelector = exports.gridVisibleSortedRowEntriesSelector = exports.gridVisibleRowsSelector = exports.gridVisibleRowsLookupSelector = exports.gridVisibleRowCountSelector = exports.gridFilteredSortedRowIdsSelector = exports.gridFilteredSortedRowEntriesSelector = exports.gridFilteredRowsLookupSelector = exports.gridFilteredDescendantCountLookupSelector = exports.gridFilterStateSelector = exports.gridFilterModelSelector = exports.gridFilterActiveItemsSelector = exports.gridFilterActiveItemsLookupSelector = void 0;
6
+ exports.gridVisibleTopLevelRowCountSelector = exports.gridVisibleSortedTopLevelRowEntriesSelector = exports.gridVisibleSortedRowIdsSelector = exports.gridVisibleSortedRowEntriesSelector = exports.gridVisibleRowsSelector = exports.gridVisibleRowsLookupSelector = exports.gridVisibleRowCountSelector = exports.gridQuickFilterValuesSelector = exports.gridFilteredSortedRowIdsSelector = exports.gridFilteredSortedRowEntriesSelector = exports.gridFilteredRowsLookupSelector = exports.gridFilteredDescendantCountLookupSelector = exports.gridFilterStateSelector = exports.gridFilterModelSelector = exports.gridFilterActiveItemsSelector = exports.gridFilterActiveItemsLookupSelector = void 0;
7
7
 
8
8
  var _createSelector = require("../../../utils/createSelector");
9
9
 
@@ -26,11 +26,18 @@ const gridFilterStateSelector = state => state.filter;
26
26
  exports.gridFilterStateSelector = gridFilterStateSelector;
27
27
  const gridFilterModelSelector = (0, _createSelector.createSelector)(gridFilterStateSelector, filterState => filterState.filterModel);
28
28
  /**
29
+ * Get the current quick filter values.
29
30
  * @category Filtering
30
- * @ignore - do not document.
31
31
  */
32
32
 
33
33
  exports.gridFilterModelSelector = gridFilterModelSelector;
34
+ const gridQuickFilterValuesSelector = (0, _createSelector.createSelector)(gridFilterModelSelector, filterModel => filterModel.quickFilterValues);
35
+ /**
36
+ * @category Filtering
37
+ * @ignore - do not document.
38
+ */
39
+
40
+ exports.gridQuickFilterValuesSelector = gridQuickFilterValuesSelector;
34
41
  const gridVisibleRowsLookupSelector = (0, _createSelector.createSelector)(gridFilterStateSelector, filterState => filterState.visibleRowsLookup);
35
42
  /**
36
43
  * @category Filtering
@@ -30,8 +30,9 @@ const cleanFilterItem = (item, apiRef) => {
30
30
  }
31
31
 
32
32
  if (cleanItem.operatorValue == null) {
33
- // we select a default operator
34
- const column = apiRef.current.getColumn(cleanItem.columnField);
33
+ // Selects a default operator
34
+ // We don't use `apiRef.current.getColumn` because it is not ready during state initialization
35
+ const column = (0, _columns.gridColumnLookupSelector)(apiRef)[cleanItem.columnField];
35
36
  cleanItem.operatorValue = column && column.filterOperators[0].value;
36
37
  }
37
38
 
@@ -82,10 +83,8 @@ const sanitizeFilterModel = (model, disableMultipleColumnsFiltering, apiRef) =>
82
83
 
83
84
  exports.sanitizeFilterModel = sanitizeFilterModel;
84
85
 
85
- const mergeStateWithFilterModel = (filterModel, disableMultipleColumnsFiltering, apiRef) => state => (0, _extends2.default)({}, state, {
86
- filter: (0, _extends2.default)({}, state.filter, {
87
- filterModel: sanitizeFilterModel(filterModel, disableMultipleColumnsFiltering, apiRef)
88
- })
86
+ const mergeStateWithFilterModel = (filterModel, disableMultipleColumnsFiltering, apiRef) => filteringState => (0, _extends2.default)({}, filteringState, {
87
+ filterModel: sanitizeFilterModel(filterModel, disableMultipleColumnsFiltering, apiRef)
89
88
  });
90
89
  /**
91
90
  * Generates a method to easily check if a row is matching the current filter model.
@@ -210,14 +209,16 @@ const buildAggregatedQuickFilterApplier = (filterModel, apiRef) => {
210
209
  const sanitizedQuickFilterValues = quickFilterValues.filter((value, index) => Object.keys(appliersPerColumnField).some(field => appliersPerColumnField[field][index] != null));
211
210
  return (rowId, shouldApplyFilter) => {
212
211
  const usedCellParams = {};
212
+ const columnsFieldsToFilter = [];
213
213
  Object.keys(appliersPerColumnField).forEach(columnField => {
214
214
  if (!shouldApplyFilter || shouldApplyFilter(columnField)) {
215
215
  usedCellParams[columnField] = apiRef.current.getCellParams(rowId, columnField);
216
+ columnsFieldsToFilter.push(columnField);
216
217
  }
217
218
  }); // Return `false` as soon as we have a quick filter value that does not match any column
218
219
 
219
220
  if (quickFilterLogicOperator === _models.GridLinkOperator.And) {
220
- return sanitizedQuickFilterValues.every((value, index) => Object.keys(appliersPerColumnField).some(field => {
221
+ return sanitizedQuickFilterValues.every((value, index) => columnsFieldsToFilter.some(field => {
221
222
  var _appliersPerColumnFie, _appliersPerColumnFie2;
222
223
 
223
224
  if (appliersPerColumnField[field][index] == null) {
@@ -229,7 +230,7 @@ const buildAggregatedQuickFilterApplier = (filterModel, apiRef) => {
229
230
  } // Return `true` as soon as we have have a quick filter value that match any column
230
231
 
231
232
 
232
- return sanitizedQuickFilterValues.some((value, index) => Object.keys(appliersPerColumnField).some(field => {
233
+ return sanitizedQuickFilterValues.some((value, index) => columnsFieldsToFilter.some(field => {
233
234
  var _appliersPerColumnFie3, _appliersPerColumnFie4;
234
235
 
235
236
  if (appliersPerColumnField[field][index] == null) {
@@ -70,7 +70,7 @@ const useGridFilter = (apiRef, props) => {
70
70
  var _props$componentsProp2;
71
71
 
72
72
  const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useGridFilter');
73
- apiRef.current.unstable_updateControlState({
73
+ apiRef.current.unstable_registerControlState({
74
74
  stateId: 'filter',
75
75
  propModel: props.filterModel,
76
76
  propOnChange: props.onFilterModelChange,
@@ -111,7 +111,23 @@ const useGridFilter = (apiRef, props) => {
111
111
 
112
112
  apiRef.current.setFilterModel((0, _extends2.default)({}, filterModel, {
113
113
  items
114
- }));
114
+ }), 'upsertFilterItem');
115
+ }, [apiRef]);
116
+ const upsertFilterItems = React.useCallback(items => {
117
+ const filterModel = (0, _gridFilterSelector.gridFilterModelSelector)(apiRef);
118
+ const existingItems = [...filterModel.items];
119
+ items.forEach(item => {
120
+ const itemIndex = items.findIndex(filterItem => filterItem.id === item.id);
121
+
122
+ if (itemIndex === -1) {
123
+ existingItems.push(item);
124
+ } else {
125
+ existingItems[itemIndex] = item;
126
+ }
127
+ });
128
+ apiRef.current.setFilterModel((0, _extends2.default)({}, filterModel, {
129
+ items
130
+ }), 'upsertFilterItems');
115
131
  }, [apiRef]);
116
132
  const deleteFilterItem = React.useCallback(itemToDelete => {
117
133
  const filterModel = (0, _gridFilterSelector.gridFilterModelSelector)(apiRef);
@@ -123,7 +139,7 @@ const useGridFilter = (apiRef, props) => {
123
139
 
124
140
  apiRef.current.setFilterModel((0, _extends2.default)({}, filterModel, {
125
141
  items
126
- }));
142
+ }), 'deleteFilterItem');
127
143
  }, [apiRef]);
128
144
  const showFilterPanel = React.useCallback(targetColumnField => {
129
145
  logger.debug('Displaying filter panel');
@@ -166,7 +182,7 @@ const useGridFilter = (apiRef, props) => {
166
182
 
167
183
  apiRef.current.setFilterModel((0, _extends2.default)({}, filterModel, {
168
184
  linkOperator
169
- }));
185
+ }), 'changeLogicOperator');
170
186
  }, [apiRef]);
171
187
  const setQuickFilterValues = React.useCallback(values => {
172
188
  const filterModel = (0, _gridFilterSelector.gridFilterModelSelector)(apiRef);
@@ -179,12 +195,12 @@ const useGridFilter = (apiRef, props) => {
179
195
  quickFilterValues: [...values]
180
196
  }));
181
197
  }, [apiRef]);
182
- const setFilterModel = React.useCallback(model => {
198
+ const setFilterModel = React.useCallback((model, reason) => {
183
199
  const currentModel = (0, _gridFilterSelector.gridFilterModelSelector)(apiRef);
184
200
 
185
201
  if (currentModel !== model) {
186
202
  logger.debug('Setting filter model');
187
- apiRef.current.setState((0, _gridFilterUtils.mergeStateWithFilterModel)(model, props.disableMultipleColumnsFiltering, apiRef));
203
+ apiRef.current.unstable_updateControlState('filter', (0, _gridFilterUtils.mergeStateWithFilterModel)(model, props.disableMultipleColumnsFiltering, apiRef), reason);
188
204
  apiRef.current.unstable_applyFilters();
189
205
  }
190
206
  }, [apiRef, logger, props.disableMultipleColumnsFiltering]);
@@ -197,6 +213,7 @@ const useGridFilter = (apiRef, props) => {
197
213
  unstable_applyFilters: applyFilters,
198
214
  deleteFilterItem,
199
215
  upsertFilterItem,
216
+ upsertFilterItems,
200
217
  setFilterModel,
201
218
  showFilterPanel,
202
219
  hideFilterPanel,
@@ -230,7 +247,7 @@ const useGridFilter = (apiRef, props) => {
230
247
  return params;
231
248
  }
232
249
 
233
- apiRef.current.setState((0, _gridFilterUtils.mergeStateWithFilterModel)(filterModel, props.disableMultipleColumnsFiltering, apiRef));
250
+ apiRef.current.unstable_updateControlState('filter', (0, _gridFilterUtils.mergeStateWithFilterModel)(filterModel, props.disableMultipleColumnsFiltering, apiRef), 'restoreState');
234
251
  return (0, _extends2.default)({}, params, {
235
252
  callbacks: [...params.callbacks, apiRef.current.unstable_applyFilters]
236
253
  });
@@ -61,7 +61,7 @@ const useGridPage = (apiRef, props) => {
61
61
 
62
62
  const logger = (0, _utils.useGridLogger)(apiRef, 'useGridPage');
63
63
  const visibleTopLevelRowCount = (0, _utils.useGridSelector)(apiRef, _filter.gridVisibleTopLevelRowCountSelector);
64
- apiRef.current.unstable_updateControlState({
64
+ apiRef.current.unstable_registerControlState({
65
65
  stateId: 'page',
66
66
  propModel: props.page,
67
67
  propOnChange: props.onPageChange,
@@ -42,7 +42,7 @@ const useGridPageSize = (apiRef, props) => {
42
42
 
43
43
  const logger = (0, _utils.useGridLogger)(apiRef, 'useGridPageSize');
44
44
  const rowHeight = (0, _utils.useGridSelector)(apiRef, _density.gridDensityRowHeightSelector);
45
- apiRef.current.unstable_updateControlState({
45
+ apiRef.current.unstable_registerControlState({
46
46
  stateId: 'pageSize',
47
47
  propModel: props.pageSize,
48
48
  propOnChange: props.onPageSizeChange,
@@ -349,10 +349,23 @@ const useGridRows = (apiRef, props) => {
349
349
  if (isFirstRender.current) {
350
350
  isFirstRender.current = false;
351
351
  return;
352
- } // The new rows have already been applied (most likely in the `'rowGroupsPreProcessingChange'` listener)
352
+ }
353
+
354
+ const areNewRowsAlreadyInState = apiRef.current.unstable_caches.rows.rowsBeforePartialUpdates === props.rows;
355
+ const isNewLoadingAlreadyInState = apiRef.current.unstable_caches.rows.loadingPropBeforePartialUpdates === props.loading; // The new rows have already been applied (most likely in the `'rowGroupsPreProcessingChange'` listener)
353
356
 
357
+ if (areNewRowsAlreadyInState) {
358
+ // If the loading prop has changed, we need to update its value in the state because it won't be done by `throttledRowsChange`
359
+ if (!isNewLoadingAlreadyInState) {
360
+ apiRef.current.setState(state => (0, _extends2.default)({}, state, {
361
+ rows: (0, _extends2.default)({}, state.rows, {
362
+ loading: props.loading
363
+ })
364
+ }));
365
+ apiRef.current.unstable_caches.rows.loadingPropBeforePartialUpdates = props.loading;
366
+ apiRef.current.forceUpdate();
367
+ }
354
368
 
355
- if (apiRef.current.unstable_caches.rows.rowsBeforePartialUpdates === props.rows && apiRef.current.unstable_caches.rows.loadingPropBeforePartialUpdates === props.loading) {
356
369
  return;
357
370
  }
358
371