@mui/x-data-grid 7.25.0 → 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.
- package/CHANGELOG.md +71 -0
- package/DataGrid/useDataGridComponent.js +2 -2
- package/components/GridRow.js +8 -2
- package/components/GridScrollArea.d.ts +5 -2
- package/components/GridScrollArea.js +32 -25
- package/components/GridSkeletonLoadingOverlay.js +2 -1
- package/components/containers/GridRoot.js +11 -9
- package/components/containers/GridRootStyles.js +3 -3
- package/components/virtualization/GridMainContainer.d.ts +2 -2
- package/components/virtualization/GridMainContainer.js +1 -1
- package/components/virtualization/GridVirtualScroller.js +21 -14
- package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.d.ts +1 -1
- package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
- package/hooks/core/useGridStateInitialization.js +3 -2
- package/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
- package/hooks/features/columns/gridColumnsSelector.d.ts +0 -5
- package/hooks/features/columns/gridColumnsSelector.js +0 -12
- package/hooks/features/dimensions/gridDimensionsSelectors.d.ts +16 -0
- package/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
- package/hooks/features/dimensions/index.d.ts +1 -1
- package/hooks/features/dimensions/index.js +1 -2
- package/hooks/features/dimensions/useGridDimensions.js +97 -70
- package/hooks/features/editing/gridEditingSelectors.d.ts +5 -1
- package/hooks/features/editing/gridEditingSelectors.js +6 -1
- package/hooks/features/editing/useGridRowEditing.js +4 -4
- package/hooks/features/filter/gridFilterState.d.ts +5 -0
- package/hooks/features/filter/gridFilterState.js +5 -0
- package/hooks/features/filter/useGridFilter.js +6 -13
- package/hooks/features/pagination/useGridPagination.js +1 -1
- package/hooks/features/rowSelection/useGridRowSelection.js +1 -1
- package/hooks/features/rowSelection/utils.js +1 -1
- package/hooks/features/rows/gridRowsMetaState.d.ts +8 -0
- package/hooks/features/rows/gridRowsUtils.d.ts +0 -4
- package/hooks/features/rows/gridRowsUtils.js +0 -16
- package/hooks/features/rows/useGridRowsMeta.js +33 -17
- package/hooks/features/sorting/gridSortingSelector.js +10 -9
- package/hooks/features/virtualization/useGridVirtualScroller.d.ts +6 -0
- package/hooks/features/virtualization/useGridVirtualScroller.js +43 -27
- package/hooks/utils/useGridSelector.d.ts +8 -1
- package/hooks/utils/useGridSelector.js +42 -8
- package/hooks/utils/useIsSSR.d.ts +1 -0
- package/hooks/utils/useIsSSR.js +5 -0
- package/index.js +1 -1
- package/internals/index.d.ts +2 -1
- package/internals/index.js +2 -1
- package/models/api/gridStateApi.d.ts +1 -0
- package/models/events/gridEventLookup.d.ts +6 -0
- package/modern/DataGrid/useDataGridComponent.js +2 -2
- package/modern/components/GridRow.js +8 -2
- package/modern/components/GridScrollArea.js +32 -25
- package/modern/components/GridSkeletonLoadingOverlay.js +2 -1
- package/modern/components/containers/GridRoot.js +11 -9
- package/modern/components/containers/GridRootStyles.js +3 -3
- package/modern/components/virtualization/GridMainContainer.js +1 -1
- package/modern/components/virtualization/GridVirtualScroller.js +21 -14
- package/modern/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
- package/modern/hooks/core/useGridStateInitialization.js +3 -2
- package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
- package/modern/hooks/features/columns/gridColumnsSelector.js +0 -12
- package/modern/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
- package/modern/hooks/features/dimensions/index.js +1 -2
- package/modern/hooks/features/dimensions/useGridDimensions.js +97 -70
- package/modern/hooks/features/editing/gridEditingSelectors.js +6 -1
- package/modern/hooks/features/editing/useGridRowEditing.js +4 -4
- package/modern/hooks/features/filter/gridFilterState.js +5 -0
- package/modern/hooks/features/filter/useGridFilter.js +6 -13
- package/modern/hooks/features/pagination/useGridPagination.js +1 -1
- package/modern/hooks/features/rowSelection/useGridRowSelection.js +1 -1
- package/modern/hooks/features/rowSelection/utils.js +1 -1
- package/modern/hooks/features/rows/gridRowsUtils.js +0 -16
- package/modern/hooks/features/rows/useGridRowsMeta.js +33 -17
- package/modern/hooks/features/sorting/gridSortingSelector.js +10 -9
- package/modern/hooks/features/virtualization/useGridVirtualScroller.js +43 -27
- package/modern/hooks/utils/useGridSelector.js +42 -8
- package/modern/hooks/utils/useIsSSR.js +5 -0
- package/modern/index.js +1 -1
- package/modern/internals/index.js +2 -1
- package/node/DataGrid/useDataGridComponent.js +2 -2
- package/node/components/GridRow.js +7 -2
- package/node/components/GridScrollArea.js +31 -24
- package/node/components/GridSkeletonLoadingOverlay.js +2 -1
- package/node/components/containers/GridRoot.js +10 -8
- package/node/components/containers/GridRootStyles.js +3 -3
- package/node/components/virtualization/GridMainContainer.js +1 -1
- package/node/components/virtualization/GridVirtualScroller.js +21 -14
- package/node/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
- package/node/hooks/core/useGridStateInitialization.js +3 -2
- package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
- package/node/hooks/features/columns/gridColumnsSelector.js +1 -13
- package/node/hooks/features/dimensions/gridDimensionsSelectors.js +38 -2
- package/node/hooks/features/dimensions/index.js +13 -11
- package/node/hooks/features/dimensions/useGridDimensions.js +94 -67
- package/node/hooks/features/editing/gridEditingSelectors.js +5 -1
- package/node/hooks/features/editing/useGridRowEditing.js +4 -4
- package/node/hooks/features/filter/gridFilterState.js +6 -1
- package/node/hooks/features/filter/useGridFilter.js +5 -12
- package/node/hooks/features/pagination/useGridPagination.js +1 -1
- package/node/hooks/features/rowSelection/useGridRowSelection.js +1 -1
- package/node/hooks/features/rowSelection/utils.js +1 -1
- package/node/hooks/features/rows/gridRowsUtils.js +0 -17
- package/node/hooks/features/rows/useGridRowsMeta.js +31 -15
- package/node/hooks/features/sorting/gridSortingSelector.js +10 -9
- package/node/hooks/features/virtualization/useGridVirtualScroller.js +42 -26
- package/node/hooks/utils/useGridSelector.js +42 -8
- package/node/hooks/utils/useIsSSR.js +12 -0
- package/node/index.js +1 -1
- package/node/internals/index.js +20 -7
- package/package.json +3 -2
|
@@ -1,2 +1,18 @@
|
|
|
1
1
|
import { GridStateCommunity } from '../../../models/gridStateCommunity';
|
|
2
2
|
export declare const gridDimensionsSelector: (state: GridStateCommunity) => import("./gridDimensionsApi").GridDimensions;
|
|
3
|
+
/**
|
|
4
|
+
* Get the summed width of all the visible columns.
|
|
5
|
+
* @category Visible Columns
|
|
6
|
+
*/
|
|
7
|
+
export declare const gridColumnsTotalWidthSelector: import("../../..").OutputSelector<GridStateCommunity, number>;
|
|
8
|
+
export declare const gridRowHeightSelector: (state: GridStateCommunity) => number;
|
|
9
|
+
export declare const gridContentHeightSelector: (state: GridStateCommunity) => number;
|
|
10
|
+
export declare const gridHasScrollXSelector: (state: GridStateCommunity) => boolean;
|
|
11
|
+
export declare const gridHasScrollYSelector: (state: GridStateCommunity) => boolean;
|
|
12
|
+
export declare const gridHasFillerSelector: (state: GridStateCommunity) => boolean;
|
|
13
|
+
export declare const gridHeaderHeightSelector: (state: GridStateCommunity) => number;
|
|
14
|
+
export declare const gridGroupHeaderHeightSelector: (state: GridStateCommunity) => number;
|
|
15
|
+
export declare const gridHeaderFilterHeightSelector: (state: GridStateCommunity) => number;
|
|
16
|
+
export declare const gridVerticalScrollbarWidthSelector: (state: GridStateCommunity) => number;
|
|
17
|
+
export declare const gridHorizontalScrollbarHeightSelector: (state: GridStateCommunity) => number;
|
|
18
|
+
export declare const gridHasBottomFillerSelector: (state: GridStateCommunity) => boolean;
|
|
@@ -1 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
import { createSelector } from "../../../utils/createSelector.js";
|
|
2
|
+
export const gridDimensionsSelector = state => state.dimensions;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Get the summed width of all the visible columns.
|
|
6
|
+
* @category Visible Columns
|
|
7
|
+
*/
|
|
8
|
+
export const gridColumnsTotalWidthSelector = createSelector(gridDimensionsSelector, dimensions => dimensions.columnsTotalWidth);
|
|
9
|
+
export const gridRowHeightSelector = state => state.dimensions.rowHeight;
|
|
10
|
+
export const gridContentHeightSelector = state => state.dimensions.contentSize.height;
|
|
11
|
+
export const gridHasScrollXSelector = state => state.dimensions.hasScrollX;
|
|
12
|
+
export const gridHasScrollYSelector = state => state.dimensions.hasScrollY;
|
|
13
|
+
export const gridHasFillerSelector = state => state.dimensions.columnsTotalWidth < state.dimensions.viewportOuterSize.width;
|
|
14
|
+
export const gridHeaderHeightSelector = state => state.dimensions.headerHeight;
|
|
15
|
+
export const gridGroupHeaderHeightSelector = state => state.dimensions.groupHeaderHeight;
|
|
16
|
+
export const gridHeaderFilterHeightSelector = state => state.dimensions.headerFilterHeight;
|
|
17
|
+
export const gridVerticalScrollbarWidthSelector = state => state.dimensions.hasScrollY ? state.dimensions.scrollbarSize : 0;
|
|
18
|
+
export const gridHorizontalScrollbarHeightSelector = state => state.dimensions.hasScrollX ? state.dimensions.scrollbarSize : 0;
|
|
19
|
+
export const gridHasBottomFillerSelector = state => {
|
|
20
|
+
const height = state.dimensions.hasScrollX ? state.dimensions.scrollbarSize : 0;
|
|
21
|
+
const needsLastRowBorder = state.dimensions.viewportOuterSize.height - state.dimensions.minimumSize.height > 0;
|
|
22
|
+
if (height === 0 && !needsLastRowBorder) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export type { GridDimensionsState } from './useGridDimensions';
|
|
2
|
-
export
|
|
2
|
+
export { gridDimensionsSelector, gridColumnsTotalWidthSelector } from './gridDimensionsSelectors';
|
|
3
3
|
export type { GridDimensions, GridDimensionsApi } from './gridDimensionsApi';
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export
|
|
2
|
-
export {};
|
|
1
|
+
export { gridDimensionsSelector, gridColumnsTotalWidthSelector } from "./gridDimensionsSelectors.js";
|
|
@@ -2,21 +2,23 @@ import _extends from "@babel/runtime/helpers/esm/extends";
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { unstable_ownerDocument as ownerDocument, unstable_useEnhancedEffect as useEnhancedEffect, unstable_useEventCallback as useEventCallback, unstable_ownerWindow as ownerWindow } from '@mui/utils';
|
|
4
4
|
import { throttle } from '@mui/x-internals/throttle';
|
|
5
|
-
import {
|
|
5
|
+
import { useGridApiOptionHandler } from "../../utils/useGridApiEventHandler.js";
|
|
6
6
|
import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
|
|
7
|
+
import { createSelector } from "../../../utils/createSelector.js";
|
|
7
8
|
import { useGridLogger } from "../../utils/useGridLogger.js";
|
|
8
|
-
import {
|
|
9
|
+
import { gridColumnPositionsSelector, gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector } from "../columns/index.js";
|
|
9
10
|
import { gridDimensionsSelector } from "./gridDimensionsSelectors.js";
|
|
10
11
|
import { gridDensityFactorSelector } from "../density/index.js";
|
|
11
12
|
import { gridRenderContextSelector } from "../virtualization/index.js";
|
|
12
13
|
import { useGridSelector } from "../../utils/index.js";
|
|
13
14
|
import { getVisibleRows } from "../../utils/useGridVisibleRows.js";
|
|
14
15
|
import { gridRowsMetaSelector } from "../rows/gridRowsMetaSelector.js";
|
|
15
|
-
import {
|
|
16
|
+
import { getValidRowHeight, rowHeightWarning } from "../rows/gridRowsUtils.js";
|
|
16
17
|
import { getTotalHeaderHeight } from "../columns/gridColumnsUtils.js";
|
|
17
18
|
import { DATA_GRID_PROPS_DEFAULT_VALUES } from "../../../constants/dataGridPropsDefaultValues.js";
|
|
18
19
|
import { roundToDecimalPlaces } from "../../../utils/roundToDecimalPlaces.js";
|
|
19
20
|
import { isJSDOM } from "../../../utils/isJSDOM.js";
|
|
21
|
+
import { isDeepEqual } from "../../../utils/utils.js";
|
|
20
22
|
const EMPTY_SIZE = {
|
|
21
23
|
width: 0,
|
|
22
24
|
height: 0
|
|
@@ -43,39 +45,47 @@ const EMPTY_DIMENSIONS = {
|
|
|
43
45
|
topContainerHeight: 0,
|
|
44
46
|
bottomContainerHeight: 0
|
|
45
47
|
};
|
|
46
|
-
export const dimensionsStateInitializer = state => {
|
|
48
|
+
export const dimensionsStateInitializer = (state, props, apiRef) => {
|
|
47
49
|
const dimensions = EMPTY_DIMENSIONS;
|
|
50
|
+
const density = gridDensityFactorSelector(apiRef);
|
|
48
51
|
return _extends({}, state, {
|
|
49
|
-
dimensions
|
|
52
|
+
dimensions: _extends({}, dimensions, getStaticDimensions(props, apiRef, density, gridVisiblePinnedColumnDefinitionsSelector(apiRef)))
|
|
50
53
|
});
|
|
51
54
|
};
|
|
55
|
+
const columnsTotalWidthSelector = createSelector(gridVisibleColumnDefinitionsSelector, gridColumnPositionsSelector, (visibleColumns, positions) => {
|
|
56
|
+
const colCount = visibleColumns.length;
|
|
57
|
+
if (colCount === 0) {
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
return roundToDecimalPlaces(positions[colCount - 1] + visibleColumns[colCount - 1].computedWidth, 1);
|
|
61
|
+
});
|
|
52
62
|
export function useGridDimensions(apiRef, props) {
|
|
53
63
|
const logger = useGridLogger(apiRef, 'useResizeContainer');
|
|
54
64
|
const errorShown = React.useRef(false);
|
|
55
65
|
const rootDimensionsRef = React.useRef(EMPTY_SIZE);
|
|
56
|
-
const dimensionsState = useGridSelector(apiRef, gridDimensionsSelector);
|
|
57
|
-
const rowsMeta = useGridSelector(apiRef, gridRowsMetaSelector);
|
|
58
66
|
const pinnedColumns = useGridSelector(apiRef, gridVisiblePinnedColumnDefinitionsSelector);
|
|
59
67
|
const densityFactor = useGridSelector(apiRef, gridDensityFactorSelector);
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
React.useEffect(() => debouncedSetSavedSize.clear, [debouncedSetSavedSize]);
|
|
68
|
+
const columnsTotalWidth = useGridSelector(apiRef, columnsTotalWidthSelector);
|
|
69
|
+
const isFirstSizing = React.useRef(true);
|
|
70
|
+
const {
|
|
71
|
+
rowHeight,
|
|
72
|
+
headerHeight,
|
|
73
|
+
groupHeaderHeight,
|
|
74
|
+
headerFilterHeight,
|
|
75
|
+
headersTotalHeight,
|
|
76
|
+
leftPinnedWidth,
|
|
77
|
+
rightPinnedWidth
|
|
78
|
+
} = getStaticDimensions(props, apiRef, densityFactor, pinnedColumns);
|
|
72
79
|
const previousSize = React.useRef(undefined);
|
|
73
|
-
const getRootDimensions = () => apiRef.current.state
|
|
74
|
-
const setDimensions =
|
|
80
|
+
const getRootDimensions = React.useCallback(() => gridDimensionsSelector(apiRef.current.state), [apiRef]);
|
|
81
|
+
const setDimensions = React.useCallback(dimensions => {
|
|
75
82
|
apiRef.current.setState(state => _extends({}, state, {
|
|
76
83
|
dimensions
|
|
77
84
|
}));
|
|
78
|
-
|
|
85
|
+
if (apiRef.current.rootElementRef.current) {
|
|
86
|
+
setCSSVariables(apiRef.current.rootElementRef.current, gridDimensionsSelector(apiRef.current.state));
|
|
87
|
+
}
|
|
88
|
+
}, [apiRef]);
|
|
79
89
|
const resize = React.useCallback(() => {
|
|
80
90
|
const element = apiRef.current.mainElementRef.current;
|
|
81
91
|
if (!element) {
|
|
@@ -96,10 +106,7 @@ export function useGridDimensions(apiRef, props) {
|
|
|
96
106
|
if (!dimensions.isReady) {
|
|
97
107
|
return 0;
|
|
98
108
|
}
|
|
99
|
-
const currentPage = getVisibleRows(apiRef
|
|
100
|
-
pagination: props.pagination,
|
|
101
|
-
paginationMode: props.paginationMode
|
|
102
|
-
});
|
|
109
|
+
const currentPage = getVisibleRows(apiRef);
|
|
103
110
|
|
|
104
111
|
// TODO: Use a combination of scrollTop, dimensions.viewportInnerSize.height and rowsMeta.possitions
|
|
105
112
|
// to find out the maximum number of rows that can fit in the visible part of the grid
|
|
@@ -110,16 +117,19 @@ export function useGridDimensions(apiRef, props) {
|
|
|
110
117
|
}
|
|
111
118
|
const maximumPageSizeWithoutScrollBar = Math.floor(dimensions.viewportInnerSize.height / rowHeight);
|
|
112
119
|
return Math.min(maximumPageSizeWithoutScrollBar, currentPage.rows.length);
|
|
113
|
-
}, [apiRef, props.
|
|
120
|
+
}, [apiRef, props.getRowHeight, rowHeight]);
|
|
114
121
|
const updateDimensions = React.useCallback(() => {
|
|
122
|
+
if (isFirstSizing.current) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
115
125
|
// All the floating point dimensions should be rounded to .1 decimal places to avoid subpixel rendering issues
|
|
116
126
|
// https://github.com/mui/mui-x/issues/9550#issuecomment-1619020477
|
|
117
127
|
// https://github.com/mui/mui-x/issues/15721
|
|
118
128
|
const rootElement = apiRef.current.rootElementRef.current;
|
|
119
|
-
const
|
|
120
|
-
const
|
|
121
|
-
const topContainerHeight = headersTotalHeight +
|
|
122
|
-
const bottomContainerHeight =
|
|
129
|
+
const scrollbarSize = measureScrollbarSize(rootElement, props.scrollbarSize);
|
|
130
|
+
const rowsMeta = gridRowsMetaSelector(apiRef.current.state);
|
|
131
|
+
const topContainerHeight = headersTotalHeight + rowsMeta.pinnedTopRowsTotalHeight;
|
|
132
|
+
const bottomContainerHeight = rowsMeta.pinnedBottomRowsTotalHeight;
|
|
123
133
|
const nonPinnedColumnsTotalWidth = columnsTotalWidth - leftPinnedWidth - rightPinnedWidth;
|
|
124
134
|
const contentSize = {
|
|
125
135
|
width: nonPinnedColumnsTotalWidth,
|
|
@@ -197,12 +207,21 @@ export function useGridDimensions(apiRef, props) {
|
|
|
197
207
|
bottomContainerHeight
|
|
198
208
|
};
|
|
199
209
|
const prevDimensions = apiRef.current.state.dimensions;
|
|
210
|
+
if (isDeepEqual(prevDimensions, newDimensions)) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
200
213
|
setDimensions(newDimensions);
|
|
201
214
|
if (!areElementSizesEqual(newDimensions.viewportInnerSize, prevDimensions.viewportInnerSize)) {
|
|
202
215
|
apiRef.current.publishEvent('viewportInnerSizeChange', newDimensions.viewportInnerSize);
|
|
203
216
|
}
|
|
204
217
|
apiRef.current.updateRenderContext?.();
|
|
205
|
-
}, [apiRef, setDimensions, props.scrollbarSize, props.autoHeight,
|
|
218
|
+
}, [apiRef, setDimensions, props.scrollbarSize, props.autoHeight, rowHeight, headerHeight, groupHeaderHeight, headerFilterHeight, columnsTotalWidth, headersTotalHeight, leftPinnedWidth, rightPinnedWidth]);
|
|
219
|
+
const updateDimensionCallback = useEventCallback(updateDimensions);
|
|
220
|
+
const debouncedUpdateDimensions = React.useMemo(() => props.resizeThrottleMs > 0 ? throttle(() => {
|
|
221
|
+
updateDimensionCallback();
|
|
222
|
+
apiRef.current.publishEvent('debouncedResize', rootDimensionsRef.current);
|
|
223
|
+
}, props.resizeThrottleMs) : undefined, [apiRef, props.resizeThrottleMs, updateDimensionCallback]);
|
|
224
|
+
React.useEffect(() => debouncedUpdateDimensions?.clear, [debouncedUpdateDimensions]);
|
|
206
225
|
const apiPublic = {
|
|
207
226
|
resize,
|
|
208
227
|
getRootDimensions
|
|
@@ -211,35 +230,12 @@ export function useGridDimensions(apiRef, props) {
|
|
|
211
230
|
updateDimensions,
|
|
212
231
|
getViewportPageSize
|
|
213
232
|
};
|
|
233
|
+
useEnhancedEffect(updateDimensions, [updateDimensions]);
|
|
214
234
|
useGridApiMethod(apiRef, apiPublic, 'public');
|
|
215
235
|
useGridApiMethod(apiRef, apiPrivate, 'private');
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
apiRef.current.publishEvent('debouncedResize', rootDimensionsRef.current);
|
|
220
|
-
}
|
|
221
|
-
}, [apiRef, savedSize, updateDimensions]);
|
|
222
|
-
const root = apiRef.current.rootElementRef.current;
|
|
223
|
-
useEnhancedEffect(() => {
|
|
224
|
-
if (!root) {
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
const set = (k, v) => root.style.setProperty(k, v);
|
|
228
|
-
set('--DataGrid-width', `${dimensionsState.viewportOuterSize.width}px`);
|
|
229
|
-
set('--DataGrid-hasScrollX', `${Number(dimensionsState.hasScrollX)}`);
|
|
230
|
-
set('--DataGrid-hasScrollY', `${Number(dimensionsState.hasScrollY)}`);
|
|
231
|
-
set('--DataGrid-scrollbarSize', `${dimensionsState.scrollbarSize}px`);
|
|
232
|
-
set('--DataGrid-rowWidth', `${dimensionsState.rowWidth}px`);
|
|
233
|
-
set('--DataGrid-columnsTotalWidth', `${dimensionsState.columnsTotalWidth}px`);
|
|
234
|
-
set('--DataGrid-leftPinnedWidth', `${dimensionsState.leftPinnedWidth}px`);
|
|
235
|
-
set('--DataGrid-rightPinnedWidth', `${dimensionsState.rightPinnedWidth}px`);
|
|
236
|
-
set('--DataGrid-headerHeight', `${dimensionsState.headerHeight}px`);
|
|
237
|
-
set('--DataGrid-headersTotalHeight', `${dimensionsState.headersTotalHeight}px`);
|
|
238
|
-
set('--DataGrid-topContainerHeight', `${dimensionsState.topContainerHeight}px`);
|
|
239
|
-
set('--DataGrid-bottomContainerHeight', `${dimensionsState.bottomContainerHeight}px`);
|
|
240
|
-
set('--height', `${dimensionsState.rowHeight}px`);
|
|
241
|
-
}, [root, dimensionsState]);
|
|
242
|
-
const isFirstSizing = React.useRef(true);
|
|
236
|
+
const handleRootMount = React.useCallback(root => {
|
|
237
|
+
setCSSVariables(root, gridDimensionsSelector(apiRef.current.state));
|
|
238
|
+
}, [apiRef]);
|
|
243
239
|
const handleResize = React.useCallback(size => {
|
|
244
240
|
rootDimensionsRef.current = size;
|
|
245
241
|
if (size.height === 0 && !errorShown.current && !props.autoHeight && !isJSDOM) {
|
|
@@ -250,28 +246,58 @@ export function useGridDimensions(apiRef, props) {
|
|
|
250
246
|
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'));
|
|
251
247
|
errorShown.current = true;
|
|
252
248
|
}
|
|
253
|
-
if (isFirstSizing.current) {
|
|
249
|
+
if (isFirstSizing.current || !debouncedUpdateDimensions) {
|
|
254
250
|
// We want to initialize the grid dimensions as soon as possible to avoid flickering
|
|
255
|
-
setSavedSize(size);
|
|
256
251
|
isFirstSizing.current = false;
|
|
252
|
+
updateDimensions();
|
|
257
253
|
return;
|
|
258
254
|
}
|
|
259
|
-
|
|
260
|
-
}, [props.autoHeight,
|
|
261
|
-
|
|
262
|
-
useGridApiOptionHandler(apiRef, '
|
|
263
|
-
useGridApiOptionHandler(apiRef, 'paginationModelChange', updateDimensions);
|
|
264
|
-
useGridApiOptionHandler(apiRef, 'columnsChange', updateDimensions);
|
|
265
|
-
useGridApiEventHandler(apiRef, 'resize', handleResize);
|
|
255
|
+
debouncedUpdateDimensions();
|
|
256
|
+
}, [updateDimensions, props.autoHeight, debouncedUpdateDimensions, logger]);
|
|
257
|
+
useGridApiOptionHandler(apiRef, 'rootMount', handleRootMount);
|
|
258
|
+
useGridApiOptionHandler(apiRef, 'resize', handleResize);
|
|
266
259
|
useGridApiOptionHandler(apiRef, 'debouncedResize', props.onResize);
|
|
267
260
|
}
|
|
268
|
-
function
|
|
261
|
+
function setCSSVariables(root, dimensions) {
|
|
262
|
+
const set = (k, v) => root.style.setProperty(k, v);
|
|
263
|
+
set('--DataGrid-hasScrollX', `${Number(dimensions.hasScrollX)}`);
|
|
264
|
+
set('--DataGrid-hasScrollY', `${Number(dimensions.hasScrollY)}`);
|
|
265
|
+
set('--DataGrid-scrollbarSize', `${dimensions.scrollbarSize}px`);
|
|
266
|
+
set('--DataGrid-rowWidth', `${dimensions.rowWidth}px`);
|
|
267
|
+
set('--DataGrid-columnsTotalWidth', `${dimensions.columnsTotalWidth}px`);
|
|
268
|
+
set('--DataGrid-leftPinnedWidth', `${dimensions.leftPinnedWidth}px`);
|
|
269
|
+
set('--DataGrid-rightPinnedWidth', `${dimensions.rightPinnedWidth}px`);
|
|
270
|
+
set('--DataGrid-headerHeight', `${dimensions.headerHeight}px`);
|
|
271
|
+
set('--DataGrid-headersTotalHeight', `${dimensions.headersTotalHeight}px`);
|
|
272
|
+
set('--DataGrid-topContainerHeight', `${dimensions.topContainerHeight}px`);
|
|
273
|
+
set('--DataGrid-bottomContainerHeight', `${dimensions.bottomContainerHeight}px`);
|
|
274
|
+
set('--height', `${dimensions.rowHeight}px`);
|
|
275
|
+
}
|
|
276
|
+
function getStaticDimensions(props, apiRef, density, pinnedColumnns) {
|
|
277
|
+
const validRowHeight = getValidRowHeight(props.rowHeight, DATA_GRID_PROPS_DEFAULT_VALUES.rowHeight, rowHeightWarning);
|
|
278
|
+
return {
|
|
279
|
+
rowHeight: Math.floor(validRowHeight * density),
|
|
280
|
+
headerHeight: Math.floor(props.columnHeaderHeight * density),
|
|
281
|
+
groupHeaderHeight: Math.floor((props.columnGroupHeaderHeight ?? props.columnHeaderHeight) * density),
|
|
282
|
+
headerFilterHeight: Math.floor((props.headerFilterHeight ?? props.columnHeaderHeight) * density),
|
|
283
|
+
columnsTotalWidth: columnsTotalWidthSelector(apiRef),
|
|
284
|
+
headersTotalHeight: getTotalHeaderHeight(apiRef, props),
|
|
285
|
+
leftPinnedWidth: pinnedColumnns.left.reduce((w, col) => w + col.computedWidth, 0),
|
|
286
|
+
rightPinnedWidth: pinnedColumnns.right.reduce((w, col) => w + col.computedWidth, 0)
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const scrollbarSizeCache = new WeakMap();
|
|
290
|
+
function measureScrollbarSize(rootElement, scrollbarSize) {
|
|
269
291
|
if (scrollbarSize !== undefined) {
|
|
270
292
|
return scrollbarSize;
|
|
271
293
|
}
|
|
272
|
-
if (rootElement === null
|
|
294
|
+
if (rootElement === null) {
|
|
273
295
|
return 0;
|
|
274
296
|
}
|
|
297
|
+
const cachedSize = scrollbarSizeCache.get(rootElement);
|
|
298
|
+
if (cachedSize !== undefined) {
|
|
299
|
+
return cachedSize;
|
|
300
|
+
}
|
|
275
301
|
const doc = ownerDocument(rootElement);
|
|
276
302
|
const scrollDiv = doc.createElement('div');
|
|
277
303
|
scrollDiv.style.width = '99px';
|
|
@@ -282,6 +308,7 @@ function measureScrollbarSize(rootElement, columnsTotalWidth, scrollbarSize) {
|
|
|
282
308
|
rootElement.appendChild(scrollDiv);
|
|
283
309
|
const size = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
|
284
310
|
rootElement.removeChild(scrollDiv);
|
|
311
|
+
scrollbarSizeCache.set(rootElement, size);
|
|
285
312
|
return size;
|
|
286
313
|
}
|
|
287
314
|
function areElementSizesEqual(a, b) {
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { GridStateCommunity } from '../../../models/gridStateCommunity';
|
|
2
2
|
import { GridRowId } from '../../../models/gridRows';
|
|
3
|
+
import { GridEditMode } from '../../../models/gridEditRowModel';
|
|
3
4
|
/**
|
|
4
5
|
* Select the row editing state.
|
|
5
6
|
*/
|
|
6
7
|
export declare const gridEditRowsStateSelector: (state: GridStateCommunity) => import("../../..").GridEditingState;
|
|
7
|
-
export declare const gridRowIsEditingSelector: import("../../../utils/createSelector").OutputSelectorV8<GridStateCommunity,
|
|
8
|
+
export declare const gridRowIsEditingSelector: import("../../../utils/createSelector").OutputSelectorV8<GridStateCommunity, {
|
|
9
|
+
rowId: GridRowId;
|
|
10
|
+
editMode: GridEditMode;
|
|
11
|
+
}, boolean>;
|
|
8
12
|
export declare const gridEditCellStateSelector: import("../../../utils/createSelector").OutputSelectorV8<GridStateCommunity, {
|
|
9
13
|
rowId: GridRowId;
|
|
10
14
|
field: string;
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { createSelectorV8 } from "../../../utils/createSelector.js";
|
|
2
|
+
import { GridEditModes } from "../../../models/gridEditRowModel.js";
|
|
3
|
+
|
|
2
4
|
/**
|
|
3
5
|
* Select the row editing state.
|
|
4
6
|
*/
|
|
5
7
|
export const gridEditRowsStateSelector = state => state.editRows;
|
|
6
|
-
export const gridRowIsEditingSelector = createSelectorV8(gridEditRowsStateSelector, (editRows,
|
|
8
|
+
export const gridRowIsEditingSelector = createSelectorV8(gridEditRowsStateSelector, (editRows, {
|
|
9
|
+
rowId,
|
|
10
|
+
editMode
|
|
11
|
+
}) => editMode === GridEditModes.Row && Boolean(editRows[rowId]));
|
|
7
12
|
export const gridEditCellStateSelector = createSelectorV8(gridEditRowsStateSelector, (editRows, {
|
|
8
13
|
rowId,
|
|
9
14
|
field
|
|
@@ -232,10 +232,10 @@ export const useGridRowEditing = (apiRef, props) => {
|
|
|
232
232
|
useGridApiOptionHandler(apiRef, 'rowEditStart', props.onRowEditStart);
|
|
233
233
|
useGridApiOptionHandler(apiRef, 'rowEditStop', props.onRowEditStop);
|
|
234
234
|
const getRowMode = React.useCallback(id => {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
235
|
+
const isEditing = gridRowIsEditingSelector(apiRef, {
|
|
236
|
+
rowId: id,
|
|
237
|
+
editMode: props.editMode
|
|
238
|
+
});
|
|
239
239
|
return isEditing ? GridRowModes.Edit : GridRowModes.View;
|
|
240
240
|
}, [apiRef, props.editMode]);
|
|
241
241
|
const updateRowModesModel = useEventCallback(newModel => {
|
|
@@ -7,6 +7,11 @@ export type GridFilterItemResult = {
|
|
|
7
7
|
export type GridQuickFilterValueResult = {
|
|
8
8
|
[key: string]: boolean;
|
|
9
9
|
};
|
|
10
|
+
export declare const defaultGridFilterLookup: {
|
|
11
|
+
filteredRowsLookup: {};
|
|
12
|
+
filteredChildrenCountLookup: {};
|
|
13
|
+
filteredDescendantCountLookup: {};
|
|
14
|
+
};
|
|
10
15
|
export declare const getDefaultGridFilterModel: () => GridFilterModel;
|
|
11
16
|
export interface GridFilterState {
|
|
12
17
|
filterModel: GridFilterModel;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { GridLogicOperator } from "../../../models/gridFilterItem.js";
|
|
2
|
+
export const defaultGridFilterLookup = {
|
|
3
|
+
filteredRowsLookup: {},
|
|
4
|
+
filteredChildrenCountLookup: {},
|
|
5
|
+
filteredDescendantCountLookup: {}
|
|
6
|
+
};
|
|
2
7
|
export const getDefaultGridFilterModel = () => ({
|
|
3
8
|
items: [],
|
|
4
9
|
logicOperator: GridLogicOperator.And,
|
|
@@ -8,7 +8,7 @@ import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
|
|
|
8
8
|
import { useGridLogger } from "../../utils/useGridLogger.js";
|
|
9
9
|
import { gridColumnLookupSelector } from "../columns/gridColumnsSelector.js";
|
|
10
10
|
import { GridPreferencePanelsValue } from "../preferencesPanel/gridPreferencePanelsValue.js";
|
|
11
|
-
import { getDefaultGridFilterModel } from "./gridFilterState.js";
|
|
11
|
+
import { defaultGridFilterLookup, getDefaultGridFilterModel } from "./gridFilterState.js";
|
|
12
12
|
import { gridFilterModelSelector } from "./gridFilterSelector.js";
|
|
13
13
|
import { useFirstRender } from "../../utils/useFirstRender.js";
|
|
14
14
|
import { gridRowsLookupSelector } from "../rows/index.js";
|
|
@@ -20,12 +20,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
20
20
|
export const filterStateInitializer = (state, props, apiRef) => {
|
|
21
21
|
const filterModel = props.filterModel ?? props.initialState?.filter?.filterModel ?? getDefaultGridFilterModel();
|
|
22
22
|
return _extends({}, state, {
|
|
23
|
-
filter: {
|
|
24
|
-
filterModel: sanitizeFilterModel(filterModel, props.disableMultipleColumnsFiltering, apiRef)
|
|
25
|
-
|
|
26
|
-
filteredChildrenCountLookup: {},
|
|
27
|
-
filteredDescendantCountLookup: {}
|
|
28
|
-
},
|
|
23
|
+
filter: _extends({
|
|
24
|
+
filterModel: sanitizeFilterModel(filterModel, props.disableMultipleColumnsFiltering, apiRef)
|
|
25
|
+
}, defaultGridFilterLookup),
|
|
29
26
|
visibleRowsLookup: {}
|
|
30
27
|
});
|
|
31
28
|
};
|
|
@@ -271,12 +268,8 @@ export const useGridFilter = (apiRef, props) => {
|
|
|
271
268
|
} = props;
|
|
272
269
|
const getRowsRef = useLazyRef(createMemoizedValues);
|
|
273
270
|
const flatFilteringMethod = React.useCallback(params => {
|
|
274
|
-
if (props.filterMode !== 'client' || !params.isRowMatchingFilters) {
|
|
275
|
-
return
|
|
276
|
-
filteredRowsLookup: {},
|
|
277
|
-
filteredChildrenCountLookup: {},
|
|
278
|
-
filteredDescendantCountLookup: {}
|
|
279
|
-
};
|
|
271
|
+
if (props.filterMode !== 'client' || !params.isRowMatchingFilters || !params.filterModel.items.length && !params.filterModel.quickFilterValues?.length) {
|
|
272
|
+
return defaultGridFilterLookup;
|
|
280
273
|
}
|
|
281
274
|
const dataRowIdToModelLookup = gridRowsLookupSelector(apiRef);
|
|
282
275
|
const filteredRowsLookup = {};
|
|
@@ -6,7 +6,7 @@ import { useGridPaginationMeta } from "./useGridPaginationMeta.js";
|
|
|
6
6
|
export const paginationStateInitializer = (state, props) => {
|
|
7
7
|
const paginationModel = _extends({}, getDefaultGridPaginationModel(props.autoPageSize), props.paginationModel ?? props.initialState?.pagination?.paginationModel);
|
|
8
8
|
throwIfPageSizeExceedsTheLimit(paginationModel.pageSize, props.signature);
|
|
9
|
-
const rowCount = props.rowCount ?? props.initialState?.pagination?.rowCount;
|
|
9
|
+
const rowCount = props.rowCount ?? props.initialState?.pagination?.rowCount ?? (props.paginationMode === 'client' ? state.rows?.totalRowCount : undefined);
|
|
10
10
|
const meta = props.paginationMeta ?? props.initialState?.pagination?.meta ?? {};
|
|
11
11
|
return _extends({}, state, {
|
|
12
12
|
pagination: _extends({}, state.pagination, {
|
|
@@ -258,7 +258,7 @@ export const useGridRowSelection = (apiRef, props) => {
|
|
|
258
258
|
if (props.filterMode === 'server') {
|
|
259
259
|
return !rowsLookup[id];
|
|
260
260
|
}
|
|
261
|
-
return filteredRowsLookup[id]
|
|
261
|
+
return !rowsLookup[id] || filteredRowsLookup[id] === false;
|
|
262
262
|
};
|
|
263
263
|
let hasChanged = false;
|
|
264
264
|
currentSelection.forEach(id => {
|
|
@@ -92,7 +92,7 @@ const getFilteredRowNodeSiblings = (tree, filteredRows, id) => {
|
|
|
92
92
|
return [];
|
|
93
93
|
}
|
|
94
94
|
const parentNode = tree[parent];
|
|
95
|
-
return parentNode.children.filter(childId => childId !== id && filteredRows[childId]);
|
|
95
|
+
return parentNode.children.filter(childId => childId !== id && filteredRows[childId] !== false);
|
|
96
96
|
};
|
|
97
97
|
export const findRowsToSelect = (apiRef, tree, selectedRow, autoSelectDescendants, autoSelectParents, addRow) => {
|
|
98
98
|
const filteredRows = gridFilteredRowsLookupSelector(apiRef);
|
|
@@ -10,4 +10,12 @@ export interface GridRowsMetaState {
|
|
|
10
10
|
* The grid rows positions.
|
|
11
11
|
*/
|
|
12
12
|
positions: number[];
|
|
13
|
+
/**
|
|
14
|
+
* The total height of the pinned top rows.
|
|
15
|
+
*/
|
|
16
|
+
pinnedTopRowsTotalHeight: number;
|
|
17
|
+
/**
|
|
18
|
+
* The total height of the pinned bottom rows.
|
|
19
|
+
*/
|
|
20
|
+
pinnedBottomRowsTotalHeight: number;
|
|
13
21
|
}
|
|
@@ -33,10 +33,6 @@ export declare const updateCacheWithNewRows: ({ previousCache, getRowId, updates
|
|
|
33
33
|
updates: GridRowModelUpdate[];
|
|
34
34
|
groupKeys?: string[];
|
|
35
35
|
}) => GridRowsInternalCache;
|
|
36
|
-
export declare function calculatePinnedRowsHeight(apiRef: RefObject<GridApiCommunity>): {
|
|
37
|
-
top: number;
|
|
38
|
-
bottom: number;
|
|
39
|
-
};
|
|
40
36
|
export declare const minimalContentHeight = "var(--DataGrid-overlayHeight, calc(var(--height) * 2))";
|
|
41
37
|
export declare function computeRowsUpdates(apiRef: RefObject<GridApiCommunity>, updates: GridRowModelUpdate[], getRowId: DataGridProcessedProps['getRowId']): GridRowModelUpdate[];
|
|
42
38
|
export declare const getValidRowHeight: (rowHeightProp: any, defaultRowHeight: number, warningMessage: string) => number;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
-
import { gridPinnedRowsSelector } from "./gridRowsSelector.js";
|
|
3
2
|
export const GRID_ROOT_GROUP_ID = `auto-generated-group-node-root`;
|
|
4
3
|
export const GRID_ID_AUTOGENERATED = Symbol('mui.id_autogenerated');
|
|
5
4
|
export const buildRootGroup = () => ({
|
|
@@ -269,21 +268,6 @@ export const updateCacheWithNewRows = ({
|
|
|
269
268
|
rowCountPropBeforePartialUpdates: previousCache.rowCountPropBeforePartialUpdates
|
|
270
269
|
};
|
|
271
270
|
};
|
|
272
|
-
export function calculatePinnedRowsHeight(apiRef) {
|
|
273
|
-
const pinnedRows = gridPinnedRowsSelector(apiRef);
|
|
274
|
-
const topPinnedRowsHeight = pinnedRows?.top?.reduce((acc, value) => {
|
|
275
|
-
acc += apiRef.current.unstable_getRowHeight(value.id);
|
|
276
|
-
return acc;
|
|
277
|
-
}, 0) || 0;
|
|
278
|
-
const bottomPinnedRowsHeight = pinnedRows?.bottom?.reduce((acc, value) => {
|
|
279
|
-
acc += apiRef.current.unstable_getRowHeight(value.id);
|
|
280
|
-
return acc;
|
|
281
|
-
}, 0) || 0;
|
|
282
|
-
return {
|
|
283
|
-
top: topPinnedRowsHeight,
|
|
284
|
-
bottom: bottomPinnedRowsHeight
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
271
|
export const minimalContentHeight = 'var(--DataGrid-overlayHeight, calc(var(--height) * 2))';
|
|
288
272
|
export function computeRowsUpdates(apiRef, updates, getRowId) {
|
|
289
273
|
const nonPinnedRowsUpdates = [];
|
|
@@ -8,12 +8,10 @@ import { eslintUseValue } from "../../../utils/utils.js";
|
|
|
8
8
|
import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
|
|
9
9
|
import { useGridSelector } from "../../utils/useGridSelector.js";
|
|
10
10
|
import { gridDensityFactorSelector } from "../density/densitySelector.js";
|
|
11
|
-
import { gridFilterModelSelector } from "../filter/gridFilterSelector.js";
|
|
12
11
|
import { gridPaginationSelector } from "../pagination/gridPaginationSelector.js";
|
|
13
|
-
import { gridSortModelSelector } from "../sorting/gridSortingSelector.js";
|
|
14
12
|
import { useGridRegisterPipeApplier } from "../../core/pipeProcessing/index.js";
|
|
15
|
-
import { gridPinnedRowsSelector } from "./gridRowsSelector.js";
|
|
16
|
-
import { gridDimensionsSelector } from "../dimensions/gridDimensionsSelectors.js";
|
|
13
|
+
import { gridPinnedRowsSelector, gridRowCountSelector } from "./gridRowsSelector.js";
|
|
14
|
+
import { gridDimensionsSelector, gridRowHeightSelector } from "../dimensions/gridDimensionsSelectors.js";
|
|
17
15
|
import { getValidRowHeight, getRowHeightWarning } from "./gridRowsUtils.js";
|
|
18
16
|
/* eslint-disable no-underscore-dangle */
|
|
19
17
|
|
|
@@ -21,10 +19,18 @@ export const rowsMetaStateInitializer = (state, props, apiRef) => {
|
|
|
21
19
|
apiRef.current.caches.rowsMeta = {
|
|
22
20
|
heights: new Map()
|
|
23
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);
|
|
24
26
|
return _extends({}, state, {
|
|
25
27
|
rowsMeta: {
|
|
26
|
-
currentPageTotalHeight:
|
|
27
|
-
positions:
|
|
28
|
+
currentPageTotalHeight: rowCount * baseRowHeight,
|
|
29
|
+
positions: Array.from({
|
|
30
|
+
length: rowCount
|
|
31
|
+
}, (_, i) => i * baseRowHeight),
|
|
32
|
+
pinnedTopRowsTotalHeight: 0,
|
|
33
|
+
pinnedBottomRowsTotalHeight: 0
|
|
28
34
|
}
|
|
29
35
|
});
|
|
30
36
|
};
|
|
@@ -44,12 +50,9 @@ export const useGridRowsMeta = (apiRef, props) => {
|
|
|
44
50
|
const hasRowWithAutoHeight = React.useRef(false);
|
|
45
51
|
const isHeightMetaValid = React.useRef(false);
|
|
46
52
|
const densityFactor = useGridSelector(apiRef, gridDensityFactorSelector);
|
|
47
|
-
const filterModel = useGridSelector(apiRef, gridFilterModelSelector);
|
|
48
|
-
const paginationState = useGridSelector(apiRef, gridPaginationSelector);
|
|
49
|
-
const sortModel = useGridSelector(apiRef, gridSortModelSelector);
|
|
50
53
|
const currentPage = useGridVisibleRows(apiRef, props);
|
|
51
54
|
const pinnedRows = useGridSelector(apiRef, gridPinnedRowsSelector);
|
|
52
|
-
const rowHeight = useGridSelector(apiRef,
|
|
55
|
+
const rowHeight = useGridSelector(apiRef, gridRowHeightSelector);
|
|
53
56
|
const getRowHeightEntry = rowId => {
|
|
54
57
|
let entry = heightCache.get(rowId);
|
|
55
58
|
if (entry === undefined) {
|
|
@@ -114,8 +117,14 @@ export const useGridRowsMeta = (apiRef, props) => {
|
|
|
114
117
|
}, [apiRef, currentPage.rows, getRowHeightProp, getEstimatedRowHeight, rowHeight, getRowSpacing, densityFactor]);
|
|
115
118
|
const hydrateRowsMeta = React.useCallback(() => {
|
|
116
119
|
hasRowWithAutoHeight.current = false;
|
|
117
|
-
pinnedRows.top.
|
|
118
|
-
|
|
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);
|
|
119
128
|
const positions = [];
|
|
120
129
|
const currentPageTotalHeight = currentPage.rows.reduce((acc, row) => {
|
|
121
130
|
positions.push(acc);
|
|
@@ -127,14 +136,21 @@ export const useGridRowsMeta = (apiRef, props) => {
|
|
|
127
136
|
// No row has height=auto, so all rows are already measured
|
|
128
137
|
lastMeasuredRowIndex.current = Infinity;
|
|
129
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
|
+
};
|
|
130
146
|
apiRef.current.setState(state => {
|
|
131
147
|
return _extends({}, state, {
|
|
132
|
-
rowsMeta
|
|
133
|
-
currentPageTotalHeight,
|
|
134
|
-
positions
|
|
135
|
-
}
|
|
148
|
+
rowsMeta
|
|
136
149
|
});
|
|
137
150
|
});
|
|
151
|
+
if (didHeightsChange) {
|
|
152
|
+
apiRef.current.updateDimensions();
|
|
153
|
+
}
|
|
138
154
|
isHeightMetaValid.current = true;
|
|
139
155
|
}, [apiRef, pinnedRows, currentPage.rows, processHeightEntry]);
|
|
140
156
|
const getRowHeight = rowId => {
|
|
@@ -184,7 +200,7 @@ export const useGridRowsMeta = (apiRef, props) => {
|
|
|
184
200
|
// Because of variable row height this is needed for the virtualization
|
|
185
201
|
useEnhancedEffect(() => {
|
|
186
202
|
hydrateRowsMeta();
|
|
187
|
-
}, [
|
|
203
|
+
}, [hydrateRowsMeta]);
|
|
188
204
|
const rowsMetaApi = {
|
|
189
205
|
unstable_getRowHeight: getRowHeight,
|
|
190
206
|
unstable_setLastMeasuredRowIndex: setLastMeasuredRowIndex,
|