@mui/x-data-grid 7.17.0 → 7.19.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 (203) hide show
  1. package/CHANGELOG.md +208 -5
  2. package/DataGrid/DataGrid.js +16 -1
  3. package/DataGrid/useDataGridComponent.js +3 -0
  4. package/DataGrid/useDataGridProps.js +2 -1
  5. package/components/GridRow.js +1 -0
  6. package/components/cell/GridCell.js +33 -9
  7. package/components/columnHeaders/GridBaseColumnHeaders.js +1 -1
  8. package/components/columnSelection/GridCellCheckboxRenderer.js +12 -4
  9. package/components/columnSelection/GridHeaderCheckbox.d.ts +1 -1
  10. package/components/containers/GridRoot.js +1 -1
  11. package/components/containers/GridRootStyles.js +32 -23
  12. package/components/containers/GridToolbarContainer.js +1 -1
  13. package/components/menu/GridMenu.js +1 -1
  14. package/components/panel/GridPanel.d.ts +1 -1
  15. package/components/panel/GridPanel.js +1 -1
  16. package/components/panel/GridPanelContent.js +1 -1
  17. package/components/panel/GridPanelFooter.js +1 -1
  18. package/components/panel/GridPanelHeader.js +1 -1
  19. package/components/panel/GridPanelWrapper.js +1 -1
  20. package/components/panel/filterPanel/filterPanelUtils.d.ts +1 -1
  21. package/components/toolbar/GridToolbarQuickFilter.js +1 -1
  22. package/components/virtualization/GridBottomContainer.d.ts +1 -1
  23. package/components/virtualization/GridBottomContainer.js +18 -1
  24. package/components/virtualization/GridMainContainer.js +3 -1
  25. package/components/virtualization/GridTopContainer.d.ts +1 -1
  26. package/components/virtualization/GridTopContainer.js +1 -1
  27. package/components/virtualization/GridVirtualScrollbar.js +1 -7
  28. package/components/virtualization/GridVirtualScroller.js +1 -0
  29. package/components/virtualization/GridVirtualScrollerFiller.js +3 -4
  30. package/hooks/features/columnGrouping/gridColumnGroupsSelector.d.ts +4 -4
  31. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +1 -2
  32. package/hooks/features/columnHeaders/useGridColumnHeaders.js +11 -11
  33. package/hooks/features/columnResize/columnResizeSelector.d.ts +1 -1
  34. package/hooks/features/columnResize/useGridColumnResize.js +6 -6
  35. package/hooks/features/columns/gridColumnsSelector.d.ts +12 -12
  36. package/hooks/features/columns/gridColumnsUtils.js +3 -2
  37. package/hooks/features/density/densitySelector.d.ts +1 -1
  38. package/hooks/features/dimensions/gridDimensionsApi.d.ts +4 -0
  39. package/hooks/features/dimensions/useGridDimensions.d.ts +1 -1
  40. package/hooks/features/dimensions/useGridDimensions.js +4 -1
  41. package/hooks/features/editing/useGridCellEditing.js +3 -19
  42. package/hooks/features/editing/useGridRowEditing.js +7 -2
  43. package/hooks/features/editing/utils.d.ts +2 -0
  44. package/hooks/features/editing/utils.js +15 -0
  45. package/hooks/features/export/useGridPrintExport.js +2 -1
  46. package/hooks/features/filter/gridFilterSelector.d.ts +17 -17
  47. package/hooks/features/focus/gridFocusStateSelector.d.ts +8 -8
  48. package/hooks/features/focus/useGridFocus.js +2 -1
  49. package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.d.ts +3 -3
  50. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +10 -46
  51. package/hooks/features/keyboardNavigation/utils.d.ts +17 -0
  52. package/hooks/features/keyboardNavigation/utils.js +58 -0
  53. package/hooks/features/pagination/gridPaginationSelector.d.ts +9 -9
  54. package/hooks/features/rowSelection/gridRowSelectionSelector.d.ts +3 -3
  55. package/hooks/features/rowSelection/useGridRowSelection.d.ts +1 -1
  56. package/hooks/features/rowSelection/useGridRowSelection.js +105 -29
  57. package/hooks/features/rowSelection/utils.d.ts +10 -0
  58. package/hooks/features/rowSelection/utils.js +156 -1
  59. package/hooks/features/rows/gridRowSpanningSelectors.d.ts +4 -0
  60. package/hooks/features/rows/gridRowSpanningSelectors.js +5 -0
  61. package/hooks/features/rows/gridRowSpanningUtils.d.ts +10 -0
  62. package/hooks/features/rows/gridRowSpanningUtils.js +42 -0
  63. package/hooks/features/rows/gridRowsSelector.d.ts +14 -14
  64. package/hooks/features/rows/useGridRowSpanning.d.ts +27 -0
  65. package/hooks/features/rows/useGridRowSpanning.js +257 -0
  66. package/hooks/features/rows/useGridRows.d.ts +1 -1
  67. package/hooks/features/rows/useGridRows.js +7 -1
  68. package/hooks/features/scroll/useGridScroll.js +19 -19
  69. package/hooks/features/sorting/gridSortingSelector.d.ts +4 -4
  70. package/hooks/features/virtualization/gridVirtualizationSelectors.d.ts +5 -5
  71. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
  72. package/hooks/features/virtualization/useGridVirtualScroller.js +17 -7
  73. package/hooks/utils/useGridApiEventHandler.js +0 -1
  74. package/hooks/utils/useGridVisibleRows.d.ts +2 -2
  75. package/index.js +1 -1
  76. package/internals/index.d.ts +2 -0
  77. package/internals/index.js +2 -0
  78. package/locales/bgBG.js +8 -9
  79. package/locales/deDE.js +4 -4
  80. package/locales/frFR.js +4 -4
  81. package/locales/hrHR.d.ts +1 -1
  82. package/locales/hrHR.js +69 -46
  83. package/locales/jaJP.js +1 -2
  84. package/locales/ptPT.d.ts +1 -1
  85. package/locales/ptPT.js +4 -4
  86. package/locales/viVN.js +20 -20
  87. package/locales/zhHK.d.ts +1 -1
  88. package/models/colDef/gridColDef.d.ts +4 -0
  89. package/models/gridRowSelectionModel.d.ts +4 -0
  90. package/models/gridStateCommunity.d.ts +2 -0
  91. package/models/props/DataGridProps.d.ts +30 -1
  92. package/modern/DataGrid/DataGrid.js +16 -1
  93. package/modern/DataGrid/useDataGridComponent.js +3 -0
  94. package/modern/DataGrid/useDataGridProps.js +2 -1
  95. package/modern/components/GridRow.js +1 -0
  96. package/modern/components/cell/GridCell.js +33 -9
  97. package/modern/components/columnHeaders/GridBaseColumnHeaders.js +1 -1
  98. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +12 -4
  99. package/modern/components/containers/GridRoot.js +1 -1
  100. package/modern/components/containers/GridRootStyles.js +32 -23
  101. package/modern/components/containers/GridToolbarContainer.js +1 -1
  102. package/modern/components/menu/GridMenu.js +1 -1
  103. package/modern/components/panel/GridPanel.js +1 -1
  104. package/modern/components/panel/GridPanelContent.js +1 -1
  105. package/modern/components/panel/GridPanelFooter.js +1 -1
  106. package/modern/components/panel/GridPanelHeader.js +1 -1
  107. package/modern/components/panel/GridPanelWrapper.js +1 -1
  108. package/modern/components/toolbar/GridToolbarQuickFilter.js +1 -1
  109. package/modern/components/virtualization/GridBottomContainer.js +18 -1
  110. package/modern/components/virtualization/GridMainContainer.js +3 -1
  111. package/modern/components/virtualization/GridTopContainer.js +1 -1
  112. package/modern/components/virtualization/GridVirtualScrollbar.js +1 -7
  113. package/modern/components/virtualization/GridVirtualScroller.js +1 -0
  114. package/modern/components/virtualization/GridVirtualScrollerFiller.js +3 -4
  115. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +11 -11
  116. package/modern/hooks/features/columnResize/useGridColumnResize.js +6 -6
  117. package/modern/hooks/features/columns/gridColumnsUtils.js +3 -2
  118. package/modern/hooks/features/dimensions/useGridDimensions.js +4 -1
  119. package/modern/hooks/features/editing/useGridCellEditing.js +3 -19
  120. package/modern/hooks/features/editing/useGridRowEditing.js +7 -2
  121. package/modern/hooks/features/editing/utils.js +15 -0
  122. package/modern/hooks/features/export/useGridPrintExport.js +2 -1
  123. package/modern/hooks/features/focus/useGridFocus.js +2 -1
  124. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +10 -46
  125. package/modern/hooks/features/keyboardNavigation/utils.js +58 -0
  126. package/modern/hooks/features/rowSelection/useGridRowSelection.js +105 -29
  127. package/modern/hooks/features/rowSelection/utils.js +156 -1
  128. package/modern/hooks/features/rows/gridRowSpanningSelectors.js +5 -0
  129. package/modern/hooks/features/rows/gridRowSpanningUtils.js +42 -0
  130. package/modern/hooks/features/rows/useGridRowSpanning.js +257 -0
  131. package/modern/hooks/features/rows/useGridRows.js +7 -1
  132. package/modern/hooks/features/scroll/useGridScroll.js +19 -19
  133. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +17 -7
  134. package/modern/hooks/utils/useGridApiEventHandler.js +0 -1
  135. package/modern/index.js +1 -1
  136. package/modern/internals/index.js +2 -0
  137. package/modern/locales/bgBG.js +8 -9
  138. package/modern/locales/deDE.js +4 -4
  139. package/modern/locales/frFR.js +4 -4
  140. package/modern/locales/hrHR.js +69 -46
  141. package/modern/locales/jaJP.js +1 -2
  142. package/modern/locales/ptPT.js +4 -4
  143. package/modern/locales/viVN.js +20 -20
  144. package/modern/utils/createSelector.js +6 -0
  145. package/modern/utils/domUtils.js +12 -12
  146. package/node/DataGrid/DataGrid.js +16 -1
  147. package/node/DataGrid/useDataGridComponent.js +3 -0
  148. package/node/DataGrid/useDataGridProps.js +2 -1
  149. package/node/components/GridRow.js +1 -0
  150. package/node/components/cell/GridCell.js +33 -9
  151. package/node/components/columnHeaders/GridBaseColumnHeaders.js +1 -1
  152. package/node/components/columnSelection/GridCellCheckboxRenderer.js +12 -4
  153. package/node/components/containers/GridRoot.js +1 -1
  154. package/node/components/containers/GridRootStyles.js +32 -23
  155. package/node/components/containers/GridToolbarContainer.js +1 -1
  156. package/node/components/menu/GridMenu.js +1 -1
  157. package/node/components/panel/GridPanel.js +1 -1
  158. package/node/components/panel/GridPanelContent.js +1 -1
  159. package/node/components/panel/GridPanelFooter.js +1 -1
  160. package/node/components/panel/GridPanelHeader.js +1 -1
  161. package/node/components/panel/GridPanelWrapper.js +1 -1
  162. package/node/components/toolbar/GridToolbarQuickFilter.js +1 -1
  163. package/node/components/virtualization/GridBottomContainer.js +18 -1
  164. package/node/components/virtualization/GridMainContainer.js +3 -1
  165. package/node/components/virtualization/GridTopContainer.js +1 -1
  166. package/node/components/virtualization/GridVirtualScrollbar.js +1 -7
  167. package/node/components/virtualization/GridVirtualScroller.js +1 -0
  168. package/node/components/virtualization/GridVirtualScrollerFiller.js +3 -4
  169. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +11 -11
  170. package/node/hooks/features/columnResize/useGridColumnResize.js +6 -6
  171. package/node/hooks/features/columns/gridColumnsUtils.js +3 -2
  172. package/node/hooks/features/dimensions/useGridDimensions.js +4 -1
  173. package/node/hooks/features/editing/useGridCellEditing.js +3 -19
  174. package/node/hooks/features/editing/useGridRowEditing.js +7 -2
  175. package/node/hooks/features/editing/utils.js +22 -0
  176. package/node/hooks/features/export/useGridPrintExport.js +2 -1
  177. package/node/hooks/features/focus/useGridFocus.js +2 -1
  178. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +16 -53
  179. package/node/hooks/features/keyboardNavigation/utils.js +68 -0
  180. package/node/hooks/features/rowSelection/useGridRowSelection.js +102 -26
  181. package/node/hooks/features/rowSelection/utils.js +160 -1
  182. package/node/hooks/features/rows/gridRowSpanningSelectors.js +11 -0
  183. package/node/hooks/features/rows/gridRowSpanningUtils.js +52 -0
  184. package/node/hooks/features/rows/useGridRowSpanning.js +267 -0
  185. package/node/hooks/features/rows/useGridRows.js +7 -1
  186. package/node/hooks/features/scroll/useGridScroll.js +19 -19
  187. package/node/hooks/features/virtualization/useGridVirtualScroller.js +17 -7
  188. package/node/hooks/utils/useGridApiEventHandler.js +0 -1
  189. package/node/index.js +1 -1
  190. package/node/internals/index.js +38 -15
  191. package/node/locales/bgBG.js +8 -9
  192. package/node/locales/deDE.js +4 -4
  193. package/node/locales/frFR.js +4 -4
  194. package/node/locales/hrHR.js +69 -46
  195. package/node/locales/jaJP.js +1 -2
  196. package/node/locales/ptPT.js +4 -4
  197. package/node/locales/viVN.js +20 -20
  198. package/node/utils/createSelector.js +6 -0
  199. package/node/utils/domUtils.js +12 -12
  200. package/package.json +3 -3
  201. package/utils/createSelector.js +6 -0
  202. package/utils/domUtils.d.ts +4 -4
  203. package/utils/domUtils.js +12 -12
@@ -3,11 +3,12 @@ import * as React from 'react';
3
3
  import { GridSignature, useGridApiEventHandler } from "../../utils/useGridApiEventHandler.js";
4
4
  import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
5
5
  import { useGridLogger } from "../../utils/useGridLogger.js";
6
- import { gridRowsLookupSelector } from "../rows/gridRowsSelector.js";
6
+ import { useGridSelector } from "../../utils/useGridSelector.js";
7
+ import { gridRowMaximumTreeDepthSelector, gridRowTreeSelector } from "../rows/gridRowsSelector.js";
7
8
  import { gridRowSelectionStateSelector, selectedGridRowsSelector, selectedIdsLookupSelector } from "./gridRowSelectionSelector.js";
8
9
  import { gridPaginatedVisibleSortedGridRowIdsSelector } from "../pagination/index.js";
9
10
  import { gridFocusCellSelector } from "../focus/gridFocusStateSelector.js";
10
- import { gridExpandedSortedRowIdsSelector, gridFilterModelSelector } from "../filter/gridFilterSelector.js";
11
+ import { gridExpandedSortedRowIdsSelector, gridFilteredRowsLookupSelector } from "../filter/gridFilterSelector.js";
11
12
  import { GRID_CHECKBOX_SELECTION_COL_DEF, GRID_ACTIONS_COLUMN_TYPE } from "../../../colDef/index.js";
12
13
  import { GridCellModes } from "../../../models/gridEditRowModel.js";
13
14
  import { isKeyboardEvent, isNavigationKey } from "../../../utils/keyboardUtils.js";
@@ -15,7 +16,7 @@ import { useGridVisibleRows } from "../../utils/useGridVisibleRows.js";
15
16
  import { GRID_DETAIL_PANEL_TOGGLE_FIELD } from "../../../constants/gridDetailPanelToggleField.js";
16
17
  import { gridClasses } from "../../../constants/gridClasses.js";
17
18
  import { isEventTargetInPortal } from "../../../utils/domUtils.js";
18
- import { isMultipleRowSelectionEnabled } from "./utils.js";
19
+ import { isMultipleRowSelectionEnabled, findRowsToSelect, findRowsToDeselect } from "./utils.js";
19
20
  const getSelectionModelPropValue = (selectionModelProp, prevSelectionModel) => {
20
21
  if (selectionModelProp == null) {
21
22
  return selectionModelProp;
@@ -40,11 +41,12 @@ export const rowSelectionStateInitializer = (state, props) => _extends({}, state
40
41
  */
41
42
  export const useGridRowSelection = (apiRef, props) => {
42
43
  const logger = useGridLogger(apiRef, 'useGridSelection');
43
- const runIfRowSelectionIsEnabled = callback => (...args) => {
44
+ const runIfRowSelectionIsEnabled = React.useCallback(callback => (...args) => {
44
45
  if (props.rowSelection) {
45
46
  callback(...args);
46
47
  }
47
- };
48
+ }, [props.rowSelection]);
49
+ const applyAutoSelection = props.signature !== GridSignature.DataGrid && (props.rowSelectionPropagation?.parents || props.rowSelectionPropagation?.descendants);
48
50
  const propRowSelectionModel = React.useMemo(() => {
49
51
  return getSelectionModelPropValue(props.rowSelectionModel, gridRowSelectionStateSelector(apiRef.current.state));
50
52
  }, [apiRef, props.rowSelectionModel]);
@@ -63,6 +65,8 @@ export const useGridRowSelection = (apiRef, props) => {
63
65
  } = props;
64
66
  const canHaveMultipleSelection = isMultipleRowSelectionEnabled(props);
65
67
  const visibleRows = useGridVisibleRows(apiRef, props);
68
+ const tree = useGridSelector(apiRef, gridRowTreeSelector);
69
+ const isNestedData = useGridSelector(apiRef, gridRowMaximumTreeDepthSelector) > 1;
66
70
  const expandMouseRowRangeSelection = React.useCallback(id => {
67
71
  let endId = id;
68
72
  const startId = lastRowToggled.current ?? id;
@@ -87,7 +91,7 @@ export const useGridRowSelection = (apiRef, props) => {
87
91
  }, !isSelected);
88
92
  }, [apiRef]);
89
93
 
90
- /**
94
+ /*
91
95
  * API METHODS
92
96
  */
93
97
  const setRowSelectionModel = React.useCallback(model => {
@@ -125,34 +129,80 @@ export const useGridRowSelection = (apiRef, props) => {
125
129
  lastRowToggled.current = id;
126
130
  if (resetSelection) {
127
131
  logger.debug(`Setting selection for row ${id}`);
128
- apiRef.current.setRowSelectionModel(isSelected ? [id] : []);
132
+ const newSelection = [];
133
+ const addRow = rowId => {
134
+ newSelection.push(rowId);
135
+ };
136
+ if (isSelected) {
137
+ addRow(id);
138
+ if (applyAutoSelection) {
139
+ findRowsToSelect(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, addRow);
140
+ }
141
+ }
142
+ apiRef.current.setRowSelectionModel(newSelection);
129
143
  } else {
130
144
  logger.debug(`Toggling selection for row ${id}`);
131
145
  const selection = gridRowSelectionStateSelector(apiRef.current.state);
132
- const newSelection = selection.filter(el => el !== id);
146
+ const newSelection = new Set(selection);
147
+ newSelection.delete(id);
148
+ const addRow = rowId => {
149
+ newSelection.add(rowId);
150
+ };
151
+ const removeRow = rowId => {
152
+ newSelection.delete(rowId);
153
+ };
133
154
  if (isSelected) {
134
- newSelection.push(id);
155
+ addRow(id);
156
+ if (applyAutoSelection) {
157
+ findRowsToSelect(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, addRow);
158
+ }
159
+ } else if (applyAutoSelection) {
160
+ findRowsToDeselect(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, removeRow);
135
161
  }
136
- const isSelectionValid = newSelection.length < 2 || canHaveMultipleSelection;
162
+ const isSelectionValid = newSelection.size < 2 || canHaveMultipleSelection;
137
163
  if (isSelectionValid) {
138
- apiRef.current.setRowSelectionModel(newSelection);
164
+ apiRef.current.setRowSelectionModel(Array.from(newSelection));
139
165
  }
140
166
  }
141
- }, [apiRef, logger, canHaveMultipleSelection]);
167
+ }, [apiRef, logger, applyAutoSelection, tree, props.rowSelectionPropagation?.descendants, props.rowSelectionPropagation?.parents, canHaveMultipleSelection]);
142
168
  const selectRows = React.useCallback((ids, isSelected = true, resetSelection = false) => {
143
169
  logger.debug(`Setting selection for several rows`);
144
170
  const selectableIds = ids.filter(id => apiRef.current.isRowSelectable(id));
145
171
  let newSelection;
146
172
  if (resetSelection) {
147
- newSelection = isSelected ? selectableIds : [];
173
+ if (isSelected) {
174
+ newSelection = selectableIds;
175
+ if (applyAutoSelection) {
176
+ const addRow = rowId => {
177
+ newSelection.push(rowId);
178
+ };
179
+ selectableIds.forEach(id => {
180
+ findRowsToSelect(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, addRow);
181
+ });
182
+ }
183
+ } else {
184
+ newSelection = [];
185
+ }
148
186
  } else {
149
187
  // We clone the existing object to avoid mutating the same object returned by the selector to others part of the project
150
188
  const selectionLookup = _extends({}, selectedIdsLookupSelector(apiRef));
189
+ const addRow = rowId => {
190
+ selectionLookup[rowId] = rowId;
191
+ };
192
+ const removeRow = rowId => {
193
+ delete selectionLookup[rowId];
194
+ };
151
195
  selectableIds.forEach(id => {
152
196
  if (isSelected) {
153
197
  selectionLookup[id] = id;
198
+ if (applyAutoSelection) {
199
+ findRowsToSelect(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, addRow);
200
+ }
154
201
  } else {
155
- delete selectionLookup[id];
202
+ removeRow(id);
203
+ if (applyAutoSelection) {
204
+ findRowsToDeselect(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, removeRow);
205
+ }
156
206
  }
157
207
  });
158
208
  newSelection = Object.values(selectionLookup);
@@ -161,7 +211,7 @@ export const useGridRowSelection = (apiRef, props) => {
161
211
  if (isSelectionValid) {
162
212
  apiRef.current.setRowSelectionModel(newSelection);
163
213
  }
164
- }, [apiRef, logger, canHaveMultipleSelection]);
214
+ }, [logger, applyAutoSelection, canHaveMultipleSelection, apiRef, tree, props.rowSelectionPropagation?.descendants, props.rowSelectionPropagation?.parents]);
165
215
  const selectRowRange = React.useCallback(({
166
216
  startId,
167
217
  endId
@@ -193,29 +243,52 @@ export const useGridRowSelection = (apiRef, props) => {
193
243
  useGridApiMethod(apiRef, selectionPublicApi, 'public');
194
244
  useGridApiMethod(apiRef, selectionPrivateApi, props.signature === GridSignature.DataGrid ? 'private' : 'public');
195
245
 
196
- /**
246
+ /*
197
247
  * EVENTS
198
248
  */
199
- const removeOutdatedSelection = React.useCallback(() => {
200
- if (props.keepNonExistentRowsSelected) {
201
- return;
202
- }
249
+ const removeOutdatedSelection = React.useCallback((sortModelUpdated = false) => {
203
250
  const currentSelection = gridRowSelectionStateSelector(apiRef.current.state);
204
- const rowsLookup = gridRowsLookupSelector(apiRef);
251
+ const filteredRowsLookup = gridFilteredRowsLookupSelector(apiRef);
205
252
 
206
253
  // We clone the existing object to avoid mutating the same object returned by the selector to others part of the project
207
254
  const selectionLookup = _extends({}, selectedIdsLookupSelector(apiRef));
208
255
  let hasChanged = false;
209
256
  currentSelection.forEach(id => {
210
- if (!rowsLookup[id]) {
257
+ if (filteredRowsLookup[id] === false) {
258
+ if (props.keepNonExistentRowsSelected) {
259
+ return;
260
+ }
211
261
  delete selectionLookup[id];
212
262
  hasChanged = true;
263
+ return;
264
+ }
265
+ if (!props.rowSelectionPropagation?.parents) {
266
+ return;
267
+ }
268
+ const node = tree[id];
269
+ if (node.type === 'group') {
270
+ const isAutoGenerated = node.isAutoGenerated;
271
+ if (isAutoGenerated) {
272
+ delete selectionLookup[id];
273
+ hasChanged = true;
274
+ return;
275
+ }
276
+ // Keep previously selected tree data parents selected if all their children are filtered out
277
+ if (!node.children.every(childId => filteredRowsLookup[childId] === false)) {
278
+ delete selectionLookup[id];
279
+ hasChanged = true;
280
+ }
213
281
  }
214
282
  });
215
- if (hasChanged) {
216
- apiRef.current.setRowSelectionModel(Object.values(selectionLookup));
283
+ if (hasChanged || isNestedData && !sortModelUpdated) {
284
+ const newSelection = Object.values(selectionLookup);
285
+ if (isNestedData) {
286
+ apiRef.current.selectRows(newSelection, true, true);
287
+ } else {
288
+ apiRef.current.setRowSelectionModel(newSelection);
289
+ }
217
290
  }
218
- }, [apiRef, props.keepNonExistentRowsSelected]);
291
+ }, [apiRef, isNestedData, props.rowSelectionPropagation?.parents, props.keepNonExistentRowsSelected, tree]);
219
292
  const handleSingleRowSelection = React.useCallback((id, event) => {
220
293
  const hasCtrlKey = event.metaKey || event.ctrlKey;
221
294
 
@@ -276,8 +349,7 @@ export const useGridRowSelection = (apiRef, props) => {
276
349
  }, [apiRef, expandMouseRowRangeSelection, canHaveMultipleSelection]);
277
350
  const handleHeaderSelectionCheckboxChange = React.useCallback(params => {
278
351
  const rowsToBeSelected = props.pagination && props.checkboxSelectionVisibleOnly && props.paginationMode === 'client' ? gridPaginatedVisibleSortedGridRowIdsSelector(apiRef) : gridExpandedSortedRowIdsSelector(apiRef);
279
- const filterModel = gridFilterModelSelector(apiRef);
280
- apiRef.current.selectRows(rowsToBeSelected, params.value, filterModel?.items.length > 0);
352
+ apiRef.current.selectRows(rowsToBeSelected, params.value);
281
353
  }, [apiRef, props.checkboxSelectionVisibleOnly, props.pagination, props.paginationMode]);
282
354
  const handleCellKeyDown = React.useCallback((params, event) => {
283
355
  // Get the most recent cell mode because it may have been changed by another listener
@@ -341,14 +413,15 @@ export const useGridRowSelection = (apiRef, props) => {
341
413
  selectRows(apiRef.current.getAllRowIds(), true);
342
414
  }
343
415
  }, [apiRef, handleSingleRowSelection, selectRows, visibleRows.rows, canHaveMultipleSelection]);
344
- useGridApiEventHandler(apiRef, 'sortedRowsSet', runIfRowSelectionIsEnabled(removeOutdatedSelection));
416
+ useGridApiEventHandler(apiRef, 'sortedRowsSet', runIfRowSelectionIsEnabled(() => removeOutdatedSelection(true)));
417
+ useGridApiEventHandler(apiRef, 'filteredRowsSet', runIfRowSelectionIsEnabled(removeOutdatedSelection));
345
418
  useGridApiEventHandler(apiRef, 'rowClick', runIfRowSelectionIsEnabled(handleRowClick));
346
419
  useGridApiEventHandler(apiRef, 'rowSelectionCheckboxChange', runIfRowSelectionIsEnabled(handleRowSelectionCheckboxChange));
347
420
  useGridApiEventHandler(apiRef, 'headerSelectionCheckboxChange', handleHeaderSelectionCheckboxChange);
348
421
  useGridApiEventHandler(apiRef, 'cellMouseDown', runIfRowSelectionIsEnabled(preventSelectionOnShift));
349
422
  useGridApiEventHandler(apiRef, 'cellKeyDown', runIfRowSelectionIsEnabled(handleCellKeyDown));
350
423
 
351
- /**
424
+ /*
352
425
  * EFFECTS
353
426
  */
354
427
  React.useEffect(() => {
@@ -386,4 +459,7 @@ export const useGridRowSelection = (apiRef, props) => {
386
459
  apiRef.current.setRowSelectionModel([]);
387
460
  }
388
461
  }, [apiRef, canHaveMultipleSelection, checkboxSelection, isStateControlled, props.rowSelection]);
462
+ React.useEffect(() => {
463
+ runIfRowSelectionIsEnabled(removeOutdatedSelection);
464
+ }, [removeOutdatedSelection, runIfRowSelectionIsEnabled]);
389
465
  };
@@ -1,2 +1,12 @@
1
+ import type { GridRowId, GridRowTreeConfig } from '../../../models/gridRows';
1
2
  import type { DataGridProcessedProps } from '../../../models/props/DataGridProps';
3
+ import type { GridPrivateApiCommunity } from '../../../models/api/gridApiCommunity';
4
+ import type { GridRowSelectionPropagation } from '../../../models/gridRowSelectionModel';
5
+ export declare const ROW_SELECTION_PROPAGATION_DEFAULT: GridRowSelectionPropagation;
6
+ export declare function getCheckboxPropsSelector(groupId: GridRowId, autoSelectParents: boolean): import("../../..").OutputSelector<import("../../../models/gridStateCommunity").GridStateCommunity, {
7
+ isIndeterminate: boolean;
8
+ isChecked: boolean;
9
+ }>;
2
10
  export declare function isMultipleRowSelectionEnabled(props: Pick<DataGridProcessedProps, 'signature' | 'disableMultipleRowSelection' | 'checkboxSelection'>): boolean;
11
+ export declare const findRowsToSelect: (apiRef: React.MutableRefObject<GridPrivateApiCommunity>, tree: GridRowTreeConfig, selectedRow: GridRowId, autoSelectDescendants: boolean, autoSelectParents: boolean, addRow: (rowId: GridRowId) => void) => void;
12
+ export declare const findRowsToDeselect: (apiRef: React.MutableRefObject<GridPrivateApiCommunity>, tree: GridRowTreeConfig, deselectedRow: GridRowId, autoSelectDescendants: boolean, autoSelectParents: boolean, removeRow: (rowId: GridRowId) => void) => void;
@@ -1,8 +1,163 @@
1
1
  import { GridSignature } from "../../utils/useGridApiEventHandler.js";
2
+ import { GRID_ROOT_GROUP_ID } from "../rows/gridRowsUtils.js";
3
+ import { gridFilteredRowsLookupSelector } from "../filter/gridFilterSelector.js";
4
+ import { gridSortedRowIdsSelector } from "../sorting/gridSortingSelector.js";
5
+ import { selectedIdsLookupSelector } from "./gridRowSelectionSelector.js";
6
+ import { gridRowTreeSelector } from "../rows/gridRowsSelector.js";
7
+ import { createSelector } from "../../../utils/createSelector.js";
8
+ export const ROW_SELECTION_PROPAGATION_DEFAULT = {
9
+ parents: false,
10
+ descendants: false
11
+ };
12
+ function getGridRowGroupSelectableDescendants(apiRef, groupId) {
13
+ const rowTree = gridRowTreeSelector(apiRef);
14
+ const sortedRowIds = gridSortedRowIdsSelector(apiRef);
15
+ const filteredRowsLookup = gridFilteredRowsLookupSelector(apiRef);
16
+ const groupNode = rowTree[groupId];
17
+ if (!groupNode || groupNode.type !== 'group') {
18
+ return [];
19
+ }
20
+ const descendants = [];
21
+ const startIndex = sortedRowIds.findIndex(id => id === groupId) + 1;
22
+ for (let index = startIndex; index < sortedRowIds.length && rowTree[sortedRowIds[index]]?.depth > groupNode.depth; index += 1) {
23
+ const id = sortedRowIds[index];
24
+ if (filteredRowsLookup[id] !== false && apiRef.current.isRowSelectable(id)) {
25
+ descendants.push(id);
26
+ }
27
+ }
28
+ return descendants;
29
+ }
30
+
31
+ // TODO v8: Use `createSelectorV8`
32
+ export function getCheckboxPropsSelector(groupId, autoSelectParents) {
33
+ return createSelector(gridRowTreeSelector, gridSortedRowIdsSelector, gridFilteredRowsLookupSelector, selectedIdsLookupSelector, (rowTree, sortedRowIds, filteredRowsLookup, rowSelectionLookup) => {
34
+ const groupNode = rowTree[groupId];
35
+ if (!groupNode || groupNode.type !== 'group') {
36
+ return {
37
+ isIndeterminate: false,
38
+ isChecked: rowSelectionLookup[groupId] === groupId
39
+ };
40
+ }
41
+ if (rowSelectionLookup[groupId] === groupId) {
42
+ return {
43
+ isIndeterminate: false,
44
+ isChecked: true
45
+ };
46
+ }
47
+ let selectableDescendentsCount = 0;
48
+ let selectedDescendentsCount = 0;
49
+ const startIndex = sortedRowIds.findIndex(id => id === groupId) + 1;
50
+ for (let index = startIndex; index < sortedRowIds.length && rowTree[sortedRowIds[index]]?.depth > groupNode.depth; index += 1) {
51
+ const id = sortedRowIds[index];
52
+ if (filteredRowsLookup[id] !== false) {
53
+ selectableDescendentsCount += 1;
54
+ if (rowSelectionLookup[id] !== undefined) {
55
+ selectedDescendentsCount += 1;
56
+ }
57
+ }
58
+ }
59
+ return {
60
+ isIndeterminate: selectedDescendentsCount > 0 && selectedDescendentsCount < selectableDescendentsCount || selectedDescendentsCount === selectableDescendentsCount && rowSelectionLookup[groupId] === undefined,
61
+ isChecked: autoSelectParents ? selectedDescendentsCount > 0 : rowSelectionLookup[groupId] === groupId
62
+ };
63
+ });
64
+ }
2
65
  export function isMultipleRowSelectionEnabled(props) {
3
66
  if (props.signature === GridSignature.DataGrid) {
4
67
  // DataGrid Community has multiple row selection enabled only if checkbox selection is enabled.
5
68
  return props.checkboxSelection && props.disableMultipleRowSelection !== true;
6
69
  }
7
70
  return !props.disableMultipleRowSelection;
8
- }
71
+ }
72
+ const getRowNodeParents = (tree, id) => {
73
+ const parents = [];
74
+ let parent = id;
75
+ while (parent != null && parent !== GRID_ROOT_GROUP_ID) {
76
+ const node = tree[parent];
77
+ if (!node) {
78
+ return parents;
79
+ }
80
+ parents.push(parent);
81
+ parent = node.parent;
82
+ }
83
+ return parents;
84
+ };
85
+ const getFilteredRowNodeSiblings = (tree, filteredRows, id) => {
86
+ const node = tree[id];
87
+ if (!node) {
88
+ return [];
89
+ }
90
+ const parent = node.parent;
91
+ if (parent == null) {
92
+ return [];
93
+ }
94
+ const parentNode = tree[parent];
95
+ return parentNode.children.filter(childId => childId !== id && filteredRows[childId]);
96
+ };
97
+ export const findRowsToSelect = (apiRef, tree, selectedRow, autoSelectDescendants, autoSelectParents, addRow) => {
98
+ const filteredRows = gridFilteredRowsLookupSelector(apiRef);
99
+ const selectedIdsLookup = selectedIdsLookupSelector(apiRef);
100
+ const selectedDescendants = new Set([]);
101
+ if (!autoSelectDescendants && !autoSelectParents) {
102
+ return;
103
+ }
104
+ if (autoSelectDescendants) {
105
+ const rowNode = tree[selectedRow];
106
+ if (rowNode?.type === 'group') {
107
+ const descendants = getGridRowGroupSelectableDescendants(apiRef, selectedRow);
108
+ descendants.forEach(rowId => {
109
+ addRow(rowId);
110
+ selectedDescendants.add(rowId);
111
+ });
112
+ }
113
+ }
114
+ if (autoSelectParents) {
115
+ const checkAllDescendantsSelected = rowId => {
116
+ if (selectedIdsLookup[rowId] !== rowId && !selectedDescendants.has(rowId)) {
117
+ return false;
118
+ }
119
+ const node = tree[rowId];
120
+ if (node?.type !== 'group') {
121
+ return true;
122
+ }
123
+ return node.children.every(checkAllDescendantsSelected);
124
+ };
125
+ const traverseParents = rowId => {
126
+ const siblings = getFilteredRowNodeSiblings(tree, filteredRows, rowId);
127
+ if (siblings.length === 0 || siblings.every(checkAllDescendantsSelected)) {
128
+ const rowNode = tree[rowId];
129
+ const parent = rowNode.parent;
130
+ if (parent != null && parent !== GRID_ROOT_GROUP_ID && apiRef.current.isRowSelectable(parent)) {
131
+ addRow(parent);
132
+ selectedDescendants.add(parent);
133
+ traverseParents(parent);
134
+ }
135
+ }
136
+ };
137
+ traverseParents(selectedRow);
138
+ }
139
+ };
140
+ export const findRowsToDeselect = (apiRef, tree, deselectedRow, autoSelectDescendants, autoSelectParents, removeRow) => {
141
+ const selectedIdsLookup = selectedIdsLookupSelector(apiRef);
142
+ if (!autoSelectParents && !autoSelectDescendants) {
143
+ return;
144
+ }
145
+ if (autoSelectParents) {
146
+ const allParents = getRowNodeParents(tree, deselectedRow);
147
+ allParents.forEach(parent => {
148
+ const isSelected = selectedIdsLookup[parent] === parent;
149
+ if (isSelected) {
150
+ removeRow(parent);
151
+ }
152
+ });
153
+ }
154
+ if (autoSelectDescendants) {
155
+ const rowNode = tree[deselectedRow];
156
+ if (rowNode?.type === 'group') {
157
+ const descendants = getGridRowGroupSelectableDescendants(apiRef, deselectedRow);
158
+ descendants.forEach(descendant => {
159
+ removeRow(descendant);
160
+ });
161
+ }
162
+ }
163
+ };
@@ -0,0 +1,4 @@
1
+ import { GridStateCommunity } from '../../../models/gridStateCommunity';
2
+ export declare const gridRowSpanningHiddenCellsSelector: import("../../..").OutputSelector<GridStateCommunity, Record<import("../../..").GridRowId, Record<string, boolean>>>;
3
+ export declare const gridRowSpanningSpannedCellsSelector: import("../../..").OutputSelector<GridStateCommunity, Record<import("../../..").GridRowId, Record<string, number>>>;
4
+ export declare const gridRowSpanningHiddenCellsOriginMapSelector: import("../../..").OutputSelector<GridStateCommunity, Record<number, Record<string, number>>>;
@@ -0,0 +1,5 @@
1
+ import { createSelector } from "../../../utils/createSelector.js";
2
+ const gridRowSpanningStateSelector = state => state.rowSpanning;
3
+ export const gridRowSpanningHiddenCellsSelector = createSelector(gridRowSpanningStateSelector, rowSpanning => rowSpanning.hiddenCells);
4
+ export const gridRowSpanningSpannedCellsSelector = createSelector(gridRowSpanningStateSelector, rowSpanning => rowSpanning.spannedCells);
5
+ export const gridRowSpanningHiddenCellsOriginMapSelector = createSelector(gridRowSpanningStateSelector, rowSpanning => rowSpanning.hiddenCellOriginMap);
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import type { GridRenderContext } from '../../../models';
3
+ import type { GridValidRowModel } from '../../../models/gridRows';
4
+ import type { GridColDef } from '../../../models/colDef';
5
+ import type { GridApiCommunity } from '../../../models/api/gridApiCommunity';
6
+ import type { RowRange } from './useGridRowSpanning';
7
+ export declare function getUnprocessedRange(testRange: RowRange, processedRange: RowRange): RowRange | null;
8
+ export declare function isRowContextInitialized(renderContext: GridRenderContext): boolean;
9
+ export declare function isRowRangeUpdated(range1: RowRange, range2: RowRange): boolean;
10
+ export declare const getCellValue: (row: GridValidRowModel, colDef: GridColDef, apiRef: React.MutableRefObject<GridApiCommunity>) => any;
@@ -0,0 +1,42 @@
1
+ export function getUnprocessedRange(testRange, processedRange) {
2
+ if (testRange.firstRowIndex >= processedRange.firstRowIndex && testRange.lastRowIndex <= processedRange.lastRowIndex) {
3
+ return null;
4
+ }
5
+ // Overflowing at the end
6
+ // Example: testRange={ firstRowIndex: 10, lastRowIndex: 20 }, processedRange={ firstRowIndex: 0, lastRowIndex: 15 }
7
+ // Unprocessed Range={ firstRowIndex: 16, lastRowIndex: 20 }
8
+ if (testRange.firstRowIndex >= processedRange.firstRowIndex && testRange.lastRowIndex > processedRange.lastRowIndex) {
9
+ return {
10
+ firstRowIndex: processedRange.lastRowIndex,
11
+ lastRowIndex: testRange.lastRowIndex
12
+ };
13
+ }
14
+ // Overflowing at the beginning
15
+ // Example: testRange={ firstRowIndex: 0, lastRowIndex: 20 }, processedRange={ firstRowIndex: 16, lastRowIndex: 30 }
16
+ // Unprocessed Range={ firstRowIndex: 0, lastRowIndex: 15 }
17
+ if (testRange.firstRowIndex < processedRange.firstRowIndex && testRange.lastRowIndex <= processedRange.lastRowIndex) {
18
+ return {
19
+ firstRowIndex: testRange.firstRowIndex,
20
+ lastRowIndex: processedRange.firstRowIndex - 1
21
+ };
22
+ }
23
+ // TODO: Should return two ranges handle overflowing at both ends ?
24
+ return testRange;
25
+ }
26
+ export function isRowContextInitialized(renderContext) {
27
+ return renderContext.firstRowIndex !== 0 || renderContext.lastRowIndex !== 0;
28
+ }
29
+ export function isRowRangeUpdated(range1, range2) {
30
+ return range1.firstRowIndex !== range2.firstRowIndex || range1.lastRowIndex !== range2.lastRowIndex;
31
+ }
32
+ export const getCellValue = (row, colDef, apiRef) => {
33
+ if (!row) {
34
+ return null;
35
+ }
36
+ let cellValue = row[colDef.field];
37
+ const valueGetter = colDef.rowSpanValueGetter ?? colDef.valueGetter;
38
+ if (valueGetter) {
39
+ cellValue = valueGetter(cellValue, row, colDef, apiRef);
40
+ }
41
+ return cellValue;
42
+ };
@@ -1,25 +1,25 @@
1
1
  import { GridStateCommunity } from '../../../models/gridStateCommunity';
2
- export declare const gridRowCountSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
3
- export declare const gridRowsLoadingSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, boolean | undefined>;
4
- export declare const gridTopLevelRowCountSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
5
- export declare const gridRowsLookupSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("./gridRowsInterfaces").GridRowIdToModelLookup<import("../../..").GridValidRowModel>>;
6
- export declare const gridRowsDataRowIdToIdLookupSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("./gridRowsInterfaces").GridRowIdToIdLookup>;
7
- export declare const gridRowTreeSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("../../..").GridRowTreeConfig>;
8
- export declare const gridRowGroupsToFetchSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("../../..").GridRowId[] | undefined>;
9
- export declare const gridRowGroupingNameSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, string>;
10
- export declare const gridRowTreeDepthsSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("./gridRowsInterfaces").GridTreeDepths>;
11
- export declare const gridRowMaximumTreeDepthSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
12
- export declare const gridDataRowIdsSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, import("../../..").GridRowId[]>;
2
+ export declare const gridRowCountSelector: import("../../..").OutputSelector<GridStateCommunity, number>;
3
+ export declare const gridRowsLoadingSelector: import("../../..").OutputSelector<GridStateCommunity, boolean | undefined>;
4
+ export declare const gridTopLevelRowCountSelector: import("../../..").OutputSelector<GridStateCommunity, number>;
5
+ export declare const gridRowsLookupSelector: import("../../..").OutputSelector<GridStateCommunity, import("./gridRowsInterfaces").GridRowIdToModelLookup<import("../../..").GridValidRowModel>>;
6
+ export declare const gridRowsDataRowIdToIdLookupSelector: import("../../..").OutputSelector<GridStateCommunity, import("./gridRowsInterfaces").GridRowIdToIdLookup>;
7
+ export declare const gridRowTreeSelector: import("../../..").OutputSelector<GridStateCommunity, import("../../..").GridRowTreeConfig>;
8
+ export declare const gridRowGroupsToFetchSelector: import("../../..").OutputSelector<GridStateCommunity, import("../../..").GridRowId[] | undefined>;
9
+ export declare const gridRowGroupingNameSelector: import("../../..").OutputSelector<GridStateCommunity, string>;
10
+ export declare const gridRowTreeDepthsSelector: import("../../..").OutputSelector<GridStateCommunity, import("./gridRowsInterfaces").GridTreeDepths>;
11
+ export declare const gridRowMaximumTreeDepthSelector: import("../../..").OutputSelector<GridStateCommunity, number>;
12
+ export declare const gridDataRowIdsSelector: import("../../..").OutputSelector<GridStateCommunity, import("../../..").GridRowId[]>;
13
13
  /**
14
14
  * @ignore - do not document.
15
15
  */
16
- export declare const gridAdditionalRowGroupsSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, {
16
+ export declare const gridAdditionalRowGroupsSelector: import("../../..").OutputSelector<GridStateCommunity, {
17
17
  pinnedRows?: import("./gridRowsInterfaces").GridPinnedRowsState;
18
18
  } | undefined>;
19
19
  /**
20
20
  * @ignore - do not document.
21
21
  */
22
- export declare const gridPinnedRowsSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, {
22
+ export declare const gridPinnedRowsSelector: import("../../..").OutputSelector<GridStateCommunity, {
23
23
  bottom: {
24
24
  id: import("../../..").GridRowId;
25
25
  model: import("../../..").GridValidRowModel;
@@ -32,4 +32,4 @@ export declare const gridPinnedRowsSelector: import("../../../utils/createSelect
32
32
  /**
33
33
  * @ignore - do not document.
34
34
  */
35
- export declare const gridPinnedRowsCountSelector: import("../../../utils/createSelector").OutputSelector<GridStateCommunity, number>;
35
+ export declare const gridPinnedRowsCountSelector: import("../../..").OutputSelector<GridStateCommunity, number>;
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import type { GridColDef } from '../../../models/colDef';
3
+ import type { GridRowId } from '../../../models/gridRows';
4
+ import type { DataGridProcessedProps } from '../../../models/props/DataGridProps';
5
+ import type { GridPrivateApiCommunity } from '../../../models/api/gridApiCommunity';
6
+ import type { GridStateInitializer } from '../../utils/useGridInitializeState';
7
+ export interface GridRowSpanningState {
8
+ spannedCells: Record<GridRowId, Record<GridColDef['field'], number>>;
9
+ hiddenCells: Record<GridRowId, Record<GridColDef['field'], boolean>>;
10
+ /**
11
+ * For each hidden cell, it contains the row index corresponding to the cell that is
12
+ * the origin of the hidden cell. i.e. the cell which is spanned.
13
+ * Used by the virtualization to properly keep the spanned cells in view.
14
+ */
15
+ hiddenCellOriginMap: Record<number, Record<GridColDef['field'], number>>;
16
+ }
17
+ export type RowRange = {
18
+ firstRowIndex: number;
19
+ lastRowIndex: number;
20
+ };
21
+ /**
22
+ * @requires columnsStateInitializer (method) - should be initialized before
23
+ * @requires rowsStateInitializer (method) - should be initialized before
24
+ * @requires filterStateInitializer (method) - should be initialized before
25
+ */
26
+ export declare const rowSpanningStateInitializer: GridStateInitializer;
27
+ export declare const useGridRowSpanning: (apiRef: React.MutableRefObject<GridPrivateApiCommunity>, props: Pick<DataGridProcessedProps, "unstable_rowSpanning" | "pagination" | "paginationMode">) => void;