@mui/x-data-grid 7.0.0-alpha.7 → 7.0.0-alpha.9

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 (501) hide show
  1. package/CHANGELOG.md +554 -51
  2. package/DataGrid/DataGrid.js +15 -27
  3. package/DataGrid/useDataGridComponent.js +2 -1
  4. package/DataGrid/useDataGridProps.js +1 -0
  5. package/README.md +1 -1
  6. package/colDef/gridDateColDef.js +1 -1
  7. package/components/GridColumnHeaders.d.ts +3 -2
  8. package/components/GridColumnHeaders.js +3 -11
  9. package/components/GridDetailPanels.d.ts +5 -0
  10. package/components/GridDetailPanels.js +4 -0
  11. package/components/GridHeaders.d.ts +4 -0
  12. package/components/GridHeaders.js +53 -0
  13. package/components/GridPagination.d.ts +4 -4
  14. package/components/GridPagination.js +1 -1
  15. package/components/GridPinnedRows.d.ts +7 -0
  16. package/components/GridPinnedRows.js +4 -0
  17. package/components/GridRow.d.ts +7 -4
  18. package/components/GridRow.js +260 -97
  19. package/components/GridScrollbarFillerCell.d.ts +7 -0
  20. package/components/GridScrollbarFillerCell.js +39 -0
  21. package/components/base/GridBody.d.ts +2 -13
  22. package/components/base/GridBody.js +2 -116
  23. package/components/base/GridOverlays.js +10 -21
  24. package/components/cell/GridActionsCell.js +1 -1
  25. package/components/cell/GridActionsCellItem.d.ts +6 -6
  26. package/components/cell/GridCell.d.ts +15 -21
  27. package/components/cell/GridCell.js +68 -373
  28. package/components/columnHeaders/GridBaseColumnHeaders.js +1 -6
  29. package/components/columnHeaders/GridColumnHeaderItem.d.ts +2 -1
  30. package/components/columnHeaders/GridColumnHeaderItem.js +7 -3
  31. package/components/columnHeaders/GridColumnHeaderSortIcon.d.ts +1 -0
  32. package/components/columnHeaders/GridColumnHeaderSortIcon.js +5 -2
  33. package/components/columnHeaders/GridColumnHeadersInner.js +1 -2
  34. package/components/containers/GridRoot.js +18 -15
  35. package/components/containers/GridRootStyles.js +307 -204
  36. package/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +1 -1
  37. package/components/panel/GridPanel.d.ts +3 -3
  38. package/components/panel/GridPanel.js +3 -4
  39. package/components/panel/filterPanel/GridFilterForm.d.ts +6 -4
  40. package/components/panel/filterPanel/GridFilterForm.js +32 -15
  41. package/components/panel/filterPanel/GridFilterPanel.js +46 -20
  42. package/components/toolbar/GridToolbarColumnsButton.d.ts +13 -1
  43. package/components/toolbar/GridToolbarColumnsButton.js +40 -22
  44. package/components/toolbar/GridToolbarDensitySelector.d.ts +13 -1
  45. package/components/toolbar/GridToolbarDensitySelector.js +40 -22
  46. package/components/toolbar/GridToolbarExport.d.ts +10 -1
  47. package/components/toolbar/GridToolbarExport.js +6 -1
  48. package/components/toolbar/GridToolbarExportContainer.d.ts +15 -1
  49. package/components/toolbar/GridToolbarExportContainer.js +41 -23
  50. package/components/toolbar/GridToolbarFilterButton.d.ts +5 -4
  51. package/components/toolbar/GridToolbarFilterButton.js +6 -10
  52. package/components/toolbar/GridToolbarQuickFilter.d.ts +4 -0
  53. package/components/toolbar/GridToolbarQuickFilter.js +4 -0
  54. package/components/virtualization/GridBottomContainer.d.ts +2 -0
  55. package/components/virtualization/GridBottomContainer.js +25 -0
  56. package/components/{containers → virtualization}/GridMainContainer.d.ts +2 -0
  57. package/components/virtualization/GridMainContainer.js +20 -0
  58. package/components/virtualization/GridTopContainer.d.ts +2 -0
  59. package/components/virtualization/GridTopContainer.js +35 -0
  60. package/components/virtualization/GridVirtualScrollbar.d.ts +7 -0
  61. package/components/virtualization/GridVirtualScrollbar.js +131 -0
  62. package/components/virtualization/GridVirtualScroller.d.ts +4 -4
  63. package/components/virtualization/GridVirtualScroller.js +69 -16
  64. package/components/virtualization/GridVirtualScrollerFiller.d.ts +4 -0
  65. package/components/virtualization/GridVirtualScrollerFiller.js +71 -0
  66. package/components/virtualization/GridVirtualScrollerRenderZone.js +2 -1
  67. package/constants/defaultGridSlotsComponents.js +6 -2
  68. package/constants/gridClasses.d.ts +60 -8
  69. package/constants/gridClasses.js +1 -1
  70. package/hooks/core/gridCoreSelector.d.ts +6 -0
  71. package/hooks/core/gridCoreSelector.js +5 -0
  72. package/hooks/core/useGridInitialization.js +4 -0
  73. package/hooks/core/useGridLoggerFactory.js +2 -2
  74. package/hooks/core/useGridRefs.d.ts +3 -0
  75. package/hooks/core/useGridRefs.js +13 -0
  76. package/hooks/core/useGridTheme.d.ts +3 -0
  77. package/hooks/core/useGridTheme.js +19 -0
  78. package/hooks/features/columnGrouping/gridColumnGroupsUtils.js +1 -1
  79. package/hooks/features/columnGrouping/useGridColumnGrouping.d.ts +1 -1
  80. package/hooks/features/columnGrouping/useGridColumnGrouping.js +13 -18
  81. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +13 -18
  82. package/hooks/features/columnHeaders/useGridColumnHeaders.js +68 -162
  83. package/hooks/features/columnMenu/useGridColumnMenu.js +28 -23
  84. package/hooks/features/columns/gridColumnsInterfaces.d.ts +17 -0
  85. package/hooks/features/columns/gridColumnsInterfaces.js +9 -1
  86. package/hooks/features/columns/gridColumnsSelector.d.ts +14 -1
  87. package/hooks/features/columns/gridColumnsSelector.js +52 -0
  88. package/hooks/features/columns/gridColumnsUtils.d.ts +1 -5
  89. package/hooks/features/columns/gridColumnsUtils.js +10 -12
  90. package/hooks/features/columns/index.d.ts +2 -2
  91. package/hooks/features/columns/index.js +2 -1
  92. package/hooks/features/columns/useGridColumnSpanning.js +62 -61
  93. package/hooks/features/columns/useGridColumns.js +20 -23
  94. package/hooks/features/dimensions/gridDimensionsApi.d.ts +60 -11
  95. package/hooks/features/dimensions/gridDimensionsSelectors.d.ts +2 -0
  96. package/hooks/features/dimensions/gridDimensionsSelectors.js +1 -0
  97. package/hooks/features/dimensions/index.d.ts +2 -0
  98. package/hooks/features/dimensions/index.js +1 -0
  99. package/hooks/features/dimensions/useGridDimensions.d.ts +7 -1
  100. package/hooks/features/dimensions/useGridDimensions.js +216 -148
  101. package/hooks/features/editing/useGridCellEditing.js +4 -4
  102. package/hooks/features/editing/useGridRowEditing.js +4 -4
  103. package/hooks/features/export/serializers/csvSerializer.js +3 -3
  104. package/hooks/features/export/useGridPrintExport.js +1 -1
  105. package/hooks/features/filter/gridFilterUtils.js +5 -5
  106. package/hooks/features/filter/useGridFilter.js +3 -3
  107. package/hooks/features/focus/gridFocusStateSelector.d.ts +2 -2
  108. package/hooks/features/focus/gridFocusStateSelector.js +2 -6
  109. package/hooks/features/focus/useGridFocus.js +3 -3
  110. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +3 -16
  111. package/hooks/features/pagination/gridPaginationUtils.js +2 -2
  112. package/hooks/features/pagination/useGridPagination.js +3 -5
  113. package/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  114. package/hooks/features/rows/gridRowsInterfaces.d.ts +1 -0
  115. package/hooks/features/rows/gridRowsSelector.d.ts +2 -2
  116. package/hooks/features/rows/gridRowsSelector.js +5 -5
  117. package/hooks/features/rows/gridRowsUtils.d.ts +1 -1
  118. package/hooks/features/rows/gridRowsUtils.js +6 -6
  119. package/hooks/features/rows/useGridRows.js +7 -7
  120. package/hooks/features/rows/useGridRowsMeta.js +9 -6
  121. package/hooks/features/scroll/useGridScroll.js +8 -10
  122. package/hooks/features/sorting/gridSortingUtils.js +5 -3
  123. package/hooks/features/sorting/useGridSorting.d.ts +1 -1
  124. package/hooks/features/sorting/useGridSorting.js +15 -10
  125. package/hooks/features/virtualization/gridVirtualizationSelectors.d.ts +14 -0
  126. package/hooks/features/virtualization/gridVirtualizationSelectors.js +22 -2
  127. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +27 -42
  128. package/hooks/features/virtualization/useGridVirtualScroller.js +441 -438
  129. package/hooks/features/virtualization/useGridVirtualization.d.ts +8 -0
  130. package/hooks/features/virtualization/useGridVirtualization.js +8 -1
  131. package/hooks/utils/index.d.ts +3 -0
  132. package/hooks/utils/index.js +4 -1
  133. package/hooks/utils/useGridApiContext.js +1 -1
  134. package/hooks/utils/useGridAriaAttributes.js +1 -2
  135. package/hooks/utils/useGridNativeEventListener.js +4 -9
  136. package/hooks/utils/useGridPrivateApiContext.js +1 -1
  137. package/hooks/utils/useGridRootProps.js +1 -1
  138. package/hooks/utils/useGridSelector.js +1 -1
  139. package/hooks/utils/useResizeObserver.d.ts +2 -0
  140. package/hooks/utils/useResizeObserver.js +36 -0
  141. package/hooks/utils/useRunOnce.d.ts +5 -0
  142. package/hooks/utils/useRunOnce.js +18 -0
  143. package/index.d.ts +0 -1
  144. package/index.js +1 -2
  145. package/internals/index.d.ts +13 -9
  146. package/internals/index.js +9 -7
  147. package/internals/utils/index.d.ts +1 -0
  148. package/internals/utils/index.js +2 -1
  149. package/internals/utils/propValidation.d.ts +4 -0
  150. package/internals/utils/propValidation.js +19 -0
  151. package/legacy/DataGrid/DataGrid.js +20 -29
  152. package/legacy/DataGrid/useDataGridComponent.js +2 -1
  153. package/legacy/DataGrid/useDataGridProps.js +1 -0
  154. package/legacy/colDef/gridDateColDef.js +1 -1
  155. package/legacy/components/GridColumnHeaders.js +3 -11
  156. package/legacy/components/GridDetailPanels.js +4 -0
  157. package/legacy/components/GridHeaders.js +53 -0
  158. package/legacy/components/GridPagination.js +1 -1
  159. package/legacy/components/GridPinnedRows.js +4 -0
  160. package/legacy/components/GridRow.js +258 -98
  161. package/legacy/components/GridScrollbarFillerCell.js +36 -0
  162. package/legacy/components/base/GridBody.js +2 -114
  163. package/legacy/components/base/GridOverlays.js +10 -25
  164. package/legacy/components/cell/GridActionsCell.js +1 -1
  165. package/legacy/components/cell/GridCell.js +70 -378
  166. package/legacy/components/columnHeaders/GridBaseColumnHeaders.js +1 -6
  167. package/legacy/components/columnHeaders/GridColumnHeaderItem.js +7 -3
  168. package/legacy/components/columnHeaders/GridColumnHeaderSortIcon.js +5 -2
  169. package/legacy/components/columnHeaders/GridColumnHeadersInner.js +1 -2
  170. package/legacy/components/containers/GridRoot.js +18 -15
  171. package/legacy/components/containers/GridRootStyles.js +215 -137
  172. package/legacy/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +1 -1
  173. package/legacy/components/panel/GridPanel.js +3 -4
  174. package/legacy/components/panel/filterPanel/GridFilterForm.js +31 -14
  175. package/legacy/components/panel/filterPanel/GridFilterPanel.js +49 -20
  176. package/legacy/components/toolbar/GridToolbarColumnsButton.js +40 -21
  177. package/legacy/components/toolbar/GridToolbarDensitySelector.js +40 -21
  178. package/legacy/components/toolbar/GridToolbarExport.js +6 -1
  179. package/legacy/components/toolbar/GridToolbarExportContainer.js +40 -21
  180. package/legacy/components/toolbar/GridToolbarFilterButton.js +6 -10
  181. package/legacy/components/toolbar/GridToolbarQuickFilter.js +4 -0
  182. package/legacy/components/virtualization/GridBottomContainer.js +25 -0
  183. package/legacy/components/virtualization/GridMainContainer.js +20 -0
  184. package/legacy/components/virtualization/GridTopContainer.js +35 -0
  185. package/legacy/components/virtualization/GridVirtualScrollbar.js +129 -0
  186. package/legacy/components/virtualization/GridVirtualScroller.js +67 -16
  187. package/legacy/components/virtualization/GridVirtualScrollerFiller.js +70 -0
  188. package/legacy/components/virtualization/GridVirtualScrollerRenderZone.js +2 -1
  189. package/legacy/constants/defaultGridSlotsComponents.js +6 -2
  190. package/legacy/constants/gridClasses.js +1 -1
  191. package/legacy/hooks/core/gridCoreSelector.js +7 -0
  192. package/legacy/hooks/core/useGridInitialization.js +4 -0
  193. package/legacy/hooks/core/useGridLoggerFactory.js +2 -2
  194. package/legacy/hooks/core/useGridRefs.js +13 -0
  195. package/legacy/hooks/core/useGridTheme.js +21 -0
  196. package/legacy/hooks/features/columnGrouping/gridColumnGroupsUtils.js +1 -1
  197. package/legacy/hooks/features/columnGrouping/useGridColumnGrouping.js +13 -18
  198. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +69 -181
  199. package/legacy/hooks/features/columnMenu/useGridColumnMenu.js +28 -23
  200. package/legacy/hooks/features/columns/gridColumnsInterfaces.js +9 -1
  201. package/legacy/hooks/features/columns/gridColumnsSelector.js +62 -0
  202. package/legacy/hooks/features/columns/gridColumnsUtils.js +10 -16
  203. package/legacy/hooks/features/columns/index.js +2 -1
  204. package/legacy/hooks/features/columns/useGridColumnSpanning.js +60 -59
  205. package/legacy/hooks/features/columns/useGridColumns.js +22 -23
  206. package/legacy/hooks/features/dimensions/gridDimensionsSelectors.js +3 -0
  207. package/legacy/hooks/features/dimensions/index.js +1 -0
  208. package/legacy/hooks/features/dimensions/useGridDimensions.js +226 -151
  209. package/legacy/hooks/features/editing/useGridCellEditing.js +4 -4
  210. package/legacy/hooks/features/editing/useGridRowEditing.js +4 -4
  211. package/legacy/hooks/features/export/serializers/csvSerializer.js +3 -3
  212. package/legacy/hooks/features/export/useGridPrintExport.js +1 -1
  213. package/legacy/hooks/features/filter/gridFilterUtils.js +5 -5
  214. package/legacy/hooks/features/filter/useGridFilter.js +3 -3
  215. package/legacy/hooks/features/focus/gridFocusStateSelector.js +2 -6
  216. package/legacy/hooks/features/focus/useGridFocus.js +3 -3
  217. package/legacy/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +3 -16
  218. package/legacy/hooks/features/pagination/gridPaginationUtils.js +2 -2
  219. package/legacy/hooks/features/pagination/useGridPagination.js +3 -5
  220. package/legacy/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  221. package/legacy/hooks/features/rows/gridRowsSelector.js +5 -5
  222. package/legacy/hooks/features/rows/gridRowsUtils.js +6 -6
  223. package/legacy/hooks/features/rows/useGridParamsApi.js +4 -5
  224. package/legacy/hooks/features/rows/useGridRows.js +7 -7
  225. package/legacy/hooks/features/rows/useGridRowsMeta.js +9 -6
  226. package/legacy/hooks/features/scroll/useGridScroll.js +8 -10
  227. package/legacy/hooks/features/sorting/gridSortingUtils.js +5 -3
  228. package/legacy/hooks/features/sorting/useGridSorting.js +15 -10
  229. package/legacy/hooks/features/virtualization/gridVirtualizationSelectors.js +29 -1
  230. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +490 -483
  231. package/legacy/hooks/features/virtualization/useGridVirtualization.js +8 -1
  232. package/legacy/hooks/utils/index.js +4 -1
  233. package/legacy/hooks/utils/useGridApiContext.js +1 -1
  234. package/legacy/hooks/utils/useGridAriaAttributes.js +1 -2
  235. package/legacy/hooks/utils/useGridNativeEventListener.js +4 -9
  236. package/legacy/hooks/utils/useGridPrivateApiContext.js +1 -1
  237. package/legacy/hooks/utils/useGridRootProps.js +1 -1
  238. package/legacy/hooks/utils/useGridSelector.js +1 -1
  239. package/legacy/hooks/utils/useResizeObserver.js +36 -0
  240. package/legacy/hooks/utils/useRunOnce.js +18 -0
  241. package/legacy/index.js +1 -2
  242. package/legacy/internals/index.js +9 -7
  243. package/legacy/internals/utils/index.js +2 -1
  244. package/legacy/internals/utils/propValidation.js +21 -0
  245. package/legacy/locales/hrHR.js +161 -0
  246. package/legacy/locales/index.js +4 -1
  247. package/legacy/locales/ptPT.js +161 -0
  248. package/legacy/locales/zhHK.js +161 -0
  249. package/legacy/models/index.js +0 -1
  250. package/legacy/models/params/index.js +1 -2
  251. package/legacy/utils/createSelector.js +1 -1
  252. package/legacy/utils/exportAs.js +1 -1
  253. package/legacy/utils/utils.js +10 -1
  254. package/locales/hrHR.d.ts +1 -0
  255. package/locales/hrHR.js +149 -0
  256. package/locales/index.d.ts +3 -0
  257. package/locales/index.js +4 -1
  258. package/locales/ptPT.d.ts +1 -0
  259. package/locales/ptPT.js +149 -0
  260. package/locales/zhHK.d.ts +1 -0
  261. package/locales/zhHK.js +149 -0
  262. package/models/api/gridColumnGroupingApi.d.ts +2 -2
  263. package/models/api/gridCoreApi.d.ts +16 -16
  264. package/models/api/gridRowsMetaApi.d.ts +1 -1
  265. package/models/api/gridVirtualizationApi.d.ts +2 -3
  266. package/models/events/gridEventLookup.d.ts +3 -3
  267. package/models/gridFilterModel.d.ts +1 -1
  268. package/models/gridSlotsComponent.d.ts +16 -2
  269. package/models/gridStateCommunity.d.ts +5 -1
  270. package/models/index.d.ts +0 -1
  271. package/models/index.js +0 -1
  272. package/models/params/index.d.ts +0 -1
  273. package/models/params/index.js +1 -2
  274. package/models/props/DataGridProps.d.ts +7 -12
  275. package/modern/DataGrid/DataGrid.js +15 -27
  276. package/modern/DataGrid/useDataGridComponent.js +2 -1
  277. package/modern/DataGrid/useDataGridProps.js +1 -0
  278. package/modern/colDef/gridDateColDef.js +1 -1
  279. package/modern/components/GridColumnHeaders.js +3 -11
  280. package/modern/components/GridDetailPanels.js +4 -0
  281. package/modern/components/GridHeaders.js +53 -0
  282. package/modern/components/GridPagination.js +1 -1
  283. package/modern/components/GridPinnedRows.js +4 -0
  284. package/modern/components/GridRow.js +258 -96
  285. package/modern/components/GridScrollbarFillerCell.js +39 -0
  286. package/modern/components/base/GridBody.js +2 -116
  287. package/modern/components/base/GridOverlays.js +10 -16
  288. package/modern/components/cell/GridActionsCell.js +1 -1
  289. package/modern/components/cell/GridCell.js +66 -370
  290. package/modern/components/columnHeaders/GridBaseColumnHeaders.js +1 -6
  291. package/modern/components/columnHeaders/GridColumnHeaderItem.js +7 -3
  292. package/modern/components/columnHeaders/GridColumnHeaderSortIcon.js +5 -2
  293. package/modern/components/columnHeaders/GridColumnHeadersInner.js +1 -1
  294. package/modern/components/containers/GridRoot.js +18 -14
  295. package/modern/components/containers/GridRootStyles.js +307 -204
  296. package/modern/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +1 -1
  297. package/modern/components/panel/GridPanel.js +3 -4
  298. package/modern/components/panel/filterPanel/GridFilterForm.js +31 -14
  299. package/modern/components/panel/filterPanel/GridFilterPanel.js +46 -20
  300. package/modern/components/toolbar/GridToolbarColumnsButton.js +38 -21
  301. package/modern/components/toolbar/GridToolbarDensitySelector.js +38 -21
  302. package/modern/components/toolbar/GridToolbarExport.js +6 -1
  303. package/modern/components/toolbar/GridToolbarExportContainer.js +39 -22
  304. package/modern/components/toolbar/GridToolbarFilterButton.js +6 -10
  305. package/modern/components/toolbar/GridToolbarQuickFilter.js +4 -0
  306. package/modern/components/virtualization/GridBottomContainer.js +25 -0
  307. package/modern/components/virtualization/GridMainContainer.js +20 -0
  308. package/modern/components/virtualization/GridTopContainer.js +35 -0
  309. package/modern/components/virtualization/GridVirtualScrollbar.js +131 -0
  310. package/modern/components/virtualization/GridVirtualScroller.js +69 -16
  311. package/modern/components/virtualization/GridVirtualScrollerFiller.js +71 -0
  312. package/modern/components/virtualization/GridVirtualScrollerRenderZone.js +2 -1
  313. package/modern/constants/defaultGridSlotsComponents.js +6 -2
  314. package/modern/constants/gridClasses.js +1 -1
  315. package/modern/hooks/core/gridCoreSelector.js +5 -0
  316. package/modern/hooks/core/useGridInitialization.js +4 -0
  317. package/modern/hooks/core/useGridLoggerFactory.js +2 -2
  318. package/modern/hooks/core/useGridRefs.js +13 -0
  319. package/modern/hooks/core/useGridTheme.js +19 -0
  320. package/modern/hooks/features/columnGrouping/gridColumnGroupsUtils.js +1 -1
  321. package/modern/hooks/features/columnGrouping/useGridColumnGrouping.js +11 -16
  322. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +67 -160
  323. package/modern/hooks/features/columnMenu/useGridColumnMenu.js +28 -23
  324. package/modern/hooks/features/columns/gridColumnsInterfaces.js +9 -1
  325. package/modern/hooks/features/columns/gridColumnsSelector.js +51 -0
  326. package/modern/hooks/features/columns/gridColumnsUtils.js +10 -12
  327. package/modern/hooks/features/columns/index.js +2 -1
  328. package/modern/hooks/features/columns/useGridColumnSpanning.js +62 -61
  329. package/modern/hooks/features/columns/useGridColumns.js +19 -21
  330. package/modern/hooks/features/dimensions/gridDimensionsSelectors.js +1 -0
  331. package/modern/hooks/features/dimensions/index.js +1 -0
  332. package/modern/hooks/features/dimensions/useGridDimensions.js +214 -146
  333. package/modern/hooks/features/editing/useGridCellEditing.js +4 -4
  334. package/modern/hooks/features/editing/useGridRowEditing.js +4 -4
  335. package/modern/hooks/features/export/serializers/csvSerializer.js +3 -3
  336. package/modern/hooks/features/export/useGridPrintExport.js +1 -1
  337. package/modern/hooks/features/filter/gridFilterUtils.js +5 -5
  338. package/modern/hooks/features/filter/useGridFilter.js +3 -3
  339. package/modern/hooks/features/focus/gridFocusStateSelector.js +2 -6
  340. package/modern/hooks/features/focus/useGridFocus.js +3 -3
  341. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +3 -16
  342. package/modern/hooks/features/pagination/gridPaginationUtils.js +2 -2
  343. package/modern/hooks/features/pagination/useGridPagination.js +3 -5
  344. package/modern/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  345. package/modern/hooks/features/rows/gridRowsSelector.js +2 -2
  346. package/modern/hooks/features/rows/gridRowsUtils.js +6 -6
  347. package/modern/hooks/features/rows/useGridRows.js +7 -7
  348. package/modern/hooks/features/rows/useGridRowsMeta.js +9 -6
  349. package/modern/hooks/features/scroll/useGridScroll.js +8 -9
  350. package/modern/hooks/features/sorting/gridSortingUtils.js +5 -3
  351. package/modern/hooks/features/sorting/useGridSorting.js +15 -10
  352. package/modern/hooks/features/virtualization/gridVirtualizationSelectors.js +22 -2
  353. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +435 -432
  354. package/modern/hooks/features/virtualization/useGridVirtualization.js +8 -1
  355. package/modern/hooks/utils/index.js +4 -1
  356. package/modern/hooks/utils/useGridApiContext.js +1 -1
  357. package/modern/hooks/utils/useGridAriaAttributes.js +1 -1
  358. package/modern/hooks/utils/useGridNativeEventListener.js +3 -9
  359. package/modern/hooks/utils/useGridPrivateApiContext.js +1 -1
  360. package/modern/hooks/utils/useGridRootProps.js +1 -1
  361. package/modern/hooks/utils/useGridSelector.js +1 -1
  362. package/modern/hooks/utils/useResizeObserver.js +36 -0
  363. package/modern/hooks/utils/useRunOnce.js +18 -0
  364. package/modern/index.js +1 -2
  365. package/modern/internals/index.js +9 -7
  366. package/modern/internals/utils/index.js +2 -1
  367. package/modern/internals/utils/propValidation.js +19 -0
  368. package/modern/locales/hrHR.js +149 -0
  369. package/modern/locales/index.js +4 -1
  370. package/modern/locales/ptPT.js +149 -0
  371. package/modern/locales/zhHK.js +149 -0
  372. package/modern/models/index.js +0 -1
  373. package/modern/models/params/index.js +1 -2
  374. package/modern/utils/createSelector.js +1 -1
  375. package/modern/utils/exportAs.js +1 -1
  376. package/modern/utils/utils.js +10 -1
  377. package/node/DataGrid/DataGrid.js +15 -27
  378. package/node/DataGrid/useDataGridComponent.js +1 -0
  379. package/node/DataGrid/useDataGridProps.js +1 -0
  380. package/node/colDef/gridDateColDef.js +1 -1
  381. package/node/components/GridColumnHeaders.js +3 -11
  382. package/node/components/GridDetailPanels.js +10 -0
  383. package/node/components/GridHeaders.js +60 -0
  384. package/node/components/GridPagination.js +1 -1
  385. package/node/components/GridPinnedRows.js +10 -0
  386. package/node/components/GridRow.js +256 -94
  387. package/node/components/GridScrollbarFillerCell.js +47 -0
  388. package/node/components/base/GridBody.js +7 -118
  389. package/node/components/base/GridOverlays.js +9 -15
  390. package/node/components/cell/GridActionsCell.js +1 -1
  391. package/node/components/cell/GridCell.js +67 -370
  392. package/node/components/columnHeaders/GridBaseColumnHeaders.js +1 -6
  393. package/node/components/columnHeaders/GridColumnHeaderItem.js +8 -4
  394. package/node/components/columnHeaders/GridColumnHeaderSortIcon.js +5 -2
  395. package/node/components/columnHeaders/GridColumnHeadersInner.js +1 -1
  396. package/node/components/containers/GridRoot.js +17 -14
  397. package/node/components/containers/GridRootStyles.js +175 -72
  398. package/node/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +1 -1
  399. package/node/components/panel/GridPanel.js +3 -4
  400. package/node/components/panel/filterPanel/GridFilterForm.js +30 -13
  401. package/node/components/panel/filterPanel/GridFilterPanel.js +45 -19
  402. package/node/components/toolbar/GridToolbarColumnsButton.js +36 -20
  403. package/node/components/toolbar/GridToolbarDensitySelector.js +36 -20
  404. package/node/components/toolbar/GridToolbarExport.js +6 -1
  405. package/node/components/toolbar/GridToolbarExportContainer.js +37 -21
  406. package/node/components/toolbar/GridToolbarFilterButton.js +6 -10
  407. package/node/components/toolbar/GridToolbarQuickFilter.js +4 -0
  408. package/node/components/virtualization/GridBottomContainer.js +34 -0
  409. package/node/components/{containers → virtualization}/GridMainContainer.js +7 -29
  410. package/node/components/virtualization/GridTopContainer.js +44 -0
  411. package/node/components/virtualization/GridVirtualScrollbar.js +138 -0
  412. package/node/components/virtualization/GridVirtualScroller.js +69 -17
  413. package/node/components/virtualization/GridVirtualScrollerFiller.js +77 -0
  414. package/node/components/virtualization/GridVirtualScrollerRenderZone.js +2 -1
  415. package/node/constants/defaultGridSlotsComponents.js +5 -1
  416. package/node/constants/gridClasses.js +1 -1
  417. package/node/hooks/core/gridCoreSelector.js +12 -0
  418. package/node/hooks/core/useGridInitialization.js +4 -0
  419. package/node/hooks/core/useGridLoggerFactory.js +2 -2
  420. package/node/hooks/core/useGridRefs.js +22 -0
  421. package/node/hooks/core/useGridTheme.js +29 -0
  422. package/node/hooks/features/columnGrouping/gridColumnGroupsUtils.js +1 -1
  423. package/node/hooks/features/columnGrouping/useGridColumnGrouping.js +11 -16
  424. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +65 -159
  425. package/node/hooks/features/columnMenu/useGridColumnMenu.js +28 -23
  426. package/node/hooks/features/columns/gridColumnsInterfaces.js +11 -1
  427. package/node/hooks/features/columns/gridColumnsSelector.js +52 -1
  428. package/node/hooks/features/columns/gridColumnsUtils.js +10 -13
  429. package/node/hooks/features/columns/index.js +22 -61
  430. package/node/hooks/features/columns/useGridColumnSpanning.js +62 -61
  431. package/node/hooks/features/columns/useGridColumns.js +20 -22
  432. package/node/hooks/features/dimensions/gridDimensionsSelectors.js +8 -0
  433. package/node/hooks/features/dimensions/index.js +11 -0
  434. package/node/hooks/features/dimensions/useGridDimensions.js +215 -144
  435. package/node/hooks/features/editing/useGridCellEditing.js +4 -4
  436. package/node/hooks/features/editing/useGridRowEditing.js +4 -4
  437. package/node/hooks/features/export/serializers/csvSerializer.js +3 -3
  438. package/node/hooks/features/export/useGridPrintExport.js +1 -1
  439. package/node/hooks/features/filter/gridFilterUtils.js +5 -5
  440. package/node/hooks/features/filter/useGridFilter.js +2 -2
  441. package/node/hooks/features/focus/gridFocusStateSelector.js +3 -7
  442. package/node/hooks/features/focus/useGridFocus.js +2 -2
  443. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +2 -15
  444. package/node/hooks/features/pagination/gridPaginationUtils.js +2 -2
  445. package/node/hooks/features/pagination/useGridPagination.js +3 -5
  446. package/node/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  447. package/node/hooks/features/rows/gridRowsSelector.js +2 -2
  448. package/node/hooks/features/rows/gridRowsUtils.js +6 -6
  449. package/node/hooks/features/rows/useGridRows.js +7 -7
  450. package/node/hooks/features/rows/useGridRowsMeta.js +7 -5
  451. package/node/hooks/features/scroll/useGridScroll.js +8 -9
  452. package/node/hooks/features/sorting/gridSortingUtils.js +5 -3
  453. package/node/hooks/features/sorting/useGridSorting.js +15 -10
  454. package/node/hooks/features/virtualization/gridVirtualizationSelectors.js +22 -2
  455. package/node/hooks/features/virtualization/useGridVirtualScroller.js +434 -431
  456. package/node/hooks/features/virtualization/useGridVirtualization.js +9 -1
  457. package/node/hooks/utils/index.js +36 -0
  458. package/node/hooks/utils/useGridApiContext.js +1 -1
  459. package/node/hooks/utils/useGridAriaAttributes.js +1 -1
  460. package/node/hooks/utils/useGridNativeEventListener.js +3 -9
  461. package/node/hooks/utils/useGridPrivateApiContext.js +1 -1
  462. package/node/hooks/utils/useGridRootProps.js +1 -1
  463. package/node/hooks/utils/useGridSelector.js +1 -1
  464. package/node/hooks/utils/useResizeObserver.js +44 -0
  465. package/node/hooks/utils/useRunOnce.js +27 -0
  466. package/node/index.js +1 -13
  467. package/node/internals/index.js +86 -71
  468. package/node/internals/utils/index.js +11 -0
  469. package/node/internals/utils/propValidation.js +26 -0
  470. package/node/locales/hrHR.js +155 -0
  471. package/node/locales/index.js +33 -0
  472. package/node/locales/ptPT.js +155 -0
  473. package/node/locales/zhHK.js +155 -0
  474. package/node/models/index.js +0 -11
  475. package/node/models/params/index.js +0 -11
  476. package/node/utils/createSelector.js +1 -1
  477. package/node/utils/exportAs.js +1 -1
  478. package/node/utils/utils.js +11 -1
  479. package/package.json +6 -6
  480. package/utils/createSelector.js +1 -1
  481. package/utils/exportAs.js +1 -1
  482. package/utils/utils.d.ts +6 -0
  483. package/utils/utils.js +10 -1
  484. package/components/DataGridVirtualScroller.d.ts +0 -3
  485. package/components/DataGridVirtualScroller.js +0 -35
  486. package/components/containers/GridMainContainer.js +0 -43
  487. package/legacy/components/DataGridVirtualScroller.js +0 -32
  488. package/legacy/components/containers/GridMainContainer.js +0 -45
  489. package/legacy/models/gridRootContainerRef.js +0 -1
  490. package/legacy/models/params/gridRenderedRowsIntervalChangeParams.js +0 -1
  491. package/models/gridRootContainerRef.d.ts +0 -5
  492. package/models/gridRootContainerRef.js +0 -1
  493. package/models/params/gridRenderedRowsIntervalChangeParams.d.ts +0 -10
  494. package/models/params/gridRenderedRowsIntervalChangeParams.js +0 -1
  495. package/modern/components/DataGridVirtualScroller.js +0 -35
  496. package/modern/components/containers/GridMainContainer.js +0 -42
  497. package/modern/models/gridRootContainerRef.js +0 -1
  498. package/modern/models/params/gridRenderedRowsIntervalChangeParams.js +0 -1
  499. package/node/components/DataGridVirtualScroller.js +0 -42
  500. package/node/models/gridRootContainerRef.js +0 -5
  501. package/node/models/params/gridRenderedRowsIntervalChangeParams.js +0 -5
@@ -1,145 +1,81 @@
1
- import _extends from "@babel/runtime/helpers/esm/extends";
2
1
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
- import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
4
3
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
5
- var _excluded = ["style"],
6
- _excluded2 = ["style"];
7
4
  import * as React from 'react';
8
5
  import * as ReactDOM from 'react-dom';
9
- import { unstable_useForkRef as useForkRef, unstable_useEnhancedEffect as useEnhancedEffect, unstable_useEventCallback as useEventCallback } from '@mui/utils';
6
+ import { unstable_useEnhancedEffect as useEnhancedEffect, unstable_useEventCallback as useEventCallback } from '@mui/utils';
10
7
  import { useTheme } from '@mui/material/styles';
11
8
  import { defaultMemoize } from 'reselect';
12
9
  import { useGridPrivateApiContext } from '../../utils/useGridPrivateApiContext';
13
10
  import { useGridRootProps } from '../../utils/useGridRootProps';
14
11
  import { useGridSelector } from '../../utils/useGridSelector';
15
- import { gridVisibleColumnDefinitionsSelector, gridColumnsTotalWidthSelector, gridColumnPositionsSelector } from '../columns/gridColumnsSelector';
12
+ import { useLazyRef } from '../../utils/useLazyRef';
13
+ import { useResizeObserver } from '../../utils/useResizeObserver';
14
+ import { useRunOnce } from '../../utils/useRunOnce';
15
+ import { gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector, gridColumnPositionsSelector } from '../columns/gridColumnsSelector';
16
+ import { gridDimensionsSelector } from '../dimensions/gridDimensionsSelectors';
17
+ import { gridPinnedRowsSelector } from '../rows/gridRowsSelector';
16
18
  import { gridFocusCellSelector, gridTabIndexCellSelector } from '../focus/gridFocusStateSelector';
17
- import { useGridVisibleRows } from '../../utils/useGridVisibleRows';
18
- import { useGridApiEventHandler } from '../../utils/useGridApiEventHandler';
19
+ import { useGridVisibleRows, getVisibleRows } from '../../utils/useGridVisibleRows';
19
20
  import { clamp } from '../../../utils/utils';
20
21
  import { selectedIdsLookupSelector } from '../rowSelection/gridRowSelectionSelector';
21
22
  import { gridRowsMetaSelector } from '../rows/gridRowsMetaSelector';
22
23
  import { getFirstNonSpannedColumnToRender } from '../columns/gridColumnsUtils';
23
24
  import { getMinimalContentHeight } from '../rows/gridRowsUtils';
24
- import { gridVirtualizationEnabledSelector, gridVirtualizationColumnEnabledSelector } from './gridVirtualizationSelectors';
25
-
26
- // Uses binary search to avoid looping through all possible positions
25
+ import { gridRenderContextSelector, gridVirtualizationEnabledSelector, gridVirtualizationColumnEnabledSelector } from './gridVirtualizationSelectors';
26
+ import { EMPTY_RENDER_CONTEXT } from './useGridVirtualization';
27
27
  import { jsx as _jsx } from "react/jsx-runtime";
28
- export function binarySearch(offset, positions) {
29
- var sliceStart = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
30
- var sliceEnd = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : positions.length;
31
- if (positions.length <= 0) {
32
- return -1;
33
- }
34
- if (sliceStart >= sliceEnd) {
35
- return sliceStart;
36
- }
37
- var pivot = sliceStart + Math.floor((sliceEnd - sliceStart) / 2);
38
- var itemOffset = positions[pivot];
39
- return offset <= itemOffset ? binarySearch(offset, positions, sliceStart, pivot) : binarySearch(offset, positions, pivot + 1, sliceEnd);
40
- }
41
- function exponentialSearch(offset, positions, index) {
42
- var interval = 1;
43
- while (index < positions.length && Math.abs(positions[index]) < offset) {
44
- index += interval;
45
- interval *= 2;
46
- }
47
- return binarySearch(offset, positions, Math.floor(index / 2), Math.min(index, positions.length));
48
- }
49
- export var getRenderableIndexes = function getRenderableIndexes(_ref) {
50
- var firstIndex = _ref.firstIndex,
51
- lastIndex = _ref.lastIndex,
52
- buffer = _ref.buffer,
53
- minFirstIndex = _ref.minFirstIndex,
54
- maxLastIndex = _ref.maxLastIndex;
55
- return [clamp(firstIndex - buffer, minFirstIndex, maxLastIndex), clamp(lastIndex + buffer, minFirstIndex, maxLastIndex)];
56
- };
57
- export var areRenderContextsEqual = function areRenderContextsEqual(context1, context2) {
58
- if (context1 === context2) {
59
- return true;
60
- }
61
- return context1.firstRowIndex === context2.firstRowIndex && context1.lastRowIndex === context2.lastRowIndex && context1.firstColumnIndex === context2.firstColumnIndex && context1.lastColumnIndex === context2.lastColumnIndex;
62
- };
63
- // The `maxSize` is 3 so that reselect caches the `renderedColumns` values for the pinned left,
64
- // unpinned, and pinned right sections.
65
- var MEMOIZE_OPTIONS = {
66
- maxSize: 3
67
- };
68
- export var useGridVirtualScroller = function useGridVirtualScroller(props) {
69
- var _currentPage$range3, _currentPage$range4;
28
+ export var EMPTY_DETAIL_PANELS = Object.freeze(new Map());
29
+ export var useGridVirtualScroller = function useGridVirtualScroller() {
70
30
  var apiRef = useGridPrivateApiContext();
71
31
  var rootProps = useGridRootProps();
72
32
  var visibleColumns = useGridSelector(apiRef, gridVisibleColumnDefinitionsSelector);
73
33
  var enabled = useGridSelector(apiRef, gridVirtualizationEnabledSelector);
74
34
  var enabledForColumns = useGridSelector(apiRef, gridVirtualizationColumnEnabledSelector);
75
- var ref = props.ref,
76
- onRenderZonePositioning = props.onRenderZonePositioning,
77
- _props$renderZoneMinC = props.renderZoneMinColumnIndex,
78
- renderZoneMinColumnIndex = _props$renderZoneMinC === void 0 ? 0 : _props$renderZoneMinC,
79
- _props$renderZoneMaxC = props.renderZoneMaxColumnIndex,
80
- renderZoneMaxColumnIndex = _props$renderZoneMaxC === void 0 ? visibleColumns.length : _props$renderZoneMaxC,
81
- getRowProps = props.getRowProps;
35
+ var dimensions = useGridSelector(apiRef, gridDimensionsSelector);
36
+ var outerSize = dimensions.viewportOuterSize;
37
+ var pinnedRows = useGridSelector(apiRef, gridPinnedRowsSelector);
38
+ var pinnedColumns = useGridSelector(apiRef, gridVisiblePinnedColumnDefinitionsSelector);
39
+ var hasBottomPinnedRows = pinnedRows.bottom.length > 0;
40
+ var _React$useState = React.useState(EMPTY_DETAIL_PANELS),
41
+ _React$useState2 = _slicedToArray(_React$useState, 2),
42
+ panels = _React$useState2[0],
43
+ setPanels = _React$useState2[1];
82
44
  var theme = useTheme();
83
45
  var columnPositions = useGridSelector(apiRef, gridColumnPositionsSelector);
84
- var columnsTotalWidth = useGridSelector(apiRef, gridColumnsTotalWidthSelector);
85
46
  var cellFocus = useGridSelector(apiRef, gridFocusCellSelector);
86
47
  var cellTabIndex = useGridSelector(apiRef, gridTabIndexCellSelector);
87
48
  var rowsMeta = useGridSelector(apiRef, gridRowsMetaSelector);
88
49
  var selectedRowsLookup = useGridSelector(apiRef, selectedIdsLookupSelector);
89
50
  var currentPage = useGridVisibleRows(apiRef, rootProps);
51
+ var gridRootRef = apiRef.current.rootElementRef;
52
+ var mainRef = apiRef.current.mainElementRef;
53
+ var scrollerRef = apiRef.current.virtualScrollerRef;
90
54
  var renderZoneRef = React.useRef(null);
91
- var rootRef = React.useRef(null);
92
- var handleRef = useForkRef(ref, rootRef);
93
- var _React$useState = React.useState(null),
94
- _React$useState2 = _slicedToArray(_React$useState, 2),
95
- renderContext = _React$useState2[0],
96
- setRenderContextState = _React$useState2[1];
97
- var prevRenderContext = React.useRef(renderContext);
55
+ var scrollbarVerticalRef = React.useRef(null);
56
+ var scrollbarHorizontalRef = React.useRef(null);
57
+ var contentHeight = dimensions.contentSize.height;
58
+ var columnsTotalWidth = dimensions.columnsTotalWidth;
59
+ useResizeObserver(mainRef, function () {
60
+ return apiRef.current.resize();
61
+ });
62
+ var previousContext = React.useRef(EMPTY_RENDER_CONTEXT);
63
+ var previousRowContext = React.useRef(EMPTY_RENDER_CONTEXT);
64
+ var renderContext = useGridSelector(apiRef, gridRenderContextSelector);
98
65
  var scrollPosition = React.useRef({
99
66
  top: 0,
100
67
  left: 0
101
- });
102
- var _React$useState3 = React.useState({
103
- width: null,
104
- height: null
105
- }),
106
- _React$useState4 = _slicedToArray(_React$useState3, 2),
107
- containerDimensions = _React$useState4[0],
108
- setContainerDimensions = _React$useState4[1];
68
+ }).current;
109
69
  var prevTotalWidth = React.useRef(columnsTotalWidth);
110
- // Each visible row (not to be confused with a filter result) is composed of a central row element
111
- // and up to two additional row elements for pinned columns (left and right).
112
- // When hovering any of these elements, the :hover styles are applied only to the row element that
113
- // was actually hovered, not its additional siblings. To make it look like a contiguous row,
114
- // we add/remove the .Mui-hovered class to all of the row elements inside one visible row.
115
- var _React$useState5 = React.useState(null),
116
- _React$useState6 = _slicedToArray(_React$useState5, 2),
117
- hoveredRowId = _React$useState6[0],
118
- setHoveredRowId = _React$useState6[1];
119
- var rowStyleCache = React.useRef(Object.create(null));
120
- var prevGetRowProps = React.useRef();
121
- var prevRootRowStyle = React.useRef();
122
- var getRenderedColumnsRef = React.useRef(defaultMemoize(function (columns, firstColumnToRender, lastColumnToRender, minFirstColumn, maxLastColumn, indexOfColumnWithFocusedCell) {
123
- // If the selected column is not within the current range of columns being displayed,
124
- // we need to render it at either the left or right of the columns,
125
- // depending on whether it is above or below the range.
126
- var focusedCellColumnIndexNotInRange;
127
- var renderedColumns = columns.slice(firstColumnToRender, lastColumnToRender);
128
- if (indexOfColumnWithFocusedCell > -1) {
129
- // check if it is not on the left pinned column.
130
- if (firstColumnToRender > indexOfColumnWithFocusedCell && indexOfColumnWithFocusedCell >= minFirstColumn) {
131
- focusedCellColumnIndexNotInRange = indexOfColumnWithFocusedCell;
132
- }
133
- // check if it is not on the right pinned column.
134
- else if (lastColumnToRender < indexOfColumnWithFocusedCell && indexOfColumnWithFocusedCell < maxLastColumn) {
135
- focusedCellColumnIndexNotInRange = indexOfColumnWithFocusedCell;
136
- }
70
+ var getRenderedColumns = useLazyRef(createGetRenderedColumns).current;
71
+ var indexOfRowWithFocusedCell = React.useMemo(function () {
72
+ if (cellFocus !== null) {
73
+ return currentPage.rows.findIndex(function (row) {
74
+ return row.id === cellFocus.id;
75
+ });
137
76
  }
138
- return {
139
- focusedCellColumnIndexNotInRange: focusedCellColumnIndexNotInRange,
140
- renderedColumns: renderedColumns
141
- };
142
- }, MEMOIZE_OPTIONS));
77
+ return -1;
78
+ }, [cellFocus, currentPage.rows]);
143
79
  var indexOfColumnWithFocusedCell = React.useMemo(function () {
144
80
  if (cellFocus !== null) {
145
81
  return visibleColumns.findIndex(function (column) {
@@ -148,187 +84,77 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
148
84
  }
149
85
  return -1;
150
86
  }, [cellFocus, visibleColumns]);
151
- var getNearestIndexToRender = React.useCallback(function (offset) {
152
- var _currentPage$range, _currentPage$range2;
153
- var lastMeasuredIndexRelativeToAllRows = apiRef.current.getLastMeasuredRowIndex();
154
- var allRowsMeasured = lastMeasuredIndexRelativeToAllRows === Infinity;
155
- if ((_currentPage$range = currentPage.range) != null && _currentPage$range.lastRowIndex && !allRowsMeasured) {
156
- // Check if all rows in this page are already measured
157
- allRowsMeasured = lastMeasuredIndexRelativeToAllRows >= currentPage.range.lastRowIndex;
158
- }
159
- var lastMeasuredIndexRelativeToCurrentPage = clamp(lastMeasuredIndexRelativeToAllRows - (((_currentPage$range2 = currentPage.range) == null ? void 0 : _currentPage$range2.firstRowIndex) || 0), 0, rowsMeta.positions.length);
160
- if (allRowsMeasured || rowsMeta.positions[lastMeasuredIndexRelativeToCurrentPage] >= offset) {
161
- // If all rows were measured (when no row has "auto" as height) or all rows before the offset
162
- // were measured, then use a binary search because it's faster.
163
- return binarySearch(offset, rowsMeta.positions);
164
- }
165
-
166
- // Otherwise, use an exponential search.
167
- // If rows have "auto" as height, their positions will be based on estimated heights.
168
- // In this case, we can skip several steps until we find a position higher than the offset.
169
- // Inspired by https://github.com/bvaughn/react-virtualized/blob/master/source/Grid/utils/CellSizeAndPositionManager.js
170
- return exponentialSearch(offset, rowsMeta.positions, lastMeasuredIndexRelativeToCurrentPage);
171
- }, [apiRef, (_currentPage$range3 = currentPage.range) == null ? void 0 : _currentPage$range3.firstRowIndex, (_currentPage$range4 = currentPage.range) == null ? void 0 : _currentPage$range4.lastRowIndex, rowsMeta.positions]);
172
- var computeRenderContext = React.useCallback(function () {
173
- if (!enabled) {
174
- return {
175
- firstRowIndex: 0,
176
- lastRowIndex: currentPage.rows.length,
177
- firstColumnIndex: 0,
178
- lastColumnIndex: visibleColumns.length
179
- };
180
- }
181
- var _ref2 = scrollPosition.current,
182
- top = _ref2.top,
183
- left = _ref2.left;
184
-
185
- // Clamp the value because the search may return an index out of bounds.
186
- // In the last index, this is not needed because Array.slice doesn't include it.
187
- var firstRowIndex = Math.min(getNearestIndexToRender(top), rowsMeta.positions.length - 1);
188
- var lastRowIndex = rootProps.autoHeight ? firstRowIndex + currentPage.rows.length : getNearestIndexToRender(top + containerDimensions.height);
189
- var firstColumnIndex = 0;
190
- var lastColumnIndex = columnPositions.length;
191
- if (enabledForColumns) {
192
- var hasRowWithAutoHeight = false;
193
- var _getRenderableIndexes = getRenderableIndexes({
194
- firstIndex: firstRowIndex,
195
- lastIndex: lastRowIndex,
196
- minFirstIndex: 0,
197
- maxLastIndex: currentPage.rows.length,
198
- buffer: rootProps.rowBuffer
199
- }),
200
- _getRenderableIndexes2 = _slicedToArray(_getRenderableIndexes, 2),
201
- firstRowToRender = _getRenderableIndexes2[0],
202
- lastRowToRender = _getRenderableIndexes2[1];
203
- for (var i = firstRowToRender; i < lastRowToRender && !hasRowWithAutoHeight; i += 1) {
204
- var row = currentPage.rows[i];
205
- hasRowWithAutoHeight = apiRef.current.rowHasAutoHeight(row.id);
206
- }
207
- if (!hasRowWithAutoHeight) {
208
- firstColumnIndex = binarySearch(Math.abs(left), columnPositions);
209
- lastColumnIndex = binarySearch(Math.abs(left) + containerDimensions.width, columnPositions);
210
- }
211
- }
212
- return {
213
- firstRowIndex: firstRowIndex,
214
- lastRowIndex: lastRowIndex,
215
- firstColumnIndex: firstColumnIndex,
216
- lastColumnIndex: lastColumnIndex
217
- };
218
- }, [enabled, enabledForColumns, getNearestIndexToRender, rowsMeta.positions.length, rootProps.autoHeight, rootProps.rowBuffer, currentPage.rows, columnPositions, visibleColumns.length, apiRef, containerDimensions]);
219
- useEnhancedEffect(function () {
220
- if (enabled) {
221
- // TODO a scroll reset should not be necessary
222
- rootRef.current.scrollLeft = 0;
223
- rootRef.current.scrollTop = 0;
224
- } else {
225
- renderZoneRef.current.style.transform = "translate3d(0px, 0px, 0px)";
87
+ React.useEffect(function () {
88
+ var _gridRootRef$current, _gridRootRef$current2;
89
+ var direction = theme.direction === 'ltr' ? 1 : -1;
90
+ var top = gridRowsMetaSelector(apiRef.current.state).positions[renderContext.firstRowIndex];
91
+ var left = direction * columnPositions[renderContext.firstColumnIndex] - columnPositions[pinnedColumns.left.length];
92
+ (_gridRootRef$current = gridRootRef.current) == null || _gridRootRef$current.style.setProperty('--DataGrid-offsetTop', "".concat(top, "px"));
93
+ (_gridRootRef$current2 = gridRootRef.current) == null || _gridRootRef$current2.style.setProperty('--DataGrid-offsetLeft', "".concat(left, "px"));
94
+ }, [apiRef, gridRootRef, theme.direction, columnPositions, pinnedColumns.left.length, renderContext]);
95
+ var updateRenderContext = React.useCallback(function (nextRenderContext, rawRenderContext) {
96
+ if (areRenderContextsEqual(nextRenderContext, apiRef.current.state.virtualization.renderContext)) {
97
+ return;
226
98
  }
227
- }, [enabled]);
228
- useEnhancedEffect(function () {
229
- setContainerDimensions({
230
- width: rootRef.current.clientWidth,
231
- height: rootRef.current.clientHeight
232
- });
233
- }, [rowsMeta.currentPageTotalHeight]);
234
- var handleResize = React.useCallback(function () {
235
- if (rootRef.current) {
236
- setContainerDimensions({
237
- width: rootRef.current.clientWidth,
238
- height: rootRef.current.clientHeight
99
+ var didRowsIntervalChange = nextRenderContext.firstRowIndex !== previousRowContext.current.firstRowIndex || nextRenderContext.lastRowIndex !== previousRowContext.current.lastRowIndex;
100
+ apiRef.current.setState(function (state) {
101
+ return _extends({}, state, {
102
+ virtualization: _extends({}, state.virtualization, {
103
+ renderContext: nextRenderContext
104
+ })
239
105
  });
240
- }
241
- }, []);
242
- useGridApiEventHandler(apiRef, 'debouncedResize', handleResize);
243
- var updateRenderZonePosition = React.useCallback(function (nextRenderContext) {
244
- var _getRenderableIndexes3 = getRenderableIndexes({
245
- firstIndex: nextRenderContext.firstRowIndex,
246
- lastIndex: nextRenderContext.lastRowIndex,
247
- minFirstIndex: 0,
248
- maxLastIndex: currentPage.rows.length,
249
- buffer: rootProps.rowBuffer
250
- }),
251
- _getRenderableIndexes4 = _slicedToArray(_getRenderableIndexes3, 2),
252
- firstRowToRender = _getRenderableIndexes4[0],
253
- lastRowToRender = _getRenderableIndexes4[1];
254
- var _getRenderableIndexes5 = getRenderableIndexes({
255
- firstIndex: nextRenderContext.firstColumnIndex,
256
- lastIndex: nextRenderContext.lastColumnIndex,
257
- minFirstIndex: renderZoneMinColumnIndex,
258
- maxLastIndex: renderZoneMaxColumnIndex,
259
- buffer: rootProps.columnBuffer
260
- }),
261
- _getRenderableIndexes6 = _slicedToArray(_getRenderableIndexes5, 1),
262
- initialFirstColumnToRender = _getRenderableIndexes6[0];
263
- var firstColumnToRender = getFirstNonSpannedColumnToRender({
264
- firstColumnToRender: initialFirstColumnToRender,
265
- apiRef: apiRef,
266
- firstRowToRender: firstRowToRender,
267
- lastRowToRender: lastRowToRender,
268
- visibleRows: currentPage.rows
269
106
  });
270
- var direction = theme.direction === 'ltr' ? 1 : -1;
271
- var top = gridRowsMetaSelector(apiRef.current.state).positions[firstRowToRender];
272
- var left = direction * gridColumnPositionsSelector(apiRef)[firstColumnToRender]; // Call directly the selector because it might be outdated when this method is called
273
- renderZoneRef.current.style.transform = "translate3d(".concat(left, "px, ").concat(top, "px, 0px)");
274
- if (typeof onRenderZonePositioning === 'function') {
275
- onRenderZonePositioning({
276
- top: top,
277
- left: left
278
- });
107
+
108
+ // The lazy-loading hook is listening to `renderedRowsIntervalChange`,
109
+ // but only does something if the dimensions are also available.
110
+ // So we wait until we have valid dimensions before publishing the first event.
111
+ if (dimensions.isReady && didRowsIntervalChange) {
112
+ previousRowContext.current = nextRenderContext;
113
+ apiRef.current.publishEvent('renderedRowsIntervalChange', nextRenderContext);
279
114
  }
280
- }, [apiRef, currentPage.rows, onRenderZonePositioning, renderZoneMinColumnIndex, renderZoneMaxColumnIndex, rootProps.columnBuffer, rootProps.rowBuffer, theme.direction]);
281
- var getRenderContext = React.useCallback(function () {
282
- return prevRenderContext.current;
283
- }, []);
284
- var setRenderContext = React.useCallback(function (nextRenderContext) {
285
- if (prevRenderContext.current && areRenderContextsEqual(nextRenderContext, prevRenderContext.current)) {
286
- updateRenderZonePosition(nextRenderContext);
287
- return;
115
+ previousContext.current = rawRenderContext;
116
+ prevTotalWidth.current = dimensions.columnsTotalWidth;
117
+ }, [apiRef, dimensions.isReady, dimensions.columnsTotalWidth]);
118
+ var triggerUpdateRenderContext = function triggerUpdateRenderContext() {
119
+ var inputs = inputsSelector(apiRef, rootProps, enabled, enabledForColumns);
120
+ var _computeRenderContext = computeRenderContext(inputs, scrollPosition),
121
+ _computeRenderContext2 = _slicedToArray(_computeRenderContext, 2),
122
+ nextRenderContext = _computeRenderContext2[0],
123
+ rawRenderContext = _computeRenderContext2[1];
124
+
125
+ // Since previous render, we have scrolled...
126
+ var topRowsScrolled = Math.abs(rawRenderContext.firstRowIndex - previousContext.current.firstRowIndex);
127
+ var bottomRowsScrolled = Math.abs(rawRenderContext.lastRowIndex - previousContext.current.lastRowIndex);
128
+ var topColumnsScrolled = Math.abs(rawRenderContext.firstColumnIndex - previousContext.current.firstColumnIndex);
129
+ var bottomColumnsScrolled = Math.abs(rawRenderContext.lastColumnIndex - previousContext.current.lastColumnIndex);
130
+ var shouldUpdate = topRowsScrolled >= rootProps.rowThreshold || bottomRowsScrolled >= rootProps.rowThreshold || topColumnsScrolled >= rootProps.columnThreshold || bottomColumnsScrolled >= rootProps.columnThreshold || prevTotalWidth.current !== dimensions.columnsTotalWidth;
131
+ if (!shouldUpdate) {
132
+ return previousContext.current;
288
133
  }
289
- setRenderContextState(nextRenderContext);
290
- updateRenderZonePosition(nextRenderContext);
291
- var _getRenderableIndexes7 = getRenderableIndexes({
292
- firstIndex: nextRenderContext.firstRowIndex,
293
- lastIndex: nextRenderContext.lastRowIndex,
294
- minFirstIndex: 0,
295
- maxLastIndex: currentPage.rows.length,
296
- buffer: rootProps.rowBuffer
297
- }),
298
- _getRenderableIndexes8 = _slicedToArray(_getRenderableIndexes7, 2),
299
- firstRowToRender = _getRenderableIndexes8[0],
300
- lastRowToRender = _getRenderableIndexes8[1];
301
- apiRef.current.publishEvent('renderedRowsIntervalChange', {
302
- firstRowToRender: firstRowToRender,
303
- lastRowToRender: lastRowToRender
134
+
135
+ // Prevents batching render context changes
136
+ ReactDOM.flushSync(function () {
137
+ updateRenderContext(nextRenderContext, rawRenderContext);
304
138
  });
305
- prevRenderContext.current = nextRenderContext;
306
- }, [apiRef, setRenderContextState, prevRenderContext, currentPage.rows.length, rootProps.rowBuffer, updateRenderZonePosition]);
307
- useEnhancedEffect(function () {
308
- if (containerDimensions.width == null) {
309
- return;
310
- }
311
- var initialRenderContext = computeRenderContext();
312
- setRenderContext(initialRenderContext);
313
- var _ref3 = scrollPosition.current,
314
- top = _ref3.top,
315
- left = _ref3.left;
316
- var params = {
317
- top: top,
318
- left: left,
319
- renderContext: initialRenderContext
320
- };
321
- apiRef.current.publishEvent('scrollPositionChange', params);
322
- }, [apiRef, computeRenderContext, containerDimensions.width, setRenderContext]);
139
+ return nextRenderContext;
140
+ };
141
+ var forceUpdateRenderContext = function forceUpdateRenderContext() {
142
+ var inputs = inputsSelector(apiRef, rootProps, enabled, enabledForColumns);
143
+ var _computeRenderContext3 = computeRenderContext(inputs, scrollPosition),
144
+ _computeRenderContext4 = _slicedToArray(_computeRenderContext3, 2),
145
+ nextRenderContext = _computeRenderContext4[0],
146
+ rawRenderContext = _computeRenderContext4[1];
147
+ updateRenderContext(nextRenderContext, rawRenderContext);
148
+ };
323
149
  var handleScroll = useEventCallback(function (event) {
324
150
  var _event$currentTarget = event.currentTarget,
325
151
  scrollTop = _event$currentTarget.scrollTop,
326
152
  scrollLeft = _event$currentTarget.scrollLeft;
327
- scrollPosition.current.top = scrollTop;
328
- scrollPosition.current.left = scrollLeft;
153
+ scrollPosition.top = scrollTop;
154
+ scrollPosition.left = scrollLeft;
329
155
 
330
156
  // On iOS and macOS, negative offsets are possible when swiping past the start
331
- if (!prevRenderContext.current || scrollTop < 0) {
157
+ if (scrollTop < 0) {
332
158
  return;
333
159
  }
334
160
  if (theme.direction === 'ltr') {
@@ -341,26 +167,12 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
341
167
  return;
342
168
  }
343
169
  }
344
-
345
- // When virtualization is disabled, the context never changes during scroll
346
- var nextRenderContext = enabled ? computeRenderContext() : prevRenderContext.current;
347
- var topRowsScrolledSincePreviousRender = Math.abs(nextRenderContext.firstRowIndex - prevRenderContext.current.firstRowIndex);
348
- var bottomRowsScrolledSincePreviousRender = Math.abs(nextRenderContext.lastRowIndex - prevRenderContext.current.lastRowIndex);
349
- var topColumnsScrolledSincePreviousRender = Math.abs(nextRenderContext.firstColumnIndex - prevRenderContext.current.firstColumnIndex);
350
- var bottomColumnsScrolledSincePreviousRender = Math.abs(nextRenderContext.lastColumnIndex - prevRenderContext.current.lastColumnIndex);
351
- var shouldSetState = topRowsScrolledSincePreviousRender >= rootProps.rowThreshold || bottomRowsScrolledSincePreviousRender >= rootProps.rowThreshold || topColumnsScrolledSincePreviousRender >= rootProps.columnThreshold || bottomColumnsScrolledSincePreviousRender >= rootProps.columnThreshold || prevTotalWidth.current !== columnsTotalWidth;
170
+ var nextRenderContext = triggerUpdateRenderContext();
352
171
  apiRef.current.publishEvent('scrollPositionChange', {
353
172
  top: scrollTop,
354
173
  left: scrollLeft,
355
- renderContext: shouldSetState ? nextRenderContext : prevRenderContext.current
356
- }, event);
357
- if (shouldSetState) {
358
- // Prevents batching render context changes
359
- ReactDOM.flushSync(function () {
360
- setRenderContext(nextRenderContext);
361
- });
362
- prevTotalWidth.current = columnsTotalWidth;
363
- }
174
+ renderContext: nextRenderContext
175
+ });
364
176
  });
365
177
  var handleWheel = useEventCallback(function (event) {
366
178
  apiRef.current.publishEvent('virtualScrollerWheel', {}, event);
@@ -368,262 +180,235 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
368
180
  var handleTouchMove = useEventCallback(function (event) {
369
181
  apiRef.current.publishEvent('virtualScrollerTouchMove', {}, event);
370
182
  });
371
- var indexOfRowWithFocusedCell = React.useMemo(function () {
372
- if (cellFocus !== null) {
373
- return currentPage.rows.findIndex(function (row) {
374
- return row.id === cellFocus.id;
375
- });
183
+ var minFirstColumn = pinnedColumns.left.length;
184
+ var maxLastColumn = visibleColumns.length - pinnedColumns.right.length;
185
+ var getRows = function getRows() {
186
+ var _params$rows, _rootProps$slotProps;
187
+ var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
188
+ var isLastSection = !hasBottomPinnedRows && params.position === undefined || hasBottomPinnedRows && params.position === 'bottom';
189
+ var isPinnedSection = params.position !== undefined;
190
+ var rowIndexOffset;
191
+ // FIXME: Why is the switch check exhaustiveness not validated with typescript-eslint?
192
+ // eslint-disable-next-line default-case
193
+ switch (params.position) {
194
+ case 'top':
195
+ rowIndexOffset = 0;
196
+ break;
197
+ case 'bottom':
198
+ rowIndexOffset = pinnedRows.top.length + currentPage.rows.length;
199
+ break;
200
+ case undefined:
201
+ rowIndexOffset = pinnedRows.top.length;
202
+ break;
376
203
  }
377
- return -1;
378
- }, [cellFocus, currentPage.rows]);
379
- useGridApiEventHandler(apiRef, 'rowMouseOver', function (params, event) {
380
- var _params$id;
381
- if (event.currentTarget.contains(event.relatedTarget)) {
382
- return;
204
+ var firstRowToRender = renderContext.firstRowIndex;
205
+ var lastRowToRender = renderContext.lastRowIndex;
206
+ var firstColumnToRender = renderContext.firstColumnIndex;
207
+ var lastColumnToRender = renderContext.lastColumnIndex;
208
+ if (!params.rows && !currentPage.range) {
209
+ return [];
383
210
  }
384
- setHoveredRowId((_params$id = params.id) != null ? _params$id : null);
385
- });
386
- useGridApiEventHandler(apiRef, 'rowMouseOut', function (params, event) {
387
- if (event.currentTarget.contains(event.relatedTarget)) {
388
- return;
211
+ var renderedRows = (_params$rows = params.rows) != null ? _params$rows : currentPage.rows.slice(firstRowToRender, lastRowToRender);
212
+
213
+ // If the selected row is not within the current range of rows being displayed,
214
+ // we need to render it at either the top or bottom of the rows,
215
+ // depending on whether it is above or below the range.
216
+ var isRowWithFocusedCellNotInRange = false;
217
+ if (!isPinnedSection && indexOfRowWithFocusedCell > -1 && (firstRowToRender > indexOfRowWithFocusedCell || lastRowToRender < indexOfRowWithFocusedCell)) {
218
+ isRowWithFocusedCellNotInRange = true;
219
+ var rowWithFocusedCell = currentPage.rows[indexOfRowWithFocusedCell];
220
+ if (indexOfRowWithFocusedCell > firstRowToRender) {
221
+ renderedRows.push(rowWithFocusedCell);
222
+ } else {
223
+ renderedRows.unshift(rowWithFocusedCell);
224
+ }
389
225
  }
390
- setHoveredRowId(null);
391
- });
392
- var getRows = function getRows() {
393
- var _rootProps$slotProps;
394
- var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
395
- renderContext: renderContext
396
- };
397
- var onRowRender = params.onRowRender,
398
- nextRenderContext = params.renderContext,
399
- _params$minFirstColum = params.minFirstColumn,
400
- minFirstColumn = _params$minFirstColum === void 0 ? renderZoneMinColumnIndex : _params$minFirstColum,
401
- _params$maxLastColumn = params.maxLastColumn,
402
- maxLastColumn = _params$maxLastColumn === void 0 ? renderZoneMaxColumnIndex : _params$maxLastColumn,
403
- _params$availableSpac = params.availableSpace,
404
- availableSpace = _params$availableSpac === void 0 ? containerDimensions.width : _params$availableSpac,
405
- _params$rowIndexOffse = params.rowIndexOffset,
406
- rowIndexOffset = _params$rowIndexOffse === void 0 ? 0 : _params$rowIndexOffse,
407
- _params$position = params.position,
408
- position = _params$position === void 0 ? 'center' : _params$position;
409
- if (!nextRenderContext || availableSpace == null) {
410
- return null;
226
+ var isColumnWihFocusedCellNotInRange = false;
227
+ if (!isPinnedSection && (firstColumnToRender > indexOfColumnWithFocusedCell || lastColumnToRender < indexOfColumnWithFocusedCell)) {
228
+ isColumnWihFocusedCellNotInRange = true;
411
229
  }
412
- var rowBuffer = enabled ? rootProps.rowBuffer : 0;
413
- var columnBuffer = enabled ? rootProps.columnBuffer : 0;
414
- var _getRenderableIndexes9 = getRenderableIndexes({
415
- firstIndex: nextRenderContext.firstRowIndex,
416
- lastIndex: nextRenderContext.lastRowIndex,
417
- minFirstIndex: 0,
418
- maxLastIndex: currentPage.rows.length,
419
- buffer: rowBuffer
420
- }),
421
- _getRenderableIndexes10 = _slicedToArray(_getRenderableIndexes9, 2),
422
- firstRowToRender = _getRenderableIndexes10[0],
423
- lastRowToRender = _getRenderableIndexes10[1];
424
- var renderedRows = [];
425
- if (params.rows) {
426
- params.rows.forEach(function (row) {
427
- renderedRows.push(row);
428
- apiRef.current.calculateColSpan({
429
- rowId: row.id,
430
- minFirstColumn: minFirstColumn,
431
- maxLastColumn: maxLastColumn,
432
- columns: visibleColumns
433
- });
230
+ var _getRenderedColumns = getRenderedColumns(visibleColumns, firstColumnToRender, lastColumnToRender, minFirstColumn, maxLastColumn, isColumnWihFocusedCellNotInRange ? indexOfColumnWithFocusedCell : -1),
231
+ focusedCellColumnIndexNotInRange = _getRenderedColumns.focusedCellColumnIndexNotInRange,
232
+ renderedColumns = _getRenderedColumns.renderedColumns;
233
+ renderedRows.forEach(function (row) {
234
+ apiRef.current.calculateColSpan({
235
+ rowId: row.id,
236
+ minFirstColumn: minFirstColumn,
237
+ maxLastColumn: maxLastColumn,
238
+ columns: visibleColumns
434
239
  });
435
- } else {
436
- if (!currentPage.range) {
437
- return null;
438
- }
439
- for (var i = firstRowToRender; i < lastRowToRender; i += 1) {
440
- var row = currentPage.rows[i];
441
- renderedRows.push(row);
240
+ if (pinnedColumns.left.length > 0) {
442
241
  apiRef.current.calculateColSpan({
443
242
  rowId: row.id,
444
- minFirstColumn: minFirstColumn,
445
- maxLastColumn: maxLastColumn,
243
+ minFirstColumn: 0,
244
+ maxLastColumn: pinnedColumns.left.length,
446
245
  columns: visibleColumns
447
246
  });
448
247
  }
449
- }
450
- // If the selected row is not within the current range of rows being displayed,
451
- // we need to render it at either the top or bottom of the rows,
452
- // depending on whether it is above or below the range.
453
-
454
- var isRowWithFocusedCellNotInRange = false;
455
- if (indexOfRowWithFocusedCell > -1) {
456
- var rowWithFocusedCell = currentPage.rows[indexOfRowWithFocusedCell];
457
- if (firstRowToRender > indexOfRowWithFocusedCell || lastRowToRender < indexOfRowWithFocusedCell) {
458
- isRowWithFocusedCellNotInRange = true;
459
- if (indexOfRowWithFocusedCell > firstRowToRender) {
460
- renderedRows.push(rowWithFocusedCell);
461
- } else {
462
- renderedRows.unshift(rowWithFocusedCell);
463
- }
248
+ if (pinnedColumns.right.length > 0) {
464
249
  apiRef.current.calculateColSpan({
465
- rowId: rowWithFocusedCell.id,
466
- minFirstColumn: minFirstColumn,
467
- maxLastColumn: maxLastColumn,
250
+ rowId: row.id,
251
+ minFirstColumn: visibleColumns.length - pinnedColumns.right.length,
252
+ maxLastColumn: visibleColumns.length,
468
253
  columns: visibleColumns
469
254
  });
470
255
  }
471
- }
472
- var _getRenderableIndexes11 = getRenderableIndexes({
473
- firstIndex: nextRenderContext.firstColumnIndex,
474
- lastIndex: nextRenderContext.lastColumnIndex,
475
- minFirstIndex: minFirstColumn,
476
- maxLastIndex: maxLastColumn,
477
- buffer: columnBuffer
478
- }),
479
- _getRenderableIndexes12 = _slicedToArray(_getRenderableIndexes11, 2),
480
- initialFirstColumnToRender = _getRenderableIndexes12[0],
481
- lastColumnToRender = _getRenderableIndexes12[1];
482
- var firstColumnToRender = getFirstNonSpannedColumnToRender({
483
- firstColumnToRender: initialFirstColumnToRender,
484
- apiRef: apiRef,
485
- firstRowToRender: firstRowToRender,
486
- lastRowToRender: lastRowToRender,
487
- visibleRows: currentPage.rows
488
256
  });
489
- var isColumnWihFocusedCellNotInRange = false;
490
- if (firstColumnToRender > indexOfColumnWithFocusedCell || lastColumnToRender < indexOfColumnWithFocusedCell) {
491
- isColumnWihFocusedCellNotInRange = true;
492
- }
493
- var _getRenderedColumnsRe = getRenderedColumnsRef.current(visibleColumns, firstColumnToRender, lastColumnToRender, minFirstColumn, maxLastColumn, isColumnWihFocusedCellNotInRange ? indexOfColumnWithFocusedCell : -1),
494
- focusedCellColumnIndexNotInRange = _getRenderedColumnsRe.focusedCellColumnIndexNotInRange,
495
- renderedColumns = _getRenderedColumnsRe.renderedColumns;
496
- var _ref4 = ((_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.row) || {},
497
- rootRowStyle = _ref4.style,
498
- rootRowProps = _objectWithoutProperties(_ref4, _excluded);
499
- var invalidatesCachedRowStyle = prevGetRowProps.current !== getRowProps || prevRootRowStyle.current !== rootRowStyle;
500
- if (invalidatesCachedRowStyle) {
501
- rowStyleCache.current = Object.create(null);
502
- }
503
257
  var rows = [];
258
+ var rowProps = (_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.row;
504
259
  var isRowWithFocusedCellRendered = false;
505
- for (var _i = 0; _i < renderedRows.length; _i += 1) {
506
- var _currentPage$range5;
507
- var _renderedRows$_i = renderedRows[_i],
508
- _id = _renderedRows$_i.id,
509
- _model = _renderedRows$_i.model;
510
- var isRowNotVisible = isRowWithFocusedCellNotInRange && cellFocus.id === _id;
511
- var lastVisibleRowIndex = isRowWithFocusedCellNotInRange ? firstRowToRender + _i === currentPage.rows.length : firstRowToRender + _i === currentPage.rows.length - 1;
512
- var baseRowHeight = !apiRef.current.rowHasAutoHeight(_id) ? apiRef.current.unstable_getRowHeight(_id) : 'auto';
260
+ for (var i = 0; i < renderedRows.length; i += 1) {
261
+ var _currentPage$range;
262
+ var _renderedRows$i = renderedRows[i],
263
+ id = _renderedRows$i.id,
264
+ model = _renderedRows$i.model;
265
+ var isRowNotVisible = isRowWithFocusedCellNotInRange && cellFocus.id === id;
266
+ var baseRowHeight = !apiRef.current.rowHasAutoHeight(id) ? apiRef.current.unstable_getRowHeight(id) : 'auto';
513
267
  var isSelected = void 0;
514
- if (selectedRowsLookup[_id] == null) {
268
+ if (selectedRowsLookup[id] == null) {
515
269
  isSelected = false;
516
270
  } else {
517
- isSelected = apiRef.current.isRowSelectable(_id);
271
+ isSelected = apiRef.current.isRowSelectable(id);
272
+ }
273
+ var isFirstVisible = false;
274
+ if (params.position === undefined) {
275
+ isFirstVisible = i === 0;
518
276
  }
519
- if (onRowRender) {
520
- onRowRender(_id);
277
+ var isLastVisible = false;
278
+ if (isLastSection) {
279
+ if (!isPinnedSection) {
280
+ var lastIndex = currentPage.rows.length - 1;
281
+ var isLastVisibleRowIndex = isRowWithFocusedCellNotInRange ? firstRowToRender + i === lastIndex + 1 : firstRowToRender + i === lastIndex;
282
+ if (isLastVisibleRowIndex) {
283
+ isLastVisible = true;
284
+ }
285
+ } else {
286
+ isLastVisible = i === renderedRows.length - 1;
287
+ }
521
288
  }
522
- var focusedCell = cellFocus !== null && cellFocus.id === _id ? cellFocus.field : null;
289
+ var focusedCell = cellFocus !== null && cellFocus.id === id ? cellFocus.field : null;
523
290
  var columnWithFocusedCellNotInRange = focusedCellColumnIndexNotInRange !== undefined && visibleColumns[focusedCellColumnIndexNotInRange];
524
291
  var renderedColumnsWithFocusedCell = columnWithFocusedCellNotInRange && focusedCell ? [columnWithFocusedCellNotInRange].concat(_toConsumableArray(renderedColumns)) : renderedColumns;
525
292
  var tabbableCell = null;
526
- if (cellTabIndex !== null && cellTabIndex.id === _id) {
527
- var cellParams = apiRef.current.getCellParams(_id, cellTabIndex.field);
293
+ if (cellTabIndex !== null && cellTabIndex.id === id) {
294
+ var cellParams = apiRef.current.getCellParams(id, cellTabIndex.field);
528
295
  tabbableCell = cellParams.cellMode === 'view' ? cellTabIndex.field : null;
529
296
  }
530
- var _ref5 = typeof getRowProps === 'function' && getRowProps(_id, _model) || {},
531
- rowStyle = _ref5.style,
532
- rowProps = _objectWithoutProperties(_ref5, _excluded2);
533
- if (!rowStyleCache.current[_id]) {
534
- var style = _extends({}, rowStyle, rootRowStyle);
535
- rowStyleCache.current[_id] = style;
536
- }
537
- var index = rowIndexOffset + ((currentPage == null || (_currentPage$range5 = currentPage.range) == null ? void 0 : _currentPage$range5.firstRowIndex) || 0) + firstRowToRender + _i;
538
- if (isRowWithFocusedCellNotInRange && (cellFocus == null ? void 0 : cellFocus.id) === _id) {
297
+ var index = rowIndexOffset + ((currentPage == null || (_currentPage$range = currentPage.range) == null ? void 0 : _currentPage$range.firstRowIndex) || 0) + firstRowToRender + i;
298
+ if (isRowWithFocusedCellNotInRange && (cellFocus == null ? void 0 : cellFocus.id) === id) {
539
299
  index = indexOfRowWithFocusedCell;
540
300
  isRowWithFocusedCellRendered = true;
541
301
  } else if (isRowWithFocusedCellRendered) {
542
302
  index -= 1;
543
303
  }
544
304
  rows.push( /*#__PURE__*/_jsx(rootProps.slots.row, _extends({
545
- row: _model,
546
- rowId: _id,
547
- focusedCellColumnIndexNotInRange: focusedCellColumnIndexNotInRange,
548
- isNotVisible: isRowNotVisible,
305
+ row: model,
306
+ rowId: id,
307
+ index: index,
549
308
  rowHeight: baseRowHeight,
550
309
  focusedCell: focusedCell,
551
310
  tabbableCell: tabbableCell,
311
+ focusedCellColumnIndexNotInRange: focusedCellColumnIndexNotInRange,
552
312
  renderedColumns: renderedColumnsWithFocusedCell,
553
313
  visibleColumns: visibleColumns,
314
+ pinnedColumns: pinnedColumns,
554
315
  firstColumnToRender: firstColumnToRender,
555
316
  lastColumnToRender: lastColumnToRender,
556
317
  selected: isSelected,
557
- index: index,
558
- containerWidth: availableSpace,
559
- isLastVisible: lastVisibleRowIndex,
560
- position: position
561
- }, rowProps, rootRowProps, {
562
- hovered: hoveredRowId === _id,
563
- style: rowStyleCache.current[_id]
564
- }), _id));
318
+ dimensions: dimensions,
319
+ isFirstVisible: isFirstVisible,
320
+ isLastVisible: isLastVisible,
321
+ isNotVisible: isRowNotVisible
322
+ }, rowProps), id));
323
+ var panel = panels.get(id);
324
+ if (panel) {
325
+ rows.push(panel);
326
+ }
565
327
  }
566
- prevGetRowProps.current = getRowProps;
567
- prevRootRowStyle.current = rootRowStyle;
568
328
  return rows;
569
329
  };
570
- var needsHorizontalScrollbar = containerDimensions.width && columnsTotalWidth >= containerDimensions.width;
330
+ var needsHorizontalScrollbar = outerSize.width && columnsTotalWidth >= outerSize.width;
331
+ var scrollerStyle = React.useMemo(function () {
332
+ return {
333
+ overflowX: !needsHorizontalScrollbar ? 'hidden' : undefined,
334
+ overflowY: rootProps.autoHeight ? 'hidden' : undefined
335
+ };
336
+ }, [needsHorizontalScrollbar, rootProps.autoHeight]);
571
337
  var contentSize = React.useMemo(function () {
572
338
  // In cases where the columns exceed the available width,
573
339
  // the horizontal scrollbar should be shown even when there're no rows.
574
340
  // Keeping 1px as minimum height ensures that the scrollbar will visible if necessary.
575
- var height = Math.max(rowsMeta.currentPageTotalHeight, 1);
576
- var shouldExtendContent = false;
577
- if (rootRef != null && rootRef.current && height <= (rootRef == null ? void 0 : rootRef.current.clientHeight)) {
578
- shouldExtendContent = true;
579
- }
341
+ var height = Math.max(contentHeight, 1);
580
342
  var size = {
581
343
  width: needsHorizontalScrollbar ? columnsTotalWidth : 'auto',
582
- height: height,
583
- minHeight: shouldExtendContent ? '100%' : 'auto'
344
+ height: height
584
345
  };
585
- if (rootProps.autoHeight && currentPage.rows.length === 0) {
586
- size.height = getMinimalContentHeight(apiRef, rootProps.rowHeight); // Give room to show the overlay when there no rows.
346
+ if (rootProps.autoHeight) {
347
+ if (currentPage.rows.length === 0) {
348
+ size.height = getMinimalContentHeight(apiRef); // Give room to show the overlay when there no rows.
349
+ } else {
350
+ size.height = contentHeight;
351
+ }
587
352
  }
588
353
  return size;
589
- }, [apiRef, rootRef, columnsTotalWidth, rowsMeta.currentPageTotalHeight, needsHorizontalScrollbar, rootProps.autoHeight, rootProps.rowHeight, currentPage.rows.length]);
354
+ }, [apiRef, columnsTotalWidth, contentHeight, needsHorizontalScrollbar, rootProps.autoHeight, currentPage.rows.length]);
590
355
  React.useEffect(function () {
591
356
  apiRef.current.publishEvent('virtualScrollerContentSizeChange');
592
357
  }, [apiRef, contentSize]);
593
- var rootStyle = React.useMemo(function () {
594
- var style = {};
595
- if (!needsHorizontalScrollbar) {
596
- style.overflowX = 'hidden';
597
- }
598
- if (rootProps.autoHeight) {
599
- style.overflowY = 'hidden';
358
+ useEnhancedEffect(function () {
359
+ // FIXME: Is this really necessary?
360
+ apiRef.current.resize();
361
+ }, [apiRef, rowsMeta.currentPageTotalHeight]);
362
+ useEnhancedEffect(function () {
363
+ if (enabled) {
364
+ // TODO a scroll reset should not be necessary
365
+ scrollerRef.current.scrollLeft = 0;
366
+ scrollerRef.current.scrollTop = 0;
367
+ } else {
368
+ var _gridRootRef$current3, _gridRootRef$current4;
369
+ (_gridRootRef$current3 = gridRootRef.current) == null || _gridRootRef$current3.style.setProperty('--DataGrid-offsetTop', '0px');
370
+ (_gridRootRef$current4 = gridRootRef.current) == null || _gridRootRef$current4.style.setProperty('--DataGrid-offsetLeft', '0px');
600
371
  }
601
- return style;
602
- }, [needsHorizontalScrollbar, rootProps.autoHeight]);
372
+ }, [enabled, gridRootRef, scrollerRef]);
373
+ useRunOnce(outerSize.width !== 0, function () {
374
+ var inputs = inputsSelector(apiRef, rootProps, enabled, enabledForColumns);
375
+ var _computeRenderContext5 = computeRenderContext(inputs, scrollPosition),
376
+ _computeRenderContext6 = _slicedToArray(_computeRenderContext5, 2),
377
+ initialRenderContext = _computeRenderContext6[0],
378
+ rawRenderContext = _computeRenderContext6[1];
379
+ updateRenderContext(initialRenderContext, rawRenderContext);
380
+ apiRef.current.publishEvent('scrollPositionChange', {
381
+ top: scrollPosition.top,
382
+ left: scrollPosition.left,
383
+ renderContext: initialRenderContext
384
+ });
385
+ });
603
386
  apiRef.current.register('private', {
604
- getRenderContext: getRenderContext
387
+ updateRenderContext: forceUpdateRenderContext
605
388
  });
606
389
  return {
607
390
  renderContext: renderContext,
608
- updateRenderZonePosition: updateRenderZonePosition,
391
+ setPanels: setPanels,
609
392
  getRows: getRows,
610
- getRootProps: function getRootProps() {
611
- var inputProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
612
- return _extends({
613
- ref: handleRef,
393
+ getContainerProps: function getContainerProps() {
394
+ return {
395
+ ref: mainRef
396
+ };
397
+ },
398
+ getScrollerProps: function getScrollerProps() {
399
+ return {
400
+ ref: scrollerRef,
401
+ tabIndex: -1,
614
402
  onScroll: handleScroll,
615
403
  onWheel: handleWheel,
616
- onTouchMove: handleTouchMove
617
- }, inputProps, {
618
- style: inputProps.style ? _extends({}, inputProps.style, rootStyle) : rootStyle,
404
+ onTouchMove: handleTouchMove,
405
+ style: scrollerStyle,
619
406
  role: 'presentation'
620
- });
407
+ };
621
408
  },
622
409
  getContentProps: function getContentProps() {
623
- var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
624
- style = _ref6.style;
625
410
  return {
626
- style: style ? _extends({}, style, contentSize) : contentSize,
411
+ style: contentSize,
627
412
  role: 'presentation'
628
413
  };
629
414
  },
@@ -632,6 +417,228 @@ export var useGridVirtualScroller = function useGridVirtualScroller(props) {
632
417
  ref: renderZoneRef,
633
418
  role: 'rowgroup'
634
419
  };
420
+ },
421
+ getScrollbarVerticalProps: function getScrollbarVerticalProps() {
422
+ return {
423
+ ref: scrollbarVerticalRef,
424
+ role: 'presentation'
425
+ };
426
+ },
427
+ getScrollbarHorizontalProps: function getScrollbarHorizontalProps() {
428
+ return {
429
+ ref: scrollbarHorizontalRef,
430
+ role: 'presentation'
431
+ };
635
432
  }
636
433
  };
637
- };
434
+ };
435
+ function createGetRenderedColumns() {
436
+ return defaultMemoize(function (columns, firstColumnToRender, lastColumnToRender, minFirstColumn, maxLastColumn, indexOfColumnWithFocusedCell) {
437
+ // If the selected column is not within the current range of columns being displayed,
438
+ // we need to render it at either the left or right of the columns,
439
+ // depending on whether it is above or below the range.
440
+ var focusedCellColumnIndexNotInRange;
441
+ var renderedColumns = columns.slice(firstColumnToRender, lastColumnToRender);
442
+ if (indexOfColumnWithFocusedCell > -1) {
443
+ // check if it is not on the left pinned column.
444
+ if (firstColumnToRender > indexOfColumnWithFocusedCell && indexOfColumnWithFocusedCell >= minFirstColumn) {
445
+ focusedCellColumnIndexNotInRange = indexOfColumnWithFocusedCell;
446
+ }
447
+ // check if it is not on the right pinned column.
448
+ else if (lastColumnToRender < indexOfColumnWithFocusedCell && indexOfColumnWithFocusedCell < maxLastColumn) {
449
+ focusedCellColumnIndexNotInRange = indexOfColumnWithFocusedCell;
450
+ }
451
+ }
452
+ return {
453
+ focusedCellColumnIndexNotInRange: focusedCellColumnIndexNotInRange,
454
+ renderedColumns: renderedColumns
455
+ };
456
+ });
457
+ }
458
+ function inputsSelector(apiRef, rootProps, enabled, enabledForColumns) {
459
+ var dimensions = gridDimensionsSelector(apiRef.current.state);
460
+ var currentPage = getVisibleRows(apiRef, rootProps);
461
+ return {
462
+ enabled: enabled,
463
+ enabledForColumns: enabledForColumns,
464
+ apiRef: apiRef,
465
+ autoHeight: rootProps.autoHeight,
466
+ rowBuffer: rootProps.rowBuffer,
467
+ columnBuffer: rootProps.columnBuffer,
468
+ leftPinnedWidth: dimensions.leftPinnedWidth,
469
+ columnsTotalWidth: dimensions.columnsTotalWidth,
470
+ viewportInnerWidth: dimensions.viewportInnerSize.width,
471
+ viewportInnerHeight: dimensions.viewportInnerSize.height,
472
+ rowsMeta: gridRowsMetaSelector(apiRef.current.state),
473
+ columnPositions: gridColumnPositionsSelector(apiRef),
474
+ rows: currentPage.rows,
475
+ range: currentPage.range,
476
+ pinnedColumns: gridVisiblePinnedColumnDefinitionsSelector(apiRef),
477
+ visibleColumns: gridVisibleColumnDefinitionsSelector(apiRef)
478
+ };
479
+ }
480
+ function computeRenderContext(inputs, scrollPosition) {
481
+ var renderContext;
482
+ if (!inputs.enabled) {
483
+ renderContext = {
484
+ firstRowIndex: 0,
485
+ lastRowIndex: inputs.rows.length,
486
+ firstColumnIndex: 0,
487
+ lastColumnIndex: inputs.visibleColumns.length
488
+ };
489
+ } else {
490
+ var top = scrollPosition.top,
491
+ left = scrollPosition.left;
492
+ var realLeft = Math.abs(left) + inputs.leftPinnedWidth;
493
+
494
+ // Clamp the value because the search may return an index out of bounds.
495
+ // In the last index, this is not needed because Array.slice doesn't include it.
496
+ var firstRowIndex = Math.min(getNearestIndexToRender(inputs, top), inputs.rowsMeta.positions.length - 1);
497
+ var lastRowIndex = inputs.autoHeight ? firstRowIndex + inputs.rows.length : getNearestIndexToRender(inputs, top + inputs.viewportInnerHeight);
498
+ var firstColumnIndex = 0;
499
+ var lastColumnIndex = inputs.columnPositions.length;
500
+ if (inputs.enabledForColumns) {
501
+ var hasRowWithAutoHeight = false;
502
+ var _getIndexesToRender = getIndexesToRender({
503
+ firstIndex: firstRowIndex,
504
+ lastIndex: lastRowIndex,
505
+ minFirstIndex: 0,
506
+ maxLastIndex: inputs.rows.length,
507
+ buffer: inputs.rowBuffer
508
+ }),
509
+ _getIndexesToRender2 = _slicedToArray(_getIndexesToRender, 2),
510
+ firstRowToRender = _getIndexesToRender2[0],
511
+ lastRowToRender = _getIndexesToRender2[1];
512
+ for (var i = firstRowToRender; i < lastRowToRender && !hasRowWithAutoHeight; i += 1) {
513
+ var row = inputs.rows[i];
514
+ hasRowWithAutoHeight = inputs.apiRef.current.rowHasAutoHeight(row.id);
515
+ }
516
+ if (!hasRowWithAutoHeight) {
517
+ firstColumnIndex = binarySearch(realLeft, inputs.columnPositions, {
518
+ atStart: true,
519
+ lastPosition: inputs.columnsTotalWidth
520
+ });
521
+ lastColumnIndex = binarySearch(realLeft + inputs.viewportInnerWidth, inputs.columnPositions);
522
+ }
523
+ }
524
+ renderContext = {
525
+ firstRowIndex: firstRowIndex,
526
+ lastRowIndex: lastRowIndex,
527
+ firstColumnIndex: firstColumnIndex,
528
+ lastColumnIndex: lastColumnIndex
529
+ };
530
+ }
531
+ var actualRenderContext = deriveRenderContext(inputs.apiRef, inputs.rowBuffer, inputs.columnBuffer, inputs.rows, inputs.pinnedColumns, inputs.visibleColumns, renderContext);
532
+ return [actualRenderContext, renderContext];
533
+ }
534
+ function getNearestIndexToRender(inputs, offset) {
535
+ var _inputs$range, _inputs$range2;
536
+ var lastMeasuredIndexRelativeToAllRows = inputs.apiRef.current.getLastMeasuredRowIndex();
537
+ var allRowsMeasured = lastMeasuredIndexRelativeToAllRows === Infinity;
538
+ if ((_inputs$range = inputs.range) != null && _inputs$range.lastRowIndex && !allRowsMeasured) {
539
+ // Check if all rows in this page are already measured
540
+ allRowsMeasured = lastMeasuredIndexRelativeToAllRows >= inputs.range.lastRowIndex;
541
+ }
542
+ var lastMeasuredIndexRelativeToCurrentPage = clamp(lastMeasuredIndexRelativeToAllRows - (((_inputs$range2 = inputs.range) == null ? void 0 : _inputs$range2.firstRowIndex) || 0), 0, inputs.rowsMeta.positions.length);
543
+ if (allRowsMeasured || inputs.rowsMeta.positions[lastMeasuredIndexRelativeToCurrentPage] >= offset) {
544
+ // If all rows were measured (when no row has "auto" as height) or all rows before the offset
545
+ // were measured, then use a binary search because it's faster.
546
+ return binarySearch(offset, inputs.rowsMeta.positions);
547
+ }
548
+
549
+ // Otherwise, use an exponential search.
550
+ // If rows have "auto" as height, their positions will be based on estimated heights.
551
+ // In this case, we can skip several steps until we find a position higher than the offset.
552
+ // Inspired by https://github.com/bvaughn/react-virtualized/blob/master/source/Grid/utils/CellSizeAndPositionManager.js
553
+ return exponentialSearch(offset, inputs.rowsMeta.positions, lastMeasuredIndexRelativeToCurrentPage);
554
+ }
555
+
556
+ /**
557
+ * Accepts as input a raw render context (the area visible in the viewport) and adds
558
+ * computes the actual render context based on pinned elements, buffer dimensions and
559
+ * spanning.
560
+ */
561
+ function deriveRenderContext(apiRef, rowBuffer, columnBuffer, rows, pinnedColumns, visibleColumns, nextRenderContext) {
562
+ var _getIndexesToRender3 = getIndexesToRender({
563
+ firstIndex: nextRenderContext.firstRowIndex,
564
+ lastIndex: nextRenderContext.lastRowIndex,
565
+ minFirstIndex: 0,
566
+ maxLastIndex: rows.length,
567
+ buffer: rowBuffer
568
+ }),
569
+ _getIndexesToRender4 = _slicedToArray(_getIndexesToRender3, 2),
570
+ firstRowToRender = _getIndexesToRender4[0],
571
+ lastRowToRender = _getIndexesToRender4[1];
572
+ var _getIndexesToRender5 = getIndexesToRender({
573
+ firstIndex: nextRenderContext.firstColumnIndex,
574
+ lastIndex: nextRenderContext.lastColumnIndex,
575
+ minFirstIndex: pinnedColumns.left.length,
576
+ maxLastIndex: visibleColumns.length - pinnedColumns.right.length,
577
+ buffer: columnBuffer
578
+ }),
579
+ _getIndexesToRender6 = _slicedToArray(_getIndexesToRender5, 2),
580
+ initialFirstColumnToRender = _getIndexesToRender6[0],
581
+ lastColumnToRender = _getIndexesToRender6[1];
582
+ var firstColumnToRender = getFirstNonSpannedColumnToRender({
583
+ firstColumnToRender: initialFirstColumnToRender,
584
+ apiRef: apiRef,
585
+ firstRowToRender: firstRowToRender,
586
+ lastRowToRender: lastRowToRender,
587
+ visibleRows: rows
588
+ });
589
+ return {
590
+ firstRowIndex: firstRowToRender,
591
+ lastRowIndex: lastRowToRender,
592
+ firstColumnIndex: firstColumnToRender,
593
+ lastColumnIndex: lastColumnToRender
594
+ };
595
+ }
596
+ /**
597
+ * Use binary search to avoid looping through all possible positions.
598
+ * The `options.atStart` provides the possibility to match for the first element that
599
+ * intersects the screen, even if said element's start position is before `offset`. In
600
+ * other words, we search for `offset + width`.
601
+ */
602
+ function binarySearch(offset, positions) {
603
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
604
+ var sliceStart = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
605
+ var sliceEnd = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : positions.length;
606
+ if (positions.length <= 0) {
607
+ return -1;
608
+ }
609
+ if (sliceStart >= sliceEnd) {
610
+ return sliceStart;
611
+ }
612
+ var pivot = sliceStart + Math.floor((sliceEnd - sliceStart) / 2);
613
+ var position = positions[pivot];
614
+ var isBefore;
615
+ if (options != null && options.atStart) {
616
+ var width = (pivot === positions.length - 1 ? options.lastPosition : positions[pivot + 1]) - position;
617
+ isBefore = offset - width < position;
618
+ } else {
619
+ isBefore = offset <= position;
620
+ }
621
+ return isBefore ? binarySearch(offset, positions, options, sliceStart, pivot) : binarySearch(offset, positions, options, pivot + 1, sliceEnd);
622
+ }
623
+ function exponentialSearch(offset, positions, index) {
624
+ var interval = 1;
625
+ while (index < positions.length && Math.abs(positions[index]) < offset) {
626
+ index += interval;
627
+ interval *= 2;
628
+ }
629
+ return binarySearch(offset, positions, undefined, Math.floor(index / 2), Math.min(index, positions.length));
630
+ }
631
+ function getIndexesToRender(_ref) {
632
+ var firstIndex = _ref.firstIndex,
633
+ lastIndex = _ref.lastIndex,
634
+ buffer = _ref.buffer,
635
+ minFirstIndex = _ref.minFirstIndex,
636
+ maxLastIndex = _ref.maxLastIndex;
637
+ return [clamp(firstIndex - buffer, minFirstIndex, maxLastIndex), clamp(lastIndex + buffer, minFirstIndex, maxLastIndex)];
638
+ }
639
+ export function areRenderContextsEqual(context1, context2) {
640
+ if (context1 === context2) {
641
+ return true;
642
+ }
643
+ return context1.firstRowIndex === context2.firstRowIndex && context1.lastRowIndex === context2.lastRowIndex && context1.firstColumnIndex === context2.firstColumnIndex && context1.lastColumnIndex === context2.lastColumnIndex;
644
+ }