@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
@@ -11,7 +11,7 @@ import { getDefaultGridFilterModel } from './gridFilterState';
11
11
  import { gridFilterModelSelector, gridVisibleSortedRowEntriesSelector } from './gridFilterSelector';
12
12
  import { useFirstRender } from '../../utils/useFirstRender';
13
13
  import { gridRowIdsSelector } from '../rows';
14
- import { useGridRegisterPreProcessor } from '../../core/preProcessing';
14
+ import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
15
15
  import { GRID_DEFAULT_STRATEGY, useGridRegisterStrategyProcessor } from '../../core/strategyProcessing';
16
16
  import { buildAggregatedFilterApplier, sanitizeFilterModel, mergeStateWithFilterModel } from './gridFilterUtils';
17
17
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -40,11 +40,7 @@ export const useGridFilter = (apiRef, props) => {
40
40
  stateSelector: gridFilterModelSelector,
41
41
  changeEvent: GridEvents.filterModelChange
42
42
  });
43
- /**
44
- * API METHODS
45
- */
46
-
47
- const applyFilters = React.useCallback(() => {
43
+ const updateFilteredRows = React.useCallback(() => {
48
44
  apiRef.current.setState(state => {
49
45
  const filterModel = gridFilterModelSelector(state, apiRef.current.instanceId);
50
46
  const isRowMatchingFilters = props.filterMode === GridFeatureModeConstant.client ? buildAggregatedFilterApplier(filterModel, apiRef) : null;
@@ -55,9 +51,16 @@ export const useGridFilter = (apiRef, props) => {
55
51
  filter: _extends({}, state.filter, filteringResult)
56
52
  });
57
53
  });
58
- apiRef.current.publishEvent(GridEvents.visibleRowsSet);
54
+ apiRef.current.publishEvent(GridEvents.filteredRowsSet);
55
+ }, [props.filterMode, apiRef]);
56
+ /**
57
+ * API METHODS
58
+ */
59
+
60
+ const applyFilters = React.useCallback(() => {
61
+ updateFilteredRows();
59
62
  apiRef.current.forceUpdate();
60
- }, [apiRef, props.filterMode]);
63
+ }, [apiRef, updateFilteredRows]);
61
64
  const upsertFilterItem = React.useCallback(item => {
62
65
  const filterModel = gridFilterModelSelector(apiRef);
63
66
  const items = [...filterModel.items];
@@ -213,9 +216,9 @@ export const useGridFilter = (apiRef, props) => {
213
216
  filteredDescendantCountLookup: {}
214
217
  };
215
218
  }, [apiRef, props.filterMode]);
216
- useGridRegisterPreProcessor(apiRef, 'exportState', stateExportPreProcessing);
217
- useGridRegisterPreProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
218
- useGridRegisterPreProcessor(apiRef, 'preferencePanel', preferencePanelPreProcessing);
219
+ useGridRegisterPipeProcessor(apiRef, 'exportState', stateExportPreProcessing);
220
+ useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
221
+ useGridRegisterPipeProcessor(apiRef, 'preferencePanel', preferencePanelPreProcessing);
219
222
  useGridRegisterStrategyProcessor(apiRef, GRID_DEFAULT_STRATEGY, 'filtering', flatFilteringMethod);
220
223
  /**
221
224
  * EVENTS
@@ -237,8 +240,10 @@ export const useGridFilter = (apiRef, props) => {
237
240
  if (methodName === 'filtering') {
238
241
  apiRef.current.unstable_applyFilters();
239
242
  }
240
- }, [apiRef]);
241
- useGridApiEventHandler(apiRef, GridEvents.rowsSet, apiRef.current.unstable_applyFilters);
243
+ }, [apiRef]); // Do not call `apiRef.current.forceUpdate` to avoid re-render before updating the sorted rows.
244
+ // Otherwise, the state is not consistent during the render
245
+
246
+ useGridApiEventHandler(apiRef, GridEvents.rowsSet, updateFilteredRows);
242
247
  useGridApiEventHandler(apiRef, GridEvents.rowExpansionChange, apiRef.current.unstable_applyFilters);
243
248
  useGridApiEventHandler(apiRef, GridEvents.columnsChange, handleColumnsChange);
244
249
  useGridApiEventHandler(apiRef, GridEvents.activeStrategyProcessorChange, handleStrategyProcessorChange);
@@ -102,21 +102,31 @@ export const useGridFocus = (apiRef, props) => {
102
102
  rowIndexToFocus += 1;
103
103
  }
104
104
 
105
+ const currentPage = getVisibleRows(apiRef, {
106
+ pagination: props.pagination,
107
+ paginationMode: props.paginationMode
108
+ });
109
+
105
110
  if (columnIndexToFocus >= visibleColumns.length) {
106
- // Go to next row if we are at the last column
111
+ // Go to next row if we are after the last column
107
112
  rowIndexToFocus += 1;
108
- columnIndexToFocus = 0;
113
+
114
+ if (rowIndexToFocus < currentPage.rows.length) {
115
+ // Go to first column of the next row if there's one more row
116
+ columnIndexToFocus = 0;
117
+ }
109
118
  } else if (columnIndexToFocus < 0) {
110
- // Go to previous row if we are at the first column
119
+ // Go to previous row if we are before the first column
111
120
  rowIndexToFocus -= 1;
112
- columnIndexToFocus = visibleColumns.length - 1;
121
+
122
+ if (rowIndexToFocus >= 0) {
123
+ // Go to last column of the previous if there's one more row
124
+ columnIndexToFocus = visibleColumns.length - 1;
125
+ }
113
126
  }
114
127
 
115
- const currentPage = getVisibleRows(apiRef, {
116
- pagination: props.pagination,
117
- paginationMode: props.paginationMode
118
- });
119
- rowIndexToFocus = clamp(rowIndexToFocus, currentPage.range.firstRowIndex, currentPage.range.lastRowIndex);
128
+ rowIndexToFocus = clamp(rowIndexToFocus, 0, currentPage.rows.length - 1);
129
+ columnIndexToFocus = clamp(columnIndexToFocus, 0, visibleColumns.length - 1);
120
130
  const rowToFocus = currentPage.rows[rowIndexToFocus];
121
131
  const columnToFocus = visibleColumns[columnIndexToFocus];
122
132
  apiRef.current.setCellFocus(rowToFocus.id, columnToFocus.field);
@@ -7,31 +7,48 @@ import { gridVisibleSortedRowEntriesSelector } from '../filter/gridFilterSelecto
7
7
  import { useGridVisibleRows } from '../../utils/useGridVisibleRows';
8
8
  import { GRID_CHECKBOX_SELECTION_COL_DEF } from '../../../colDef/gridCheckboxSelectionColDef';
9
9
  import { gridClasses } from '../../../constants/gridClasses';
10
+ import { GridCellModes } from '../../../models/gridEditRowModel';
11
+ import { isNavigationKey } from '../../../utils/keyboardUtils';
12
+ import { GRID_DETAIL_PANEL_TOGGLE_FIELD } from '../../../constants/gridDetailPanelToggleField';
10
13
  /**
11
- * @requires useGridPage (state)
12
- * @requires useGridPageSize (state)
13
- * @requires useGridFilter (state)
14
- * @requires useGridColumns (state, method)
15
- * @requires useGridRows (state, method)
16
14
  * @requires useGridSorting (method) - can be after
15
+ * @requires useGridFilter (state) - can be after
16
+ * @requires useGridColumns (state, method) - can be after
17
17
  * @requires useGridDimensions (method) - can be after
18
18
  * @requires useGridFocus (method) - can be after
19
19
  * @requires useGridScroll (method) - can be after
20
+ * @requires useGridColumnSpanning (method) - can be after
20
21
  */
21
22
 
22
23
  export const useGridKeyboardNavigation = (apiRef, props) => {
23
24
  const logger = useGridLogger(apiRef, 'useGridKeyboardNavigation');
24
25
  const currentPage = useGridVisibleRows(apiRef, props);
25
- const goToCell = React.useCallback((colIndex, rowIndex) => {
26
+ /**
27
+ * @param {number} colIndex Index of the column to focus
28
+ * @param {number} rowIndex index of the row to focus
29
+ * @param {string} closestColumnToUse Which closest column cell to use when the cell is spanned by `colSpan`.
30
+ */
31
+
32
+ const goToCell = React.useCallback((colIndex, rowIndex, closestColumnToUse = 'left') => {
33
+ const visibleSortedRows = gridVisibleSortedRowEntriesSelector(apiRef);
34
+ const rowId = visibleSortedRows[rowIndex]?.id;
35
+ const nextCellColSpanInfo = apiRef.current.unstable_getCellColSpanInfo(rowId, colIndex);
36
+
37
+ if (nextCellColSpanInfo && nextCellColSpanInfo.spannedByColSpan) {
38
+ if (closestColumnToUse === 'left') {
39
+ colIndex = nextCellColSpanInfo.leftVisibleCellIndex;
40
+ } else if (closestColumnToUse === 'right') {
41
+ colIndex = nextCellColSpanInfo.rightVisibleCellIndex;
42
+ }
43
+ }
44
+
26
45
  logger.debug(`Navigating to cell row ${rowIndex}, col ${colIndex}`);
27
46
  apiRef.current.scrollToIndexes({
28
47
  colIndex,
29
48
  rowIndex
30
49
  });
31
50
  const field = apiRef.current.getVisibleColumns()[colIndex].field;
32
- const visibleSortedRows = gridVisibleSortedRowEntriesSelector(apiRef);
33
- const node = visibleSortedRows[rowIndex];
34
- apiRef.current.setCellFocus(node.id, field);
51
+ apiRef.current.setCellFocus(rowId, field);
35
52
  }, [apiRef, logger]);
36
53
  const goToHeader = React.useCallback((colIndex, event) => {
37
54
  logger.debug(`Navigating to header col ${colIndex}`);
@@ -84,7 +101,7 @@ export const useGridKeyboardNavigation = (apiRef, props) => {
84
101
  case 'ArrowRight':
85
102
  {
86
103
  if (colIndexBefore < lastColIndex) {
87
- goToCell(colIndexBefore + 1, rowIndexBefore);
104
+ goToCell(colIndexBefore + 1, rowIndexBefore, 'right');
88
105
  }
89
106
 
90
107
  break;
@@ -103,16 +120,36 @@ export const useGridKeyboardNavigation = (apiRef, props) => {
103
120
  {
104
121
  // "Tab" is only triggered by the row / cell editing feature
105
122
  if (event.shiftKey && colIndexBefore > firstColIndex) {
106
- goToCell(colIndexBefore - 1, rowIndexBefore);
123
+ goToCell(colIndexBefore - 1, rowIndexBefore, 'left');
107
124
  } else if (!event.shiftKey && colIndexBefore < lastColIndex) {
108
- goToCell(colIndexBefore + 1, rowIndexBefore);
125
+ goToCell(colIndexBefore + 1, rowIndexBefore, 'right');
109
126
  }
110
127
 
111
128
  break;
112
129
  }
113
130
 
114
- case 'PageDown':
115
131
  case ' ':
132
+ {
133
+ const field = params.field;
134
+
135
+ if (field === GRID_DETAIL_PANEL_TOGGLE_FIELD) {
136
+ break;
137
+ }
138
+
139
+ const colDef = params.colDef;
140
+
141
+ if (colDef && colDef.type === 'treeDataGroup') {
142
+ break;
143
+ }
144
+
145
+ if (!event.shiftKey && rowIndexBefore < lastRowIndexInPage) {
146
+ goToCell(colIndexBefore, Math.min(rowIndexBefore + viewportPageSize, lastRowIndexInPage));
147
+ }
148
+
149
+ break;
150
+ }
151
+
152
+ case 'PageDown':
116
153
  {
117
154
  if (rowIndexBefore < lastRowIndexInPage) {
118
155
  goToCell(colIndexBefore, Math.min(rowIndexBefore + viewportPageSize, lastRowIndexInPage));
@@ -265,6 +302,20 @@ export const useGridKeyboardNavigation = (apiRef, props) => {
265
302
  event.preventDefault();
266
303
  }
267
304
  }, [apiRef, currentPage, goToCell, goToHeader]);
305
+ const handleCellKeyDown = React.useCallback((params, event) => {
306
+ // Ignore portal
307
+ if (!event.currentTarget.contains(event.target)) {
308
+ return;
309
+ } // Get the most recent params because the cell mode may have changed by another listener
310
+
311
+
312
+ const cellParams = apiRef.current.getCellParams(params.id, params.field);
313
+
314
+ if (cellParams.cellMode !== GridCellModes.Edit && isNavigationKey(event.key)) {
315
+ apiRef.current.publishEvent(GridEvents.cellNavigationKeyDown, cellParams, event);
316
+ }
317
+ }, [apiRef]);
268
318
  useGridApiEventHandler(apiRef, GridEvents.cellNavigationKeyDown, handleCellNavigationKeyDown);
269
319
  useGridApiEventHandler(apiRef, GridEvents.columnHeaderKeyDown, handleColumnHeaderKeyDown);
320
+ useGridApiEventHandler(apiRef, GridEvents.cellKeyDown, handleCellKeyDown);
270
321
  };
@@ -3,8 +3,8 @@ import * as React from 'react';
3
3
  import { useGridLogger, useGridSelector, useGridApiMethod, useGridApiEventHandler } from '../../utils';
4
4
  import { GridEvents } from '../../../models/events';
5
5
  import { gridVisibleTopLevelRowCountSelector } from '../filter';
6
- import { gridPageSelector } from './gridPaginationSelector';
7
- import { useGridRegisterPreProcessor } from '../../core/preProcessing';
6
+ import { gridPageSelector, gridPageSizeSelector } from './gridPaginationSelector';
7
+ import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
8
8
  import { buildWarning } from '../../../utils/warning';
9
9
  export const getPageCount = (rowCount, pageSize) => {
10
10
  if (pageSize > 0 && rowCount > 0) {
@@ -85,8 +85,8 @@ export const useGridPage = (apiRef, props) => {
85
85
  apiRef.current.setState(mergeStateWithPage(page));
86
86
  return params;
87
87
  }, [apiRef]);
88
- useGridRegisterPreProcessor(apiRef, 'exportState', stateExportPreProcessing);
89
- useGridRegisterPreProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
88
+ useGridRegisterPipeProcessor(apiRef, 'exportState', stateExportPreProcessing);
89
+ useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
90
90
  /**
91
91
  * EVENTS
92
92
  */
@@ -104,7 +104,12 @@ export const useGridPage = (apiRef, props) => {
104
104
  apiRef.current.forceUpdate();
105
105
  };
106
106
 
107
+ const handlePageChange = () => apiRef.current.scrollToIndexes({
108
+ rowIndex: gridPageSelector(apiRef) * gridPageSizeSelector(apiRef)
109
+ });
110
+
107
111
  useGridApiEventHandler(apiRef, GridEvents.pageSizeChange, handlePageSizeChange);
112
+ useGridApiEventHandler(apiRef, GridEvents.pageChange, handlePageChange);
108
113
  /**
109
114
  * EFFECTS
110
115
  */
@@ -4,7 +4,7 @@ import { GridEvents } from '../../../models/events';
4
4
  import { useGridLogger, useGridApiMethod, useGridApiEventHandler, useGridSelector } from '../../utils';
5
5
  import { gridPageSizeSelector } from './gridPaginationSelector';
6
6
  import { gridDensityRowHeightSelector } from '../density';
7
- import { useGridRegisterPreProcessor } from '../../core/preProcessing';
7
+ import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
8
8
  export const defaultPageSize = autoPageSize => autoPageSize ? 0 : 100;
9
9
 
10
10
  const mergeStateWithPageSize = pageSize => state => _extends({}, state, {
@@ -78,8 +78,8 @@ export const useGridPageSize = (apiRef, props) => {
78
78
 
79
79
  return params;
80
80
  }, [apiRef]);
81
- useGridRegisterPreProcessor(apiRef, 'exportState', stateExportPreProcessing);
82
- useGridRegisterPreProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
81
+ useGridRegisterPipeProcessor(apiRef, 'exportState', stateExportPreProcessing);
82
+ useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
83
83
  /**
84
84
  * EVENTS
85
85
  */
@@ -1,9 +1,11 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
+ import { GridEvents } from '../../../models/events';
3
4
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
4
5
  import { useGridLogger } from '../../utils/useGridLogger';
5
- import { useGridRegisterPreProcessor } from '../../core/preProcessing';
6
+ import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
6
7
  import { gridPreferencePanelStateSelector } from './gridPreferencePanelSelector';
8
+ import { useGridSelector } from '../../utils/useGridSelector';
7
9
  export const preferencePanelStateInitializer = (state, props) => _extends({}, state, {
8
10
  preferencePanel: props.initialState?.preferencePanel ?? {
9
11
  open: false
@@ -15,6 +17,7 @@ export const preferencePanelStateInitializer = (state, props) => _extends({}, st
15
17
 
16
18
  export const useGridPreferencesPanel = apiRef => {
17
19
  const logger = useGridLogger(apiRef, 'useGridPreferencesPanel');
20
+ const preferencePanelState = useGridSelector(apiRef, gridPreferencePanelStateSelector);
18
21
  const hideTimeout = React.useRef();
19
22
  const immediateTimeout = React.useRef();
20
23
  /**
@@ -23,13 +26,20 @@ export const useGridPreferencesPanel = apiRef => {
23
26
 
24
27
  const hidePreferences = React.useCallback(() => {
25
28
  logger.debug('Hiding Preferences Panel');
29
+
30
+ if (preferencePanelState.openedPanelValue) {
31
+ apiRef.current.publishEvent(GridEvents.preferencePanelClose, {
32
+ openedPanelValue: preferencePanelState.openedPanelValue
33
+ });
34
+ }
35
+
26
36
  apiRef.current.setState(state => _extends({}, state, {
27
37
  preferencePanel: {
28
38
  open: false
29
39
  }
30
40
  }));
31
41
  apiRef.current.forceUpdate();
32
- }, [apiRef, logger]); // This is to prevent the preferences from closing when you open a select box or another panel,
42
+ }, [apiRef, logger, preferencePanelState.openedPanelValue]); // This is to prevent the preferences from closing when you open a select box or another panel,
33
43
  // The issue is in MUI core V4 => Fixed in V5
34
44
 
35
45
  const doNotHidePanel = React.useCallback(() => {
@@ -49,8 +59,11 @@ export const useGridPreferencesPanel = apiRef => {
49
59
  openedPanelValue: newValue
50
60
  })
51
61
  }));
62
+ apiRef.current.publishEvent(GridEvents.preferencePanelOpen, {
63
+ openedPanelValue: newValue
64
+ });
52
65
  apiRef.current.forceUpdate();
53
- }, [doNotHidePanel, apiRef, logger]);
66
+ }, [logger, doNotHidePanel, apiRef]);
54
67
  useGridApiMethod(apiRef, {
55
68
  showPreferences,
56
69
  hidePreferences: hidePreferencesDelayed
@@ -81,8 +94,8 @@ export const useGridPreferencesPanel = apiRef => {
81
94
 
82
95
  return params;
83
96
  }, [apiRef]);
84
- useGridRegisterPreProcessor(apiRef, 'exportState', stateExportPreProcessing);
85
- useGridRegisterPreProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
97
+ useGridRegisterPipeProcessor(apiRef, 'exportState', stateExportPreProcessing);
98
+ useGridRegisterPipeProcessor(apiRef, 'restoreState', stateRestorePreProcessing);
86
99
  /**
87
100
  * EFFECTS
88
101
  */
@@ -1,6 +1,7 @@
1
1
  import { createSelector } from '../../../utils/createSelector';
2
2
  export const gridRowsStateSelector = state => state.rows;
3
3
  export const gridRowCountSelector = createSelector(gridRowsStateSelector, rows => rows.totalRowCount);
4
+ export const gridRowsLoadingSelector = createSelector(gridRowsStateSelector, rows => rows.loading);
4
5
  export const gridTopLevelRowCountSelector = createSelector(gridRowsStateSelector, rows => rows.totalTopLevelRowCount);
5
6
  export const gridRowsLookupSelector = createSelector(gridRowsStateSelector, rows => rows.idRowsLookup);
6
7
  export const gridRowTreeSelector = createSelector(gridRowsStateSelector, rows => rows.tree);
@@ -0,0 +1,11 @@
1
+ /**
2
+ * A helper function to check if the id provided is valid.
3
+ * @param {GridRowId} id Id as [[GridRowId]].
4
+ * @param {GridRowModel | Partial<GridRowModel>} row Row as [[GridRowModel]].
5
+ * @param {string} detailErrorMessage A custom error message to display for invalid IDs
6
+ */
7
+ export function checkGridRowIdIsValid(id, row, detailErrorMessage = 'A row was provided without id in the rows prop:') {
8
+ if (id == null) {
9
+ throw new Error(['MUI: The data grid component requires all rows to have a unique `id` property.', 'Alternatively, you can use the `getRowId` prop to specify a custom id for each row.', detailErrorMessage, JSON.stringify(row)].join('\n'));
10
+ }
11
+ }
@@ -1,4 +1,4 @@
1
1
  export * from './gridRowsMetaSelector';
2
2
  export * from './gridRowsMetaState';
3
3
  export * from './gridRowsSelector';
4
- export {};
4
+ export { checkGridRowIdIsValid } from './gridRowsUtils';
@@ -1,12 +1,12 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { GridEvents } from '../../../models/events';
4
- import { checkGridRowIdIsValid } from '../../../models/gridRows';
5
4
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
6
5
  import { useGridLogger } from '../../utils/useGridLogger';
7
6
  import { gridRowCountSelector, gridRowsLookupSelector, gridRowTreeSelector, gridRowIdsSelector, gridRowGroupingNameSelector } from './gridRowsSelector';
8
7
  import { GridSignature, useGridApiEventHandler } from '../../utils/useGridApiEventHandler';
9
8
  import { useGridVisibleRows } from '../../utils/useGridVisibleRows';
9
+ import { checkGridRowIdIsValid } from './gridRowsUtils';
10
10
 
11
11
  function getGridRowId(rowModel, getRowId, detailErrorMessage) {
12
12
  const id = getRowId ? getRowId(rowModel) : rowModel.id;
@@ -43,7 +43,7 @@ const convertGridRowsPropToState = ({
43
43
  };
44
44
  };
45
45
 
46
- const getRowsStateFromCache = (rowsCache, previousTree, apiRef, rowCountProp) => {
46
+ const getRowsStateFromCache = (rowsCache, previousTree, apiRef, rowCountProp, loadingProp) => {
47
47
  const {
48
48
  value
49
49
  } = rowsCache.state;
@@ -53,6 +53,7 @@ const getRowsStateFromCache = (rowsCache, previousTree, apiRef, rowCountProp) =>
53
53
  }));
54
54
  const dataTopLevelRowCount = groupingResponse.treeDepth === 1 ? groupingResponse.ids.length : Object.values(groupingResponse.tree).filter(node => node.parent == null).length;
55
55
  return _extends({}, groupingResponse, {
56
+ loading: loadingProp,
56
57
  totalRowCount: Math.max(rowCount, groupingResponse.ids.length),
57
58
  totalTopLevelRowCount: Math.max(rowCount, dataTopLevelRowCount)
58
59
  });
@@ -75,7 +76,7 @@ export const rowsStateInitializer = (state, props, apiRef) => {
75
76
  lastUpdateMs: Date.now()
76
77
  };
77
78
  return _extends({}, state, {
78
- rows: getRowsStateFromCache(rowsCache, null, apiRef, props.rowCount),
79
+ rows: getRowsStateFromCache(rowsCache, null, apiRef, props.rowCount, props.loading),
79
80
  rowsCache // TODO remove from state
80
81
 
81
82
  });
@@ -102,7 +103,7 @@ export const useGridRows = (apiRef, props) => {
102
103
  rowsCache.current.timeout = null;
103
104
  rowsCache.current.lastUpdateMs = Date.now();
104
105
  apiRef.current.setState(state => _extends({}, state, {
105
- rows: getRowsStateFromCache(rowsCache.current, gridRowTreeSelector(apiRef), apiRef, props.rowCount)
106
+ rows: getRowsStateFromCache(rowsCache.current, gridRowTreeSelector(apiRef), apiRef, props.rowCount, props.loading)
106
107
  }));
107
108
  apiRef.current.publishEvent(GridEvents.rowsSet);
108
109
  apiRef.current.forceUpdate();
@@ -128,7 +129,7 @@ export const useGridRows = (apiRef, props) => {
128
129
  }
129
130
 
130
131
  run();
131
- }, [props.throttleRowsMs, props.rowCount, apiRef]);
132
+ }, [props.throttleRowsMs, props.rowCount, props.loading, apiRef]);
132
133
  /**
133
134
  * API METHODS
134
135
  */
@@ -224,12 +225,31 @@ export const useGridRows = (apiRef, props) => {
224
225
  apiRef.current.publishEvent(GridEvents.rowExpansionChange, newNode);
225
226
  }, [apiRef]);
226
227
  const getRowNode = React.useCallback(id => gridRowTreeSelector(apiRef)[id] ?? null, [apiRef]);
228
+ const setRowIndex = React.useCallback((rowId, targetIndex) => {
229
+ const allRows = gridRowIdsSelector(apiRef);
230
+ const oldIndex = allRows.findIndex(row => row === rowId);
231
+
232
+ if (oldIndex === targetIndex) {
233
+ return;
234
+ }
235
+
236
+ logger.debug(`Moving row ${rowId} to index ${targetIndex}`);
237
+ const updatedRows = [...allRows];
238
+ updatedRows.splice(targetIndex, 0, updatedRows.splice(oldIndex, 1)[0]);
239
+ apiRef.current.setState(state => _extends({}, state, {
240
+ rows: _extends({}, state.rows, {
241
+ ids: updatedRows
242
+ })
243
+ }));
244
+ apiRef.current.applySorting();
245
+ }, [apiRef, logger]);
227
246
  const rowApi = {
228
247
  getRow,
229
248
  getRowModels,
230
249
  getRowsCount,
231
250
  getAllRowIds,
232
251
  setRows,
252
+ setRowIndex,
233
253
  updateRows,
234
254
  setRowChildrenExpansion,
235
255
  getRowNode,
@@ -7,8 +7,7 @@ import { gridDensityRowHeightSelector, gridDensityFactorSelector } from '../dens
7
7
  import { gridFilterStateSelector } from '../filter/gridFilterSelector';
8
8
  import { gridPaginationSelector } from '../pagination/gridPaginationSelector';
9
9
  import { gridSortingStateSelector } from '../sorting/gridSortingSelector';
10
- import { GridEvents } from '../../../models/events/gridEvents';
11
- import { useGridApiEventHandler } from '../../utils/useGridApiEventHandler';
10
+ import { useGridRegisterPipeApplier } from '../../core/pipeProcessing';
12
11
  export const rowsMetaStateInitializer = state => _extends({}, state, {
13
12
  rowsMeta: {
14
13
  currentPageTotalHeight: 0,
@@ -61,16 +60,17 @@ export const useGridRowsMeta = (apiRef, props) => {
61
60
  };
62
61
 
63
62
  if (getRowSpacing) {
64
- const index = apiRef.current.getRowIndexRelativeToVisibleRows(row.id);
63
+ const indexRelativeToCurrentPage = apiRef.current.getRowIndexRelativeToVisibleRows(row.id);
65
64
  const spacing = getRowSpacing(_extends({}, row, {
66
- isFirstVisible: index === 0,
67
- isLastVisible: index === currentPage.rows.length - 1
65
+ isFirstVisible: indexRelativeToCurrentPage === 0,
66
+ isLastVisible: indexRelativeToCurrentPage === currentPage.rows.length - 1,
67
+ indexRelativeToCurrentPage
68
68
  }));
69
69
  initialHeights.spacingTop = spacing.top ?? 0;
70
70
  initialHeights.spacingBottom = spacing.bottom ?? 0;
71
71
  }
72
72
 
73
- const sizes = apiRef.current.unstable_applyPreProcessors('rowHeight', initialHeights, row);
73
+ const sizes = apiRef.current.unstable_applyPipeProcessors('rowHeight', initialHeights, row);
74
74
  const finalRowHeight = Object.values(sizes).reduce((acc2, value) => acc2 + value, 0);
75
75
  rowsHeightLookup.current[row.id] = {
76
76
  value: baseRowHeight,
@@ -108,14 +108,7 @@ export const useGridRowsMeta = (apiRef, props) => {
108
108
  React.useEffect(() => {
109
109
  hydrateRowsMeta();
110
110
  }, [rowHeight, filterState, paginationState, sortingState, hydrateRowsMeta]);
111
- const handlePreProcessorRegister = React.useCallback(name => {
112
- if (name !== 'rowHeight') {
113
- return;
114
- }
115
-
116
- hydrateRowsMeta();
117
- }, [hydrateRowsMeta]);
118
- useGridApiEventHandler(apiRef, GridEvents.preProcessorRegister, handlePreProcessorRegister);
111
+ useGridRegisterPipeApplier(apiRef, 'rowHeight', hydrateRowsMeta);
119
112
  const rowsMetaApi = {
120
113
  unstable_getRowHeight: getTargetRowHeight,
121
114
  unstable_getRowInternalSizes: getRowInternalSizes,
@@ -1,11 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import { useGridLogger } from '../../utils/useGridLogger';
3
3
  import { gridColumnPositionsSelector, gridVisibleColumnDefinitionsSelector } from '../columns/gridColumnsSelector';
4
+ import { useGridSelector } from '../../utils/useGridSelector';
4
5
  import { gridPageSelector, gridPageSizeSelector } from '../pagination/gridPaginationSelector';
5
6
  import { gridRowCountSelector } from '../rows/gridRowsSelector';
6
7
  import { gridRowsMetaSelector } from '../rows/gridRowsMetaSelector';
7
8
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
8
- import { useGridNativeEventListener } from '../../utils/useGridNativeEventListener'; // Logic copied from https://www.w3.org/TR/wai-aria-practices/examples/listbox/js/listbox.js
9
+ import { gridVisibleSortedRowEntriesSelector } from '../filter/gridFilterSelector'; // Logic copied from https://www.w3.org/TR/wai-aria-practices/examples/listbox/js/listbox.js
9
10
  // Similar to https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
10
11
 
11
12
  function scrollIntoView(dimensions) {
@@ -32,6 +33,8 @@ function scrollIntoView(dimensions) {
32
33
  * @requires useGridColumns (state) - can be after, async only
33
34
  * @requires useGridRows (state) - can be after, async only
34
35
  * @requires useGridRowsMeta (state) - can be after, async only
36
+ * @requires useGridFilter (state)
37
+ * @requires useGridColumnSpanning (method)
35
38
  */
36
39
 
37
40
 
@@ -39,11 +42,13 @@ export const useGridScroll = (apiRef, props) => {
39
42
  const logger = useGridLogger(apiRef, 'useGridScroll');
40
43
  const colRef = apiRef.current.columnHeadersElementRef;
41
44
  const windowRef = apiRef.current.windowRef;
45
+ const visibleSortedRows = useGridSelector(apiRef, gridVisibleSortedRowEntriesSelector);
42
46
  const scrollToIndexes = React.useCallback(params => {
43
47
  const totalRowCount = gridRowCountSelector(apiRef);
44
48
  const visibleColumns = gridVisibleColumnDefinitionsSelector(apiRef);
49
+ const scrollToHeader = params.rowIndex == null;
45
50
 
46
- if (totalRowCount === 0 || visibleColumns.length === 0) {
51
+ if (!scrollToHeader && totalRowCount === 0 || visibleColumns.length === 0) {
47
52
  return false;
48
53
  }
49
54
 
@@ -52,10 +57,25 @@ export const useGridScroll = (apiRef, props) => {
52
57
 
53
58
  if (params.colIndex != null) {
54
59
  const columnPositions = gridColumnPositionsSelector(apiRef);
60
+ let cellWidth;
61
+
62
+ if (typeof params.rowIndex !== 'undefined') {
63
+ const rowId = visibleSortedRows[params.rowIndex]?.id;
64
+ const cellColSpanInfo = apiRef.current.unstable_getCellColSpanInfo(rowId, params.colIndex);
65
+
66
+ if (cellColSpanInfo && !cellColSpanInfo.spannedByColSpan) {
67
+ cellWidth = cellColSpanInfo.cellProps.width;
68
+ }
69
+ }
70
+
71
+ if (typeof cellWidth === 'undefined') {
72
+ cellWidth = visibleColumns[params.colIndex].computedWidth;
73
+ }
74
+
55
75
  scrollCoordinates.left = scrollIntoView({
56
76
  clientHeight: windowRef.current.clientWidth,
57
77
  scrollTop: windowRef.current.scrollLeft,
58
- offsetHeight: visibleColumns[params.colIndex].computedWidth,
78
+ offsetHeight: cellWidth,
59
79
  offsetTop: columnPositions[params.colIndex]
60
80
  });
61
81
  }
@@ -74,7 +94,7 @@ export const useGridScroll = (apiRef, props) => {
74
94
  });
75
95
  }
76
96
 
77
- scrollCoordinates = apiRef.current.unstable_applyPreProcessors('scrollToIndexes', scrollCoordinates, params);
97
+ scrollCoordinates = apiRef.current.unstable_applyPipeProcessors('scrollToIndexes', scrollCoordinates, params);
78
98
 
79
99
  if (typeof scrollCoordinates.left !== undefined || typeof scrollCoordinates.top !== undefined) {
80
100
  apiRef.current.scroll(scrollCoordinates);
@@ -82,7 +102,7 @@ export const useGridScroll = (apiRef, props) => {
82
102
  }
83
103
 
84
104
  return false;
85
- }, [logger, apiRef, windowRef, props.pagination]);
105
+ }, [logger, apiRef, windowRef, props.pagination, visibleSortedRows]);
86
106
  const scroll = React.useCallback(params => {
87
107
  if (windowRef.current && params.left != null && colRef.current) {
88
108
  colRef.current.scrollLeft = params.left;
@@ -116,9 +136,4 @@ export const useGridScroll = (apiRef, props) => {
116
136
  getScrollPosition
117
137
  };
118
138
  useGridApiMethod(apiRef, scrollApi, 'GridScrollApi');
119
- const preventScroll = React.useCallback(event => {
120
- event.target.scrollLeft = 0;
121
- event.target.scrollTop = 0;
122
- }, []);
123
- useGridNativeEventListener(apiRef, () => apiRef.current?.renderingZoneRef?.current?.parentElement, 'scroll', preventScroll);
124
139
  };