@mui/x-data-grid 5.11.1 → 5.12.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.
- package/CHANGELOG.md +199 -20
- package/DataGrid/DataGrid.js +26 -1
- package/README.md +2 -2
- package/colDef/gridCheckboxSelectionColDef.d.ts +1 -0
- package/colDef/gridCheckboxSelectionColDef.js +2 -1
- package/colDef/gridDateOperators.d.ts +1 -1
- package/colDef/gridNumericColDef.js +1 -1
- package/components/GridRow.d.ts +1 -1
- package/components/GridRow.js +51 -12
- package/components/cell/GridActionsCellItem.d.ts +1 -1
- package/components/cell/GridCell.d.ts +2 -1
- package/components/cell/GridCell.js +12 -7
- package/components/columnHeaders/GridColumnHeaderItem.js +9 -6
- package/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
- package/components/columnSelection/GridHeaderCheckbox.js +0 -1
- package/components/containers/GridRootStyles.js +8 -3
- package/components/menu/GridMenu.js +9 -2
- package/components/panel/GridColumnsPanel.js +12 -7
- package/components/panel/GridPanelWrapper.d.ts +1 -1
- package/components/panel/GridPanelWrapper.js +3 -3
- package/components/panel/filterPanel/GridFilterForm.d.ts +61 -4
- package/components/panel/filterPanel/GridFilterForm.js +88 -8
- package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
- package/components/panel/filterPanel/GridFilterPanel.d.ts +8 -5
- package/components/panel/filterPanel/GridFilterPanel.js +26 -11
- package/components/toolbar/GridToolbarColumnsButton.js +0 -1
- package/components/toolbar/GridToolbarDensitySelector.js +0 -1
- package/components/toolbar/GridToolbarExportContainer.js +0 -1
- package/components/toolbar/GridToolbarFilterButton.d.ts +1 -1
- package/components/toolbar/GridToolbarFilterButton.js +0 -1
- package/components/toolbar/GridToolbarQuickFilter.d.ts +7 -0
- package/components/toolbar/GridToolbarQuickFilter.js +57 -4
- package/constants/defaultGridSlotsComponents.js +2 -1
- package/constants/gridClasses.d.ts +4 -0
- package/constants/gridClasses.js +1 -1
- package/constants/localeTextConstants.js +1 -0
- package/hooks/core/useGridStateInitialization.js +19 -6
- package/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
- package/hooks/features/columns/gridColumnsInterfaces.d.ts +3 -0
- package/hooks/features/columns/useGridColumnSpanning.d.ts +1 -1
- package/hooks/features/columns/useGridColumnSpanning.js +1 -1
- package/hooks/features/columns/useGridColumns.d.ts +1 -1
- package/hooks/features/columns/useGridColumns.js +13 -15
- package/hooks/features/dimensions/gridDimensionsApi.d.ts +5 -0
- package/hooks/features/dimensions/useGridDimensions.js +9 -8
- package/hooks/features/editRows/useGridCellEditing.new.js +11 -4
- package/hooks/features/editRows/useGridEditing.old.js +1 -1
- package/hooks/features/editRows/useGridRowEditing.new.js +10 -4
- package/hooks/features/events/useGridEvents.d.ts +1 -1
- package/hooks/features/events/useGridEvents.js +2 -0
- package/hooks/features/filter/gridFilterSelector.d.ts +5 -0
- package/hooks/features/filter/gridFilterSelector.js +6 -0
- package/hooks/features/filter/gridFilterState.d.ts +1 -1
- package/hooks/features/filter/gridFilterUtils.d.ts +10 -2
- package/hooks/features/filter/gridFilterUtils.js +3 -6
- package/hooks/features/filter/useGridFilter.d.ts +1 -1
- package/hooks/features/filter/useGridFilter.js +29 -12
- package/hooks/features/pagination/useGridPage.js +1 -1
- package/hooks/features/pagination/useGridPageSize.js +1 -1
- package/hooks/features/rows/useGridRowsMeta.d.ts +1 -1
- package/hooks/features/rows/useGridRowsMeta.js +133 -67
- package/hooks/features/selection/useGridSelection.js +1 -1
- package/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
- package/hooks/features/sorting/useGridSorting.d.ts +1 -1
- package/hooks/features/sorting/useGridSorting.js +1 -1
- package/hooks/features/virtualization/useGridVirtualScroller.d.ts +2 -1
- package/hooks/features/virtualization/useGridVirtualScroller.js +65 -11
- package/index.js +1 -1
- package/internals/index.d.ts +1 -0
- package/legacy/DataGrid/DataGrid.js +26 -1
- package/legacy/colDef/gridCheckboxSelectionColDef.js +2 -1
- package/legacy/colDef/gridNumericColDef.js +1 -1
- package/legacy/components/GridRow.js +56 -12
- package/legacy/components/cell/GridCell.js +12 -7
- package/legacy/components/columnHeaders/GridColumnHeaderItem.js +11 -6
- package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
- package/legacy/components/columnSelection/GridHeaderCheckbox.js +0 -1
- package/legacy/components/containers/GridRootStyles.js +10 -7
- package/legacy/components/menu/GridMenu.js +9 -2
- package/legacy/components/panel/GridColumnsPanel.js +14 -7
- package/legacy/components/panel/GridPanelWrapper.js +3 -3
- package/legacy/components/panel/filterPanel/GridFilterForm.js +89 -8
- package/legacy/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
- package/legacy/components/panel/filterPanel/GridFilterPanel.js +28 -12
- package/legacy/components/toolbar/GridToolbarColumnsButton.js +0 -1
- package/legacy/components/toolbar/GridToolbarDensitySelector.js +0 -1
- package/legacy/components/toolbar/GridToolbarExportContainer.js +0 -1
- package/legacy/components/toolbar/GridToolbarFilterButton.js +0 -1
- package/legacy/components/toolbar/GridToolbarQuickFilter.js +67 -6
- package/legacy/constants/defaultGridSlotsComponents.js +2 -1
- package/legacy/constants/gridClasses.js +1 -1
- package/legacy/constants/localeTextConstants.js +1 -0
- package/legacy/hooks/core/useGridStateInitialization.js +18 -6
- package/legacy/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
- package/legacy/hooks/features/columns/useGridColumnSpanning.js +1 -1
- package/legacy/hooks/features/columns/useGridColumns.js +13 -15
- package/legacy/hooks/features/dimensions/useGridDimensions.js +9 -8
- package/legacy/hooks/features/editRows/useGridCellEditing.new.js +14 -7
- package/legacy/hooks/features/editRows/useGridEditing.old.js +1 -1
- package/legacy/hooks/features/editRows/useGridRowEditing.new.js +10 -4
- package/legacy/hooks/features/events/useGridEvents.js +2 -0
- package/legacy/hooks/features/filter/gridFilterSelector.js +8 -0
- package/legacy/hooks/features/filter/gridFilterUtils.js +4 -7
- package/legacy/hooks/features/filter/useGridFilter.js +33 -12
- package/legacy/hooks/features/pagination/useGridPage.js +1 -1
- package/legacy/hooks/features/pagination/useGridPageSize.js +1 -1
- package/legacy/hooks/features/rows/useGridRowsMeta.js +133 -66
- package/legacy/hooks/features/selection/useGridSelection.js +1 -1
- package/legacy/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
- package/legacy/hooks/features/sorting/useGridSorting.js +1 -1
- package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +84 -26
- package/legacy/index.js +1 -1
- package/legacy/locales/arSD.js +1 -0
- package/legacy/locales/bgBG.js +1 -0
- package/legacy/locales/csCZ.js +1 -0
- package/legacy/locales/daDK.js +1 -0
- package/legacy/locales/deDE.js +1 -0
- package/legacy/locales/elGR.js +1 -0
- package/legacy/locales/esES.js +1 -0
- package/legacy/locales/faIR.js +1 -0
- package/legacy/locales/fiFI.js +1 -0
- package/legacy/locales/frFR.js +1 -0
- package/legacy/locales/heIL.js +10 -9
- package/legacy/locales/huHU.js +1 -0
- package/legacy/locales/itIT.js +1 -0
- package/legacy/locales/jaJP.js +29 -24
- package/legacy/locales/koKR.js +1 -0
- package/legacy/locales/nbNO.js +128 -0
- package/legacy/locales/nlNL.js +1 -0
- package/legacy/locales/plPL.js +1 -0
- package/legacy/locales/ptBR.js +1 -0
- package/legacy/locales/ruRU.js +7 -6
- package/legacy/locales/skSK.js +1 -0
- package/legacy/locales/trTR.js +8 -7
- package/legacy/locales/ukUA.js +1 -0
- package/legacy/locales/viVN.js +1 -0
- package/legacy/locales/zhCN.js +1 -0
- package/legacy/models/events/gridEvents.js +2 -0
- package/legacy/models/gridApiCaches.js +1 -0
- package/legacy/models/params/gridMenuParams.js +1 -0
- package/legacy/models/params/index.js +2 -1
- package/locales/arSD.js +1 -0
- package/locales/bgBG.js +1 -0
- package/locales/csCZ.js +1 -0
- package/locales/daDK.js +1 -0
- package/locales/deDE.js +1 -0
- package/locales/elGR.js +1 -0
- package/locales/esES.js +1 -0
- package/locales/faIR.js +1 -0
- package/locales/fiFI.js +1 -0
- package/locales/frFR.js +1 -0
- package/locales/heIL.js +10 -9
- package/locales/huHU.js +1 -0
- package/locales/itIT.js +1 -0
- package/locales/jaJP.js +25 -24
- package/locales/koKR.js +1 -0
- package/locales/nbNO.d.ts +2 -0
- package/locales/nbNO.js +116 -0
- package/locales/nlNL.js +1 -0
- package/locales/plPL.js +1 -0
- package/locales/ptBR.js +1 -0
- package/locales/ruRU.js +7 -6
- package/locales/skSK.js +1 -0
- package/locales/trTR.js +8 -7
- package/locales/ukUA.js +1 -0
- package/locales/viVN.js +1 -0
- package/locales/zhCN.js +1 -0
- package/models/api/gridCallbackDetails.d.ts +6 -1
- package/models/api/gridCoreApi.d.ts +2 -6
- package/models/api/gridFilterApi.d.ts +8 -1
- package/models/api/gridLocaleTextApi.d.ts +1 -0
- package/models/api/gridRowsMetaApi.d.ts +24 -0
- package/models/api/gridStateApi.d.ts +14 -3
- package/models/colDef/gridColDef.d.ts +4 -4
- package/models/events/gridEventLookup.d.ts +16 -1
- package/models/events/gridEvents.d.ts +3 -1
- package/models/events/gridEvents.js +2 -0
- package/models/gridApiCaches.d.ts +6 -0
- package/models/gridApiCaches.js +1 -0
- package/models/gridIconSlotsComponent.d.ts +5 -0
- package/models/params/gridMenuParams.d.ts +7 -0
- package/models/params/gridMenuParams.js +1 -0
- package/models/params/gridRowParams.d.ts +1 -1
- package/models/params/index.d.ts +1 -0
- package/models/params/index.js +2 -1
- package/models/props/DataGridProps.d.ts +24 -2
- package/modern/DataGrid/DataGrid.js +26 -1
- package/modern/colDef/gridCheckboxSelectionColDef.js +2 -1
- package/modern/colDef/gridNumericColDef.js +1 -1
- package/modern/components/GridRow.js +51 -12
- package/modern/components/cell/GridCell.js +12 -7
- package/modern/components/columnHeaders/GridColumnHeaderItem.js +9 -6
- package/modern/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
- package/modern/components/columnSelection/GridHeaderCheckbox.js +0 -1
- package/modern/components/containers/GridRootStyles.js +8 -3
- package/modern/components/menu/GridMenu.js +9 -2
- package/modern/components/panel/GridColumnsPanel.js +12 -7
- package/modern/components/panel/GridPanelWrapper.js +3 -3
- package/modern/components/panel/filterPanel/GridFilterForm.js +88 -8
- package/modern/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
- package/modern/components/panel/filterPanel/GridFilterPanel.js +26 -11
- package/modern/components/toolbar/GridToolbarColumnsButton.js +0 -1
- package/modern/components/toolbar/GridToolbarDensitySelector.js +0 -1
- package/modern/components/toolbar/GridToolbarExportContainer.js +0 -1
- package/modern/components/toolbar/GridToolbarFilterButton.js +0 -1
- package/modern/components/toolbar/GridToolbarQuickFilter.js +57 -4
- package/modern/constants/defaultGridSlotsComponents.js +2 -1
- package/modern/constants/gridClasses.js +1 -1
- package/modern/constants/localeTextConstants.js +1 -0
- package/modern/hooks/core/useGridStateInitialization.js +19 -6
- package/modern/hooks/features/columnMenu/useGridColumnMenu.js +22 -0
- package/modern/hooks/features/columns/useGridColumnSpanning.js +1 -1
- package/modern/hooks/features/columns/useGridColumns.js +12 -14
- package/modern/hooks/features/dimensions/useGridDimensions.js +9 -8
- package/modern/hooks/features/editRows/useGridCellEditing.new.js +10 -3
- package/modern/hooks/features/editRows/useGridEditing.old.js +1 -1
- package/modern/hooks/features/editRows/useGridRowEditing.new.js +9 -3
- package/modern/hooks/features/events/useGridEvents.js +2 -0
- package/modern/hooks/features/filter/gridFilterSelector.js +6 -0
- package/modern/hooks/features/filter/gridFilterUtils.js +3 -6
- package/modern/hooks/features/filter/useGridFilter.js +29 -12
- package/modern/hooks/features/pagination/useGridPage.js +1 -1
- package/modern/hooks/features/pagination/useGridPageSize.js +1 -1
- package/modern/hooks/features/rows/useGridRowsMeta.js +129 -59
- package/modern/hooks/features/selection/useGridSelection.js +1 -1
- package/modern/hooks/features/selection/useGridSelectionPreProcessors.js +8 -6
- package/modern/hooks/features/sorting/useGridSorting.js +1 -1
- package/modern/hooks/features/virtualization/useGridVirtualScroller.js +65 -11
- package/modern/index.js +1 -1
- package/modern/locales/arSD.js +1 -0
- package/modern/locales/bgBG.js +1 -0
- package/modern/locales/csCZ.js +1 -0
- package/modern/locales/daDK.js +1 -0
- package/modern/locales/deDE.js +1 -0
- package/modern/locales/elGR.js +1 -0
- package/modern/locales/esES.js +1 -0
- package/modern/locales/faIR.js +1 -0
- package/modern/locales/fiFI.js +1 -0
- package/modern/locales/frFR.js +1 -0
- package/modern/locales/heIL.js +10 -9
- package/modern/locales/huHU.js +1 -0
- package/modern/locales/itIT.js +1 -0
- package/modern/locales/jaJP.js +25 -24
- package/modern/locales/koKR.js +1 -0
- package/modern/locales/nbNO.js +116 -0
- package/modern/locales/nlNL.js +1 -0
- package/modern/locales/plPL.js +1 -0
- package/modern/locales/ptBR.js +1 -0
- package/modern/locales/ruRU.js +7 -6
- package/modern/locales/skSK.js +1 -0
- package/modern/locales/trTR.js +8 -7
- package/modern/locales/ukUA.js +1 -0
- package/modern/locales/viVN.js +1 -0
- package/modern/locales/zhCN.js +1 -0
- package/modern/models/events/gridEvents.js +2 -0
- package/modern/models/gridApiCaches.js +1 -0
- package/modern/models/params/gridMenuParams.js +1 -0
- package/modern/models/params/index.js +2 -1
- package/node/DataGrid/DataGrid.js +26 -1
- package/node/colDef/gridCheckboxSelectionColDef.js +4 -2
- package/node/colDef/gridNumericColDef.js +1 -1
- package/node/components/GridRow.js +53 -12
- package/node/components/cell/GridCell.js +12 -7
- package/node/components/columnHeaders/GridColumnHeaderItem.js +9 -6
- package/node/components/columnSelection/GridCellCheckboxRenderer.js +0 -1
- package/node/components/columnSelection/GridHeaderCheckbox.js +0 -1
- package/node/components/containers/GridRootStyles.js +8 -3
- package/node/components/menu/GridMenu.js +10 -2
- package/node/components/panel/GridColumnsPanel.js +12 -7
- package/node/components/panel/GridPanelWrapper.js +5 -3
- package/node/components/panel/filterPanel/GridFilterForm.js +91 -9
- package/node/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +0 -1
- package/node/components/panel/filterPanel/GridFilterPanel.js +28 -11
- package/node/components/toolbar/GridToolbarColumnsButton.js +0 -1
- package/node/components/toolbar/GridToolbarDensitySelector.js +0 -1
- package/node/components/toolbar/GridToolbarExportContainer.js +0 -1
- package/node/components/toolbar/GridToolbarFilterButton.js +0 -1
- package/node/components/toolbar/GridToolbarQuickFilter.js +61 -4
- package/node/constants/defaultGridSlotsComponents.js +2 -1
- package/node/constants/gridClasses.js +1 -1
- package/node/constants/localeTextConstants.js +1 -0
- package/node/hooks/core/useGridStateInitialization.js +19 -6
- package/node/hooks/features/columnMenu/useGridColumnMenu.js +23 -0
- package/node/hooks/features/columns/useGridColumnSpanning.js +11 -16
- package/node/hooks/features/columns/useGridColumns.js +13 -15
- package/node/hooks/features/dimensions/useGridDimensions.js +9 -8
- package/node/hooks/features/editRows/useGridCellEditing.new.js +11 -4
- package/node/hooks/features/editRows/useGridEditing.old.js +1 -1
- package/node/hooks/features/editRows/useGridRowEditing.new.js +10 -4
- package/node/hooks/features/events/useGridEvents.js +2 -0
- package/node/hooks/features/filter/gridFilterSelector.js +9 -2
- package/node/hooks/features/filter/gridFilterUtils.js +4 -5
- package/node/hooks/features/filter/useGridFilter.js +28 -11
- package/node/hooks/features/pagination/useGridPage.js +1 -1
- package/node/hooks/features/pagination/useGridPageSize.js +1 -1
- package/node/hooks/features/rows/useGridRowsMeta.js +136 -69
- package/node/hooks/features/selection/useGridSelection.js +1 -1
- package/node/hooks/features/selection/useGridSelectionPreProcessors.js +7 -5
- package/node/hooks/features/sorting/useGridSorting.js +1 -1
- package/node/hooks/features/virtualization/useGridVirtualScroller.js +65 -12
- package/node/index.js +1 -1
- package/node/locales/arSD.js +1 -0
- package/node/locales/bgBG.js +1 -0
- package/node/locales/csCZ.js +1 -0
- package/node/locales/daDK.js +1 -0
- package/node/locales/deDE.js +1 -0
- package/node/locales/elGR.js +1 -0
- package/node/locales/esES.js +1 -0
- package/node/locales/faIR.js +1 -0
- package/node/locales/fiFI.js +1 -0
- package/node/locales/frFR.js +1 -0
- package/node/locales/heIL.js +10 -9
- package/node/locales/huHU.js +1 -0
- package/node/locales/itIT.js +1 -0
- package/node/locales/jaJP.js +25 -24
- package/node/locales/koKR.js +1 -0
- package/node/locales/nbNO.js +126 -0
- package/node/locales/nlNL.js +1 -0
- package/node/locales/plPL.js +1 -0
- package/node/locales/ptBR.js +1 -0
- package/node/locales/ruRU.js +7 -6
- package/node/locales/skSK.js +1 -0
- package/node/locales/trTR.js +8 -7
- package/node/locales/ukUA.js +1 -0
- package/node/locales/viVN.js +1 -0
- package/node/locales/zhCN.js +1 -0
- package/node/models/events/gridEvents.js +2 -0
- package/node/models/gridApiCaches.js +5 -0
- package/node/models/params/gridMenuParams.js +5 -0
- package/node/models/params/index.js +13 -0
- package/package.json +6 -5
|
@@ -37,7 +37,7 @@ const hasScroll = ({
|
|
|
37
37
|
|
|
38
38
|
export function useGridDimensions(apiRef, props) {
|
|
39
39
|
const logger = useGridLogger(apiRef, 'useResizeContainer');
|
|
40
|
-
const
|
|
40
|
+
const errorShown = React.useRef(false);
|
|
41
41
|
const rootDimensionsRef = React.useRef(null);
|
|
42
42
|
const fullDimensionsRef = React.useRef(null);
|
|
43
43
|
const rowsMeta = useGridSelector(apiRef, gridRowsMetaSelector);
|
|
@@ -92,7 +92,8 @@ export function useGridDimensions(apiRef, props) {
|
|
|
92
92
|
viewportOuterSize,
|
|
93
93
|
viewportInnerSize,
|
|
94
94
|
hasScrollX,
|
|
95
|
-
hasScrollY
|
|
95
|
+
hasScrollY,
|
|
96
|
+
scrollBarSize
|
|
96
97
|
};
|
|
97
98
|
const prevDimensions = fullDimensionsRef.current;
|
|
98
99
|
fullDimensionsRef.current = newFullDimensions;
|
|
@@ -142,14 +143,14 @@ export function useGridDimensions(apiRef, props) {
|
|
|
142
143
|
|
|
143
144
|
const isJSDOM = /jsdom/.test(window.navigator.userAgent);
|
|
144
145
|
|
|
145
|
-
if (size.height === 0 && !
|
|
146
|
-
logger.
|
|
147
|
-
|
|
146
|
+
if (size.height === 0 && !errorShown.current && !props.autoHeight && !isJSDOM) {
|
|
147
|
+
logger.error(['The parent DOM element of the data grid has an empty height.', 'Please make sure that this element has an intrinsic height.', 'The grid displays with a height of 0px.', '', 'More details: https://mui.com/r/x-data-grid-no-dimensions.'].join('\n'));
|
|
148
|
+
errorShown.current = true;
|
|
148
149
|
}
|
|
149
150
|
|
|
150
|
-
if (size.width === 0 && !
|
|
151
|
-
logger.
|
|
152
|
-
|
|
151
|
+
if (size.width === 0 && !errorShown.current && !isJSDOM) {
|
|
152
|
+
logger.error(['The parent DOM element of the data grid has an empty width.', 'Please make sure that this element has an intrinsic width.', 'The grid displays with a width of 0px.', '', 'More details: https://mui.com/r/x-data-grid-no-dimensions.'].join('\n'));
|
|
153
|
+
errorShown.current = true;
|
|
153
154
|
}
|
|
154
155
|
|
|
155
156
|
if (isTestEnvironment) {
|
|
@@ -303,6 +303,9 @@ export const useGridCellEditing = (apiRef, props) => {
|
|
|
303
303
|
} = editingState[id][field];
|
|
304
304
|
|
|
305
305
|
if (error || isProcessingProps) {
|
|
306
|
+
// Attempt to change cell mode to "view" was not successful
|
|
307
|
+
// Update previous mode to allow another attempt
|
|
308
|
+
prevCellModesModel.current[id][field].mode = GridCellModes.Edit;
|
|
306
309
|
return;
|
|
307
310
|
}
|
|
308
311
|
|
|
@@ -310,6 +313,8 @@ export const useGridCellEditing = (apiRef, props) => {
|
|
|
310
313
|
|
|
311
314
|
if (processRowUpdate) {
|
|
312
315
|
const handleError = errorThrown => {
|
|
316
|
+
prevCellModesModel.current[id][field].mode = GridCellModes.Edit;
|
|
317
|
+
|
|
313
318
|
if (onProcessRowUpdateError) {
|
|
314
319
|
onProcessRowUpdateError(errorThrown);
|
|
315
320
|
} else {
|
|
@@ -413,10 +418,13 @@ export const useGridCellEditing = (apiRef, props) => {
|
|
|
413
418
|
}
|
|
414
419
|
}, [cellModesModelProp, updateCellModesModel]);
|
|
415
420
|
React.useEffect(() => {
|
|
416
|
-
const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef);
|
|
421
|
+
const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef); // Update the ref here because updateStateToStopCellEditMode may change it later
|
|
422
|
+
|
|
423
|
+
const copyOfPrevCellModes = prevCellModesModel.current;
|
|
424
|
+
prevCellModesModel.current = cellModesModel;
|
|
417
425
|
Object.entries(cellModesModel).forEach(([id, fields]) => {
|
|
418
426
|
Object.entries(fields).forEach(([field, params]) => {
|
|
419
|
-
const prevMode =
|
|
427
|
+
const prevMode = copyOfPrevCellModes[id]?.[field]?.mode || GridCellModes.View;
|
|
420
428
|
const originalId = idToIdLookup[id] ?? id;
|
|
421
429
|
|
|
422
430
|
if (params.mode === GridCellModes.Edit && prevMode === GridCellModes.View) {
|
|
@@ -432,6 +440,5 @@ export const useGridCellEditing = (apiRef, props) => {
|
|
|
432
440
|
}
|
|
433
441
|
});
|
|
434
442
|
});
|
|
435
|
-
prevCellModesModel.current = cellModesModel;
|
|
436
443
|
}, [apiRef, cellModesModel, updateStateToStartCellEditMode, updateStateToStopCellEditMode]);
|
|
437
444
|
};
|
|
@@ -21,7 +21,7 @@ export function useGridEditing(apiRef, props) {
|
|
|
21
21
|
useCellEditing(apiRef, props);
|
|
22
22
|
useGridRowEditing(apiRef, props);
|
|
23
23
|
const debounceMap = React.useRef({});
|
|
24
|
-
apiRef.current.
|
|
24
|
+
apiRef.current.unstable_registerControlState({
|
|
25
25
|
stateId: 'editRows',
|
|
26
26
|
propModel: props.editRowsModel,
|
|
27
27
|
propOnChange: props.onEditRowsModelChange,
|
|
@@ -382,12 +382,14 @@ export const useGridRowEditing = (apiRef, props) => {
|
|
|
382
382
|
const isSomeFieldProcessingProps = Object.values(editingState[id]).some(fieldProps => fieldProps.isProcessingProps);
|
|
383
383
|
|
|
384
384
|
if (isSomeFieldProcessingProps) {
|
|
385
|
+
prevRowModesModel.current[id].mode = GridRowModes.Edit;
|
|
385
386
|
return;
|
|
386
387
|
}
|
|
387
388
|
|
|
388
389
|
const hasSomeFieldWithError = Object.values(editingState[id]).some(fieldProps => fieldProps.error);
|
|
389
390
|
|
|
390
391
|
if (hasSomeFieldWithError) {
|
|
392
|
+
prevRowModesModel.current[id].mode = GridRowModes.Edit;
|
|
391
393
|
return;
|
|
392
394
|
}
|
|
393
395
|
|
|
@@ -395,6 +397,8 @@ export const useGridRowEditing = (apiRef, props) => {
|
|
|
395
397
|
|
|
396
398
|
if (processRowUpdate) {
|
|
397
399
|
const handleError = errorThrown => {
|
|
400
|
+
prevRowModesModel.current[id].mode = GridRowModes.Edit;
|
|
401
|
+
|
|
398
402
|
if (onProcessRowUpdateError) {
|
|
399
403
|
onProcessRowUpdateError(errorThrown);
|
|
400
404
|
} else {
|
|
@@ -565,9 +569,12 @@ export const useGridRowEditing = (apiRef, props) => {
|
|
|
565
569
|
}
|
|
566
570
|
}, [rowModesModelProp, updateRowModesModel]);
|
|
567
571
|
React.useEffect(() => {
|
|
568
|
-
const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef);
|
|
572
|
+
const idToIdLookup = gridRowsIdToIdLookupSelector(apiRef); // Update the ref here because updateStateToStopRowEditMode may change it later
|
|
573
|
+
|
|
574
|
+
const copyOfPrevRowModesModel = prevRowModesModel.current;
|
|
575
|
+
prevRowModesModel.current = rowModesModel;
|
|
569
576
|
Object.entries(rowModesModel).forEach(([id, params]) => {
|
|
570
|
-
const prevMode =
|
|
577
|
+
const prevMode = copyOfPrevRowModesModel[id]?.mode || GridRowModes.View;
|
|
571
578
|
const originalId = idToIdLookup[id] ?? id;
|
|
572
579
|
|
|
573
580
|
if (params.mode === GridRowModes.Edit && prevMode === GridRowModes.View) {
|
|
@@ -580,6 +587,5 @@ export const useGridRowEditing = (apiRef, props) => {
|
|
|
580
587
|
}, params));
|
|
581
588
|
}
|
|
582
589
|
});
|
|
583
|
-
prevRowModesModel.current = rowModesModel;
|
|
584
590
|
}, [apiRef, rowModesModel, updateStateToStartRowEditMode, updateStateToStopRowEditMode]);
|
|
585
591
|
};
|
|
@@ -18,6 +18,8 @@ export function useGridEvents(apiRef, props) {
|
|
|
18
18
|
useGridApiOptionHandler(apiRef, 'cellFocusOut', props.onCellFocusOut);
|
|
19
19
|
useGridApiOptionHandler(apiRef, 'preferencePanelClose', props.onPreferencePanelClose);
|
|
20
20
|
useGridApiOptionHandler(apiRef, 'preferencePanelOpen', props.onPreferencePanelOpen);
|
|
21
|
+
useGridApiOptionHandler(apiRef, 'menuOpen', props.onMenuOpen);
|
|
22
|
+
useGridApiOptionHandler(apiRef, 'menuClose', props.onMenuClose);
|
|
21
23
|
useGridApiOptionHandler(apiRef, 'rowDoubleClick', props.onRowDoubleClick);
|
|
22
24
|
useGridApiOptionHandler(apiRef, 'rowClick', props.onRowClick);
|
|
23
25
|
useGridApiOptionHandler(apiRef, 'componentError', props.onError);
|
|
@@ -13,6 +13,12 @@ export const gridFilterStateSelector = state => state.filter;
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
export const gridFilterModelSelector = createSelector(gridFilterStateSelector, filterState => filterState.filterModel);
|
|
16
|
+
/**
|
|
17
|
+
* Get the current quick filter values.
|
|
18
|
+
* @category Filtering
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export const gridQuickFilterValuesSelector = createSelector(gridFilterModelSelector, filterModel => filterModel.quickFilterValues);
|
|
16
22
|
/**
|
|
17
23
|
* @category Filtering
|
|
18
24
|
* @ignore - do not document.
|
|
@@ -10,7 +10,7 @@ import { gridColumnFieldsSelector } from '../columns';
|
|
|
10
10
|
* @return {GridFilterItem} The clean filter item with an uniq ID and an always-defined operatorValue.
|
|
11
11
|
* TODO: Make the typing reflect the different between GridFilterInputItem and GridFilterItem.
|
|
12
12
|
*/
|
|
13
|
-
const cleanFilterItem = (item, apiRef) => {
|
|
13
|
+
export const cleanFilterItem = (item, apiRef) => {
|
|
14
14
|
const cleanItem = _extends({}, item);
|
|
15
15
|
|
|
16
16
|
if (cleanItem.id == null) {
|
|
@@ -25,7 +25,6 @@ const cleanFilterItem = (item, apiRef) => {
|
|
|
25
25
|
|
|
26
26
|
return cleanItem;
|
|
27
27
|
};
|
|
28
|
-
|
|
29
28
|
const filterModelDisableMultiColumnsFilteringWarning = buildWarning(['MUI: The `filterModel` can only contain a single item when the `disableMultipleColumnsFiltering` prop is set to `true`.', 'If you are using the community version of the `DataGrid`, this prop is always `true`.'], 'error');
|
|
30
29
|
const filterModelMissingItemIdWarning = buildWarning("MUI: The 'id' field is required on `filterModel.items` when you use multiple filters.", 'error');
|
|
31
30
|
const filterModelMissingItemOperatorWarning = buildWarning(['MUI: One of your filtering item have no `operatorValue` provided.', 'This property will become required on `@mui/x-data-grid@6.X`.']);
|
|
@@ -65,10 +64,8 @@ export const sanitizeFilterModel = (model, disableMultipleColumnsFiltering, apiR
|
|
|
65
64
|
|
|
66
65
|
return model;
|
|
67
66
|
};
|
|
68
|
-
export const mergeStateWithFilterModel = (filterModel, disableMultipleColumnsFiltering, apiRef) =>
|
|
69
|
-
|
|
70
|
-
filterModel: sanitizeFilterModel(filterModel, disableMultipleColumnsFiltering, apiRef)
|
|
71
|
-
})
|
|
67
|
+
export const mergeStateWithFilterModel = (filterModel, disableMultipleColumnsFiltering, apiRef) => filteringState => _extends({}, filteringState, {
|
|
68
|
+
filterModel: sanitizeFilterModel(filterModel, disableMultipleColumnsFiltering, apiRef)
|
|
72
69
|
});
|
|
73
70
|
/**
|
|
74
71
|
* Generates a method to easily check if a row is matching the current filter model.
|
|
@@ -12,7 +12,7 @@ import { useFirstRender } from '../../utils/useFirstRender';
|
|
|
12
12
|
import { gridRowIdsSelector } from '../rows';
|
|
13
13
|
import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
|
|
14
14
|
import { GRID_DEFAULT_STRATEGY, useGridRegisterStrategyProcessor } from '../../core/strategyProcessing';
|
|
15
|
-
import { buildAggregatedFilterApplier, sanitizeFilterModel, mergeStateWithFilterModel } from './gridFilterUtils';
|
|
15
|
+
import { buildAggregatedFilterApplier, sanitizeFilterModel, mergeStateWithFilterModel, cleanFilterItem } from './gridFilterUtils';
|
|
16
16
|
import { isDeepEqual } from '../../../utils/utils';
|
|
17
17
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
18
18
|
export const filterStateInitializer = (state, props, apiRef) => {
|
|
@@ -33,7 +33,7 @@ export const filterStateInitializer = (state, props, apiRef) => {
|
|
|
33
33
|
|
|
34
34
|
export const useGridFilter = (apiRef, props) => {
|
|
35
35
|
const logger = useGridLogger(apiRef, 'useGridFilter');
|
|
36
|
-
apiRef.current.
|
|
36
|
+
apiRef.current.unstable_registerControlState({
|
|
37
37
|
stateId: 'filter',
|
|
38
38
|
propModel: props.filterModel,
|
|
39
39
|
propOnChange: props.onFilterModelChange,
|
|
@@ -74,7 +74,23 @@ export const useGridFilter = (apiRef, props) => {
|
|
|
74
74
|
|
|
75
75
|
apiRef.current.setFilterModel(_extends({}, filterModel, {
|
|
76
76
|
items
|
|
77
|
-
}));
|
|
77
|
+
}), 'upsertFilterItem');
|
|
78
|
+
}, [apiRef]);
|
|
79
|
+
const upsertFilterItems = React.useCallback(items => {
|
|
80
|
+
const filterModel = gridFilterModelSelector(apiRef);
|
|
81
|
+
const existingItems = [...filterModel.items];
|
|
82
|
+
items.forEach(item => {
|
|
83
|
+
const itemIndex = items.findIndex(filterItem => filterItem.id === item.id);
|
|
84
|
+
|
|
85
|
+
if (itemIndex === -1) {
|
|
86
|
+
existingItems.push(item);
|
|
87
|
+
} else {
|
|
88
|
+
existingItems[itemIndex] = item;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
apiRef.current.setFilterModel(_extends({}, filterModel, {
|
|
92
|
+
items
|
|
93
|
+
}), 'upsertFilterItems');
|
|
78
94
|
}, [apiRef]);
|
|
79
95
|
const deleteFilterItem = React.useCallback(itemToDelete => {
|
|
80
96
|
const filterModel = gridFilterModelSelector(apiRef);
|
|
@@ -86,7 +102,7 @@ export const useGridFilter = (apiRef, props) => {
|
|
|
86
102
|
|
|
87
103
|
apiRef.current.setFilterModel(_extends({}, filterModel, {
|
|
88
104
|
items
|
|
89
|
-
}));
|
|
105
|
+
}), 'deleteFilterItem');
|
|
90
106
|
}, [apiRef]);
|
|
91
107
|
const showFilterPanel = React.useCallback(targetColumnField => {
|
|
92
108
|
logger.debug('Displaying filter panel');
|
|
@@ -100,13 +116,13 @@ export const useGridFilter = (apiRef, props) => {
|
|
|
100
116
|
if (filterItemOnTarget) {
|
|
101
117
|
newFilterItems = filterItemsWithValue;
|
|
102
118
|
} else if (props.disableMultipleColumnsFiltering) {
|
|
103
|
-
newFilterItems = [{
|
|
119
|
+
newFilterItems = [cleanFilterItem({
|
|
104
120
|
columnField: targetColumnField
|
|
105
|
-
}];
|
|
121
|
+
}, apiRef)];
|
|
106
122
|
} else {
|
|
107
|
-
newFilterItems = [...filterItemsWithValue, {
|
|
123
|
+
newFilterItems = [...filterItemsWithValue, cleanFilterItem({
|
|
108
124
|
columnField: targetColumnField
|
|
109
|
-
}];
|
|
125
|
+
}, apiRef)];
|
|
110
126
|
}
|
|
111
127
|
|
|
112
128
|
apiRef.current.setFilterModel(_extends({}, filterModel, {
|
|
@@ -129,7 +145,7 @@ export const useGridFilter = (apiRef, props) => {
|
|
|
129
145
|
|
|
130
146
|
apiRef.current.setFilterModel(_extends({}, filterModel, {
|
|
131
147
|
linkOperator
|
|
132
|
-
}));
|
|
148
|
+
}), 'changeLogicOperator');
|
|
133
149
|
}, [apiRef]);
|
|
134
150
|
const setQuickFilterValues = React.useCallback(values => {
|
|
135
151
|
const filterModel = gridFilterModelSelector(apiRef);
|
|
@@ -142,12 +158,12 @@ export const useGridFilter = (apiRef, props) => {
|
|
|
142
158
|
quickFilterValues: [...values]
|
|
143
159
|
}));
|
|
144
160
|
}, [apiRef]);
|
|
145
|
-
const setFilterModel = React.useCallback(model => {
|
|
161
|
+
const setFilterModel = React.useCallback((model, reason) => {
|
|
146
162
|
const currentModel = gridFilterModelSelector(apiRef);
|
|
147
163
|
|
|
148
164
|
if (currentModel !== model) {
|
|
149
165
|
logger.debug('Setting filter model');
|
|
150
|
-
apiRef.current.
|
|
166
|
+
apiRef.current.unstable_updateControlState('filter', mergeStateWithFilterModel(model, props.disableMultipleColumnsFiltering, apiRef), reason);
|
|
151
167
|
apiRef.current.unstable_applyFilters();
|
|
152
168
|
}
|
|
153
169
|
}, [apiRef, logger, props.disableMultipleColumnsFiltering]);
|
|
@@ -160,6 +176,7 @@ export const useGridFilter = (apiRef, props) => {
|
|
|
160
176
|
unstable_applyFilters: applyFilters,
|
|
161
177
|
deleteFilterItem,
|
|
162
178
|
upsertFilterItem,
|
|
179
|
+
upsertFilterItems,
|
|
163
180
|
setFilterModel,
|
|
164
181
|
showFilterPanel,
|
|
165
182
|
hideFilterPanel,
|
|
@@ -191,7 +208,7 @@ export const useGridFilter = (apiRef, props) => {
|
|
|
191
208
|
return params;
|
|
192
209
|
}
|
|
193
210
|
|
|
194
|
-
apiRef.current.
|
|
211
|
+
apiRef.current.unstable_updateControlState('filter', mergeStateWithFilterModel(filterModel, props.disableMultipleColumnsFiltering, apiRef), 'restoreState');
|
|
195
212
|
return _extends({}, params, {
|
|
196
213
|
callbacks: [...params.callbacks, apiRef.current.unstable_applyFilters]
|
|
197
214
|
});
|
|
@@ -37,7 +37,7 @@ const noRowCountInServerMode = buildWarning(["MUI: the 'rowCount' prop is undefi
|
|
|
37
37
|
export const useGridPage = (apiRef, props) => {
|
|
38
38
|
const logger = useGridLogger(apiRef, 'useGridPage');
|
|
39
39
|
const visibleTopLevelRowCount = useGridSelector(apiRef, gridVisibleTopLevelRowCountSelector);
|
|
40
|
-
apiRef.current.
|
|
40
|
+
apiRef.current.unstable_registerControlState({
|
|
41
41
|
stateId: 'page',
|
|
42
42
|
propModel: props.page,
|
|
43
43
|
propOnChange: props.onPageChange,
|
|
@@ -19,7 +19,7 @@ const mergeStateWithPageSize = pageSize => state => _extends({}, state, {
|
|
|
19
19
|
export const useGridPageSize = (apiRef, props) => {
|
|
20
20
|
const logger = useGridLogger(apiRef, 'useGridPageSize');
|
|
21
21
|
const rowHeight = useGridSelector(apiRef, gridDensityRowHeightSelector);
|
|
22
|
-
apiRef.current.
|
|
22
|
+
apiRef.current.unstable_registerControlState({
|
|
23
23
|
stateId: 'pageSize',
|
|
24
24
|
propModel: props.pageSize,
|
|
25
25
|
propOnChange: props.onPageSizeChange,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
2
|
import * as React from 'react';
|
|
3
|
+
import { debounce } from '@mui/material/utils';
|
|
3
4
|
import { useGridVisibleRows } from '../../utils/useGridVisibleRows';
|
|
4
5
|
import { useGridApiMethod } from '../../utils/useGridApiMethod';
|
|
5
6
|
import { useGridSelector } from '../../utils/useGridSelector';
|
|
@@ -21,64 +22,99 @@ export const rowsMetaStateInitializer = state => _extends({}, state, {
|
|
|
21
22
|
|
|
22
23
|
export const useGridRowsMeta = (apiRef, props) => {
|
|
23
24
|
const {
|
|
24
|
-
getRowHeight,
|
|
25
|
-
getRowSpacing
|
|
25
|
+
getRowHeight: getRowHeightProp,
|
|
26
|
+
getRowSpacing,
|
|
27
|
+
getEstimatedRowHeight
|
|
26
28
|
} = props;
|
|
27
|
-
const rowsHeightLookup = React.useRef({});
|
|
28
|
-
|
|
29
|
+
const rowsHeightLookup = React.useRef({}); // Inspired by https://github.com/bvaughn/react-virtualized/blob/master/source/Grid/utils/CellSizeAndPositionManager.js
|
|
30
|
+
|
|
31
|
+
const lastMeasuredRowIndex = React.useRef(-1);
|
|
32
|
+
const hasRowWithAutoHeight = React.useRef(false);
|
|
33
|
+
const rowHeightFromDensity = useGridSelector(apiRef, gridDensityRowHeightSelector);
|
|
29
34
|
const filterState = useGridSelector(apiRef, gridFilterStateSelector);
|
|
30
35
|
const paginationState = useGridSelector(apiRef, gridPaginationSelector);
|
|
31
36
|
const sortingState = useGridSelector(apiRef, gridSortingStateSelector);
|
|
32
37
|
const currentPage = useGridVisibleRows(apiRef, props);
|
|
33
38
|
const hydrateRowsMeta = React.useCallback(() => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
39
|
+
hasRowWithAutoHeight.current = false;
|
|
40
|
+
const densityFactor = gridDensityFactorSelector(apiRef.current.state, apiRef.current.instanceId);
|
|
41
|
+
const positions = [];
|
|
42
|
+
const currentPageTotalHeight = currentPage.rows.reduce((acc, row) => {
|
|
43
|
+
positions.push(acc);
|
|
44
|
+
|
|
45
|
+
if (!rowsHeightLookup.current[row.id]) {
|
|
46
|
+
rowsHeightLookup.current[row.id] = {
|
|
47
|
+
sizes: {
|
|
48
|
+
base: rowHeightFromDensity
|
|
49
|
+
},
|
|
50
|
+
isResized: false,
|
|
51
|
+
autoHeight: false,
|
|
52
|
+
needsFirstMeasurement: true // Assume all rows will need to be measured by default
|
|
53
|
+
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const {
|
|
58
|
+
isResized,
|
|
59
|
+
needsFirstMeasurement,
|
|
60
|
+
sizes
|
|
61
|
+
} = rowsHeightLookup.current[row.id];
|
|
62
|
+
let baseRowHeight = rowHeightFromDensity;
|
|
63
|
+
const existingBaseRowHeight = sizes.base;
|
|
64
|
+
|
|
65
|
+
if (isResized) {
|
|
66
|
+
// Do not recalculate resized row height and use the value from the lookup
|
|
67
|
+
baseRowHeight = existingBaseRowHeight;
|
|
68
|
+
} else if (getRowHeightProp) {
|
|
69
|
+
const rowHeightFromUser = getRowHeightProp(_extends({}, row, {
|
|
70
|
+
densityFactor
|
|
71
|
+
}));
|
|
48
72
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
73
|
+
if (rowHeightFromUser === 'auto') {
|
|
74
|
+
if (needsFirstMeasurement) {
|
|
75
|
+
const estimatedRowHeight = getEstimatedRowHeight ? getEstimatedRowHeight(_extends({}, row, {
|
|
52
76
|
densityFactor
|
|
53
|
-
}))
|
|
77
|
+
})) : rowHeightFromDensity; // If the row was not measured yet use the estimated row height
|
|
78
|
+
|
|
79
|
+
baseRowHeight = estimatedRowHeight ?? rowHeightFromDensity;
|
|
80
|
+
} else {
|
|
81
|
+
baseRowHeight = existingBaseRowHeight;
|
|
54
82
|
}
|
|
55
|
-
|
|
83
|
+
|
|
84
|
+
hasRowWithAutoHeight.current = true;
|
|
85
|
+
rowsHeightLookup.current[row.id].autoHeight = true;
|
|
86
|
+
} else {
|
|
87
|
+
// Default back to base rowHeight if getRowHeight returns null or undefined.
|
|
88
|
+
baseRowHeight = rowHeightFromUser ?? rowHeightFromDensity;
|
|
89
|
+
rowsHeightLookup.current[row.id].needsFirstMeasurement = false;
|
|
90
|
+
rowsHeightLookup.current[row.id].autoHeight = false;
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
rowsHeightLookup.current[row.id].needsFirstMeasurement = false;
|
|
94
|
+
} // We use an object to make simple to check if a height is already added or not
|
|
56
95
|
|
|
57
96
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
97
|
+
const initialHeights = {
|
|
98
|
+
base: baseRowHeight
|
|
99
|
+
};
|
|
61
100
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
101
|
+
if (getRowSpacing) {
|
|
102
|
+
const indexRelativeToCurrentPage = apiRef.current.getRowIndexRelativeToVisibleRows(row.id);
|
|
103
|
+
const spacing = getRowSpacing(_extends({}, row, {
|
|
104
|
+
isFirstVisible: indexRelativeToCurrentPage === 0,
|
|
105
|
+
isLastVisible: indexRelativeToCurrentPage === currentPage.rows.length - 1,
|
|
106
|
+
indexRelativeToCurrentPage
|
|
107
|
+
}));
|
|
108
|
+
initialHeights.spacingTop = spacing.top ?? 0;
|
|
109
|
+
initialHeights.spacingBottom = spacing.bottom ?? 0;
|
|
110
|
+
}
|
|
72
111
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
};
|
|
80
|
-
return acc + finalRowHeight;
|
|
81
|
-
}, 0);
|
|
112
|
+
const processedSizes = apiRef.current.unstable_applyPipeProcessors('rowHeight', initialHeights, row);
|
|
113
|
+
rowsHeightLookup.current[row.id].sizes = processedSizes;
|
|
114
|
+
const finalRowHeight = Object.values(processedSizes).reduce((acc2, value) => acc2 + value, 0);
|
|
115
|
+
return acc + finalRowHeight;
|
|
116
|
+
}, 0);
|
|
117
|
+
apiRef.current.setState(state => {
|
|
82
118
|
return _extends({}, state, {
|
|
83
119
|
rowsMeta: {
|
|
84
120
|
currentPageTotalHeight,
|
|
@@ -86,33 +122,67 @@ export const useGridRowsMeta = (apiRef, props) => {
|
|
|
86
122
|
}
|
|
87
123
|
});
|
|
88
124
|
});
|
|
89
|
-
apiRef.current.forceUpdate();
|
|
90
|
-
}, [apiRef, currentPage.rows, getRowSpacing, getRowHeight]);
|
|
91
125
|
|
|
92
|
-
|
|
126
|
+
if (!hasRowWithAutoHeight.current) {
|
|
127
|
+
// No row has height=auto, so all rows are already measured
|
|
128
|
+
lastMeasuredRowIndex.current = Infinity;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
apiRef.current.forceUpdate();
|
|
132
|
+
}, [apiRef, currentPage.rows, rowHeightFromDensity, getRowHeightProp, getRowSpacing, getEstimatedRowHeight]);
|
|
133
|
+
const getRowHeight = React.useCallback(rowId => {
|
|
134
|
+
const height = rowsHeightLookup.current[rowId];
|
|
135
|
+
return height ? height.sizes.base : rowHeightFromDensity;
|
|
136
|
+
}, [rowHeightFromDensity]);
|
|
93
137
|
|
|
94
138
|
const getRowInternalSizes = rowId => rowsHeightLookup.current[rowId]?.sizes;
|
|
95
139
|
|
|
96
140
|
const setRowHeight = React.useCallback((id, height) => {
|
|
97
|
-
rowsHeightLookup.current[id] =
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
sizes: _extends({}, rowsHeightLookup.current[id].sizes, {
|
|
101
|
-
base: height
|
|
102
|
-
})
|
|
103
|
-
};
|
|
141
|
+
rowsHeightLookup.current[id].sizes.base = height;
|
|
142
|
+
rowsHeightLookup.current[id].isResized = true;
|
|
143
|
+
rowsHeightLookup.current[id].needsFirstMeasurement = false;
|
|
104
144
|
hydrateRowsMeta();
|
|
105
|
-
}, [hydrateRowsMeta]);
|
|
145
|
+
}, [hydrateRowsMeta]);
|
|
146
|
+
const debouncedHydrateRowsMeta = React.useMemo(() => debounce(hydrateRowsMeta), [hydrateRowsMeta]);
|
|
147
|
+
const storeMeasuredRowHeight = React.useCallback((id, height) => {
|
|
148
|
+
if (!rowsHeightLookup.current[id] || !rowsHeightLookup.current[id].autoHeight) {
|
|
149
|
+
return;
|
|
150
|
+
} // Only trigger hydration if the value is different, otherwise we trigger a loop
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
const needsHydration = rowsHeightLookup.current[id].sizes.base !== height;
|
|
154
|
+
rowsHeightLookup.current[id].needsFirstMeasurement = false;
|
|
155
|
+
rowsHeightLookup.current[id].sizes.base = height;
|
|
156
|
+
|
|
157
|
+
if (needsHydration) {
|
|
158
|
+
debouncedHydrateRowsMeta();
|
|
159
|
+
}
|
|
160
|
+
}, [debouncedHydrateRowsMeta]);
|
|
161
|
+
const rowHasAutoHeight = React.useCallback(id => {
|
|
162
|
+
return rowsHeightLookup.current[id]?.autoHeight || false;
|
|
163
|
+
}, []);
|
|
164
|
+
const getLastMeasuredRowIndex = React.useCallback(() => {
|
|
165
|
+
return lastMeasuredRowIndex.current;
|
|
166
|
+
}, []);
|
|
167
|
+
const setLastMeasuredRowIndex = React.useCallback(index => {
|
|
168
|
+
if (hasRowWithAutoHeight.current && index > lastMeasuredRowIndex.current) {
|
|
169
|
+
lastMeasuredRowIndex.current = index;
|
|
170
|
+
}
|
|
171
|
+
}, []); // The effect is used to build the rows meta data - currentPageTotalHeight and positions.
|
|
106
172
|
// Because of variable row height this is needed for the virtualization
|
|
107
173
|
|
|
108
174
|
React.useEffect(() => {
|
|
109
175
|
hydrateRowsMeta();
|
|
110
|
-
}, [
|
|
176
|
+
}, [rowHeightFromDensity, filterState, paginationState, sortingState, hydrateRowsMeta]);
|
|
111
177
|
useGridRegisterPipeApplier(apiRef, 'rowHeight', hydrateRowsMeta);
|
|
112
178
|
const rowsMetaApi = {
|
|
113
|
-
|
|
179
|
+
unstable_getLastMeasuredRowIndex: getLastMeasuredRowIndex,
|
|
180
|
+
unstable_setLastMeasuredRowIndex: setLastMeasuredRowIndex,
|
|
181
|
+
unstable_rowHasAutoHeight: rowHasAutoHeight,
|
|
182
|
+
unstable_getRowHeight: getRowHeight,
|
|
114
183
|
unstable_getRowInternalSizes: getRowInternalSizes,
|
|
115
|
-
unstable_setRowHeight: setRowHeight
|
|
184
|
+
unstable_setRowHeight: setRowHeight,
|
|
185
|
+
unstable_storeRowHeightMeasurement: storeMeasuredRowHeight
|
|
116
186
|
};
|
|
117
187
|
useGridApiMethod(apiRef, rowsMetaApi, 'GridRowsMetaApi');
|
|
118
188
|
};
|
|
@@ -46,7 +46,7 @@ export const useGridSelection = (apiRef, props) => {
|
|
|
46
46
|
return getSelectionModelPropValue(props.selectionModel, gridSelectionStateSelector(apiRef.current.state));
|
|
47
47
|
}, [apiRef, props.selectionModel]);
|
|
48
48
|
const lastRowToggled = React.useRef(null);
|
|
49
|
-
apiRef.current.
|
|
49
|
+
apiRef.current.unstable_registerControlState({
|
|
50
50
|
stateId: 'selection',
|
|
51
51
|
propModel: propSelectionModel,
|
|
52
52
|
propOnChange: props.onSelectionModelChange,
|
|
@@ -3,7 +3,7 @@ import * as React from 'react';
|
|
|
3
3
|
import { unstable_composeClasses as composeClasses } from '@mui/material';
|
|
4
4
|
import { useGridRegisterPipeProcessor } from '../../core/pipeProcessing';
|
|
5
5
|
import { getDataGridUtilityClass } from '../../../constants';
|
|
6
|
-
import { GRID_CHECKBOX_SELECTION_COL_DEF } from '../../../colDef';
|
|
6
|
+
import { GRID_CHECKBOX_SELECTION_COL_DEF, GRID_CHECKBOX_SELECTION_FIELD } from '../../../colDef';
|
|
7
7
|
|
|
8
8
|
const useUtilityClasses = ownerState => {
|
|
9
9
|
const {
|
|
@@ -31,14 +31,16 @@ export const useGridSelectionPreProcessors = (apiRef, props) => {
|
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
const shouldHaveSelectionColumn = props.checkboxSelection;
|
|
34
|
-
const haveSelectionColumn = columnsState.lookup[
|
|
34
|
+
const haveSelectionColumn = columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD] != null;
|
|
35
35
|
|
|
36
36
|
if (shouldHaveSelectionColumn && !haveSelectionColumn) {
|
|
37
|
-
columnsState.lookup[
|
|
38
|
-
columnsState.all = [
|
|
37
|
+
columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD] = selectionColumn;
|
|
38
|
+
columnsState.all = [GRID_CHECKBOX_SELECTION_FIELD, ...columnsState.all];
|
|
39
39
|
} else if (!shouldHaveSelectionColumn && haveSelectionColumn) {
|
|
40
|
-
delete columnsState.lookup[
|
|
41
|
-
columnsState.all = columnsState.all.filter(field => field !==
|
|
40
|
+
delete columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD];
|
|
41
|
+
columnsState.all = columnsState.all.filter(field => field !== GRID_CHECKBOX_SELECTION_FIELD);
|
|
42
|
+
} else if (shouldHaveSelectionColumn && haveSelectionColumn) {
|
|
43
|
+
columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD] = _extends({}, selectionColumn, columnsState.lookup[GRID_CHECKBOX_SELECTION_FIELD]);
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
return columnsState;
|
|
@@ -28,7 +28,7 @@ export const sortingStateInitializer = (state, props) => {
|
|
|
28
28
|
|
|
29
29
|
export const useGridSorting = (apiRef, props) => {
|
|
30
30
|
const logger = useGridLogger(apiRef, 'useGridSorting');
|
|
31
|
-
apiRef.current.
|
|
31
|
+
apiRef.current.unstable_registerControlState({
|
|
32
32
|
stateId: 'sortModel',
|
|
33
33
|
propModel: props.sortModel,
|
|
34
34
|
propOnChange: props.onSortModelChange,
|