@mui/x-data-grid 5.14.0 → 5.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/CHANGELOG.md +147 -5
  2. package/DataGrid/DataGrid.js +7 -1
  3. package/DataGrid/useDataGridProps.js +1 -0
  4. package/colDef/gridStringColDef.js +1 -1
  5. package/components/GridRow.js +5 -1
  6. package/components/base/GridOverlays.js +2 -2
  7. package/components/cell/GridEditInputCell.d.ts +2 -5
  8. package/components/cell/GridEditInputCell.js +13 -14
  9. package/components/cell/GridEditSingleSelectCell.d.ts +4 -0
  10. package/components/cell/GridEditSingleSelectCell.js +11 -4
  11. package/components/columnSelection/GridCellCheckboxRenderer.js +5 -0
  12. package/components/containers/GridRoot.js +4 -2
  13. package/components/toolbar/GridToolbarDensitySelector.js +13 -4
  14. package/components/toolbar/GridToolbarExportContainer.js +13 -2
  15. package/constants/envConstants.d.ts +1 -1
  16. package/constants/envConstants.js +2 -11
  17. package/constants/gridClasses.d.ts +16 -0
  18. package/constants/gridClasses.js +1 -1
  19. package/constants/localeTextConstants.js +1 -1
  20. package/hooks/features/dimensions/useGridDimensions.js +6 -1
  21. package/hooks/features/editRows/useGridCellEditing.new.d.ts +1 -1
  22. package/hooks/features/editRows/useGridCellEditing.new.js +26 -16
  23. package/hooks/features/editRows/useGridCellEditing.old.js +2 -2
  24. package/hooks/features/editRows/useGridEditing.new.d.ts +1 -1
  25. package/hooks/features/editRows/useGridEditing.new.js +4 -0
  26. package/hooks/features/editRows/useGridEditing.old.js +1 -1
  27. package/hooks/features/editRows/useGridRowEditing.new.d.ts +1 -1
  28. package/hooks/features/editRows/useGridRowEditing.new.js +16 -10
  29. package/hooks/features/export/utils.js +8 -1
  30. package/hooks/features/filter/gridFilterState.d.ts +12 -1
  31. package/hooks/features/filter/gridFilterUtils.d.ts +8 -5
  32. package/hooks/features/filter/gridFilterUtils.js +74 -43
  33. package/hooks/features/filter/useGridFilter.js +16 -3
  34. package/hooks/features/focus/useGridFocus.js +11 -6
  35. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.d.ts +1 -1
  36. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +42 -34
  37. package/hooks/features/pagination/useGridPageSize.js +3 -1
  38. package/hooks/features/rows/gridRowsSelector.d.ts +14 -0
  39. package/hooks/features/rows/gridRowsSelector.js +20 -1
  40. package/hooks/features/rows/gridRowsState.d.ts +8 -1
  41. package/hooks/features/rows/gridRowsUtils.d.ts +4 -0
  42. package/hooks/features/rows/gridRowsUtils.js +21 -3
  43. package/hooks/features/rows/index.d.ts +1 -1
  44. package/hooks/features/rows/index.js +1 -1
  45. package/hooks/features/rows/useGridRows.js +5 -2
  46. package/hooks/features/rows/useGridRowsMeta.js +19 -4
  47. package/hooks/features/rows/useGridRowsPreProcessors.js +2 -1
  48. package/hooks/features/scroll/useGridScroll.js +7 -2
  49. package/hooks/features/selection/useGridSelection.js +7 -3
  50. package/hooks/features/sorting/useGridSorting.js +8 -0
  51. package/hooks/features/statePersistence/gridStatePersistenceInterface.d.ts +3 -0
  52. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +3 -1
  53. package/hooks/features/virtualization/useGridVirtualScroller.js +31 -16
  54. package/index.js +1 -1
  55. package/internals/index.d.ts +5 -1
  56. package/internals/index.js +4 -0
  57. package/legacy/DataGrid/DataGrid.js +7 -1
  58. package/legacy/DataGrid/useDataGridProps.js +1 -0
  59. package/legacy/colDef/gridStringColDef.js +1 -1
  60. package/legacy/components/GridRow.js +5 -1
  61. package/legacy/components/base/GridOverlays.js +2 -2
  62. package/legacy/components/cell/GridEditInputCell.js +13 -14
  63. package/legacy/components/cell/GridEditSingleSelectCell.js +11 -3
  64. package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +5 -0
  65. package/legacy/components/containers/GridRoot.js +4 -2
  66. package/legacy/components/toolbar/GridToolbarDensitySelector.js +14 -5
  67. package/legacy/components/toolbar/GridToolbarExportContainer.js +15 -2
  68. package/legacy/constants/envConstants.js +2 -11
  69. package/legacy/constants/gridClasses.js +1 -1
  70. package/legacy/constants/localeTextConstants.js +1 -1
  71. package/legacy/hooks/features/dimensions/useGridDimensions.js +6 -1
  72. package/legacy/hooks/features/editRows/useGridCellEditing.new.js +27 -17
  73. package/legacy/hooks/features/editRows/useGridCellEditing.old.js +2 -2
  74. package/legacy/hooks/features/editRows/useGridEditing.new.js +4 -0
  75. package/legacy/hooks/features/editRows/useGridEditing.old.js +1 -1
  76. package/legacy/hooks/features/editRows/useGridRowEditing.new.js +16 -10
  77. package/legacy/hooks/features/export/utils.js +13 -1
  78. package/legacy/hooks/features/filter/gridFilterUtils.js +84 -55
  79. package/legacy/hooks/features/filter/useGridFilter.js +16 -3
  80. package/legacy/hooks/features/focus/useGridFocus.js +11 -6
  81. package/legacy/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +47 -34
  82. package/legacy/hooks/features/pagination/useGridPageSize.js +3 -1
  83. package/legacy/hooks/features/rows/gridRowsSelector.js +23 -0
  84. package/legacy/hooks/features/rows/gridRowsUtils.js +21 -3
  85. package/legacy/hooks/features/rows/index.js +1 -1
  86. package/legacy/hooks/features/rows/useGridRows.js +5 -2
  87. package/legacy/hooks/features/rows/useGridRowsMeta.js +19 -4
  88. package/legacy/hooks/features/rows/useGridRowsPreProcessors.js +2 -1
  89. package/legacy/hooks/features/scroll/useGridScroll.js +7 -2
  90. package/legacy/hooks/features/selection/useGridSelection.js +7 -3
  91. package/legacy/hooks/features/sorting/useGridSorting.js +8 -0
  92. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +32 -16
  93. package/legacy/index.js +1 -1
  94. package/legacy/internals/index.js +4 -0
  95. package/legacy/locales/arSD.js +1 -1
  96. package/legacy/locales/bgBG.js +1 -1
  97. package/legacy/locales/csCZ.js +1 -1
  98. package/legacy/locales/daDK.js +1 -1
  99. package/legacy/locales/deDE.js +9 -9
  100. package/legacy/locales/elGR.js +1 -1
  101. package/legacy/locales/esES.js +1 -1
  102. package/legacy/locales/faIR.js +1 -1
  103. package/legacy/locales/fiFI.js +1 -1
  104. package/legacy/locales/frFR.js +1 -1
  105. package/legacy/locales/heIL.js +1 -1
  106. package/legacy/locales/huHU.js +1 -1
  107. package/legacy/locales/itIT.js +15 -15
  108. package/legacy/locales/jaJP.js +3 -3
  109. package/legacy/locales/koKR.js +34 -30
  110. package/legacy/locales/nbNO.js +1 -1
  111. package/legacy/locales/nlNL.js +1 -1
  112. package/legacy/locales/plPL.js +1 -1
  113. package/legacy/locales/ptBR.js +1 -1
  114. package/legacy/locales/roRO.js +1 -1
  115. package/legacy/locales/ruRU.js +1 -1
  116. package/legacy/locales/skSK.js +1 -1
  117. package/legacy/locales/svSE.js +1 -1
  118. package/legacy/locales/trTR.js +1 -1
  119. package/legacy/locales/ukUA.js +1 -1
  120. package/legacy/locales/viVN.js +1 -1
  121. package/legacy/locales/zhCN.js +37 -33
  122. package/legacy/locales/zhTW.js +1 -1
  123. package/legacy/utils/keyboardUtils.js +8 -5
  124. package/locales/arSD.js +1 -1
  125. package/locales/bgBG.js +1 -1
  126. package/locales/csCZ.js +1 -1
  127. package/locales/daDK.js +1 -1
  128. package/locales/deDE.js +9 -9
  129. package/locales/elGR.js +1 -1
  130. package/locales/esES.js +1 -1
  131. package/locales/faIR.js +1 -1
  132. package/locales/fiFI.js +1 -1
  133. package/locales/frFR.js +1 -1
  134. package/locales/heIL.js +1 -1
  135. package/locales/huHU.js +1 -1
  136. package/locales/itIT.js +15 -15
  137. package/locales/jaJP.js +3 -3
  138. package/locales/koKR.js +30 -30
  139. package/locales/nbNO.js +1 -1
  140. package/locales/nlNL.js +1 -1
  141. package/locales/plPL.js +1 -1
  142. package/locales/ptBR.js +1 -1
  143. package/locales/roRO.js +1 -1
  144. package/locales/ruRU.js +1 -1
  145. package/locales/skSK.js +1 -1
  146. package/locales/svSE.js +1 -1
  147. package/locales/trTR.js +1 -1
  148. package/locales/ukUA.js +1 -1
  149. package/locales/viVN.js +1 -1
  150. package/locales/zhCN.js +33 -33
  151. package/locales/zhTW.js +1 -1
  152. package/models/gridRows.d.ts +5 -0
  153. package/models/props/DataGridProps.d.ts +8 -3
  154. package/modern/DataGrid/DataGrid.js +7 -1
  155. package/modern/DataGrid/useDataGridProps.js +1 -0
  156. package/modern/colDef/gridStringColDef.js +1 -1
  157. package/modern/components/GridRow.js +5 -1
  158. package/modern/components/base/GridOverlays.js +2 -2
  159. package/modern/components/cell/GridEditInputCell.js +13 -14
  160. package/modern/components/cell/GridEditSingleSelectCell.js +11 -4
  161. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +5 -0
  162. package/modern/components/containers/GridRoot.js +4 -2
  163. package/modern/components/toolbar/GridToolbarDensitySelector.js +11 -4
  164. package/modern/components/toolbar/GridToolbarExportContainer.js +11 -2
  165. package/modern/constants/envConstants.js +2 -11
  166. package/modern/constants/gridClasses.js +1 -1
  167. package/modern/constants/localeTextConstants.js +1 -1
  168. package/modern/hooks/features/dimensions/useGridDimensions.js +6 -1
  169. package/modern/hooks/features/editRows/useGridCellEditing.new.js +24 -16
  170. package/modern/hooks/features/editRows/useGridCellEditing.old.js +2 -2
  171. package/modern/hooks/features/editRows/useGridEditing.new.js +4 -0
  172. package/modern/hooks/features/editRows/useGridEditing.old.js +1 -1
  173. package/modern/hooks/features/editRows/useGridRowEditing.new.js +16 -10
  174. package/modern/hooks/features/export/utils.js +6 -1
  175. package/modern/hooks/features/filter/gridFilterUtils.js +73 -42
  176. package/modern/hooks/features/filter/useGridFilter.js +16 -3
  177. package/modern/hooks/features/focus/useGridFocus.js +11 -6
  178. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +42 -30
  179. package/modern/hooks/features/pagination/useGridPageSize.js +3 -1
  180. package/modern/hooks/features/rows/gridRowsSelector.js +18 -1
  181. package/modern/hooks/features/rows/gridRowsUtils.js +19 -3
  182. package/modern/hooks/features/rows/index.js +1 -1
  183. package/modern/hooks/features/rows/useGridRows.js +5 -2
  184. package/modern/hooks/features/rows/useGridRowsMeta.js +17 -4
  185. package/modern/hooks/features/rows/useGridRowsPreProcessors.js +2 -1
  186. package/modern/hooks/features/scroll/useGridScroll.js +5 -2
  187. package/modern/hooks/features/selection/useGridSelection.js +7 -1
  188. package/modern/hooks/features/sorting/useGridSorting.js +8 -0
  189. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +30 -15
  190. package/modern/index.js +1 -1
  191. package/modern/internals/index.js +4 -0
  192. package/modern/locales/arSD.js +1 -1
  193. package/modern/locales/bgBG.js +1 -1
  194. package/modern/locales/csCZ.js +1 -1
  195. package/modern/locales/daDK.js +1 -1
  196. package/modern/locales/deDE.js +9 -9
  197. package/modern/locales/elGR.js +1 -1
  198. package/modern/locales/esES.js +1 -1
  199. package/modern/locales/faIR.js +1 -1
  200. package/modern/locales/fiFI.js +1 -1
  201. package/modern/locales/frFR.js +1 -1
  202. package/modern/locales/heIL.js +1 -1
  203. package/modern/locales/huHU.js +1 -1
  204. package/modern/locales/itIT.js +15 -15
  205. package/modern/locales/jaJP.js +3 -3
  206. package/modern/locales/koKR.js +30 -30
  207. package/modern/locales/nbNO.js +1 -1
  208. package/modern/locales/nlNL.js +1 -1
  209. package/modern/locales/plPL.js +1 -1
  210. package/modern/locales/ptBR.js +1 -1
  211. package/modern/locales/roRO.js +1 -1
  212. package/modern/locales/ruRU.js +1 -1
  213. package/modern/locales/skSK.js +1 -1
  214. package/modern/locales/svSE.js +1 -1
  215. package/modern/locales/trTR.js +1 -1
  216. package/modern/locales/ukUA.js +1 -1
  217. package/modern/locales/viVN.js +1 -1
  218. package/modern/locales/zhCN.js +33 -33
  219. package/modern/locales/zhTW.js +1 -1
  220. package/modern/utils/keyboardUtils.js +7 -2
  221. package/node/DataGrid/DataGrid.js +7 -1
  222. package/node/DataGrid/useDataGridProps.js +1 -0
  223. package/node/colDef/gridStringColDef.js +1 -1
  224. package/node/components/GridRow.js +5 -1
  225. package/node/components/base/GridOverlays.js +2 -2
  226. package/node/components/cell/GridEditInputCell.js +15 -16
  227. package/node/components/cell/GridEditSingleSelectCell.js +10 -4
  228. package/node/components/columnSelection/GridCellCheckboxRenderer.js +5 -0
  229. package/node/components/containers/GridRoot.js +3 -1
  230. package/node/components/toolbar/GridToolbarDensitySelector.js +13 -4
  231. package/node/components/toolbar/GridToolbarExportContainer.js +13 -2
  232. package/node/constants/envConstants.js +2 -13
  233. package/node/constants/gridClasses.js +1 -1
  234. package/node/constants/localeTextConstants.js +1 -1
  235. package/node/hooks/features/dimensions/useGridDimensions.js +7 -1
  236. package/node/hooks/features/editRows/useGridCellEditing.new.js +26 -16
  237. package/node/hooks/features/editRows/useGridCellEditing.old.js +2 -2
  238. package/node/hooks/features/editRows/useGridEditing.new.js +4 -0
  239. package/node/hooks/features/editRows/useGridEditing.old.js +1 -1
  240. package/node/hooks/features/editRows/useGridRowEditing.new.js +16 -10
  241. package/node/hooks/features/export/utils.js +7 -0
  242. package/node/hooks/features/filter/gridFilterUtils.js +81 -47
  243. package/node/hooks/features/filter/useGridFilter.js +15 -2
  244. package/node/hooks/features/focus/useGridFocus.js +11 -6
  245. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +43 -34
  246. package/node/hooks/features/pagination/useGridPageSize.js +4 -1
  247. package/node/hooks/features/rows/gridRowsSelector.js +24 -2
  248. package/node/hooks/features/rows/gridRowsUtils.js +23 -2
  249. package/node/hooks/features/rows/index.js +70 -12
  250. package/node/hooks/features/rows/useGridRows.js +5 -2
  251. package/node/hooks/features/rows/useGridRowsMeta.js +20 -4
  252. package/node/hooks/features/rows/useGridRowsPreProcessors.js +2 -1
  253. package/node/hooks/features/scroll/useGridScroll.js +7 -1
  254. package/node/hooks/features/selection/useGridSelection.js +7 -3
  255. package/node/hooks/features/sorting/useGridSorting.js +8 -0
  256. package/node/hooks/features/virtualization/useGridVirtualScroller.js +31 -16
  257. package/node/index.js +1 -1
  258. package/node/internals/index.js +36 -0
  259. package/node/locales/arSD.js +1 -1
  260. package/node/locales/bgBG.js +1 -1
  261. package/node/locales/csCZ.js +1 -1
  262. package/node/locales/daDK.js +1 -1
  263. package/node/locales/deDE.js +9 -9
  264. package/node/locales/elGR.js +1 -1
  265. package/node/locales/esES.js +1 -1
  266. package/node/locales/faIR.js +1 -1
  267. package/node/locales/fiFI.js +1 -1
  268. package/node/locales/frFR.js +1 -1
  269. package/node/locales/heIL.js +1 -1
  270. package/node/locales/huHU.js +1 -1
  271. package/node/locales/itIT.js +15 -15
  272. package/node/locales/jaJP.js +3 -3
  273. package/node/locales/koKR.js +30 -30
  274. package/node/locales/nbNO.js +1 -1
  275. package/node/locales/nlNL.js +1 -1
  276. package/node/locales/plPL.js +1 -1
  277. package/node/locales/ptBR.js +1 -1
  278. package/node/locales/roRO.js +1 -1
  279. package/node/locales/ruRU.js +1 -1
  280. package/node/locales/skSK.js +1 -1
  281. package/node/locales/svSE.js +1 -1
  282. package/node/locales/trTR.js +1 -1
  283. package/node/locales/ukUA.js +1 -1
  284. package/node/locales/viVN.js +1 -1
  285. package/node/locales/zhCN.js +33 -33
  286. package/node/locales/zhTW.js +1 -1
  287. package/node/utils/keyboardUtils.js +10 -4
  288. package/package.json +1 -1
  289. package/utils/keyboardUtils.d.ts +2 -2
  290. package/utils/keyboardUtils.js +7 -2
@@ -27,10 +27,16 @@ var _keyboardUtils = require("../../../utils/keyboardUtils");
27
27
 
28
28
  var _gridDetailPanelToggleField = require("../../../constants/gridDetailPanelToggleField");
29
29
 
30
+ var _gridRowsSelector = require("../rows/gridRowsSelector");
31
+
30
32
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31
33
 
32
34
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
33
35
 
36
+ function enrichPageRowsWithPinnedRows(apiRef, rows) {
37
+ const pinnedRows = (0, _gridRowsSelector.gridPinnedRowsSelector)(apiRef) || {};
38
+ return [...(pinnedRows.top || []), ...rows, ...(pinnedRows.bottom || [])];
39
+ }
34
40
  /**
35
41
  * @requires useGridSorting (method) - can be after
36
42
  * @requires useGridFilter (state) - can be after
@@ -40,20 +46,20 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
40
46
  * @requires useGridScroll (method) - can be after
41
47
  * @requires useGridColumnSpanning (method) - can be after
42
48
  */
49
+
50
+
43
51
  const useGridKeyboardNavigation = (apiRef, props) => {
44
52
  const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useGridKeyboardNavigation');
45
- const currentPage = (0, _useGridVisibleRows.useGridVisibleRows)(apiRef, props);
53
+ const initialCurrentPageRows = (0, _useGridVisibleRows.useGridVisibleRows)(apiRef, props).rows;
54
+ const currentPageRows = React.useMemo(() => enrichPageRowsWithPinnedRows(apiRef, initialCurrentPageRows), [apiRef, initialCurrentPageRows]);
46
55
  /**
47
56
  * @param {number} colIndex Index of the column to focus
48
57
  * @param {number} rowIndex index of the row to focus
49
58
  * @param {string} closestColumnToUse Which closest column cell to use when the cell is spanned by `colSpan`.
50
59
  */
51
60
 
52
- const goToCell = React.useCallback((colIndex, rowIndex, closestColumnToUse = 'left') => {
53
- var _visibleSortedRows$ro;
54
-
61
+ const goToCell = React.useCallback((colIndex, rowId, closestColumnToUse = 'left') => {
55
62
  const visibleSortedRows = (0, _gridFilterSelector.gridVisibleSortedRowEntriesSelector)(apiRef);
56
- const rowId = (_visibleSortedRows$ro = visibleSortedRows[rowIndex]) == null ? void 0 : _visibleSortedRows$ro.id;
57
63
  const nextCellColSpanInfo = apiRef.current.unstable_getCellColSpanInfo(rowId, colIndex);
58
64
 
59
65
  if (nextCellColSpanInfo && nextCellColSpanInfo.spannedByColSpan) {
@@ -62,12 +68,15 @@ const useGridKeyboardNavigation = (apiRef, props) => {
62
68
  } else if (closestColumnToUse === 'right') {
63
69
  colIndex = nextCellColSpanInfo.rightVisibleCellIndex;
64
70
  }
65
- }
71
+ } // `scrollToIndexes` requires a rowIndex relative to all visible rows.
72
+ // Those rows do not include pinned rows, but pinned rows do not need scroll anyway.
73
+
66
74
 
67
- logger.debug(`Navigating to cell row ${rowIndex}, col ${colIndex}`);
75
+ const rowIndexRelativeToAllRows = visibleSortedRows.findIndex(row => row.id === rowId);
76
+ logger.debug(`Navigating to cell row ${rowIndexRelativeToAllRows}, col ${colIndex}`);
68
77
  apiRef.current.scrollToIndexes({
69
78
  colIndex,
70
- rowIndex
79
+ rowIndex: rowIndexRelativeToAllRows
71
80
  });
72
81
  const field = apiRef.current.getVisibleColumns()[colIndex].field;
73
82
  apiRef.current.setCellFocus(rowId, field);
@@ -80,19 +89,21 @@ const useGridKeyboardNavigation = (apiRef, props) => {
80
89
  const field = apiRef.current.getVisibleColumns()[colIndex].field;
81
90
  apiRef.current.setColumnHeaderFocus(field, event);
82
91
  }, [apiRef, logger]);
92
+ const getRowIdFromIndex = React.useCallback(rowIndex => {
93
+ return currentPageRows[rowIndex].id;
94
+ }, [currentPageRows]);
83
95
  const handleCellNavigationKeyDown = React.useCallback((params, event) => {
84
96
  const dimensions = apiRef.current.getRootDimensions();
85
97
 
86
- if (!currentPage.range || !dimensions) {
98
+ if (currentPageRows.length === 0 || !dimensions) {
87
99
  return;
88
100
  }
89
101
 
90
102
  const viewportPageSize = apiRef.current.unstable_getViewportPageSize();
91
- const visibleSortedRows = (0, _gridFilterSelector.gridVisibleSortedRowEntriesSelector)(apiRef);
92
103
  const colIndexBefore = params.field ? apiRef.current.getColumnIndex(params.field) : 0;
93
- const rowIndexBefore = visibleSortedRows.findIndex(row => row.id === params.id);
94
- const firstRowIndexInPage = currentPage.range.firstRowIndex;
95
- const lastRowIndexInPage = currentPage.range.lastRowIndex;
104
+ const rowIndexBefore = currentPageRows.findIndex(row => row.id === params.id);
105
+ const firstRowIndexInPage = 0;
106
+ const lastRowIndexInPage = currentPageRows.length - 1;
96
107
  const firstColIndex = 0;
97
108
  const lastColIndex = (0, _gridColumnsSelector.gridVisibleColumnDefinitionsSelector)(apiRef).length - 1;
98
109
  let shouldPreventDefault = true;
@@ -103,7 +114,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
103
114
  {
104
115
  // "Enter" is only triggered by the row / cell editing feature
105
116
  if (rowIndexBefore < lastRowIndexInPage) {
106
- goToCell(colIndexBefore, rowIndexBefore + 1);
117
+ goToCell(colIndexBefore, getRowIdFromIndex(rowIndexBefore + 1));
107
118
  }
108
119
 
109
120
  break;
@@ -112,7 +123,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
112
123
  case 'ArrowUp':
113
124
  {
114
125
  if (rowIndexBefore > firstRowIndexInPage) {
115
- goToCell(colIndexBefore, rowIndexBefore - 1);
126
+ goToCell(colIndexBefore, getRowIdFromIndex(rowIndexBefore - 1));
116
127
  } else {
117
128
  goToHeader(colIndexBefore, event);
118
129
  }
@@ -123,7 +134,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
123
134
  case 'ArrowRight':
124
135
  {
125
136
  if (colIndexBefore < lastColIndex) {
126
- goToCell(colIndexBefore + 1, rowIndexBefore, 'right');
137
+ goToCell(colIndexBefore + 1, getRowIdFromIndex(rowIndexBefore), 'right');
127
138
  }
128
139
 
129
140
  break;
@@ -132,7 +143,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
132
143
  case 'ArrowLeft':
133
144
  {
134
145
  if (colIndexBefore > firstColIndex) {
135
- goToCell(colIndexBefore - 1, rowIndexBefore);
146
+ goToCell(colIndexBefore - 1, getRowIdFromIndex(rowIndexBefore));
136
147
  }
137
148
 
138
149
  break;
@@ -142,9 +153,9 @@ const useGridKeyboardNavigation = (apiRef, props) => {
142
153
  {
143
154
  // "Tab" is only triggered by the row / cell editing feature
144
155
  if (event.shiftKey && colIndexBefore > firstColIndex) {
145
- goToCell(colIndexBefore - 1, rowIndexBefore, 'left');
156
+ goToCell(colIndexBefore - 1, getRowIdFromIndex(rowIndexBefore), 'left');
146
157
  } else if (!event.shiftKey && colIndexBefore < lastColIndex) {
147
- goToCell(colIndexBefore + 1, rowIndexBefore, 'right');
158
+ goToCell(colIndexBefore + 1, getRowIdFromIndex(rowIndexBefore), 'right');
148
159
  }
149
160
 
150
161
  break;
@@ -165,7 +176,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
165
176
  }
166
177
 
167
178
  if (!event.shiftKey && rowIndexBefore < lastRowIndexInPage) {
168
- goToCell(colIndexBefore, Math.min(rowIndexBefore + viewportPageSize, lastRowIndexInPage));
179
+ goToCell(colIndexBefore, getRowIdFromIndex(Math.min(rowIndexBefore + viewportPageSize, lastRowIndexInPage)));
169
180
  }
170
181
 
171
182
  break;
@@ -174,7 +185,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
174
185
  case 'PageDown':
175
186
  {
176
187
  if (rowIndexBefore < lastRowIndexInPage) {
177
- goToCell(colIndexBefore, Math.min(rowIndexBefore + viewportPageSize, lastRowIndexInPage));
188
+ goToCell(colIndexBefore, getRowIdFromIndex(Math.min(rowIndexBefore + viewportPageSize, lastRowIndexInPage)));
178
189
  }
179
190
 
180
191
  break;
@@ -186,7 +197,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
186
197
  const nextRowIndex = Math.max(rowIndexBefore - viewportPageSize, firstRowIndexInPage);
187
198
 
188
199
  if (nextRowIndex !== rowIndexBefore && nextRowIndex >= firstRowIndexInPage) {
189
- goToCell(colIndexBefore, nextRowIndex);
200
+ goToCell(colIndexBefore, getRowIdFromIndex(nextRowIndex));
190
201
  } else {
191
202
  goToHeader(colIndexBefore, event);
192
203
  }
@@ -197,9 +208,9 @@ const useGridKeyboardNavigation = (apiRef, props) => {
197
208
  case 'Home':
198
209
  {
199
210
  if (event.ctrlKey || event.metaKey || event.shiftKey) {
200
- goToCell(firstColIndex, firstRowIndexInPage);
211
+ goToCell(firstColIndex, getRowIdFromIndex(firstRowIndexInPage));
201
212
  } else {
202
- goToCell(firstColIndex, rowIndexBefore);
213
+ goToCell(firstColIndex, getRowIdFromIndex(rowIndexBefore));
203
214
  }
204
215
 
205
216
  break;
@@ -208,9 +219,9 @@ const useGridKeyboardNavigation = (apiRef, props) => {
208
219
  case 'End':
209
220
  {
210
221
  if (event.ctrlKey || event.metaKey || event.shiftKey) {
211
- goToCell(lastColIndex, lastRowIndexInPage);
222
+ goToCell(lastColIndex, getRowIdFromIndex(lastRowIndexInPage));
212
223
  } else {
213
- goToCell(lastColIndex, rowIndexBefore);
224
+ goToCell(lastColIndex, getRowIdFromIndex(rowIndexBefore));
214
225
  }
215
226
 
216
227
  break;
@@ -225,10 +236,8 @@ const useGridKeyboardNavigation = (apiRef, props) => {
225
236
  if (shouldPreventDefault) {
226
237
  event.preventDefault();
227
238
  }
228
- }, [apiRef, currentPage, goToCell, goToHeader]);
239
+ }, [apiRef, currentPageRows, goToCell, goToHeader, getRowIdFromIndex]);
229
240
  const handleColumnHeaderKeyDown = React.useCallback((params, event) => {
230
- var _currentPage$range$fi, _currentPage$range, _currentPage$range$la, _currentPage$range2;
231
-
232
241
  const headerTitleNode = event.currentTarget.querySelector(`.${_gridClasses.gridClasses.columnHeaderTitleContainerContent}`);
233
242
  const isFromInsideContent = !!headerTitleNode && headerTitleNode.contains(event.target);
234
243
 
@@ -246,8 +255,8 @@ const useGridKeyboardNavigation = (apiRef, props) => {
246
255
 
247
256
  const viewportPageSize = apiRef.current.unstable_getViewportPageSize();
248
257
  const colIndexBefore = params.field ? apiRef.current.getColumnIndex(params.field) : 0;
249
- const firstRowIndexInPage = (_currentPage$range$fi = (_currentPage$range = currentPage.range) == null ? void 0 : _currentPage$range.firstRowIndex) != null ? _currentPage$range$fi : null;
250
- const lastRowIndexInPage = (_currentPage$range$la = (_currentPage$range2 = currentPage.range) == null ? void 0 : _currentPage$range2.lastRowIndex) != null ? _currentPage$range$la : null;
258
+ const firstRowIndexInPage = 0;
259
+ const lastRowIndexInPage = currentPageRows.length - 1;
251
260
  const firstColIndex = 0;
252
261
  const lastColIndex = (0, _gridColumnsSelector.gridVisibleColumnDefinitionsSelector)(apiRef).length - 1;
253
262
  let shouldPreventDefault = true;
@@ -256,7 +265,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
256
265
  case 'ArrowDown':
257
266
  {
258
267
  if (firstRowIndexInPage !== null) {
259
- goToCell(colIndexBefore, firstRowIndexInPage);
268
+ goToCell(colIndexBefore, getRowIdFromIndex(firstRowIndexInPage));
260
269
  }
261
270
 
262
271
  break;
@@ -283,7 +292,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
283
292
  case 'PageDown':
284
293
  {
285
294
  if (firstRowIndexInPage !== null && lastRowIndexInPage !== null) {
286
- goToCell(colIndexBefore, Math.min(firstRowIndexInPage + viewportPageSize, lastRowIndexInPage));
295
+ goToCell(colIndexBefore, getRowIdFromIndex(Math.min(firstRowIndexInPage + viewportPageSize, lastRowIndexInPage)));
287
296
  }
288
297
 
289
298
  break;
@@ -325,7 +334,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
325
334
  if (shouldPreventDefault) {
326
335
  event.preventDefault();
327
336
  }
328
- }, [apiRef, currentPage, goToCell, goToHeader]);
337
+ }, [apiRef, currentPageRows, goToCell, goToHeader, getRowIdFromIndex]);
329
338
  const handleCellKeyDown = React.useCallback((params, event) => {
330
339
  // Ignore portal
331
340
  if (!event.currentTarget.contains(event.target)) {
@@ -19,6 +19,8 @@ var _density = require("../density");
19
19
 
20
20
  var _pipeProcessing = require("../../core/pipeProcessing");
21
21
 
22
+ var _gridRowsUtils = require("../rows/gridRowsUtils");
23
+
22
24
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
25
 
24
26
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -118,7 +120,8 @@ const useGridPageSize = (apiRef, props) => {
118
120
  return;
119
121
  }
120
122
 
121
- const maximumPageSizeWithoutScrollBar = Math.floor(dimensions.viewportInnerSize.height / rowHeight);
123
+ const pinnedRowsHeight = (0, _gridRowsUtils.calculatePinnedRowsHeight)(apiRef);
124
+ const maximumPageSizeWithoutScrollBar = Math.floor((dimensions.viewportInnerSize.height - pinnedRowsHeight.top - pinnedRowsHeight.bottom) / rowHeight);
122
125
  apiRef.current.setPageSize(maximumPageSizeWithoutScrollBar);
123
126
  }, [apiRef, props.autoPageSize, rowHeight]);
124
127
  (0, _utils.useGridApiEventHandler)(apiRef, 'viewportInnerSizeChange', handleUpdateAutoPageSize);
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.gridTopLevelRowCountSelector = exports.gridRowsStateSelector = exports.gridRowsLookupSelector = exports.gridRowsLoadingSelector = exports.gridRowsIdToIdLookupSelector = exports.gridRowTreeSelector = exports.gridRowTreeDepthSelector = exports.gridRowIdsSelector = exports.gridRowGroupingNameSelector = exports.gridRowCountSelector = void 0;
6
+ exports.gridTopLevelRowCountSelector = exports.gridRowsStateSelector = exports.gridRowsLookupSelector = exports.gridRowsLoadingSelector = exports.gridRowsIdToIdLookupSelector = exports.gridRowTreeSelector = exports.gridRowTreeDepthSelector = exports.gridRowIdsSelector = exports.gridRowGroupingNameSelector = exports.gridRowCountSelector = exports.gridPinnedRowsSelector = exports.gridPinnedRowsCountSelector = exports.gridAdditionalRowGroupsSelector = void 0;
7
7
 
8
8
  var _createSelector = require("../../../utils/createSelector");
9
9
 
@@ -27,4 +27,26 @@ exports.gridRowGroupingNameSelector = gridRowGroupingNameSelector;
27
27
  const gridRowTreeDepthSelector = (0, _createSelector.createSelector)(gridRowsStateSelector, rows => rows.treeDepth);
28
28
  exports.gridRowTreeDepthSelector = gridRowTreeDepthSelector;
29
29
  const gridRowIdsSelector = (0, _createSelector.createSelector)(gridRowsStateSelector, rows => rows.ids);
30
- exports.gridRowIdsSelector = gridRowIdsSelector;
30
+ /**
31
+ * @ignore - do not document.
32
+ */
33
+
34
+ exports.gridRowIdsSelector = gridRowIdsSelector;
35
+ const gridAdditionalRowGroupsSelector = (0, _createSelector.createSelector)(gridRowsStateSelector, rows => rows == null ? void 0 : rows.additionalRowGroups);
36
+ /**
37
+ * @ignore - do not document.
38
+ */
39
+
40
+ exports.gridAdditionalRowGroupsSelector = gridAdditionalRowGroupsSelector;
41
+ const gridPinnedRowsSelector = (0, _createSelector.createSelector)(gridAdditionalRowGroupsSelector, additionalRowGroups => additionalRowGroups == null ? void 0 : additionalRowGroups.pinnedRows);
42
+ /**
43
+ * @ignore - do not document.
44
+ */
45
+
46
+ exports.gridPinnedRowsSelector = gridPinnedRowsSelector;
47
+ const gridPinnedRowsCountSelector = (0, _createSelector.createSelector)(gridPinnedRowsSelector, pinnedRows => {
48
+ var _pinnedRows$top, _pinnedRows$bottom;
49
+
50
+ return ((pinnedRows == null ? void 0 : (_pinnedRows$top = pinnedRows.top) == null ? void 0 : _pinnedRows$top.length) || 0) + ((pinnedRows == null ? void 0 : (_pinnedRows$bottom = pinnedRows.bottom) == null ? void 0 : _pinnedRows$bottom.length) || 0);
51
+ });
52
+ exports.gridPinnedRowsCountSelector = gridPinnedRowsCountSelector;
@@ -5,6 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
+ exports.calculatePinnedRowsHeight = calculatePinnedRowsHeight;
8
9
  exports.checkGridRowIdIsValid = checkGridRowIdIsValid;
9
10
  exports.getTreeNodeDescendants = exports.getRowsStateFromCache = exports.getRowIdFromRowModel = exports.createRowsInternalCache = void 0;
10
11
 
@@ -12,6 +13,8 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
12
13
 
13
14
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
14
15
 
16
+ var _gridRowsSelector = require("./gridRowsSelector");
17
+
15
18
  const _excluded = ["rowsBeforePartialUpdates"];
16
19
 
17
20
  /**
@@ -73,7 +76,7 @@ const getRowsStateFromCache = ({
73
76
  previousTree
74
77
  }));
75
78
  const processedGroupingResponse = apiRef.current.unstable_applyPipeProcessors('hydrateRows', groupingResponse);
76
- const dataTopLevelRowCount = processedGroupingResponse.treeDepth === 1 ? processedGroupingResponse.ids.length : Object.values(processedGroupingResponse.tree).filter(node => node.parent == null).length;
79
+ const dataTopLevelRowCount = processedGroupingResponse.treeDepth === 1 ? processedGroupingResponse.ids.length : Object.values(processedGroupingResponse.tree).filter(node => node.parent == null && !node.isPinned).length;
77
80
  return (0, _extends2.default)({}, processedGroupingResponse, {
78
81
  groupingResponseBeforeRowHydration: groupingResponse,
79
82
  loading: loadingProp,
@@ -109,4 +112,22 @@ const getTreeNodeDescendants = (tree, parentId, skipAutoGeneratedRows) => {
109
112
  return validDescendants;
110
113
  };
111
114
 
112
- exports.getTreeNodeDescendants = getTreeNodeDescendants;
115
+ exports.getTreeNodeDescendants = getTreeNodeDescendants;
116
+
117
+ function calculatePinnedRowsHeight(apiRef) {
118
+ var _pinnedRows$top, _pinnedRows$bottom;
119
+
120
+ const pinnedRows = (0, _gridRowsSelector.gridPinnedRowsSelector)(apiRef);
121
+ const topPinnedRowsHeight = (pinnedRows == null ? void 0 : (_pinnedRows$top = pinnedRows.top) == null ? void 0 : _pinnedRows$top.reduce((acc, value) => {
122
+ acc += apiRef.current.unstable_getRowHeight(value.id);
123
+ return acc;
124
+ }, 0)) || 0;
125
+ const bottomPinnedRowsHeight = (pinnedRows == null ? void 0 : (_pinnedRows$bottom = pinnedRows.bottom) == null ? void 0 : _pinnedRows$bottom.reduce((acc, value) => {
126
+ acc += apiRef.current.unstable_getRowHeight(value.id);
127
+ return acc;
128
+ }, 0)) || 0;
129
+ return {
130
+ top: topPinnedRowsHeight,
131
+ bottom: bottomPinnedRowsHeight
132
+ };
133
+ }
@@ -4,6 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  var _exportNames = {
7
+ gridRowsStateSelector: true,
8
+ gridRowCountSelector: true,
9
+ gridRowsLoadingSelector: true,
10
+ gridTopLevelRowCountSelector: true,
11
+ gridRowsLookupSelector: true,
12
+ gridRowsIdToIdLookupSelector: true,
13
+ gridRowTreeSelector: true,
14
+ gridRowGroupingNameSelector: true,
15
+ gridRowTreeDepthSelector: true,
16
+ gridRowIdsSelector: true,
7
17
  checkGridRowIdIsValid: true
8
18
  };
9
19
  Object.defineProperty(exports, "checkGridRowIdIsValid", {
@@ -12,6 +22,66 @@ Object.defineProperty(exports, "checkGridRowIdIsValid", {
12
22
  return _gridRowsUtils.checkGridRowIdIsValid;
13
23
  }
14
24
  });
25
+ Object.defineProperty(exports, "gridRowCountSelector", {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _gridRowsSelector.gridRowCountSelector;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "gridRowGroupingNameSelector", {
32
+ enumerable: true,
33
+ get: function () {
34
+ return _gridRowsSelector.gridRowGroupingNameSelector;
35
+ }
36
+ });
37
+ Object.defineProperty(exports, "gridRowIdsSelector", {
38
+ enumerable: true,
39
+ get: function () {
40
+ return _gridRowsSelector.gridRowIdsSelector;
41
+ }
42
+ });
43
+ Object.defineProperty(exports, "gridRowTreeDepthSelector", {
44
+ enumerable: true,
45
+ get: function () {
46
+ return _gridRowsSelector.gridRowTreeDepthSelector;
47
+ }
48
+ });
49
+ Object.defineProperty(exports, "gridRowTreeSelector", {
50
+ enumerable: true,
51
+ get: function () {
52
+ return _gridRowsSelector.gridRowTreeSelector;
53
+ }
54
+ });
55
+ Object.defineProperty(exports, "gridRowsIdToIdLookupSelector", {
56
+ enumerable: true,
57
+ get: function () {
58
+ return _gridRowsSelector.gridRowsIdToIdLookupSelector;
59
+ }
60
+ });
61
+ Object.defineProperty(exports, "gridRowsLoadingSelector", {
62
+ enumerable: true,
63
+ get: function () {
64
+ return _gridRowsSelector.gridRowsLoadingSelector;
65
+ }
66
+ });
67
+ Object.defineProperty(exports, "gridRowsLookupSelector", {
68
+ enumerable: true,
69
+ get: function () {
70
+ return _gridRowsSelector.gridRowsLookupSelector;
71
+ }
72
+ });
73
+ Object.defineProperty(exports, "gridRowsStateSelector", {
74
+ enumerable: true,
75
+ get: function () {
76
+ return _gridRowsSelector.gridRowsStateSelector;
77
+ }
78
+ });
79
+ Object.defineProperty(exports, "gridTopLevelRowCountSelector", {
80
+ enumerable: true,
81
+ get: function () {
82
+ return _gridRowsSelector.gridTopLevelRowCountSelector;
83
+ }
84
+ });
15
85
 
16
86
  var _gridRowsMetaSelector = require("./gridRowsMetaSelector");
17
87
 
@@ -43,16 +113,4 @@ Object.keys(_gridRowsMetaState).forEach(function (key) {
43
113
 
44
114
  var _gridRowsSelector = require("./gridRowsSelector");
45
115
 
46
- Object.keys(_gridRowsSelector).forEach(function (key) {
47
- if (key === "default" || key === "__esModule") return;
48
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
49
- if (key in exports && exports[key] === _gridRowsSelector[key]) return;
50
- Object.defineProperty(exports, key, {
51
- enumerable: true,
52
- get: function () {
53
- return _gridRowsSelector[key];
54
- }
55
- });
56
- });
57
-
58
116
  var _gridRowsUtils = require("./gridRowsUtils");
@@ -53,8 +53,11 @@ exports.rowsStateInitializer = rowsStateInitializer;
53
53
 
54
54
  const useGridRows = (apiRef, props) => {
55
55
  if (process.env.NODE_ENV !== 'production') {
56
- // Freeze rows for immutability
57
- Object.freeze(props.rows);
56
+ try {
57
+ // Freeze the `rows` prop so developers have a fast failure if they try to use Array.prototype.push().
58
+ Object.freeze(props.rows);
59
+ } catch (error) {// Sometimes, it's impossible to freeze, so we give up on it.
60
+ }
58
61
  }
59
62
 
60
63
  const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useGridRows');
@@ -29,6 +29,8 @@ var _gridSortingSelector = require("../sorting/gridSortingSelector");
29
29
 
30
30
  var _pipeProcessing = require("../../core/pipeProcessing");
31
31
 
32
+ var _gridRowsSelector = require("./gridRowsSelector");
33
+
32
34
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
33
35
 
34
36
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -62,13 +64,14 @@ const useGridRowsMeta = (apiRef, props) => {
62
64
  const paginationState = (0, _useGridSelector.useGridSelector)(apiRef, _gridPaginationSelector.gridPaginationSelector);
63
65
  const sortingState = (0, _useGridSelector.useGridSelector)(apiRef, _gridSortingSelector.gridSortingStateSelector);
64
66
  const currentPage = (0, _useGridVisibleRows.useGridVisibleRows)(apiRef, props);
67
+ const pinnedRows = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridPinnedRowsSelector);
65
68
  const hydrateRowsMeta = React.useCallback(() => {
69
+ var _pinnedRows$top, _pinnedRows$bottom;
70
+
66
71
  hasRowWithAutoHeight.current = false;
67
72
  const densityFactor = (0, _densitySelector.gridDensityFactorSelector)(apiRef.current.state, apiRef.current.instanceId);
68
- const positions = [];
69
- const currentPageTotalHeight = currentPage.rows.reduce((acc, row) => {
70
- positions.push(acc);
71
73
 
74
+ const calculateRowProcessedSizes = row => {
72
75
  if (!rowsHeightLookup.current[row.id]) {
73
76
  rowsHeightLookup.current[row.id] = {
74
77
  sizes: {
@@ -140,9 +143,22 @@ const useGridRowsMeta = (apiRef, props) => {
140
143
 
141
144
  const processedSizes = apiRef.current.unstable_applyPipeProcessors('rowHeight', initialHeights, row);
142
145
  rowsHeightLookup.current[row.id].sizes = processedSizes;
146
+ return processedSizes;
147
+ };
148
+
149
+ const positions = [];
150
+ const currentPageTotalHeight = currentPage.rows.reduce((acc, row) => {
151
+ positions.push(acc);
152
+ const processedSizes = calculateRowProcessedSizes(row);
143
153
  const finalRowHeight = Object.values(processedSizes).reduce((acc2, value) => acc2 + value, 0);
144
154
  return acc + finalRowHeight;
145
155
  }, 0);
156
+ pinnedRows == null ? void 0 : (_pinnedRows$top = pinnedRows.top) == null ? void 0 : _pinnedRows$top.forEach(row => {
157
+ calculateRowProcessedSizes(row);
158
+ });
159
+ pinnedRows == null ? void 0 : (_pinnedRows$bottom = pinnedRows.bottom) == null ? void 0 : _pinnedRows$bottom.forEach(row => {
160
+ calculateRowProcessedSizes(row);
161
+ });
146
162
  apiRef.current.setState(state => {
147
163
  return (0, _extends2.default)({}, state, {
148
164
  rowsMeta: {
@@ -158,7 +174,7 @@ const useGridRowsMeta = (apiRef, props) => {
158
174
  }
159
175
 
160
176
  apiRef.current.forceUpdate();
161
- }, [apiRef, currentPage.rows, rowHeightFromDensity, getRowHeightProp, getRowSpacing, getEstimatedRowHeight]);
177
+ }, [apiRef, currentPage.rows, rowHeightFromDensity, getRowHeightProp, getRowSpacing, getEstimatedRowHeight, pinnedRows]);
162
178
  const getRowHeight = React.useCallback(rowId => {
163
179
  const height = rowsHeightLookup.current[rowId];
164
180
  return height ? height.sizes.base : rowHeightFromDensity;
@@ -18,7 +18,8 @@ const flatRowTreeCreationMethod = ({
18
18
  for (let i = 0; i < ids.length; i += 1) {
19
19
  const rowId = ids[i];
20
20
 
21
- if (previousTree && previousTree[rowId] && previousTree[rowId].depth === 0 && previousTree[rowId].parent == null) {
21
+ if (previousTree && previousTree[rowId] && previousTree[rowId].depth === 0 && previousTree[rowId].parent == null && // pinned row can be unpinned
22
+ !previousTree[rowId].isPinned) {
22
23
  tree[rowId] = previousTree[rowId];
23
24
  } else {
24
25
  tree[rowId] = {
@@ -23,6 +23,8 @@ var _useGridApiMethod = require("../../utils/useGridApiMethod");
23
23
 
24
24
  var _gridFilterSelector = require("../filter/gridFilterSelector");
25
25
 
26
+ var _gridClasses = require("../../../constants/gridClasses");
27
+
26
28
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
29
 
28
30
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -108,13 +110,17 @@ const useGridScroll = (apiRef, props) => {
108
110
  }
109
111
 
110
112
  if (params.rowIndex != null) {
113
+ var _querySelector, _querySelector2;
114
+
111
115
  const rowsMeta = (0, _gridRowsMetaSelector.gridRowsMetaSelector)(apiRef.current.state);
112
116
  const page = (0, _gridPaginationSelector.gridPageSelector)(apiRef);
113
117
  const pageSize = (0, _gridPaginationSelector.gridPageSizeSelector)(apiRef);
114
118
  const elementIndex = !props.pagination ? params.rowIndex : params.rowIndex - page * pageSize;
115
119
  const targetOffsetHeight = rowsMeta.positions[elementIndex + 1] ? rowsMeta.positions[elementIndex + 1] - rowsMeta.positions[elementIndex] : rowsMeta.currentPageTotalHeight - rowsMeta.positions[elementIndex];
120
+ const topPinnedRowsHeight = ((_querySelector = windowRef.current.querySelector(`.${_gridClasses.gridClasses['pinnedRows--top']}`)) == null ? void 0 : _querySelector.clientHeight) || 0;
121
+ const bottomPinnedRowsHeight = ((_querySelector2 = windowRef.current.querySelector(`.${_gridClasses.gridClasses['pinnedRows--bottom']}`)) == null ? void 0 : _querySelector2.clientHeight) || 0;
116
122
  scrollCoordinates.top = scrollIntoView({
117
- clientHeight: windowRef.current.clientHeight,
123
+ clientHeight: windowRef.current.clientHeight - topPinnedRowsHeight - bottomPinnedRowsHeight,
118
124
  scrollTop: windowRef.current.scrollTop,
119
125
  offsetHeight: targetOffsetHeight,
120
126
  offsetTop: rowsMeta.positions[elementIndex]
@@ -143,13 +143,13 @@ const useGridSelection = (apiRef, props) => {
143
143
  }, [apiRef, logger]);
144
144
  const isRowSelected = React.useCallback(id => (0, _gridSelectionSelector.gridSelectionStateSelector)(apiRef.current.state).includes(id), [apiRef]);
145
145
  const isRowSelectable = React.useCallback(id => {
146
- var _apiRef$current$getRo;
147
-
148
146
  if (propIsRowSelectable && !propIsRowSelectable(apiRef.current.getRowParams(id))) {
149
147
  return false;
150
148
  }
151
149
 
152
- if (((_apiRef$current$getRo = apiRef.current.getRowNode(id)) == null ? void 0 : _apiRef$current$getRo.position) === 'footer') {
150
+ const rowNode = apiRef.current.getRowNode(id);
151
+
152
+ if ((rowNode == null ? void 0 : rowNode.position) === 'footer' || rowNode != null && rowNode.isPinned) {
153
153
  return false;
154
154
  }
155
155
 
@@ -299,6 +299,10 @@ const useGridSelection = (apiRef, props) => {
299
299
  }
300
300
  }
301
301
 
302
+ if (params.rowNode.isPinned) {
303
+ return;
304
+ }
305
+
302
306
  if (event.shiftKey && (canHaveMultipleSelection || checkboxSelection)) {
303
307
  expandMouseRowRangeSelection(params.id);
304
308
  } else {
@@ -225,6 +225,10 @@ const useGridSorting = (apiRef, props) => {
225
225
  const bodyRowIds = [];
226
226
  const footerRowIds = [];
227
227
  (0, _rows.gridRowIdsSelector)(apiRef).forEach(rowId => {
228
+ if (rowTree[rowId].isPinned) {
229
+ return;
230
+ }
231
+
228
232
  if (rowTree[rowId].position === 'footer') {
229
233
  footerRowIds.push(rowId);
230
234
  } else {
@@ -237,6 +241,10 @@ const useGridSorting = (apiRef, props) => {
237
241
  const bodyRows = [];
238
242
  const footerRowIds = [];
239
243
  Object.values(rowTree).forEach(rowNode => {
244
+ if (rowNode.isPinned) {
245
+ return;
246
+ }
247
+
240
248
  if (rowNode.position === 'footer') {
241
249
  footerRowIds.push(rowNode.id);
242
250
  } else {