@mui/x-data-grid 7.24.1 → 7.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/DataGrid/DataGrid.js +1 -7
  3. package/DataGrid/useDataGridComponent.js +2 -2
  4. package/components/GridRow.d.ts +0 -1
  5. package/components/GridRow.js +32 -20
  6. package/components/GridScrollArea.d.ts +5 -2
  7. package/components/GridScrollArea.js +32 -25
  8. package/components/GridSkeletonLoadingOverlay.js +2 -1
  9. package/components/cell/GridCell.d.ts +9 -6
  10. package/components/cell/GridCell.js +29 -52
  11. package/components/containers/GridRoot.js +11 -9
  12. package/components/containers/GridRootStyles.js +138 -40
  13. package/components/toolbar/GridToolbarColumnsButton.js +5 -4
  14. package/components/toolbar/GridToolbarDensitySelector.js +2 -2
  15. package/components/toolbar/GridToolbarExportContainer.js +2 -2
  16. package/components/toolbar/GridToolbarFilterButton.js +4 -3
  17. package/components/virtualization/GridMainContainer.d.ts +10 -0
  18. package/components/virtualization/GridMainContainer.js +10 -2
  19. package/components/virtualization/GridVirtualScrollbar.d.ts +4 -0
  20. package/components/virtualization/GridVirtualScrollbar.js +5 -5
  21. package/components/virtualization/GridVirtualScroller.js +36 -16
  22. package/components/virtualization/GridVirtualScrollerContent.js +11 -2
  23. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.d.ts +1 -1
  24. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  25. package/hooks/core/useGridStateInitialization.js +3 -2
  26. package/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  27. package/hooks/features/columnResize/useGridColumnResize.js +2 -1
  28. package/hooks/features/columns/gridColumnsSelector.d.ts +0 -5
  29. package/hooks/features/columns/gridColumnsSelector.js +0 -12
  30. package/hooks/features/columns/useGridColumns.js +7 -3
  31. package/hooks/features/dimensions/gridDimensionsSelectors.d.ts +16 -0
  32. package/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
  33. package/hooks/features/dimensions/index.d.ts +1 -1
  34. package/hooks/features/dimensions/index.js +1 -2
  35. package/hooks/features/dimensions/useGridDimensions.js +102 -77
  36. package/hooks/features/editing/gridEditingSelectors.d.ts +10 -0
  37. package/hooks/features/editing/gridEditingSelectors.js +12 -1
  38. package/hooks/features/editing/index.d.ts +1 -1
  39. package/hooks/features/editing/index.js +1 -1
  40. package/hooks/features/editing/useGridCellEditing.js +3 -3
  41. package/hooks/features/editing/useGridRowEditing.js +8 -9
  42. package/hooks/features/filter/gridFilterState.d.ts +5 -0
  43. package/hooks/features/filter/gridFilterState.js +5 -0
  44. package/hooks/features/filter/useGridFilter.js +6 -13
  45. package/hooks/features/focus/useGridFocus.js +3 -2
  46. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +24 -16
  47. package/hooks/features/keyboardNavigation/utils.d.ts +1 -2
  48. package/hooks/features/keyboardNavigation/utils.js +0 -5
  49. package/hooks/features/listView/useGridListView.js +2 -1
  50. package/hooks/features/pagination/useGridPagination.js +1 -1
  51. package/hooks/features/rowSelection/useGridRowSelection.js +4 -4
  52. package/hooks/features/rowSelection/utils.js +1 -1
  53. package/hooks/features/rows/gridRowsMetaState.d.ts +8 -0
  54. package/hooks/features/rows/gridRowsUtils.d.ts +0 -4
  55. package/hooks/features/rows/gridRowsUtils.js +0 -16
  56. package/hooks/features/rows/useGridParamsApi.d.ts +1 -1
  57. package/hooks/features/rows/useGridParamsApi.js +33 -14
  58. package/hooks/features/rows/useGridRowSpanning.js +94 -91
  59. package/hooks/features/rows/useGridRows.js +7 -8
  60. package/hooks/features/rows/useGridRowsMeta.js +36 -19
  61. package/hooks/features/sorting/gridSortingSelector.js +10 -9
  62. package/hooks/features/virtualization/gridFocusedVirtualCellSelector.js +2 -2
  63. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +15 -1
  64. package/hooks/features/virtualization/useGridVirtualScroller.js +74 -72
  65. package/hooks/utils/useGridSelector.d.ts +8 -1
  66. package/hooks/utils/useGridSelector.js +42 -8
  67. package/hooks/utils/useIsSSR.d.ts +1 -0
  68. package/hooks/utils/useIsSSR.js +5 -0
  69. package/index.js +1 -1
  70. package/internals/index.d.ts +2 -1
  71. package/internals/index.js +2 -1
  72. package/models/api/gridApiCommon.d.ts +2 -2
  73. package/models/api/gridParamsApi.d.ts +29 -2
  74. package/models/api/gridStateApi.d.ts +1 -0
  75. package/models/api/index.d.ts +1 -1
  76. package/models/api/index.js +0 -1
  77. package/models/events/gridEventLookup.d.ts +6 -0
  78. package/modern/DataGrid/DataGrid.js +1 -7
  79. package/modern/DataGrid/useDataGridComponent.js +2 -2
  80. package/modern/components/GridRow.js +32 -20
  81. package/modern/components/GridScrollArea.js +32 -25
  82. package/modern/components/GridSkeletonLoadingOverlay.js +2 -1
  83. package/modern/components/cell/GridCell.js +29 -52
  84. package/modern/components/containers/GridRoot.js +11 -9
  85. package/modern/components/containers/GridRootStyles.js +138 -40
  86. package/modern/components/toolbar/GridToolbarColumnsButton.js +5 -4
  87. package/modern/components/toolbar/GridToolbarDensitySelector.js +2 -2
  88. package/modern/components/toolbar/GridToolbarExportContainer.js +2 -2
  89. package/modern/components/toolbar/GridToolbarFilterButton.js +4 -3
  90. package/modern/components/virtualization/GridMainContainer.js +10 -2
  91. package/modern/components/virtualization/GridVirtualScrollbar.js +5 -5
  92. package/modern/components/virtualization/GridVirtualScroller.js +36 -16
  93. package/modern/components/virtualization/GridVirtualScrollerContent.js +11 -2
  94. package/modern/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  95. package/modern/hooks/core/useGridStateInitialization.js +3 -2
  96. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  97. package/modern/hooks/features/columnResize/useGridColumnResize.js +2 -1
  98. package/modern/hooks/features/columns/gridColumnsSelector.js +0 -12
  99. package/modern/hooks/features/columns/useGridColumns.js +7 -3
  100. package/modern/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
  101. package/modern/hooks/features/dimensions/index.js +1 -2
  102. package/modern/hooks/features/dimensions/useGridDimensions.js +102 -77
  103. package/modern/hooks/features/editing/gridEditingSelectors.js +12 -1
  104. package/modern/hooks/features/editing/index.js +1 -1
  105. package/modern/hooks/features/editing/useGridCellEditing.js +3 -3
  106. package/modern/hooks/features/editing/useGridRowEditing.js +8 -9
  107. package/modern/hooks/features/filter/gridFilterState.js +5 -0
  108. package/modern/hooks/features/filter/useGridFilter.js +6 -13
  109. package/modern/hooks/features/focus/useGridFocus.js +3 -2
  110. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +24 -16
  111. package/modern/hooks/features/keyboardNavigation/utils.js +0 -5
  112. package/modern/hooks/features/listView/useGridListView.js +2 -1
  113. package/modern/hooks/features/pagination/useGridPagination.js +1 -1
  114. package/modern/hooks/features/rowSelection/useGridRowSelection.js +4 -4
  115. package/modern/hooks/features/rowSelection/utils.js +1 -1
  116. package/modern/hooks/features/rows/gridRowsUtils.js +0 -16
  117. package/modern/hooks/features/rows/useGridParamsApi.js +33 -14
  118. package/modern/hooks/features/rows/useGridRowSpanning.js +94 -91
  119. package/modern/hooks/features/rows/useGridRows.js +7 -8
  120. package/modern/hooks/features/rows/useGridRowsMeta.js +36 -19
  121. package/modern/hooks/features/sorting/gridSortingSelector.js +10 -9
  122. package/modern/hooks/features/virtualization/gridFocusedVirtualCellSelector.js +2 -2
  123. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +74 -72
  124. package/modern/hooks/utils/useGridSelector.js +42 -8
  125. package/modern/hooks/utils/useIsSSR.js +5 -0
  126. package/modern/index.js +1 -1
  127. package/modern/internals/index.js +2 -1
  128. package/modern/models/api/index.js +0 -1
  129. package/modern/utils/roundToDecimalPlaces.js +3 -0
  130. package/modern/utils/utils.js +6 -1
  131. package/node/DataGrid/DataGrid.js +1 -7
  132. package/node/DataGrid/useDataGridComponent.js +2 -2
  133. package/node/components/GridRow.js +28 -17
  134. package/node/components/GridScrollArea.js +31 -24
  135. package/node/components/GridSkeletonLoadingOverlay.js +2 -1
  136. package/node/components/cell/GridCell.js +27 -50
  137. package/node/components/containers/GridRoot.js +10 -8
  138. package/node/components/containers/GridRootStyles.js +138 -40
  139. package/node/components/toolbar/GridToolbarColumnsButton.js +5 -4
  140. package/node/components/toolbar/GridToolbarDensitySelector.js +2 -2
  141. package/node/components/toolbar/GridToolbarExportContainer.js +2 -2
  142. package/node/components/toolbar/GridToolbarFilterButton.js +4 -3
  143. package/node/components/virtualization/GridMainContainer.js +10 -2
  144. package/node/components/virtualization/GridVirtualScrollbar.js +5 -5
  145. package/node/components/virtualization/GridVirtualScroller.js +36 -16
  146. package/node/components/virtualization/GridVirtualScrollerContent.js +11 -2
  147. package/node/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  148. package/node/hooks/core/useGridStateInitialization.js +3 -2
  149. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  150. package/node/hooks/features/columnResize/useGridColumnResize.js +2 -1
  151. package/node/hooks/features/columns/gridColumnsSelector.js +1 -13
  152. package/node/hooks/features/columns/useGridColumns.js +7 -3
  153. package/node/hooks/features/dimensions/gridDimensionsSelectors.js +38 -2
  154. package/node/hooks/features/dimensions/index.js +13 -11
  155. package/node/hooks/features/dimensions/useGridDimensions.js +99 -74
  156. package/node/hooks/features/editing/gridEditingSelectors.js +12 -2
  157. package/node/hooks/features/editing/index.js +7 -11
  158. package/node/hooks/features/editing/useGridCellEditing.js +2 -2
  159. package/node/hooks/features/editing/useGridRowEditing.js +6 -7
  160. package/node/hooks/features/filter/gridFilterState.js +6 -1
  161. package/node/hooks/features/filter/useGridFilter.js +5 -12
  162. package/node/hooks/features/focus/useGridFocus.js +3 -2
  163. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +24 -15
  164. package/node/hooks/features/keyboardNavigation/utils.js +0 -6
  165. package/node/hooks/features/listView/useGridListView.js +2 -1
  166. package/node/hooks/features/pagination/useGridPagination.js +1 -1
  167. package/node/hooks/features/rowSelection/useGridRowSelection.js +3 -3
  168. package/node/hooks/features/rowSelection/utils.js +1 -1
  169. package/node/hooks/features/rows/gridRowsUtils.js +0 -17
  170. package/node/hooks/features/rows/useGridParamsApi.js +33 -14
  171. package/node/hooks/features/rows/useGridRowSpanning.js +92 -89
  172. package/node/hooks/features/rows/useGridRows.js +7 -8
  173. package/node/hooks/features/rows/useGridRowsMeta.js +36 -19
  174. package/node/hooks/features/sorting/gridSortingSelector.js +10 -9
  175. package/node/hooks/features/virtualization/gridFocusedVirtualCellSelector.js +2 -2
  176. package/node/hooks/features/virtualization/useGridVirtualScroller.js +73 -71
  177. package/node/hooks/utils/useGridSelector.js +42 -8
  178. package/node/hooks/utils/useIsSSR.js +12 -0
  179. package/node/index.js +1 -1
  180. package/node/internals/index.js +20 -7
  181. package/node/models/api/index.js +0 -11
  182. package/node/utils/roundToDecimalPlaces.js +9 -0
  183. package/node/utils/utils.js +8 -1
  184. package/package.json +3 -2
  185. package/utils/roundToDecimalPlaces.d.ts +1 -0
  186. package/utils/roundToDecimalPlaces.js +3 -0
  187. package/utils/utils.d.ts +1 -0
  188. package/utils/utils.js +6 -1
@@ -1,18 +1,17 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import useLazyRef from '@mui/utils/useLazyRef';
4
+ import { unstable_useEnhancedEffect as useEnhancedEffect } from '@mui/utils';
4
5
  import { ResizeObserver } from "../../../utils/ResizeObserver.js";
5
6
  import { useGridVisibleRows } from "../../utils/useGridVisibleRows.js";
6
7
  import { eslintUseValue } from "../../../utils/utils.js";
7
8
  import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
8
9
  import { useGridSelector } from "../../utils/useGridSelector.js";
9
10
  import { gridDensityFactorSelector } from "../density/densitySelector.js";
10
- import { gridFilterModelSelector } from "../filter/gridFilterSelector.js";
11
11
  import { gridPaginationSelector } from "../pagination/gridPaginationSelector.js";
12
- import { gridSortModelSelector } from "../sorting/gridSortingSelector.js";
13
12
  import { useGridRegisterPipeApplier } from "../../core/pipeProcessing/index.js";
14
- import { gridPinnedRowsSelector } from "./gridRowsSelector.js";
15
- import { gridDimensionsSelector } from "../dimensions/gridDimensionsSelectors.js";
13
+ import { gridPinnedRowsSelector, gridRowCountSelector } from "./gridRowsSelector.js";
14
+ import { gridDimensionsSelector, gridRowHeightSelector } from "../dimensions/gridDimensionsSelectors.js";
16
15
  import { getValidRowHeight, getRowHeightWarning } from "./gridRowsUtils.js";
17
16
  /* eslint-disable no-underscore-dangle */
18
17
 
@@ -20,10 +19,18 @@ export const rowsMetaStateInitializer = (state, props, apiRef) => {
20
19
  apiRef.current.caches.rowsMeta = {
21
20
  heights: new Map()
22
21
  };
22
+ const baseRowHeight = gridRowHeightSelector(apiRef.current.state);
23
+ const dataRowCount = gridRowCountSelector(apiRef);
24
+ const pagination = gridPaginationSelector(apiRef.current.state);
25
+ const rowCount = Math.min(pagination.enabled ? pagination.paginationModel.pageSize : dataRowCount, dataRowCount);
23
26
  return _extends({}, state, {
24
27
  rowsMeta: {
25
- currentPageTotalHeight: 0,
26
- positions: []
28
+ currentPageTotalHeight: rowCount * baseRowHeight,
29
+ positions: Array.from({
30
+ length: rowCount
31
+ }, (_, i) => i * baseRowHeight),
32
+ pinnedTopRowsTotalHeight: 0,
33
+ pinnedBottomRowsTotalHeight: 0
27
34
  }
28
35
  });
29
36
  };
@@ -43,12 +50,9 @@ export const useGridRowsMeta = (apiRef, props) => {
43
50
  const hasRowWithAutoHeight = React.useRef(false);
44
51
  const isHeightMetaValid = React.useRef(false);
45
52
  const densityFactor = useGridSelector(apiRef, gridDensityFactorSelector);
46
- const filterModel = useGridSelector(apiRef, gridFilterModelSelector);
47
- const paginationState = useGridSelector(apiRef, gridPaginationSelector);
48
- const sortModel = useGridSelector(apiRef, gridSortModelSelector);
49
53
  const currentPage = useGridVisibleRows(apiRef, props);
50
54
  const pinnedRows = useGridSelector(apiRef, gridPinnedRowsSelector);
51
- const rowHeight = useGridSelector(apiRef, () => gridDimensionsSelector(apiRef.current.state).rowHeight);
55
+ const rowHeight = useGridSelector(apiRef, gridRowHeightSelector);
52
56
  const getRowHeightEntry = rowId => {
53
57
  let entry = heightCache.get(rowId);
54
58
  if (entry === undefined) {
@@ -110,11 +114,17 @@ export const useGridRowsMeta = (apiRef, props) => {
110
114
  }
111
115
  apiRef.current.unstable_applyPipeProcessors('rowHeight', entry, row);
112
116
  return entry;
113
- }, [apiRef, currentPage.rows.length, getRowHeightProp, getEstimatedRowHeight, rowHeight, getRowSpacing, densityFactor]);
117
+ }, [apiRef, currentPage.rows, getRowHeightProp, getEstimatedRowHeight, rowHeight, getRowSpacing, densityFactor]);
114
118
  const hydrateRowsMeta = React.useCallback(() => {
115
119
  hasRowWithAutoHeight.current = false;
116
- pinnedRows.top.forEach(processHeightEntry);
117
- pinnedRows.bottom.forEach(processHeightEntry);
120
+ const pinnedTopRowsTotalHeight = pinnedRows.top.reduce((acc, row) => {
121
+ const entry = processHeightEntry(row);
122
+ return acc + entry.content + entry.spacingTop + entry.spacingBottom + entry.detail;
123
+ }, 0);
124
+ const pinnedBottomRowsTotalHeight = pinnedRows.bottom.reduce((acc, row) => {
125
+ const entry = processHeightEntry(row);
126
+ return acc + entry.content + entry.spacingTop + entry.spacingBottom + entry.detail;
127
+ }, 0);
118
128
  const positions = [];
119
129
  const currentPageTotalHeight = currentPage.rows.reduce((acc, row) => {
120
130
  positions.push(acc);
@@ -126,14 +136,21 @@ export const useGridRowsMeta = (apiRef, props) => {
126
136
  // No row has height=auto, so all rows are already measured
127
137
  lastMeasuredRowIndex.current = Infinity;
128
138
  }
139
+ const didHeightsChange = pinnedTopRowsTotalHeight !== apiRef.current.state.rowsMeta.pinnedTopRowsTotalHeight || pinnedBottomRowsTotalHeight !== apiRef.current.state.rowsMeta.pinnedBottomRowsTotalHeight || currentPageTotalHeight !== apiRef.current.state.rowsMeta.currentPageTotalHeight;
140
+ const rowsMeta = {
141
+ currentPageTotalHeight,
142
+ positions,
143
+ pinnedTopRowsTotalHeight,
144
+ pinnedBottomRowsTotalHeight
145
+ };
129
146
  apiRef.current.setState(state => {
130
147
  return _extends({}, state, {
131
- rowsMeta: {
132
- currentPageTotalHeight,
133
- positions
134
- }
148
+ rowsMeta
135
149
  });
136
150
  });
151
+ if (didHeightsChange) {
152
+ apiRef.current.updateDimensions();
153
+ }
137
154
  isHeightMetaValid.current = true;
138
155
  }, [apiRef, pinnedRows, currentPage.rows, processHeightEntry]);
139
156
  const getRowHeight = rowId => {
@@ -181,9 +198,9 @@ export const useGridRowsMeta = (apiRef, props) => {
181
198
 
182
199
  // The effect is used to build the rows meta data - currentPageTotalHeight and positions.
183
200
  // Because of variable row height this is needed for the virtualization
184
- React.useEffect(() => {
201
+ useEnhancedEffect(() => {
185
202
  hydrateRowsMeta();
186
- }, [filterModel, paginationState, sortModel, hydrateRowsMeta]);
203
+ }, [hydrateRowsMeta]);
187
204
  const rowsMetaApi = {
188
205
  unstable_getRowHeight: getRowHeight,
189
206
  unstable_setLastMeasuredRowIndex: setLastMeasuredRowIndex,
@@ -24,15 +24,16 @@ export const gridSortedRowEntriesSelector = createSelectorMemoized(gridSortedRow
24
24
  id,
25
25
  model
26
26
  });
27
- }
28
- const rowNode = rowTree[id];
29
- if (rowNode && isAutogeneratedRowNode(rowNode)) {
30
- acc.push({
31
- id,
32
- model: {
33
- [GRID_ID_AUTOGENERATED]: id
34
- }
35
- });
27
+ } else {
28
+ const rowNode = rowTree[id];
29
+ if (rowNode && isAutogeneratedRowNode(rowNode)) {
30
+ acc.push({
31
+ id,
32
+ model: {
33
+ [GRID_ID_AUTOGENERATED]: id
34
+ }
35
+ });
36
+ }
36
37
  }
37
38
  return acc;
38
39
  }, []));
@@ -6,7 +6,7 @@ import { gridRenderContextSelector } from "./gridVirtualizationSelectors.js";
6
6
  import { gridFocusCellSelector } from "../focus/index.js";
7
7
  import { gridVisibleRowsSelector } from "../pagination/index.js";
8
8
  import { gridRowsLookupSelector } from "../rows/index.js";
9
- const gridIsFocusedCellOutOfContex = createSelector(gridFocusCellSelector, gridRenderContextSelector, gridVisibleRowsSelector, gridVisibleColumnDefinitionsSelector, gridRowsLookupSelector, (focusedCell, renderContext, currentPage, visibleColumns, rows) => {
9
+ const gridIsFocusedCellOutOfContext = createSelector(gridFocusCellSelector, gridRenderContextSelector, gridVisibleRowsSelector, gridVisibleColumnDefinitionsSelector, gridRowsLookupSelector, (focusedCell, renderContext, currentPage, visibleColumns, rows) => {
10
10
  if (!focusedCell) {
11
11
  return false;
12
12
  }
@@ -19,7 +19,7 @@ const gridIsFocusedCellOutOfContex = createSelector(gridFocusCellSelector, gridR
19
19
  const isInRenderContext = rowIndex !== undefined && columnIndex !== -1 && rowIndex >= renderContext.firstRowIndex && rowIndex <= renderContext.lastRowIndex;
20
20
  return !isInRenderContext;
21
21
  });
22
- export const gridFocusedVirtualCellSelector = createSelectorMemoized(gridIsFocusedCellOutOfContex, gridVisibleColumnDefinitionsSelector, gridVisibleRowsSelector, gridRowsLookupSelector, gridFocusCellSelector, (isFocusedCellOutOfRenderContext, visibleColumns, currentPage, rows, focusedCell) => {
22
+ export const gridFocusedVirtualCellSelector = createSelectorMemoized(gridIsFocusedCellOutOfContext, gridVisibleColumnDefinitionsSelector, gridVisibleRowsSelector, gridRowsLookupSelector, gridFocusCellSelector, (isFocusedCellOutOfRenderContext, visibleColumns, currentPage, rows, focusedCell) => {
23
23
  if (!isFocusedCellOutOfRenderContext) {
24
24
  return null;
25
25
  }
@@ -6,15 +6,15 @@ import useLazyRef from '@mui/utils/useLazyRef';
6
6
  import useTimeout from '@mui/utils/useTimeout';
7
7
  import { useRtl } from '@mui/system/RtlProvider';
8
8
  import reactMajor from '@mui/x-internals/reactMajor';
9
+ import { gridDimensionsSelector, gridColumnsTotalWidthSelector, gridContentHeightSelector, gridHasFillerSelector, gridRowHeightSelector, gridVerticalScrollbarWidthSelector } from "../dimensions/gridDimensionsSelectors.js";
9
10
  import { useGridPrivateApiContext } from "../../utils/useGridPrivateApiContext.js";
10
11
  import { useGridRootProps } from "../../utils/useGridRootProps.js";
11
12
  import { useGridSelector } from "../../utils/useGridSelector.js";
12
13
  import { useRunOnce } from "../../utils/useRunOnce.js";
13
14
  import { gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector, gridColumnPositionsSelector, gridHasColSpanSelector } from "../columns/gridColumnsSelector.js";
14
- import { gridDimensionsSelector } from "../dimensions/gridDimensionsSelectors.js";
15
15
  import { gridPinnedRowsSelector } from "../rows/gridRowsSelector.js";
16
16
  import { useGridVisibleRows, getVisibleRows } from "../../utils/useGridVisibleRows.js";
17
- import { useGridApiEventHandler } from "../../utils/index.js";
17
+ import { useGridApiOptionHandler } from "../../utils/index.js";
18
18
  import * as platform from "../../../utils/platform.js";
19
19
  import { clamp, range } from "../../../utils/utils.js";
20
20
  import { selectedIdsLookupSelector } from "../rowSelection/gridRowSelectionSelector.js";
@@ -25,7 +25,9 @@ import { EMPTY_RENDER_CONTEXT } from "./useGridVirtualization.js";
25
25
  import { gridRowSpanningHiddenCellsOriginMapSelector } from "../rows/gridRowSpanningSelectors.js";
26
26
  import { gridListColumnSelector } from "../listView/gridListViewSelectors.js";
27
27
  import { minimalContentHeight } from "../rows/gridRowsUtils.js";
28
+ import { EMPTY_PINNED_COLUMN_FIELDS } from "../columns/index.js";
28
29
  import { gridFocusedVirtualCellSelector } from "./gridFocusedVirtualCellSelector.js";
30
+ import { roundToDecimalPlaces } from "../../../utils/roundToDecimalPlaces.js";
29
31
  import { isJSDOM } from "../../../utils/isJSDOM.js";
30
32
  import { jsx as _jsx } from "react/jsx-runtime";
31
33
  const MINIMUM_COLUMN_WIDTH = 50;
@@ -55,28 +57,26 @@ export const useGridVirtualScroller = () => {
55
57
  const visibleColumns = useGridSelector(apiRef, () => listView ? [gridListColumnSelector(apiRef.current.state)] : gridVisibleColumnDefinitionsSelector(apiRef));
56
58
  const enabledForRows = useGridSelector(apiRef, gridVirtualizationRowEnabledSelector) && !isJSDOM;
57
59
  const enabledForColumns = useGridSelector(apiRef, gridVirtualizationColumnEnabledSelector) && !isJSDOM;
58
- const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
59
- const outerSize = dimensions.viewportOuterSize;
60
60
  const pinnedRows = useGridSelector(apiRef, gridPinnedRowsSelector);
61
- const pinnedColumnDefinitions = useGridSelector(apiRef, gridVisiblePinnedColumnDefinitionsSelector);
62
- const pinnedColumns = listView ? {
63
- left: [],
64
- right: []
65
- } : pinnedColumnDefinitions;
61
+ const pinnedColumnDefinitions = gridVisiblePinnedColumnDefinitionsSelector(apiRef);
62
+ const pinnedColumns = listView ? EMPTY_PINNED_COLUMN_FIELDS : pinnedColumnDefinitions;
66
63
  const hasBottomPinnedRows = pinnedRows.bottom.length > 0;
67
64
  const [panels, setPanels] = React.useState(EMPTY_DETAIL_PANELS);
68
65
  const isRtl = useRtl();
69
- const rowsMeta = useGridSelector(apiRef, gridRowsMetaSelector);
70
66
  const selectedRowsLookup = useGridSelector(apiRef, selectedIdsLookupSelector);
71
- const currentPage = useGridVisibleRows(apiRef, rootProps);
67
+ const currentPage = useGridVisibleRows(apiRef);
72
68
  const mainRef = apiRef.current.mainElementRef;
73
69
  const scrollerRef = apiRef.current.virtualScrollerRef;
74
70
  const scrollbarVerticalRef = apiRef.current.virtualScrollbarVerticalRef;
75
71
  const scrollbarHorizontalRef = apiRef.current.virtualScrollbarHorizontalRef;
76
- const contentHeight = dimensions.contentSize.height;
77
- const columnsTotalWidth = dimensions.columnsTotalWidth;
78
72
  const hasColSpan = useGridSelector(apiRef, gridHasColSpanSelector);
79
73
  const isRenderContextReady = React.useRef(false);
74
+ const rowHeight = useGridSelector(apiRef, gridRowHeightSelector);
75
+ const contentHeight = useGridSelector(apiRef, gridContentHeightSelector);
76
+ const columnsTotalWidth = useGridSelector(apiRef, gridColumnsTotalWidthSelector);
77
+ const needsHorizontalScrollbar = useGridSelector(apiRef, needsHorizontalScrollbarSelector);
78
+ const verticalScrollbarWidth = useGridSelector(apiRef, gridVerticalScrollbarWidthSelector);
79
+ const gridHasFiller = useGridSelector(apiRef, gridHasFillerSelector);
80
80
  const previousSize = React.useRef(null);
81
81
  const mainRefCallback = React.useCallback(node => {
82
82
  mainRef.current = node;
@@ -84,7 +84,10 @@ export const useGridVirtualScroller = () => {
84
84
  return undefined;
85
85
  }
86
86
  const initialRect = node.getBoundingClientRect();
87
- let lastSize = roundDimensions(initialRect);
87
+ let lastSize = {
88
+ width: roundToDecimalPlaces(initialRect.width, 1),
89
+ height: roundToDecimalPlaces(initialRect.height, 1)
90
+ };
88
91
  if (!previousSize.current || lastSize.width !== previousSize.current.width && lastSize.height !== previousSize.current.height) {
89
92
  previousSize.current = lastSize;
90
93
  apiRef.current.publishEvent('resize', lastSize);
@@ -97,7 +100,10 @@ export const useGridVirtualScroller = () => {
97
100
  if (!entry) {
98
101
  return;
99
102
  }
100
- const newSize = roundDimensions(entry.contentRect);
103
+ const newSize = {
104
+ width: roundToDecimalPlaces(entry.contentRect.width, 1),
105
+ height: roundToDecimalPlaces(entry.contentRect.height, 1)
106
+ };
101
107
  if (newSize.width === lastSize.width && newSize.height === lastSize.height) {
102
108
  return;
103
109
  }
@@ -137,7 +143,7 @@ export const useGridVirtualScroller = () => {
137
143
  const focusedVirtualCell = useGridSelector(apiRef, gridFocusedVirtualCellSelector);
138
144
  const scrollTimeout = useTimeout();
139
145
  const frozenContext = React.useRef(undefined);
140
- const scrollCache = useLazyRef(() => createScrollCache(isRtl, rootProps.rowBufferPx, rootProps.columnBufferPx, dimensions.rowHeight * 15, MINIMUM_COLUMN_WIDTH * 6)).current;
146
+ const scrollCache = useLazyRef(() => createScrollCache(isRtl, rootProps.rowBufferPx, rootProps.columnBufferPx, rowHeight * 15, MINIMUM_COLUMN_WIDTH * 6)).current;
141
147
  const updateRenderContext = React.useCallback(nextRenderContext => {
142
148
  if (areRenderContextsEqual(nextRenderContext, apiRef.current.state.virtualization.renderContext)) {
143
149
  return;
@@ -152,22 +158,28 @@ export const useGridVirtualScroller = () => {
152
158
  });
153
159
 
154
160
  // The lazy-loading hook is listening to `renderedRowsIntervalChange`,
155
- // but only does something if the dimensions are also available.
156
- // So we wait until we have valid dimensions before publishing the first event.
157
- if (dimensions.isReady && didRowsIntervalChange) {
161
+ // but only does something if we already have a render context, because
162
+ // otherwise we would call an update directly on mount
163
+ const isReady = gridDimensionsSelector(apiRef.current.state).isReady;
164
+ if (isReady && didRowsIntervalChange) {
158
165
  previousRowContext.current = nextRenderContext;
159
166
  apiRef.current.publishEvent('renderedRowsIntervalChange', nextRenderContext);
160
167
  }
161
168
  previousContextScrollPosition.current = scrollPosition.current;
162
- }, [apiRef, dimensions.isReady]);
169
+ }, [apiRef]);
163
170
  const triggerUpdateRenderContext = useEventCallback(() => {
164
171
  const scroller = scrollerRef.current;
165
172
  if (!scroller) {
166
173
  return undefined;
167
174
  }
175
+ const dimensions = gridDimensionsSelector(apiRef.current.state);
176
+ const maxScrollTop = Math.ceil(dimensions.minimumSize.height - dimensions.viewportOuterSize.height);
177
+ const maxScrollLeft = Math.ceil(dimensions.minimumSize.width - dimensions.viewportInnerSize.width);
178
+
179
+ // Clamp the scroll position to the viewport to avoid re-calculating the render context for scroll bounce
168
180
  const newScroll = {
169
- top: scroller.scrollTop,
170
- left: scroller.scrollLeft
181
+ top: clamp(scroller.scrollTop, 0, maxScrollTop),
182
+ left: isRtl ? clamp(scroller.scrollLeft, -maxScrollLeft, 0) : clamp(scroller.scrollLeft, 0, maxScrollLeft)
171
183
  };
172
184
  const dx = newScroll.left - scrollPosition.current.left;
173
185
  const dy = newScroll.top - scrollPosition.current.top;
@@ -180,7 +192,7 @@ export const useGridVirtualScroller = () => {
180
192
  const columnScroll = Math.abs(scrollPosition.current.left - previousContextScrollPosition.current.left);
181
193
 
182
194
  // PERF: use the computed minimum column width instead of a static one
183
- const didCrossThreshold = rowScroll >= dimensions.rowHeight || columnScroll >= MINIMUM_COLUMN_WIDTH;
195
+ const didCrossThreshold = rowScroll >= rowHeight || columnScroll >= MINIMUM_COLUMN_WIDTH;
184
196
  const didChangeDirection = scrollCache.direction !== direction;
185
197
  const shouldUpdate = didCrossThreshold || didChangeDirection;
186
198
  if (!shouldUpdate) {
@@ -202,7 +214,7 @@ export const useGridVirtualScroller = () => {
202
214
  }
203
215
  }
204
216
  scrollCache.direction = direction;
205
- scrollCache.buffer = bufferForDirection(isRtl, direction, rootProps.rowBufferPx, rootProps.columnBufferPx, dimensions.rowHeight * 15, MINIMUM_COLUMN_WIDTH * 6);
217
+ scrollCache.buffer = bufferForDirection(isRtl, direction, rootProps.rowBufferPx, rootProps.columnBufferPx, rowHeight * 15, MINIMUM_COLUMN_WIDTH * 6);
206
218
  const inputs = inputsSelector(apiRef, rootProps, enabledForRows, enabledForColumns);
207
219
  const nextRenderContext = computeRenderContext(inputs, scrollPosition.current, scrollCache);
208
220
 
@@ -214,40 +226,25 @@ export const useGridVirtualScroller = () => {
214
226
  return nextRenderContext;
215
227
  });
216
228
  const forceUpdateRenderContext = () => {
229
+ // skip update if dimensions are not ready and virtualization is enabled
230
+ if (!gridDimensionsSelector(apiRef.current.state).isReady && (enabledForRows || enabledForColumns)) {
231
+ return;
232
+ }
217
233
  const inputs = inputsSelector(apiRef, rootProps, enabledForRows, enabledForColumns);
218
234
  const nextRenderContext = computeRenderContext(inputs, scrollPosition.current, scrollCache);
219
235
  // Reset the frozen context when the render context changes, see the illustration in https://github.com/mui/mui-x/pull/12353
220
236
  frozenContext.current = undefined;
221
237
  updateRenderContext(nextRenderContext);
222
238
  };
223
- const handleScroll = useEventCallback(event => {
239
+ const handleScroll = useEventCallback(() => {
224
240
  if (ignoreNextScrollEvent.current) {
225
241
  ignoreNextScrollEvent.current = false;
226
242
  return;
227
243
  }
228
- const {
229
- scrollTop,
230
- scrollLeft
231
- } = event.currentTarget;
232
-
233
- // On iOS and macOS, negative offsets are possible when swiping past the start
234
- if (scrollTop < 0) {
235
- return;
236
- }
237
- if (!isRtl) {
238
- if (scrollLeft < 0) {
239
- return;
240
- }
241
- }
242
- if (isRtl) {
243
- if (scrollLeft > 0) {
244
- return;
245
- }
246
- }
247
244
  const nextRenderContext = triggerUpdateRenderContext();
248
245
  apiRef.current.publishEvent('scrollPositionChange', {
249
- top: scrollTop,
250
- left: scrollLeft,
246
+ top: scrollPosition.current.top,
247
+ left: scrollPosition.current.left,
251
248
  renderContext: nextRenderContext
252
249
  });
253
250
  });
@@ -261,7 +258,12 @@ export const useGridVirtualScroller = () => {
261
258
  if (!params.rows && !currentPage.range) {
262
259
  return [];
263
260
  }
264
- const baseRenderContext = params.renderContext ?? renderContext;
261
+ let baseRenderContext = renderContext;
262
+ if (params.renderContext) {
263
+ baseRenderContext = params.renderContext;
264
+ baseRenderContext.firstColumnIndex = renderContext.firstColumnIndex;
265
+ baseRenderContext.lastColumnIndex = renderContext.lastColumnIndex;
266
+ }
265
267
  const isLastSection = !hasBottomPinnedRows && params.position === undefined || hasBottomPinnedRows && params.position === 'bottom';
266
268
  const isPinnedSection = params.position !== undefined;
267
269
  let rowIndexOffset;
@@ -355,7 +357,7 @@ export const useGridVirtualScroller = () => {
355
357
  }
356
358
  }
357
359
  let currentRenderContext = baseRenderContext;
358
- if (!isPinnedSection && frozenContext.current && rowIndexInPage >= frozenContext.current.firstRowIndex && rowIndexInPage < frozenContext.current.lastRowIndex) {
360
+ if (frozenContext.current && rowIndexInPage >= frozenContext.current.firstRowIndex && rowIndexInPage < frozenContext.current.lastRowIndex) {
359
361
  currentRenderContext = frozenContext.current;
360
362
  }
361
363
  const isVirtualFocusRow = rowIndexInPage === virtualRowIndex;
@@ -369,9 +371,8 @@ export const useGridVirtualScroller = () => {
369
371
  rowId: id,
370
372
  index: rowIndex,
371
373
  selected: isSelected,
372
- offsetTop: params.rows ? undefined : rowsMeta.positions[rowIndexInPage],
373
374
  offsetLeft: offsetLeft,
374
- columnsTotalWidth: dimensions.columnsTotalWidth,
375
+ columnsTotalWidth: columnsTotalWidth,
375
376
  rowHeight: baseRowHeight,
376
377
  pinnedColumns: pinnedColumns,
377
378
  visibleColumns: visibleColumns,
@@ -382,8 +383,8 @@ export const useGridVirtualScroller = () => {
382
383
  isLastVisible: isLastVisible,
383
384
  isNotVisible: isVirtualFocusRow,
384
385
  showBottomBorder: showBottomBorder,
385
- scrollbarWidth: dimensions.hasScrollY ? dimensions.scrollbarSize : 0,
386
- gridHasFiller: dimensions.columnsTotalWidth < dimensions.viewportOuterSize.width
386
+ scrollbarWidth: verticalScrollbarWidth,
387
+ gridHasFiller: gridHasFiller
387
388
  }, rowProps), id));
388
389
  if (isVirtualFocusRow) {
389
390
  return;
@@ -400,7 +401,6 @@ export const useGridVirtualScroller = () => {
400
401
  });
401
402
  return rows;
402
403
  };
403
- const needsHorizontalScrollbar = outerSize.width && columnsTotalWidth > outerSize.width;
404
404
  const scrollerStyle = React.useMemo(() => ({
405
405
  overflowX: !needsHorizontalScrollbar || listView ? 'hidden' : undefined,
406
406
  overflowY: rootProps.autoHeight ? 'hidden' : undefined
@@ -436,14 +436,11 @@ export const useGridVirtualScroller = () => {
436
436
  scrollerRef.current.scrollLeft = 0;
437
437
  }
438
438
  }, [listView, scrollerRef]);
439
- useRunOnce(outerSize.width !== 0, () => {
440
- const inputs = inputsSelector(apiRef, rootProps, enabledForRows, enabledForColumns);
441
- const initialRenderContext = computeRenderContext(inputs, scrollPosition.current, scrollCache);
442
- updateRenderContext(initialRenderContext);
439
+ useRunOnce(renderContext !== EMPTY_RENDER_CONTEXT, () => {
443
440
  apiRef.current.publishEvent('scrollPositionChange', {
444
441
  top: scrollPosition.current.top,
445
442
  left: scrollPosition.current.left,
446
- renderContext: initialRenderContext
443
+ renderContext
447
444
  });
448
445
  isRenderContextReady.current = true;
449
446
  if (rootProps.initialState?.scroll && scrollerRef.current) {
@@ -496,9 +493,9 @@ export const useGridVirtualScroller = () => {
496
493
  apiRef.current.register('private', {
497
494
  updateRenderContext: forceUpdateRenderContext
498
495
  });
499
- useGridApiEventHandler(apiRef, 'columnsChange', forceUpdateRenderContext);
500
- useGridApiEventHandler(apiRef, 'filteredRowsSet', forceUpdateRenderContext);
501
- useGridApiEventHandler(apiRef, 'rowExpansionChange', forceUpdateRenderContext);
496
+ useGridApiOptionHandler(apiRef, 'sortedRowsSet', forceUpdateRenderContext);
497
+ useGridApiOptionHandler(apiRef, 'paginationModelChange', forceUpdateRenderContext);
498
+ useGridApiOptionHandler(apiRef, 'columnsChange', forceUpdateRenderContext);
502
499
  return {
503
500
  renderContext,
504
501
  setPanels,
@@ -527,14 +524,23 @@ export const useGridVirtualScroller = () => {
527
524
  }),
528
525
  getScrollbarVerticalProps: () => ({
529
526
  ref: scrollbarVerticalRef,
530
- role: 'presentation'
527
+ role: 'presentation',
528
+ scrollPosition
531
529
  }),
532
530
  getScrollbarHorizontalProps: () => ({
533
531
  ref: scrollbarHorizontalRef,
534
- role: 'presentation'
532
+ role: 'presentation',
533
+ scrollPosition
534
+ }),
535
+ getScrollAreaProps: () => ({
536
+ scrollPosition
535
537
  })
536
538
  };
537
539
  };
540
+ // dimension selectors
541
+ function needsHorizontalScrollbarSelector(state) {
542
+ return state.dimensions.viewportOuterSize.width > 0 && state.dimensions.columnsTotalWidth > state.dimensions.viewportOuterSize.width;
543
+ }
538
544
  function inputsSelector(apiRef, rootProps, enabledForRows, enabledForColumns) {
539
545
  const dimensions = gridDimensionsSelector(apiRef.current.state);
540
546
  const currentPage = getVisibleRows(apiRef, rootProps);
@@ -573,6 +579,11 @@ function computeRenderContext(inputs, scrollPosition, scrollCache) {
573
579
  firstColumnIndex: 0,
574
580
  lastColumnIndex: inputs.visibleColumns.length
575
581
  };
582
+ if (inputs.listView) {
583
+ return _extends({}, renderContext, {
584
+ lastColumnIndex: 1
585
+ });
586
+ }
576
587
  const {
577
588
  top,
578
589
  left
@@ -824,13 +835,4 @@ function bufferForDirection(isRtl, direction, rowBufferPx, columnBufferPx, verti
824
835
  // eslint unable to figure out enum exhaustiveness
825
836
  throw new Error('unreachable');
826
837
  }
827
- }
828
-
829
- // Round to avoid issues with subpixel rendering
830
- // https://github.com/mui/mui-x/issues/15721
831
- function roundDimensions(dimensions) {
832
- return {
833
- width: Math.round(dimensions.width * 10) / 10,
834
- height: Math.round(dimensions.height * 10) / 10
835
- };
836
838
  }
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { fastObjectShallowCompare } from '@mui/x-internals/fastObjectShallowCompare';
3
3
  import { warnOnce } from '@mui/x-internals/warning';
4
+ import { useSyncExternalStore } from 'use-sync-external-store/shim';
4
5
  import { useLazyRef } from "./useLazyRef.js";
5
- import { useOnMount } from "./useOnMount.js";
6
6
  function isOutputSelector(selector) {
7
7
  return selector.acceptsApiRef;
8
8
  }
@@ -42,8 +42,10 @@ const createRefs = () => ({
42
42
  state: null,
43
43
  equals: null,
44
44
  selector: null,
45
- args: null
45
+ args: undefined
46
46
  });
47
+ const EMPTY = [];
48
+ const emptyGetSnapshot = () => null;
47
49
 
48
50
  // TODO v8: Remove this function
49
51
  export const useGridSelector = (apiRef, selector, equals = defaultCompare) => {
@@ -60,15 +62,31 @@ export const useGridSelector = (apiRef, selector, equals = defaultCompare) => {
60
62
  refs.current.state = state;
61
63
  refs.current.equals = equals;
62
64
  refs.current.selector = selector;
63
- useOnMount(() => {
64
- return apiRef.current.store.subscribe(() => {
65
+ const subscribe = React.useCallback(() => {
66
+ if (refs.current.subscription) {
67
+ return null;
68
+ }
69
+ refs.current.subscription = apiRef.current.store.subscribe(() => {
65
70
  const newState = applySelector(apiRef, refs.current.selector);
66
71
  if (!refs.current.equals(refs.current.state, newState)) {
67
72
  refs.current.state = newState;
68
73
  setState(newState);
69
74
  }
70
75
  });
71
- });
76
+ return null;
77
+ },
78
+ // eslint-disable-next-line react-hooks/exhaustive-deps
79
+ EMPTY);
80
+ const unsubscribe = React.useCallback(() => {
81
+ return () => {
82
+ if (refs.current.subscription) {
83
+ refs.current.subscription();
84
+ refs.current.subscription = undefined;
85
+ }
86
+ };
87
+ // eslint-disable-next-line react-hooks/exhaustive-deps
88
+ }, EMPTY);
89
+ useSyncExternalStore(unsubscribe, subscribe, emptyGetSnapshot);
72
90
  return state;
73
91
  };
74
92
 
@@ -96,14 +114,30 @@ export const useGridSelectorV8 = (apiRef, selector, args = undefined, equals = d
96
114
  setState(newState);
97
115
  }
98
116
  }
99
- useOnMount(() => {
100
- return apiRef.current.store.subscribe(() => {
117
+ const subscribe = React.useCallback(() => {
118
+ if (refs.current.subscription) {
119
+ return null;
120
+ }
121
+ refs.current.subscription = apiRef.current.store.subscribe(() => {
101
122
  const newState = applySelectorV8(apiRef, refs.current.selector, refs.current.args, apiRef.current.instanceId);
102
123
  if (!refs.current.equals(refs.current.state, newState)) {
103
124
  refs.current.state = newState;
104
125
  setState(newState);
105
126
  }
106
127
  });
107
- });
128
+ return null;
129
+ },
130
+ // eslint-disable-next-line react-hooks/exhaustive-deps
131
+ EMPTY);
132
+ const unsubscribe = React.useCallback(() => {
133
+ return () => {
134
+ if (refs.current.subscription) {
135
+ refs.current.subscription();
136
+ refs.current.subscription = undefined;
137
+ }
138
+ };
139
+ // eslint-disable-next-line react-hooks/exhaustive-deps
140
+ }, EMPTY);
141
+ useSyncExternalStore(unsubscribe, subscribe, emptyGetSnapshot);
108
142
  return state;
109
143
  };
@@ -0,0 +1,5 @@
1
+ import { useSyncExternalStore } from 'use-sync-external-store/shim';
2
+ const emptySubscribe = () => () => {};
3
+ const clientSnapshot = () => false;
4
+ const serverSnapshot = () => true;
5
+ export const useIsSSR = () => useSyncExternalStore(emptySubscribe, clientSnapshot, serverSnapshot);
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v7.24.1
2
+ * @mui/x-data-grid v7.26.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -22,6 +22,7 @@ export { useGridDensity, densityStateInitializer } from "../hooks/features/densi
22
22
  export { useGridCsvExport } from "../hooks/features/export/useGridCsvExport.js";
23
23
  export { useGridPrintExport } from "../hooks/features/export/useGridPrintExport.js";
24
24
  export { useGridFilter, filterStateInitializer } from "../hooks/features/filter/useGridFilter.js";
25
+ export { defaultGridFilterLookup } from "../hooks/features/filter/gridFilterState.js";
25
26
  export { passFilterLogic } from "../hooks/features/filter/gridFilterUtils.js";
26
27
  export { gridFilteredChildrenCountLookupSelector, gridExpandedSortedRowTreeLevelPositionLookupSelector } from "../hooks/features/filter/gridFilterSelector.js";
27
28
  export { isSingleSelectColDef } from "../components/panel/filterPanel/filterPanelUtils.js";
@@ -42,7 +43,6 @@ export { useGridParamsApi } from "../hooks/features/rows/useGridParamsApi.js";
42
43
  export { getRowIdFromRowModel, GRID_ID_AUTOGENERATED } from "../hooks/features/rows/gridRowsUtils.js";
43
44
  export { gridAdditionalRowGroupsSelector, gridPinnedRowsSelector } from "../hooks/features/rows/gridRowsSelector.js";
44
45
  export { headerFilteringStateInitializer, useGridHeaderFiltering } from "../hooks/features/headerFiltering/useGridHeaderFiltering.js";
45
- export { calculatePinnedRowsHeight } from "../hooks/features/rows/gridRowsUtils.js";
46
46
  export { useGridRowSelection, rowSelectionStateInitializer } from "../hooks/features/rowSelection/useGridRowSelection.js";
47
47
  export { useGridRowSelectionPreProcessors } from "../hooks/features/rowSelection/useGridRowSelectionPreProcessors.js";
48
48
  export { useGridSorting, sortingStateInitializer } from "../hooks/features/sorting/useGridSorting.js";
@@ -50,6 +50,7 @@ export { gridSortedRowIndexLookupSelector } from "../hooks/features/sorting/grid
50
50
  export { useGridScroll } from "../hooks/features/scroll/useGridScroll.js";
51
51
  export { useGridEvents } from "../hooks/features/events/useGridEvents.js";
52
52
  export { dimensionsStateInitializer, useGridDimensions } from "../hooks/features/dimensions/useGridDimensions.js";
53
+ export * from "../hooks/features/dimensions/gridDimensionsSelectors.js";
53
54
  export { useGridStatePersistence } from "../hooks/features/statePersistence/useGridStatePersistence.js";
54
55
  export { useGridVirtualScroller, EMPTY_DETAIL_PANELS } from "../hooks/features/virtualization/useGridVirtualScroller.js";
55
56
  export * from "../hooks/features/virtualization/index.js";
@@ -1,4 +1,3 @@
1
- export * from "./gridParamsApi.js";
2
1
  export * from "./gridColumnApi.js";
3
2
  export * from "./gridDensityApi.js";
4
3
  export * from "./gridRowApi.js";
@@ -0,0 +1,3 @@
1
+ export function roundToDecimalPlaces(value, decimals) {
2
+ return Math.round(value * 10 ** decimals) / 10 ** decimals;
3
+ }
@@ -196,4 +196,9 @@ export function deepClone(obj) {
196
196
  * of a `eslint-disable-next-line react-hooks/exhaustive-deps` because
197
197
  * that hint disables checks on all values instead of just one.
198
198
  */
199
- export function eslintUseValue(_) {}
199
+ export function eslintUseValue(_) {}
200
+ export const runIf = (condition, fn) => params => {
201
+ if (condition) {
202
+ fn(params);
203
+ }
204
+ };