@mui/x-data-grid 5.7.0 → 5.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/CHANGELOG.md +241 -53
  2. package/DataGrid/DataGrid.d.ts +8 -3
  3. package/DataGrid/DataGrid.js +28 -5
  4. package/DataGrid/useDataGridComponent.js +5 -5
  5. package/DataGrid/useDataGridProps.d.ts +2 -1
  6. package/LICENSE +21 -0
  7. package/README.md +6 -4
  8. package/colDef/gridBooleanColDef.d.ts +1 -1
  9. package/colDef/gridBooleanOperators.d.ts +1 -1
  10. package/colDef/gridDateColDef.d.ts +5 -9
  11. package/colDef/gridDateColDef.js +2 -2
  12. package/colDef/gridDateOperators.d.ts +1 -1
  13. package/{models/colDef → colDef}/gridDefaultColumnTypes.d.ts +1 -1
  14. package/{models/colDef → colDef}/gridDefaultColumnTypes.js +6 -6
  15. package/colDef/gridNumericColDef.d.ts +1 -1
  16. package/colDef/gridNumericOperators.d.ts +2 -2
  17. package/colDef/gridStringColDef.d.ts +1 -1
  18. package/colDef/gridStringOperators.d.ts +1 -1
  19. package/colDef/index.d.ts +1 -0
  20. package/colDef/index.js +2 -1
  21. package/components/GridRow.d.ts +4 -0
  22. package/components/GridRow.js +55 -24
  23. package/components/base/GridOverlays.js +4 -3
  24. package/components/cell/GridActionsCell.d.ts +5 -1
  25. package/components/cell/GridActionsCell.js +170 -21
  26. package/components/cell/GridActionsCellItem.d.ts +66 -4
  27. package/components/cell/GridActionsCellItem.js +7 -5
  28. package/components/cell/GridCell.d.ts +5 -4
  29. package/components/cell/GridCell.js +30 -9
  30. package/components/cell/GridEditInputCell.js +3 -3
  31. package/components/cell/GridEditSingleSelectCell.js +24 -15
  32. package/components/columnHeaders/GridColumnHeaderFilterIconButton.d.ts +12 -0
  33. package/components/columnHeaders/{ColumnHeaderFilterIcon.js → GridColumnHeaderFilterIconButton.js} +22 -4
  34. package/components/columnHeaders/GridColumnHeaderItem.js +9 -12
  35. package/components/columnHeaders/GridColumnHeaders.d.ts +0 -1
  36. package/components/columnHeaders/GridColumnHeaders.js +1 -1
  37. package/components/columnHeaders/index.d.ts +1 -0
  38. package/components/columnHeaders/index.js +1 -0
  39. package/components/columnSelection/GridCellCheckboxRenderer.d.ts +3 -3
  40. package/components/columnSelection/GridCellCheckboxRenderer.js +22 -5
  41. package/components/columnSelection/GridHeaderCheckbox.d.ts +1 -1
  42. package/components/containers/GridRoot.js +29 -17
  43. package/components/containers/GridRootStyles.js +36 -1
  44. package/components/menu/GridMenu.js +1 -0
  45. package/components/menu/columnMenu/GridColumnMenu.js +1 -1
  46. package/components/panel/GridPanel.d.ts +2 -2
  47. package/components/panel/GridPanel.js +1 -0
  48. package/components/panel/GridPreferencesPanel.js +1 -1
  49. package/components/panel/filterPanel/GridFilterForm.js +14 -10
  50. package/components/panel/filterPanel/GridFilterInputBoolean.js +13 -8
  51. package/components/panel/filterPanel/GridFilterInputSingleSelect.js +22 -15
  52. package/components/panel/filterPanel/GridFilterInputValue.js +22 -15
  53. package/components/toolbar/GridToolbarDensitySelector.js +1 -1
  54. package/components/toolbar/GridToolbarFilterButton.d.ts +1 -1
  55. package/components/virtualization/GridVirtualScroller.js +2 -0
  56. package/components/virtualization/GridVirtualScrollerContent.js +1 -3
  57. package/constants/defaultGridSlotsComponents.js +4 -2
  58. package/constants/gridClasses.d.ts +35 -3
  59. package/constants/gridClasses.js +1 -1
  60. package/constants/gridDetailPanelToggleField.d.ts +1 -0
  61. package/constants/gridDetailPanelToggleField.js +2 -0
  62. package/constants/localeTextConstants.js +3 -1
  63. package/hooks/core/index.d.ts +1 -1
  64. package/hooks/core/pipeProcessing/gridPipeProcessingApi.d.ts +85 -0
  65. package/hooks/core/{preProcessing/gridPreProcessingApi.js → pipeProcessing/gridPipeProcessingApi.js} +0 -0
  66. package/hooks/core/pipeProcessing/index.d.ts +4 -0
  67. package/hooks/core/pipeProcessing/index.js +4 -0
  68. package/hooks/core/pipeProcessing/useGridPipeProcessing.d.ts +32 -0
  69. package/hooks/core/pipeProcessing/useGridPipeProcessing.js +108 -0
  70. package/hooks/core/pipeProcessing/useGridRegisterPipeApplier.d.ts +3 -0
  71. package/{modern/hooks/core/preProcessing/useGridRegisterPreProcessor.js → hooks/core/pipeProcessing/useGridRegisterPipeApplier.js} +2 -6
  72. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.d.ts +4 -0
  73. package/hooks/core/{preProcessing/useGridRegisterPreProcessor.js → pipeProcessing/useGridRegisterPipeProcessor.js} +2 -6
  74. package/hooks/core/strategyProcessing/useGridStrategyProcessing.d.ts +27 -16
  75. package/hooks/core/strategyProcessing/useGridStrategyProcessing.js +26 -15
  76. package/hooks/core/useGridInitialization.js +2 -2
  77. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +0 -1
  78. package/hooks/features/columnHeaders/useGridColumnHeaders.js +77 -11
  79. package/hooks/features/columnMenu/useGridColumnMenu.js +2 -1
  80. package/hooks/features/columns/gridColumnsInterfaces.d.ts +3 -1
  81. package/hooks/features/columns/gridColumnsSelector.d.ts +6 -6
  82. package/hooks/features/columns/gridColumnsUtils.d.ts +22 -4
  83. package/hooks/features/columns/gridColumnsUtils.js +105 -20
  84. package/hooks/features/columns/useGridColumnSpanning.d.ts +7 -0
  85. package/hooks/features/columns/useGridColumnSpanning.js +109 -0
  86. package/hooks/features/columns/useGridColumns.d.ts +1 -1
  87. package/hooks/features/columns/useGridColumns.js +55 -40
  88. package/hooks/features/dimensions/gridDimensionsApi.d.ts +5 -0
  89. package/hooks/features/dimensions/useGridDimensions.js +5 -4
  90. package/hooks/features/editRows/useGridCellEditing.new.d.ts +1 -1
  91. package/hooks/features/editRows/useGridCellEditing.new.js +40 -17
  92. package/hooks/features/editRows/useGridEditing.new.js +7 -3
  93. package/hooks/features/editRows/useGridRowEditing.new.d.ts +1 -1
  94. package/hooks/features/editRows/useGridRowEditing.new.js +44 -21
  95. package/hooks/features/events/useGridEvents.d.ts +1 -1
  96. package/hooks/features/events/useGridEvents.js +2 -0
  97. package/hooks/features/filter/gridFilterSelector.d.ts +3 -9
  98. package/hooks/features/filter/useGridFilter.js +18 -13
  99. package/hooks/features/focus/useGridFocus.js +19 -9
  100. package/hooks/features/{keyboard → keyboardNavigation}/useGridKeyboardNavigation.d.ts +3 -5
  101. package/hooks/features/{keyboard → keyboardNavigation}/useGridKeyboardNavigation.js +66 -13
  102. package/hooks/features/pagination/gridPaginationSelector.d.ts +1 -3
  103. package/hooks/features/pagination/useGridPage.js +9 -4
  104. package/hooks/features/pagination/useGridPageSize.js +3 -3
  105. package/hooks/features/preferencesPanel/useGridPreferencesPanel.js +18 -5
  106. package/hooks/features/rows/gridRowsSelector.d.ts +2 -1
  107. package/hooks/features/rows/gridRowsSelector.js +1 -0
  108. package/hooks/features/rows/gridRowsState.d.ts +4 -0
  109. package/hooks/features/rows/gridRowsUtils.d.ts +8 -0
  110. package/hooks/features/rows/gridRowsUtils.js +11 -0
  111. package/hooks/features/rows/index.d.ts +1 -0
  112. package/hooks/features/rows/index.js +1 -1
  113. package/hooks/features/rows/useGridRows.d.ts +2 -2
  114. package/hooks/features/rows/useGridRows.js +27 -7
  115. package/hooks/features/rows/useGridRowsMeta.js +7 -14
  116. package/hooks/features/scroll/useGridScroll.d.ts +2 -0
  117. package/hooks/features/scroll/useGridScroll.js +27 -14
  118. package/hooks/features/selection/gridSelectionSelector.d.ts +1 -3
  119. package/hooks/features/selection/useGridSelection.d.ts +4 -2
  120. package/hooks/features/selection/useGridSelection.js +75 -27
  121. package/hooks/features/selection/useGridSelectionPreProcessors.js +2 -2
  122. package/hooks/features/sorting/gridSortingSelector.d.ts +1 -3
  123. package/hooks/features/sorting/gridSortingUtils.d.ts +1 -2
  124. package/hooks/features/sorting/useGridSorting.js +13 -13
  125. package/hooks/features/statePersistence/useGridStatePersistence.js +2 -2
  126. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +9 -0
  127. package/hooks/features/virtualization/useGridVirtualScroller.js +64 -27
  128. package/hooks/utils/useGridRootProps.d.ts +1 -1
  129. package/hooks/utils/useGridVisibleRows.d.ts +2 -2
  130. package/index.js +1 -1
  131. package/internals/index.d.ts +4 -6
  132. package/internals/index.js +3 -3
  133. package/legacy/DataGrid/DataGrid.js +28 -5
  134. package/legacy/DataGrid/useDataGridComponent.js +5 -5
  135. package/legacy/colDef/gridDateColDef.js +2 -2
  136. package/legacy/{models/colDef → colDef}/gridDefaultColumnTypes.js +6 -6
  137. package/legacy/colDef/index.js +2 -1
  138. package/legacy/components/GridRow.js +53 -24
  139. package/legacy/components/base/GridOverlays.js +4 -3
  140. package/legacy/components/cell/GridActionsCell.js +188 -27
  141. package/legacy/components/cell/GridActionsCellItem.js +7 -5
  142. package/legacy/components/cell/GridCell.js +31 -9
  143. package/legacy/components/cell/GridEditInputCell.js +3 -3
  144. package/legacy/components/cell/GridEditSingleSelectCell.js +35 -26
  145. package/legacy/components/columnHeaders/{ColumnHeaderFilterIcon.js → GridColumnHeaderFilterIconButton.js} +22 -4
  146. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +9 -12
  147. package/legacy/components/columnHeaders/GridColumnHeaders.js +2 -3
  148. package/legacy/components/columnHeaders/index.js +1 -0
  149. package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +23 -5
  150. package/legacy/components/containers/GridRoot.js +34 -17
  151. package/legacy/components/containers/GridRootStyles.js +26 -5
  152. package/legacy/components/menu/GridMenu.js +1 -0
  153. package/legacy/components/menu/columnMenu/GridColumnMenu.js +1 -1
  154. package/legacy/components/panel/GridPanel.js +1 -0
  155. package/legacy/components/panel/GridPreferencesPanel.js +1 -1
  156. package/legacy/components/panel/filterPanel/GridFilterForm.js +14 -10
  157. package/legacy/components/panel/filterPanel/GridFilterInputBoolean.js +13 -8
  158. package/legacy/components/panel/filterPanel/GridFilterInputSingleSelect.js +22 -17
  159. package/legacy/components/panel/filterPanel/GridFilterInputValue.js +22 -17
  160. package/legacy/components/toolbar/GridToolbarDensitySelector.js +1 -1
  161. package/legacy/components/virtualization/GridVirtualScroller.js +2 -0
  162. package/legacy/components/virtualization/GridVirtualScrollerContent.js +1 -3
  163. package/legacy/constants/defaultGridSlotsComponents.js +4 -2
  164. package/legacy/constants/gridClasses.js +1 -1
  165. package/legacy/constants/gridDetailPanelToggleField.js +2 -0
  166. package/legacy/constants/localeTextConstants.js +3 -1
  167. package/legacy/hooks/core/{preProcessing/gridPreProcessingApi.js → pipeProcessing/gridPipeProcessingApi.js} +0 -0
  168. package/legacy/hooks/core/pipeProcessing/index.js +4 -0
  169. package/legacy/hooks/core/pipeProcessing/useGridPipeProcessing.js +119 -0
  170. package/legacy/hooks/core/{preProcessing/useGridRegisterPreProcessor.js → pipeProcessing/useGridRegisterPipeApplier.js} +2 -6
  171. package/legacy/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +27 -0
  172. package/legacy/hooks/core/strategyProcessing/useGridStrategyProcessing.js +26 -15
  173. package/legacy/hooks/core/useGridInitialization.js +2 -2
  174. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +90 -11
  175. package/legacy/hooks/features/columnMenu/useGridColumnMenu.js +2 -1
  176. package/legacy/hooks/features/columns/gridColumnsUtils.js +120 -32
  177. package/legacy/hooks/features/columns/useGridColumnSpanning.js +107 -0
  178. package/legacy/hooks/features/columns/useGridColumns.js +55 -40
  179. package/legacy/hooks/features/dimensions/useGridDimensions.js +5 -4
  180. package/legacy/hooks/features/editRows/useGridCellEditing.new.js +36 -15
  181. package/legacy/hooks/features/editRows/useGridEditing.new.js +7 -3
  182. package/legacy/hooks/features/editRows/useGridRowEditing.new.js +53 -30
  183. package/legacy/hooks/features/events/useGridEvents.js +2 -0
  184. package/legacy/hooks/features/filter/useGridFilter.js +18 -13
  185. package/legacy/hooks/features/focus/useGridFocus.js +19 -9
  186. package/legacy/hooks/features/{keyboard → keyboardNavigation}/useGridKeyboardNavigation.js +66 -12
  187. package/legacy/hooks/features/pagination/useGridPage.js +11 -4
  188. package/legacy/hooks/features/pagination/useGridPageSize.js +3 -3
  189. package/legacy/hooks/features/preferencesPanel/useGridPreferencesPanel.js +18 -5
  190. package/legacy/hooks/features/rows/gridRowsSelector.js +3 -0
  191. package/legacy/hooks/features/rows/gridRowsUtils.js +13 -0
  192. package/legacy/hooks/features/rows/index.js +1 -1
  193. package/legacy/hooks/features/rows/useGridRows.js +35 -9
  194. package/legacy/hooks/features/rows/useGridRowsMeta.js +7 -14
  195. package/legacy/hooks/features/scroll/useGridScroll.js +27 -14
  196. package/legacy/hooks/features/selection/useGridSelection.js +77 -27
  197. package/legacy/hooks/features/selection/useGridSelectionPreProcessors.js +2 -2
  198. package/legacy/hooks/features/sorting/useGridSorting.js +8 -10
  199. package/legacy/hooks/features/statePersistence/useGridStatePersistence.js +2 -2
  200. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +75 -37
  201. package/legacy/index.js +1 -1
  202. package/legacy/internals/index.js +3 -3
  203. package/legacy/locales/arSD.js +3 -1
  204. package/legacy/locales/bgBG.js +3 -1
  205. package/legacy/locales/csCZ.js +2 -0
  206. package/legacy/locales/daDK.js +37 -31
  207. package/legacy/locales/deDE.js +3 -1
  208. package/legacy/locales/elGR.js +2 -0
  209. package/legacy/locales/esES.js +2 -0
  210. package/legacy/locales/faIR.js +3 -1
  211. package/legacy/locales/fiFI.js +2 -0
  212. package/legacy/locales/frFR.js +2 -0
  213. package/legacy/locales/heIL.js +3 -1
  214. package/legacy/locales/huHU.js +122 -0
  215. package/legacy/locales/index.js +1 -0
  216. package/legacy/locales/itIT.js +2 -0
  217. package/legacy/locales/jaJP.js +2 -0
  218. package/legacy/locales/koKR.js +2 -0
  219. package/legacy/locales/nlNL.js +2 -0
  220. package/legacy/locales/plPL.js +3 -1
  221. package/legacy/locales/ptBR.js +3 -1
  222. package/legacy/locales/ruRU.js +2 -0
  223. package/legacy/locales/skSK.js +2 -0
  224. package/legacy/locales/trTR.js +3 -1
  225. package/legacy/locales/ukUA.js +2 -0
  226. package/legacy/locales/viVN.js +2 -0
  227. package/legacy/locales/zhCN.js +2 -0
  228. package/{modern/hooks/core/preProcessing/gridPreProcessingApi.js → legacy/models/api/gridColumnSpanning.js} +0 -0
  229. package/legacy/models/colDef/index.js +1 -2
  230. package/legacy/models/events/gridEvents.js +10 -3
  231. package/legacy/models/gridColumnSpanning.js +1 -0
  232. package/legacy/models/gridRows.js +1 -33
  233. package/legacy/models/index.js +2 -2
  234. package/legacy/models/params/gridPreferencePanelParams.js +1 -0
  235. package/legacy/models/params/index.js +2 -1
  236. package/locales/arSD.js +3 -1
  237. package/locales/bgBG.js +3 -1
  238. package/locales/csCZ.js +2 -0
  239. package/locales/daDK.js +33 -31
  240. package/locales/deDE.js +3 -1
  241. package/locales/elGR.js +2 -0
  242. package/locales/esES.js +2 -0
  243. package/locales/faIR.js +3 -1
  244. package/locales/fiFI.js +2 -0
  245. package/locales/frFR.js +2 -0
  246. package/locales/heIL.js +3 -1
  247. package/locales/huHU.d.ts +2 -0
  248. package/locales/huHU.js +110 -0
  249. package/locales/index.d.ts +1 -0
  250. package/locales/index.js +1 -0
  251. package/locales/itIT.js +2 -0
  252. package/locales/jaJP.js +2 -0
  253. package/locales/koKR.js +2 -0
  254. package/locales/nlNL.js +2 -0
  255. package/locales/plPL.js +3 -1
  256. package/locales/ptBR.js +3 -1
  257. package/locales/ruRU.js +2 -0
  258. package/locales/skSK.js +2 -0
  259. package/locales/trTR.js +3 -1
  260. package/locales/ukUA.js +2 -0
  261. package/locales/viVN.js +2 -0
  262. package/locales/zhCN.js +2 -0
  263. package/models/api/gridApiCommon.d.ts +3 -2
  264. package/models/api/gridColumnSpanning.d.ts +28 -0
  265. package/models/api/gridColumnSpanning.js +1 -0
  266. package/models/api/gridEditingApi.d.ts +51 -5
  267. package/models/api/gridLocaleTextApi.d.ts +1 -0
  268. package/models/api/gridParamsApi.d.ts +5 -5
  269. package/models/api/gridRowApi.d.ts +8 -2
  270. package/models/colDef/gridColDef.d.ts +38 -28
  271. package/models/colDef/index.d.ts +0 -1
  272. package/models/colDef/index.js +1 -2
  273. package/models/events/gridEventLookup.d.ts +30 -9
  274. package/models/events/gridEvents.d.ts +50 -17
  275. package/models/events/gridEvents.js +10 -3
  276. package/models/gridCell.d.ts +1 -0
  277. package/models/gridColumnSpanning.d.ts +12 -0
  278. package/models/gridColumnSpanning.js +1 -0
  279. package/models/gridEditRowModel.d.ts +1 -1
  280. package/models/gridFilterOperator.d.ts +3 -2
  281. package/models/gridIconSlotsComponent.d.ts +5 -0
  282. package/models/gridRows.d.ts +10 -18
  283. package/models/gridRows.js +1 -31
  284. package/models/gridSlotsComponent.d.ts +5 -0
  285. package/models/gridSlotsComponentsProps.d.ts +1 -0
  286. package/models/gridSortModel.d.ts +3 -4
  287. package/models/index.d.ts +1 -1
  288. package/models/index.js +2 -2
  289. package/models/params/gridCellParams.d.ts +25 -15
  290. package/models/params/gridColumnHeaderParams.d.ts +3 -2
  291. package/models/params/gridEditCellParams.d.ts +2 -3
  292. package/models/params/gridPreferencePanelParams.d.ts +3 -0
  293. package/models/params/gridPreferencePanelParams.js +1 -0
  294. package/models/params/gridRowParams.d.ts +12 -8
  295. package/models/params/gridValueOptionsParams.d.ts +3 -3
  296. package/models/params/index.d.ts +1 -0
  297. package/models/params/index.js +2 -1
  298. package/models/props/DataGridProps.d.ts +37 -17
  299. package/modern/DataGrid/DataGrid.js +28 -5
  300. package/modern/DataGrid/useDataGridComponent.js +5 -5
  301. package/modern/colDef/gridDateColDef.js +2 -2
  302. package/modern/{models/colDef → colDef}/gridDefaultColumnTypes.js +6 -6
  303. package/modern/colDef/index.js +2 -1
  304. package/modern/components/GridRow.js +53 -22
  305. package/modern/components/base/GridOverlays.js +4 -3
  306. package/modern/components/cell/GridActionsCell.js +168 -21
  307. package/modern/components/cell/GridActionsCellItem.js +7 -5
  308. package/modern/components/cell/GridCell.js +30 -9
  309. package/modern/components/cell/GridEditInputCell.js +3 -3
  310. package/modern/components/cell/GridEditSingleSelectCell.js +22 -13
  311. package/modern/components/columnHeaders/{ColumnHeaderFilterIcon.js → GridColumnHeaderFilterIconButton.js} +22 -4
  312. package/modern/components/columnHeaders/GridColumnHeaderItem.js +7 -10
  313. package/modern/components/columnHeaders/GridColumnHeaders.js +1 -1
  314. package/modern/components/columnHeaders/index.js +1 -0
  315. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +22 -5
  316. package/modern/components/containers/GridRoot.js +29 -17
  317. package/modern/components/containers/GridRootStyles.js +36 -1
  318. package/modern/components/menu/GridMenu.js +1 -0
  319. package/modern/components/menu/columnMenu/GridColumnMenu.js +1 -1
  320. package/modern/components/panel/GridPanel.js +1 -0
  321. package/modern/components/panel/GridPreferencesPanel.js +1 -1
  322. package/modern/components/panel/filterPanel/GridFilterForm.js +10 -6
  323. package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +11 -6
  324. package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +20 -13
  325. package/modern/components/panel/filterPanel/GridFilterInputValue.js +20 -13
  326. package/modern/components/toolbar/GridToolbarDensitySelector.js +1 -1
  327. package/modern/components/virtualization/GridVirtualScroller.js +2 -0
  328. package/modern/components/virtualization/GridVirtualScrollerContent.js +1 -3
  329. package/modern/constants/defaultGridSlotsComponents.js +4 -2
  330. package/modern/constants/gridClasses.js +1 -1
  331. package/modern/constants/gridDetailPanelToggleField.js +2 -0
  332. package/modern/constants/localeTextConstants.js +3 -1
  333. package/modern/hooks/core/pipeProcessing/gridPipeProcessingApi.js +1 -0
  334. package/modern/hooks/core/pipeProcessing/index.js +4 -0
  335. package/modern/hooks/core/pipeProcessing/useGridPipeProcessing.js +108 -0
  336. package/modern/hooks/core/pipeProcessing/useGridRegisterPipeApplier.js +27 -0
  337. package/modern/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +27 -0
  338. package/modern/hooks/core/strategyProcessing/useGridStrategyProcessing.js +26 -15
  339. package/modern/hooks/core/useGridInitialization.js +2 -2
  340. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +77 -11
  341. package/modern/hooks/features/columnMenu/useGridColumnMenu.js +2 -1
  342. package/modern/hooks/features/columns/gridColumnsUtils.js +105 -20
  343. package/modern/hooks/features/columns/useGridColumnSpanning.js +107 -0
  344. package/modern/hooks/features/columns/useGridColumns.js +55 -40
  345. package/modern/hooks/features/dimensions/useGridDimensions.js +5 -4
  346. package/modern/hooks/features/editRows/useGridCellEditing.new.js +40 -17
  347. package/modern/hooks/features/editRows/useGridEditing.new.js +7 -3
  348. package/modern/hooks/features/editRows/useGridRowEditing.new.js +44 -21
  349. package/modern/hooks/features/events/useGridEvents.js +2 -0
  350. package/modern/hooks/features/filter/useGridFilter.js +18 -13
  351. package/modern/hooks/features/focus/useGridFocus.js +19 -9
  352. package/modern/hooks/features/{keyboard → keyboardNavigation}/useGridKeyboardNavigation.js +64 -13
  353. package/modern/hooks/features/pagination/useGridPage.js +9 -4
  354. package/modern/hooks/features/pagination/useGridPageSize.js +3 -3
  355. package/modern/hooks/features/preferencesPanel/useGridPreferencesPanel.js +18 -5
  356. package/modern/hooks/features/rows/gridRowsSelector.js +1 -0
  357. package/modern/hooks/features/rows/gridRowsUtils.js +11 -0
  358. package/modern/hooks/features/rows/index.js +1 -1
  359. package/modern/hooks/features/rows/useGridRows.js +25 -5
  360. package/modern/hooks/features/rows/useGridRowsMeta.js +7 -14
  361. package/modern/hooks/features/scroll/useGridScroll.js +25 -10
  362. package/modern/hooks/features/selection/useGridSelection.js +75 -27
  363. package/modern/hooks/features/selection/useGridSelectionPreProcessors.js +2 -2
  364. package/modern/hooks/features/sorting/useGridSorting.js +13 -13
  365. package/modern/hooks/features/statePersistence/useGridStatePersistence.js +2 -2
  366. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +64 -23
  367. package/modern/index.js +1 -1
  368. package/modern/internals/index.js +3 -3
  369. package/modern/locales/arSD.js +3 -1
  370. package/modern/locales/bgBG.js +3 -1
  371. package/modern/locales/csCZ.js +2 -0
  372. package/modern/locales/daDK.js +33 -31
  373. package/modern/locales/deDE.js +3 -1
  374. package/modern/locales/elGR.js +2 -0
  375. package/modern/locales/esES.js +2 -0
  376. package/modern/locales/faIR.js +3 -1
  377. package/modern/locales/fiFI.js +2 -0
  378. package/modern/locales/frFR.js +2 -0
  379. package/modern/locales/heIL.js +3 -1
  380. package/modern/locales/huHU.js +110 -0
  381. package/modern/locales/index.js +1 -0
  382. package/modern/locales/itIT.js +2 -0
  383. package/modern/locales/jaJP.js +2 -0
  384. package/modern/locales/koKR.js +2 -0
  385. package/modern/locales/nlNL.js +2 -0
  386. package/modern/locales/plPL.js +3 -1
  387. package/modern/locales/ptBR.js +3 -1
  388. package/modern/locales/ruRU.js +2 -0
  389. package/modern/locales/skSK.js +2 -0
  390. package/modern/locales/trTR.js +3 -1
  391. package/modern/locales/ukUA.js +2 -0
  392. package/modern/locales/viVN.js +2 -0
  393. package/modern/locales/zhCN.js +2 -0
  394. package/modern/models/api/gridColumnSpanning.js +1 -0
  395. package/modern/models/colDef/index.js +1 -2
  396. package/modern/models/events/gridEvents.js +10 -3
  397. package/modern/models/gridColumnSpanning.js +1 -0
  398. package/modern/models/gridRows.js +1 -31
  399. package/modern/models/index.js +2 -2
  400. package/modern/models/params/gridPreferencePanelParams.js +1 -0
  401. package/modern/models/params/index.js +2 -1
  402. package/node/DataGrid/DataGrid.js +28 -5
  403. package/node/DataGrid/useDataGridComponent.js +6 -6
  404. package/node/colDef/gridDateColDef.js +2 -2
  405. package/node/{models/colDef → colDef}/gridDefaultColumnTypes.js +6 -6
  406. package/node/colDef/index.js +13 -0
  407. package/node/components/GridRow.js +56 -24
  408. package/node/components/base/GridOverlays.js +3 -2
  409. package/node/components/cell/GridActionsCell.js +172 -21
  410. package/node/components/cell/GridActionsCellItem.js +7 -4
  411. package/node/components/cell/GridCell.js +30 -9
  412. package/node/components/cell/GridEditInputCell.js +3 -3
  413. package/node/components/cell/GridEditSingleSelectCell.js +25 -15
  414. package/node/components/columnHeaders/{ColumnHeaderFilterIcon.js → GridColumnHeaderFilterIconButton.js} +23 -5
  415. package/node/components/columnHeaders/GridColumnHeaderItem.js +9 -13
  416. package/node/components/columnHeaders/GridColumnHeaders.js +1 -1
  417. package/node/components/columnHeaders/index.js +13 -0
  418. package/node/components/columnSelection/GridCellCheckboxRenderer.js +22 -5
  419. package/node/components/containers/GridRoot.js +28 -17
  420. package/node/components/containers/GridRootStyles.js +36 -1
  421. package/node/components/menu/GridMenu.js +1 -0
  422. package/node/components/menu/columnMenu/GridColumnMenu.js +1 -1
  423. package/node/components/panel/GridPanel.js +1 -0
  424. package/node/components/panel/GridPreferencesPanel.js +1 -1
  425. package/node/components/panel/filterPanel/GridFilterForm.js +15 -10
  426. package/node/components/panel/filterPanel/GridFilterInputBoolean.js +14 -8
  427. package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +23 -15
  428. package/node/components/panel/filterPanel/GridFilterInputValue.js +23 -15
  429. package/node/components/toolbar/GridToolbarDensitySelector.js +1 -1
  430. package/node/components/virtualization/GridVirtualScroller.js +2 -0
  431. package/node/components/virtualization/GridVirtualScrollerContent.js +1 -3
  432. package/node/constants/defaultGridSlotsComponents.js +3 -1
  433. package/node/constants/gridClasses.js +1 -1
  434. package/node/constants/gridDetailPanelToggleField.js +9 -0
  435. package/node/constants/localeTextConstants.js +3 -1
  436. package/node/hooks/core/{preProcessing/gridPreProcessingApi.js → pipeProcessing/gridPipeProcessingApi.js} +0 -0
  437. package/node/hooks/core/pipeProcessing/index.js +57 -0
  438. package/node/hooks/core/pipeProcessing/useGridPipeProcessing.js +124 -0
  439. package/node/hooks/core/{preProcessing/useGridRegisterPreProcessor.js → pipeProcessing/useGridRegisterPipeApplier.js} +4 -7
  440. package/node/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +42 -0
  441. package/node/hooks/core/strategyProcessing/useGridStrategyProcessing.js +26 -15
  442. package/node/hooks/core/useGridInitialization.js +2 -2
  443. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +81 -11
  444. package/node/hooks/features/columnMenu/useGridColumnMenu.js +2 -1
  445. package/node/hooks/features/columns/gridColumnsUtils.js +114 -25
  446. package/node/hooks/features/columns/useGridColumnSpanning.js +130 -0
  447. package/node/hooks/features/columns/useGridColumns.js +55 -40
  448. package/node/hooks/features/dimensions/useGridDimensions.js +5 -4
  449. package/node/hooks/features/editRows/useGridCellEditing.new.js +42 -17
  450. package/node/hooks/features/editRows/useGridEditing.new.js +6 -2
  451. package/node/hooks/features/editRows/useGridRowEditing.new.js +45 -21
  452. package/node/hooks/features/events/useGridEvents.js +2 -0
  453. package/node/hooks/features/filter/useGridFilter.js +18 -13
  454. package/node/hooks/features/focus/useGridFocus.js +19 -9
  455. package/node/hooks/features/{keyboard → keyboardNavigation}/useGridKeyboardNavigation.js +69 -13
  456. package/node/hooks/features/pagination/useGridPage.js +8 -3
  457. package/node/hooks/features/pagination/useGridPageSize.js +3 -3
  458. package/node/hooks/features/preferencesPanel/useGridPreferencesPanel.js +20 -5
  459. package/node/hooks/features/rows/gridRowsSelector.js +3 -1
  460. package/node/hooks/features/rows/gridRowsUtils.js +18 -0
  461. package/node/hooks/features/rows/index.js +15 -1
  462. package/node/hooks/features/rows/useGridRows.js +29 -9
  463. package/node/hooks/features/rows/useGridRowsMeta.js +7 -15
  464. package/node/hooks/features/scroll/useGridScroll.js +28 -14
  465. package/node/hooks/features/selection/useGridSelection.js +75 -26
  466. package/node/hooks/features/selection/useGridSelectionPreProcessors.js +2 -2
  467. package/node/hooks/features/sorting/useGridSorting.js +13 -13
  468. package/node/hooks/features/statePersistence/useGridStatePersistence.js +2 -2
  469. package/node/hooks/features/virtualization/useGridVirtualScroller.js +69 -27
  470. package/node/index.js +1 -1
  471. package/node/internals/index.js +12 -12
  472. package/node/locales/arSD.js +3 -1
  473. package/node/locales/bgBG.js +3 -1
  474. package/node/locales/csCZ.js +2 -0
  475. package/node/locales/daDK.js +33 -31
  476. package/node/locales/deDE.js +3 -1
  477. package/node/locales/elGR.js +2 -0
  478. package/node/locales/esES.js +2 -0
  479. package/node/locales/faIR.js +3 -1
  480. package/node/locales/fiFI.js +2 -0
  481. package/node/locales/frFR.js +2 -0
  482. package/node/locales/heIL.js +3 -1
  483. package/node/locales/huHU.js +120 -0
  484. package/node/locales/index.js +13 -0
  485. package/node/locales/itIT.js +2 -0
  486. package/node/locales/jaJP.js +2 -0
  487. package/node/locales/koKR.js +2 -0
  488. package/node/locales/nlNL.js +2 -0
  489. package/node/locales/plPL.js +3 -1
  490. package/node/locales/ptBR.js +3 -1
  491. package/node/locales/ruRU.js +2 -0
  492. package/node/locales/skSK.js +2 -0
  493. package/node/locales/trTR.js +3 -1
  494. package/node/locales/ukUA.js +2 -0
  495. package/node/locales/viVN.js +2 -0
  496. package/node/locales/zhCN.js +2 -0
  497. package/node/models/api/gridColumnSpanning.js +5 -0
  498. package/node/models/colDef/index.js +0 -13
  499. package/node/models/events/gridEvents.js +10 -3
  500. package/node/models/gridColumnSpanning.js +5 -0
  501. package/node/models/gridRows.js +1 -34
  502. package/node/models/index.js +13 -13
  503. package/node/models/params/gridPreferencePanelParams.js +5 -0
  504. package/node/models/params/index.js +13 -0
  505. package/package.json +4 -4
  506. package/utils/domUtils.d.ts +2 -2
  507. package/components/columnHeaders/ColumnHeaderFilterIcon.d.ts +0 -5
  508. package/hooks/core/preProcessing/gridPreProcessingApi.d.ts +0 -67
  509. package/hooks/core/preProcessing/index.d.ts +0 -3
  510. package/hooks/core/preProcessing/index.js +0 -3
  511. package/hooks/core/preProcessing/useGridPreProcessing.d.ts +0 -6
  512. package/hooks/core/preProcessing/useGridPreProcessing.js +0 -53
  513. package/hooks/core/preProcessing/useGridRegisterPreProcessor.d.ts +0 -7
  514. package/hooks/features/keyboard/useGridKeyboard.d.ts +0 -10
  515. package/hooks/features/keyboard/useGridKeyboard.js +0 -70
  516. package/legacy/hooks/core/preProcessing/index.js +0 -3
  517. package/legacy/hooks/core/preProcessing/useGridPreProcessing.js +0 -62
  518. package/legacy/hooks/features/keyboard/useGridKeyboard.js +0 -70
  519. package/modern/hooks/core/preProcessing/index.js +0 -3
  520. package/modern/hooks/core/preProcessing/useGridPreProcessing.js +0 -53
  521. package/modern/hooks/features/keyboard/useGridKeyboard.js +0 -70
  522. package/node/hooks/core/preProcessing/index.js +0 -44
  523. package/node/hooks/core/preProcessing/useGridPreProcessing.js +0 -72
  524. package/node/hooks/features/keyboard/useGridKeyboard.js +0 -91
@@ -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', 'row--editable', 'row--editing', 'row', 'row--lastVisible', 'rowCount', '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', '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']);
@@ -0,0 +1,2 @@
1
+ // Can't import from pro package - hence duplication
2
+ export const GRID_DETAIL_PANEL_TOGGLE_FIELD = '__detail_panel_toggle__';
@@ -103,5 +103,7 @@ export const GRID_DEFAULT_LOCALE_TEXT = {
103
103
  expandDetailPanel: 'Expand',
104
104
  collapseDetailPanel: 'Collapse',
105
105
  // Used core components translation keys
106
- MuiTablePagination: {}
106
+ MuiTablePagination: {},
107
+ // Row reordering text
108
+ rowReorderingHeaderName: 'Row reordering'
107
109
  };
@@ -0,0 +1,4 @@
1
+ export * from './gridPipeProcessingApi';
2
+ export * from './useGridPipeProcessing';
3
+ export * from './useGridRegisterPipeProcessor';
4
+ export * from './useGridRegisterPipeApplier';
@@ -0,0 +1,108 @@
1
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
+ import _toPropertyKey from "@babel/runtime/helpers/esm/toPropertyKey";
3
+ import * as React from 'react';
4
+ import { useGridApiMethod } from '../../utils/useGridApiMethod';
5
+
6
+ /**
7
+ * Implement the Pipeline Pattern
8
+ *
9
+ * More information and detailed example in (TODO add link to technical doc when ready)
10
+ *
11
+ * Some plugins contains custom logic to enrich data provided by other plugins or components.
12
+ * For instance, the row grouping plugin needs to add / remove the grouping columns when the grid columns are updated.
13
+ *
14
+ * =====================================================================================================================
15
+ *
16
+ * The plugin containing the custom logic must use:
17
+ *
18
+ * - `useGridRegisterPipeProcessor` to register their processor.
19
+ *
20
+ * - `apiRef.current.unstable_requestPipeProcessorsApplication` to imperatively re-apply a group.
21
+ * This method should be used in last resort.
22
+ * Most of the time, the application should be triggered by an update on the deps of the processor.
23
+ *
24
+ * =====================================================================================================================
25
+ *
26
+ * The plugin or component that needs to enrich its data must use:
27
+ *
28
+ * - `apiRef.current.unstable_applyPipeProcessors` to run in chain all the processors of a given group.
29
+ *
30
+ * - `useGridRegisterPipeApplier` to re-apply the whole pipe when requested.
31
+ * The applier will be called when:
32
+ * * a processor is registered.
33
+ * * `apiRef.current.unstable_requestPipeProcessorsApplication` is called for the given group.
34
+ */
35
+ export const useGridPipeProcessing = apiRef => {
36
+ const processorsCache = React.useRef({});
37
+ const runAppliers = React.useCallback(groupCache => {
38
+ if (!groupCache) {
39
+ return;
40
+ }
41
+
42
+ Object.values(groupCache.appliers).forEach(callback => {
43
+ callback();
44
+ });
45
+ }, []);
46
+ const registerPipeProcessor = React.useCallback((group, id, processor) => {
47
+ if (!processorsCache.current[group]) {
48
+ processorsCache.current[group] = {
49
+ processors: {},
50
+ appliers: {}
51
+ };
52
+ }
53
+
54
+ const groupCache = processorsCache.current[group];
55
+ const oldProcessor = groupCache.processors[id];
56
+
57
+ if (oldProcessor !== processor) {
58
+ groupCache.processors[id] = processor;
59
+ runAppliers(groupCache);
60
+ }
61
+
62
+ return () => {
63
+ const _processors = processorsCache.current[group].processors,
64
+ otherProcessors = _objectWithoutPropertiesLoose(_processors, [id].map(_toPropertyKey));
65
+
66
+ processorsCache.current[group].processors = otherProcessors;
67
+ };
68
+ }, [runAppliers]);
69
+ const registerPipeApplier = React.useCallback((group, id, applier) => {
70
+ if (!processorsCache.current[group]) {
71
+ processorsCache.current[group] = {
72
+ processors: {},
73
+ appliers: {}
74
+ };
75
+ }
76
+
77
+ processorsCache.current[group].appliers[id] = applier;
78
+ return () => {
79
+ const _appliers = processorsCache.current[group].appliers,
80
+ otherAppliers = _objectWithoutPropertiesLoose(_appliers, [id].map(_toPropertyKey));
81
+
82
+ processorsCache.current[group].appliers = otherAppliers;
83
+ };
84
+ }, []);
85
+ const requestPipeProcessorsApplication = React.useCallback(group => {
86
+ const groupCache = processorsCache.current[group];
87
+ runAppliers(groupCache);
88
+ }, [runAppliers]);
89
+ const applyPipeProcessors = React.useCallback((...args) => {
90
+ const [group, value, context] = args;
91
+
92
+ if (!processorsCache.current[group]) {
93
+ return value;
94
+ }
95
+
96
+ const preProcessors = Object.values(processorsCache.current[group].processors);
97
+ return preProcessors.reduce((acc, preProcessor) => {
98
+ return preProcessor(acc, context);
99
+ }, value);
100
+ }, []);
101
+ const preProcessingApi = {
102
+ unstable_registerPipeProcessor: registerPipeProcessor,
103
+ unstable_registerPipeApplier: registerPipeApplier,
104
+ unstable_requestPipeProcessorsApplication: requestPipeProcessorsApplication,
105
+ unstable_applyPipeProcessors: applyPipeProcessors
106
+ };
107
+ useGridApiMethod(apiRef, preProcessingApi, 'GridPipeProcessingApi');
108
+ };
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import { useFirstRender } from '../../utils/useFirstRender';
3
+ export const useGridRegisterPipeApplier = (apiRef, group, callback) => {
4
+ const cleanup = React.useRef();
5
+ const id = React.useRef(`mui-${Math.round(Math.random() * 1e9)}`);
6
+ const registerPreProcessor = React.useCallback(() => {
7
+ cleanup.current = apiRef.current.unstable_registerPipeApplier(group, id.current, callback);
8
+ }, [apiRef, callback, group]);
9
+ useFirstRender(() => {
10
+ registerPreProcessor();
11
+ });
12
+ const isFirstRender = React.useRef(true);
13
+ React.useEffect(() => {
14
+ if (isFirstRender.current) {
15
+ isFirstRender.current = false;
16
+ } else {
17
+ registerPreProcessor();
18
+ }
19
+
20
+ return () => {
21
+ if (cleanup.current) {
22
+ cleanup.current();
23
+ cleanup.current = null;
24
+ }
25
+ };
26
+ }, [registerPreProcessor]);
27
+ };
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import { useFirstRender } from '../../utils/useFirstRender';
3
+ export const useGridRegisterPipeProcessor = (apiRef, group, callback) => {
4
+ const cleanup = React.useRef();
5
+ const id = React.useRef(`mui-${Math.round(Math.random() * 1e9)}`);
6
+ const registerPreProcessor = React.useCallback(() => {
7
+ cleanup.current = apiRef.current.unstable_registerPipeProcessor(group, id.current, callback);
8
+ }, [apiRef, callback, group]);
9
+ useFirstRender(() => {
10
+ registerPreProcessor();
11
+ });
12
+ const isFirstRender = React.useRef(true);
13
+ React.useEffect(() => {
14
+ if (isFirstRender.current) {
15
+ isFirstRender.current = false;
16
+ } else {
17
+ registerPreProcessor();
18
+ }
19
+
20
+ return () => {
21
+ if (cleanup.current) {
22
+ cleanup.current();
23
+ cleanup.current = null;
24
+ }
25
+ };
26
+ }, [registerPreProcessor]);
27
+ };
@@ -13,31 +13,42 @@ export const GRID_STRATEGIES_PROCESSORS = {
13
13
  /**
14
14
  * Implements a variant of the Strategy Pattern (see https://en.wikipedia.org/wiki/Strategy_pattern)
15
15
  *
16
- * Some plugins contain custom logic that must only be run if the right strategy is active.
17
- * For instance, the tree data plugin has:
18
- * - custom row tree creation algorithm.
19
- * - custom sorting algorithm.
20
- * - custom filtering algorithm.
16
+ * More information and detailed example in (TODO add link to technical doc when ready)
17
+ *
18
+ * Some plugins contains custom logic that must only be applied if the right strategy is active.
19
+ * For instance, the row grouping plugin has a custom filtering algorithm.
20
+ * This algorithm must be applied by the filtering plugin if the row grouping is the current way of grouping rows,
21
+ * but not if the tree data is the current way of grouping rows.
22
+ *
23
+ * =====================================================================================================================
24
+ *
25
+ * The plugin containing the custom logic must use:
26
+ *
27
+ * - `useGridRegisterStrategyProcessor` to register their processor.
28
+ * When the processor of the active strategy changes, it will fire `GridEvents.activeStrategyProcessorChange` to re-apply the processor.
21
29
  *
22
- * These plugins must use:
23
- * - `apiRef.current.unstable_registerStrategyProcessor` to register their processors.
24
30
  * - `apiRef.current.unstable_setStrategyAvailability` to tell if their strategy can be used.
25
31
  *
26
- * Some hooks need to run the custom logic of the active strategy.
27
- * For instance, the `useGridFiltering` wants to run:
28
- * - the tree data filtering if the tree data is the current way of grouping rows.
29
- * - the row grouping filtering if the row grouping is the current way of grouping rows.
30
- * - the flat filtering if there is no grouping of the rows (equivalent to the "none" strategy).
32
+ * =====================================================================================================================
33
+ *
34
+ * The plugin or component that needs to apply the custom logic of the current strategy must use:
35
+ *
36
+ * - `apiRef.current.unstable_applyStrategyProcessor` to run the processor of the active strategy for a given processor name.
31
37
  *
32
- * These hooks must use:
33
- * - `apiRef.current.unstable_applyStrategyProcessor` to run a processor.
34
38
  * - `GridEvents.strategyAvailabilityChange` to update something when the active strategy changes.
35
39
  * Warning: Be careful not to apply the processor several times.
36
40
  * For instance `GridEvents.rowsSet` is fired by `useGridRows` whenever the active strategy changes.
37
41
  * So listening to both would most likely run your logic twice.
38
- * - `GridEvents.activeStrategyProcessorChange` to update something when the processor of the active strategy changes
42
+ *
43
+ * - `GridEvents.activeStrategyProcessorChange` to update something when the processor of the active strategy changes.
44
+ *
45
+ * =====================================================================================================================
39
46
  *
40
47
  * Each processor name is part of a strategy group which can only have one active strategy at the time.
48
+ * For now, there is only one strategy group named `rowTree` which customize
49
+ * - row tree creation algorithm.
50
+ * - sorting algorithm.
51
+ * - filtering algorithm.
41
52
  */
42
53
  export const useGridStrategyProcessing = apiRef => {
43
54
  const availableStrategies = React.useRef(new Map());
@@ -2,7 +2,7 @@ import { useGridLoggerFactory } from './useGridLoggerFactory';
2
2
  import { useGridApiInitialization } from './useGridApiInitialization';
3
3
  import { useGridErrorHandler } from './useGridErrorHandler';
4
4
  import { useGridLocaleText } from './useGridLocaleText';
5
- import { useGridPreProcessing } from './preProcessing';
5
+ import { useGridPipeProcessing } from './pipeProcessing';
6
6
  import { useGridStrategyProcessing } from './strategyProcessing';
7
7
  import { useGridStateInitialization } from './useGridStateInitialization';
8
8
  /**
@@ -14,7 +14,7 @@ export const useGridInitialization = (inputApiRef, props) => {
14
14
  useGridLoggerFactory(apiRef, props);
15
15
  useGridErrorHandler(apiRef, props);
16
16
  useGridStateInitialization(apiRef, props);
17
- useGridPreProcessing(apiRef);
17
+ useGridPipeProcessing(apiRef);
18
18
  useGridStrategyProcessing(apiRef);
19
19
  useGridLocaleText(apiRef, props);
20
20
  return apiRef;
@@ -1,6 +1,8 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
+ import * as ReactDOM from 'react-dom';
3
4
  import { useForkRef } from '@mui/material/utils';
5
+ import { defaultMemoize } from 'reselect';
4
6
  import { useGridApiContext } from '../../utils/useGridApiContext';
5
7
  import { useGridSelector } from '../../utils/useGridSelector';
6
8
  import { gridVisibleColumnDefinitionsSelector, gridColumnPositionsSelector } from '../columns/gridColumnsSelector';
@@ -13,7 +15,15 @@ import { useGridRootProps } from '../../utils/useGridRootProps';
13
15
  import { useGridApiEventHandler } from '../../utils/useGridApiEventHandler';
14
16
  import { GridEvents } from '../../../models/events';
15
17
  import { GridColumnHeaderItem } from '../../../components/columnHeaders/GridColumnHeaderItem';
18
+ import { getFirstColumnIndexToRender } from '../columns/gridColumnsUtils';
19
+ import { useGridVisibleRows } from '../../utils/useGridVisibleRows';
20
+ import { getRenderableIndexes } from '../virtualization/useGridVirtualScroller';
16
21
  import { jsx as _jsx } from "react/jsx-runtime";
22
+
23
+ function isUIEvent(event) {
24
+ return !!event.target;
25
+ }
26
+
17
27
  export const useGridColumnHeaders = props => {
18
28
  const {
19
29
  innerRef: innerRefProp,
@@ -37,18 +47,43 @@ export const useGridColumnHeaders = props => {
37
47
  const [renderContext, setRenderContext] = React.useState(null);
38
48
  const prevRenderContext = React.useRef(renderContext);
39
49
  const prevScrollLeft = React.useRef(0);
50
+ const currentPage = useGridVisibleRows(apiRef, rootProps);
40
51
  React.useEffect(() => {
41
52
  apiRef.current.columnHeadersContainerElementRef.current.scrollLeft = 0;
42
- }, [apiRef]);
53
+ }, [apiRef]); // memoize `getFirstColumnIndexToRender`, since it's called on scroll
54
+
55
+ const getFirstColumnIndexToRenderRef = React.useRef(defaultMemoize(getFirstColumnIndexToRender, {
56
+ equalityCheck: (a, b) => ['firstColumnIndex', 'minColumnIndex', 'columnBuffer'].every(key => a[key] === b[key])
57
+ }));
43
58
  const updateInnerPosition = React.useCallback(nextRenderContext => {
44
- const firstColumnToRender = Math.max(nextRenderContext.firstColumnIndex - rootProps.columnBuffer, minColumnIndex);
59
+ const [firstRowToRender, lastRowToRender] = getRenderableIndexes({
60
+ firstIndex: nextRenderContext.firstRowIndex,
61
+ lastIndex: nextRenderContext.lastRowIndex,
62
+ minFirstIndex: 0,
63
+ maxLastIndex: currentPage.rows.length,
64
+ buffer: rootProps.rowBuffer
65
+ });
66
+ const firstColumnToRender = getFirstColumnIndexToRenderRef.current({
67
+ firstColumnIndex: nextRenderContext.firstColumnIndex,
68
+ minColumnIndex,
69
+ columnBuffer: rootProps.columnBuffer,
70
+ firstRowToRender,
71
+ lastRowToRender,
72
+ apiRef,
73
+ visibleRows: currentPage.rows
74
+ });
45
75
  const offset = firstColumnToRender > 0 ? prevScrollLeft.current - columnPositions[firstColumnToRender] : prevScrollLeft.current;
46
76
  innerRef.current.style.transform = `translate3d(${-offset}px, 0px, 0px)`;
47
- }, [columnPositions, minColumnIndex, rootProps.columnBuffer]);
77
+ }, [columnPositions, minColumnIndex, rootProps.columnBuffer, apiRef, currentPage.rows, rootProps.rowBuffer]);
78
+ React.useLayoutEffect(() => {
79
+ if (renderContext) {
80
+ updateInnerPosition(renderContext);
81
+ }
82
+ }, [renderContext, updateInnerPosition]);
48
83
  const handleScroll = React.useCallback(({
49
84
  left,
50
85
  renderContext: nextRenderContext = null
51
- }) => {
86
+ }, event) => {
52
87
  if (!innerRef.current) {
53
88
  return;
54
89
  } // Ignore vertical scroll.
@@ -59,15 +94,32 @@ export const useGridColumnHeaders = props => {
59
94
  return;
60
95
  }
61
96
 
62
- prevScrollLeft.current = left;
97
+ prevScrollLeft.current = left; // We can only update the position when we guarantee that the render context has been
98
+ // rendered. This is achieved using ReactDOM.flushSync or when the context doesn't change.
99
+
100
+ let canUpdateInnerPosition = false;
63
101
 
64
102
  if (nextRenderContext !== prevRenderContext.current || !prevRenderContext.current) {
65
- setRenderContext(nextRenderContext);
103
+ // ReactDOM.flushSync cannot be called on `scroll` events fired inside effects
104
+ if (isUIEvent(event)) {
105
+ // To prevent flickering, the inner position can only be updated after the new context has
106
+ // been rendered. ReactDOM.flushSync ensures that the state changes will happen before
107
+ // updating the position.
108
+ ReactDOM.flushSync(() => {
109
+ setRenderContext(nextRenderContext);
110
+ });
111
+ canUpdateInnerPosition = true;
112
+ } else {
113
+ setRenderContext(nextRenderContext);
114
+ }
115
+
66
116
  prevRenderContext.current = nextRenderContext;
117
+ } else {
118
+ canUpdateInnerPosition = true;
67
119
  } // Pass directly the render context to avoid waiting for the next render
68
120
 
69
121
 
70
- if (nextRenderContext) {
122
+ if (nextRenderContext && canUpdateInnerPosition) {
71
123
  updateInnerPosition(nextRenderContext);
72
124
  }
73
125
  }, [updateInnerPosition]);
@@ -93,7 +145,22 @@ export const useGridColumnHeaders = props => {
93
145
  }
94
146
 
95
147
  const columns = [];
96
- const firstColumnToRender = Math.max(nextRenderContext.firstColumnIndex - rootProps.columnBuffer, minFirstColumn);
148
+ const [firstRowToRender, lastRowToRender] = getRenderableIndexes({
149
+ firstIndex: nextRenderContext.firstRowIndex,
150
+ lastIndex: nextRenderContext.lastRowIndex,
151
+ minFirstIndex: 0,
152
+ maxLastIndex: currentPage.rows.length,
153
+ buffer: rootProps.rowBuffer
154
+ });
155
+ const firstColumnToRender = getFirstColumnIndexToRenderRef.current({
156
+ firstColumnIndex: nextRenderContext.firstColumnIndex,
157
+ minColumnIndex: minFirstColumn,
158
+ columnBuffer: rootProps.columnBuffer,
159
+ apiRef,
160
+ firstRowToRender,
161
+ lastRowToRender,
162
+ visibleRows: currentPage.rows
163
+ });
97
164
  const lastColumnToRender = Math.min(nextRenderContext.lastColumnIndex + rootProps.columnBuffer, maxLastColumn);
98
165
  const renderedColumns = visibleColumns.slice(firstColumnToRender, lastColumnToRender);
99
166
 
@@ -113,11 +180,11 @@ export const useGridColumnHeaders = props => {
113
180
  column: column,
114
181
  colIndex: columnIndex,
115
182
  isResizing: resizeCol === column.field,
116
- isLastColumn: columnIndex === columns.length - 1,
183
+ isLastColumn: columnIndex === visibleColumns.length - 1,
117
184
  extendRowFullWidth: !rootProps.disableExtendRowFullWidth,
118
185
  hasFocus: hasFocus,
119
186
  tabIndex: tabIndex
120
- }, other), i));
187
+ }, other), column.field));
121
188
  }
122
189
 
123
190
  return columns;
@@ -132,7 +199,6 @@ export const useGridColumnHeaders = props => {
132
199
  renderContext,
133
200
  getColumns,
134
201
  isDragging: !!dragCol,
135
- updateInnerPosition,
136
202
  getRootProps: (other = {}) => _extends({
137
203
  style: rootStyle
138
204
  }, other),
@@ -79,5 +79,6 @@ export const useGridColumnMenu = apiRef => {
79
79
  */
80
80
 
81
81
  useGridApiEventHandler(apiRef, GridEvents.columnResizeStart, hideColumnMenu);
82
- useGridApiEventHandler(apiRef, GridEvents.rowsScroll, hideColumnMenu);
82
+ useGridApiEventHandler(apiRef, GridEvents.virtualScrollerWheel, apiRef.current.hideColumnMenu);
83
+ useGridApiEventHandler(apiRef, GridEvents.virtualScrollerTouchMove, apiRef.current.hideColumnMenu);
83
84
  };
@@ -1,5 +1,5 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import { DEFAULT_GRID_COL_TYPE_KEY, getGridDefaultColumnTypes } from '../../../models';
2
+ import { DEFAULT_GRID_COL_TYPE_KEY, getGridDefaultColumnTypes } from '../../../colDef';
3
3
  import { gridColumnsSelector, gridColumnVisibilityModelSelector } from './gridColumnsSelector';
4
4
  import { clamp } from '../../../utils/utils';
5
5
  export const COLUMNS_DIMENSION_PROPERTIES = ['maxWidth', 'minWidth', 'width', 'flex'];
@@ -206,9 +206,15 @@ export const applyInitialState = (columnsState, initialState) => {
206
206
 
207
207
  for (let i = 0; i < columnsWithUpdatedDimensions.length; i += 1) {
208
208
  const field = columnsWithUpdatedDimensions[i];
209
- newColumnLookup[field] = _extends({}, newColumnLookup[field], dimensions[field], {
209
+
210
+ const newColDef = _extends({}, newColumnLookup[field], {
210
211
  hasBeenResized: true
211
212
  });
213
+
214
+ Object.entries(dimensions[field]).forEach(([key, value]) => {
215
+ newColDef[key] = value === -1 ? Infinity : value;
216
+ });
217
+ newColumnLookup[field] = newColDef;
212
218
  }
213
219
 
214
220
  const newColumnsState = {
@@ -243,7 +249,7 @@ export const createColumnsState = ({
243
249
  apiRef,
244
250
  columnsToUpsert,
245
251
  initialState,
246
- columnsTypes,
252
+ columnTypes,
247
253
  currentColumnVisibilityModel = gridColumnVisibilityModelSelector(apiRef),
248
254
  shouldRegenColumnVisibilityModelFromColumns,
249
255
  keepOnlyColumnsToUpsert = false
@@ -251,7 +257,7 @@ export const createColumnsState = ({
251
257
  const isInsideStateInitializer = !apiRef.current.state.columns;
252
258
  let columnsStateWithoutColumnVisibilityModel;
253
259
 
254
- if (isInsideStateInitializer || keepOnlyColumnsToUpsert) {
260
+ if (isInsideStateInitializer) {
255
261
  columnsStateWithoutColumnVisibilityModel = {
256
262
  all: [],
257
263
  lookup: {}
@@ -259,33 +265,69 @@ export const createColumnsState = ({
259
265
  } else {
260
266
  const currentState = gridColumnsSelector(apiRef.current.state);
261
267
  columnsStateWithoutColumnVisibilityModel = {
262
- all: [...currentState.all],
263
- lookup: _extends({}, currentState.lookup)
268
+ all: keepOnlyColumnsToUpsert ? [] : [...currentState.all],
269
+ lookup: _extends({}, currentState.lookup) // Will be cleaned later if keepOnlyColumnsToUpsert=true
270
+
264
271
  };
265
272
  }
266
273
 
274
+ let columnsToKeep = {};
275
+
276
+ if (keepOnlyColumnsToUpsert && !isInsideStateInitializer) {
277
+ columnsToKeep = Object.keys(columnsStateWithoutColumnVisibilityModel.lookup).reduce((acc, key) => _extends({}, acc, {
278
+ [key]: false
279
+ }), {});
280
+ }
281
+
267
282
  const columnsToUpsertLookup = {};
268
283
  columnsToUpsert.forEach(newColumn => {
269
- columnsToUpsertLookup[newColumn.field] = true;
270
-
271
- if (columnsStateWithoutColumnVisibilityModel.lookup[newColumn.field] == null) {
284
+ const {
285
+ field
286
+ } = newColumn;
287
+ columnsToUpsertLookup[field] = true;
288
+ columnsToKeep[field] = true;
289
+ let existingState = columnsStateWithoutColumnVisibilityModel.lookup[field];
290
+
291
+ if (existingState == null) {
272
292
  // New Column
273
- columnsStateWithoutColumnVisibilityModel.lookup[newColumn.field] = _extends({}, getGridColDef(columnsTypes, newColumn.type), newColumn);
274
- columnsStateWithoutColumnVisibilityModel.all.push(newColumn.field);
275
- } else {
276
- const mergedColumn = _extends({}, columnsStateWithoutColumnVisibilityModel.lookup[newColumn.field], newColumn);
293
+ existingState = _extends({}, getGridColDef(columnTypes, newColumn.type), {
294
+ // TODO v6: Inline `getGridColDef`
295
+ field,
296
+ hasBeenResized: false
297
+ });
298
+ columnsStateWithoutColumnVisibilityModel.all.push(field);
299
+ } else if (keepOnlyColumnsToUpsert) {
300
+ columnsStateWithoutColumnVisibilityModel.all.push(field);
301
+ }
277
302
 
278
- if (!mergedColumn.hasBeenResized && COLUMNS_DIMENSION_PROPERTIES.some(propertyName => newColumn[propertyName] !== undefined)) {
279
- mergedColumn.hasBeenResized = true;
280
- }
303
+ let hasBeenResized = existingState.hasBeenResized;
304
+ COLUMNS_DIMENSION_PROPERTIES.forEach(key => {
305
+ if (newColumn[key] !== undefined) {
306
+ hasBeenResized = true;
281
307
 
282
- columnsStateWithoutColumnVisibilityModel.lookup[newColumn.field] = mergedColumn;
283
- }
308
+ if (newColumn[key] === -1) {
309
+ newColumn[key] = Infinity;
310
+ }
311
+ }
312
+ });
313
+ columnsStateWithoutColumnVisibilityModel.lookup[field] = _extends({}, existingState, {
314
+ hide: newColumn.hide == null ? false : newColumn.hide
315
+ }, newColumn, {
316
+ hasBeenResized
317
+ });
284
318
  });
285
319
 
320
+ if (keepOnlyColumnsToUpsert && !isInsideStateInitializer) {
321
+ Object.keys(columnsStateWithoutColumnVisibilityModel.lookup).forEach(field => {
322
+ if (!columnsToKeep[field]) {
323
+ delete columnsStateWithoutColumnVisibilityModel.lookup[field];
324
+ }
325
+ });
326
+ }
327
+
286
328
  const columnsLookupBeforePreProcessing = _extends({}, columnsStateWithoutColumnVisibilityModel.lookup);
287
329
 
288
- const columnsStateWithPreProcessing = apiRef.current.unstable_applyPreProcessors('hydrateColumns', columnsStateWithoutColumnVisibilityModel); // TODO v6: remove the sync between the columns `hide` option and the model.
330
+ const columnsStateWithPreProcessing = apiRef.current.unstable_applyPipeProcessors('hydrateColumns', columnsStateWithoutColumnVisibilityModel); // TODO v6: remove the sync between the columns `hide` option and the model.
289
331
 
290
332
  let columnVisibilityModel = {};
291
333
 
@@ -360,4 +402,47 @@ export const createColumnsState = ({
360
402
  };
361
403
  export const mergeColumnsState = columnsState => state => _extends({}, state, {
362
404
  columns: columnsState
363
- });
405
+ });
406
+ export function getFirstNonSpannedColumnToRender({
407
+ firstColumnToRender,
408
+ apiRef,
409
+ firstRowToRender,
410
+ lastRowToRender,
411
+ visibleRows
412
+ }) {
413
+ let firstNonSpannedColumnToRender = firstColumnToRender;
414
+
415
+ for (let i = firstRowToRender; i < lastRowToRender; i += 1) {
416
+ const row = visibleRows[i];
417
+
418
+ if (row) {
419
+ const rowId = visibleRows[i].id;
420
+ const cellColSpanInfo = apiRef.current.unstable_getCellColSpanInfo(rowId, firstColumnToRender);
421
+
422
+ if (cellColSpanInfo && cellColSpanInfo.spannedByColSpan) {
423
+ firstNonSpannedColumnToRender = cellColSpanInfo.leftVisibleCellIndex;
424
+ }
425
+ }
426
+ }
427
+
428
+ return firstNonSpannedColumnToRender;
429
+ }
430
+ export function getFirstColumnIndexToRender({
431
+ firstColumnIndex,
432
+ minColumnIndex,
433
+ columnBuffer,
434
+ firstRowToRender,
435
+ lastRowToRender,
436
+ apiRef,
437
+ visibleRows
438
+ }) {
439
+ const initialFirstColumnToRender = Math.max(firstColumnIndex - columnBuffer, minColumnIndex);
440
+ const firstColumnToRender = getFirstNonSpannedColumnToRender({
441
+ firstColumnToRender: initialFirstColumnToRender,
442
+ apiRef,
443
+ firstRowToRender,
444
+ lastRowToRender,
445
+ visibleRows
446
+ });
447
+ return firstColumnToRender;
448
+ }