@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.
Files changed (108) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/DataGrid/useDataGridComponent.js +2 -2
  3. package/components/GridRow.js +8 -2
  4. package/components/GridScrollArea.d.ts +5 -2
  5. package/components/GridScrollArea.js +32 -25
  6. package/components/GridSkeletonLoadingOverlay.js +2 -1
  7. package/components/containers/GridRoot.js +11 -9
  8. package/components/containers/GridRootStyles.js +3 -3
  9. package/components/virtualization/GridMainContainer.d.ts +2 -2
  10. package/components/virtualization/GridMainContainer.js +1 -1
  11. package/components/virtualization/GridVirtualScroller.js +21 -14
  12. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.d.ts +1 -1
  13. package/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  14. package/hooks/core/useGridStateInitialization.js +3 -2
  15. package/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  16. package/hooks/features/columns/gridColumnsSelector.d.ts +0 -5
  17. package/hooks/features/columns/gridColumnsSelector.js +0 -12
  18. package/hooks/features/dimensions/gridDimensionsSelectors.d.ts +16 -0
  19. package/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
  20. package/hooks/features/dimensions/index.d.ts +1 -1
  21. package/hooks/features/dimensions/index.js +1 -2
  22. package/hooks/features/dimensions/useGridDimensions.js +97 -70
  23. package/hooks/features/editing/gridEditingSelectors.d.ts +5 -1
  24. package/hooks/features/editing/gridEditingSelectors.js +6 -1
  25. package/hooks/features/editing/useGridRowEditing.js +4 -4
  26. package/hooks/features/filter/gridFilterState.d.ts +5 -0
  27. package/hooks/features/filter/gridFilterState.js +5 -0
  28. package/hooks/features/filter/useGridFilter.js +6 -13
  29. package/hooks/features/pagination/useGridPagination.js +1 -1
  30. package/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  31. package/hooks/features/rowSelection/utils.js +1 -1
  32. package/hooks/features/rows/gridRowsMetaState.d.ts +8 -0
  33. package/hooks/features/rows/gridRowsUtils.d.ts +0 -4
  34. package/hooks/features/rows/gridRowsUtils.js +0 -16
  35. package/hooks/features/rows/useGridRowsMeta.js +33 -17
  36. package/hooks/features/sorting/gridSortingSelector.js +10 -9
  37. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +6 -0
  38. package/hooks/features/virtualization/useGridVirtualScroller.js +43 -27
  39. package/hooks/utils/useGridSelector.d.ts +8 -1
  40. package/hooks/utils/useGridSelector.js +42 -8
  41. package/hooks/utils/useIsSSR.d.ts +1 -0
  42. package/hooks/utils/useIsSSR.js +5 -0
  43. package/index.js +1 -1
  44. package/internals/index.d.ts +2 -1
  45. package/internals/index.js +2 -1
  46. package/models/api/gridStateApi.d.ts +1 -0
  47. package/models/events/gridEventLookup.d.ts +6 -0
  48. package/modern/DataGrid/useDataGridComponent.js +2 -2
  49. package/modern/components/GridRow.js +8 -2
  50. package/modern/components/GridScrollArea.js +32 -25
  51. package/modern/components/GridSkeletonLoadingOverlay.js +2 -1
  52. package/modern/components/containers/GridRoot.js +11 -9
  53. package/modern/components/containers/GridRootStyles.js +3 -3
  54. package/modern/components/virtualization/GridMainContainer.js +1 -1
  55. package/modern/components/virtualization/GridVirtualScroller.js +21 -14
  56. package/modern/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  57. package/modern/hooks/core/useGridStateInitialization.js +3 -2
  58. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  59. package/modern/hooks/features/columns/gridColumnsSelector.js +0 -12
  60. package/modern/hooks/features/dimensions/gridDimensionsSelectors.js +26 -1
  61. package/modern/hooks/features/dimensions/index.js +1 -2
  62. package/modern/hooks/features/dimensions/useGridDimensions.js +97 -70
  63. package/modern/hooks/features/editing/gridEditingSelectors.js +6 -1
  64. package/modern/hooks/features/editing/useGridRowEditing.js +4 -4
  65. package/modern/hooks/features/filter/gridFilterState.js +5 -0
  66. package/modern/hooks/features/filter/useGridFilter.js +6 -13
  67. package/modern/hooks/features/pagination/useGridPagination.js +1 -1
  68. package/modern/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  69. package/modern/hooks/features/rowSelection/utils.js +1 -1
  70. package/modern/hooks/features/rows/gridRowsUtils.js +0 -16
  71. package/modern/hooks/features/rows/useGridRowsMeta.js +33 -17
  72. package/modern/hooks/features/sorting/gridSortingSelector.js +10 -9
  73. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +43 -27
  74. package/modern/hooks/utils/useGridSelector.js +42 -8
  75. package/modern/hooks/utils/useIsSSR.js +5 -0
  76. package/modern/index.js +1 -1
  77. package/modern/internals/index.js +2 -1
  78. package/node/DataGrid/useDataGridComponent.js +2 -2
  79. package/node/components/GridRow.js +7 -2
  80. package/node/components/GridScrollArea.js +31 -24
  81. package/node/components/GridSkeletonLoadingOverlay.js +2 -1
  82. package/node/components/containers/GridRoot.js +10 -8
  83. package/node/components/containers/GridRootStyles.js +3 -3
  84. package/node/components/virtualization/GridMainContainer.js +1 -1
  85. package/node/components/virtualization/GridVirtualScroller.js +21 -14
  86. package/node/hooks/core/pipeProcessing/useGridRegisterPipeProcessor.js +6 -4
  87. package/node/hooks/core/useGridStateInitialization.js +3 -2
  88. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +10 -14
  89. package/node/hooks/features/columns/gridColumnsSelector.js +1 -13
  90. package/node/hooks/features/dimensions/gridDimensionsSelectors.js +38 -2
  91. package/node/hooks/features/dimensions/index.js +13 -11
  92. package/node/hooks/features/dimensions/useGridDimensions.js +94 -67
  93. package/node/hooks/features/editing/gridEditingSelectors.js +5 -1
  94. package/node/hooks/features/editing/useGridRowEditing.js +4 -4
  95. package/node/hooks/features/filter/gridFilterState.js +6 -1
  96. package/node/hooks/features/filter/useGridFilter.js +5 -12
  97. package/node/hooks/features/pagination/useGridPagination.js +1 -1
  98. package/node/hooks/features/rowSelection/useGridRowSelection.js +1 -1
  99. package/node/hooks/features/rowSelection/utils.js +1 -1
  100. package/node/hooks/features/rows/gridRowsUtils.js +0 -17
  101. package/node/hooks/features/rows/useGridRowsMeta.js +31 -15
  102. package/node/hooks/features/sorting/gridSortingSelector.js +10 -9
  103. package/node/hooks/features/virtualization/useGridVirtualScroller.js +42 -26
  104. package/node/hooks/utils/useGridSelector.js +42 -8
  105. package/node/hooks/utils/useIsSSR.js +12 -0
  106. package/node/index.js +1 -1
  107. package/node/internals/index.js +20 -7
  108. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -3,6 +3,77 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 7.26.0
7
+
8
+ _Feb 7, 2025_
9
+
10
+ We'd like to offer a big thanks to the 6 contributors who made this release possible. Here are some highlights ✨:
11
+
12
+ - ⚡ Mount and resize performance improvements for the Data Grid
13
+ - 🐞 Bugfixes
14
+
15
+ Special thanks go out to the community contributors who have helped make this release possible:
16
+ @lauri865.
17
+ Following are all team members who have contributed to this release:
18
+ @arminmeh, @noraleonte, @LukasTy, @KenanYusuf, @flaviendelangle.
19
+
20
+ <!--/ HIGHLIGHT_ABOVE_SEPARATOR /-->
21
+
22
+ ### Data Grid
23
+
24
+ #### `@mui/x-data-grid@7.26.0`
25
+
26
+ - [DataGrid] Avoid `<GridRoot />` double-render pass on mount in SPA mode (#16480) @lauri865
27
+
28
+ #### `@mui/x-data-grid-pro@7.26.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
29
+
30
+ Same changes as in `@mui/x-data-grid@7.26.0`, plus:
31
+
32
+ - [DataGridPro] Fix the return type of `useGridApiContext()` for Pro and Premium packages on React < 19 (#16446) @arminmeh
33
+
34
+ #### `@mui/x-data-grid-premium@7.26.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
35
+
36
+ Same changes as in `@mui/x-data-grid-pro@7.26.0`, plus:
37
+
38
+ - [DataGridPremium] Fix "no rows" overlay not showing with active aggregation (#16468) @KenanYusuf
39
+
40
+ ### Date and Time Pickers
41
+
42
+ #### `@mui/x-date-pickers@7.26.0`
43
+
44
+ Internal changes.
45
+
46
+ #### `@mui/x-date-pickers-pro@7.26.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
47
+
48
+ Same changes as in `@mui/x-date-pickers@7.26.0`, plus:
49
+
50
+ - [DateRangePicker] Fix `currentMonthCalendarPosition` prop behavior on mobile (#16457) @LukasTy
51
+ - [DateRangePicker] Fix vertical alignment for multi input fields (#16490) @noraleonte
52
+
53
+ ### Charts
54
+
55
+ #### `@mui/x-charts@7.26.0`
56
+
57
+ Internal changes.
58
+
59
+ #### `@mui/x-charts-pro@7.26.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
60
+
61
+ Same changes as in `@mui/x-charts@7.26.0`.
62
+
63
+ ### Tree View
64
+
65
+ #### `@mui/x-tree-view@7.26.0`
66
+
67
+ Internal changes.
68
+
69
+ #### `@mui/x-tree-view-pro@7.26.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
70
+
71
+ Same changes as in `@mui/x-tree-view@7.26.0`.
72
+
73
+ ### Core
74
+
75
+ - [core] Fix corepack and pnpm installation in CircleCI (#16452) @flaviendelangle
76
+
6
77
  ## 7.25.0
7
78
 
8
79
  _Jan 31, 2025_
@@ -41,7 +41,6 @@ export const useDataGridComponent = (inputApiRef, props) => {
41
41
  /**
42
42
  * Register all state initializers here.
43
43
  */
44
- useGridInitializeState(dimensionsStateInitializer, apiRef, props);
45
44
  useGridInitializeState(rowSelectionStateInitializer, apiRef, props);
46
45
  useGridInitializeState(columnsStateInitializer, apiRef, props);
47
46
  useGridInitializeState(paginationStateInitializer, apiRef, props);
@@ -54,10 +53,11 @@ export const useDataGridComponent = (inputApiRef, props) => {
54
53
  useGridInitializeState(rowSpanningStateInitializer, apiRef, props);
55
54
  useGridInitializeState(densityStateInitializer, apiRef, props);
56
55
  useGridInitializeState(columnResizeStateInitializer, apiRef, props);
57
- useGridInitializeState(rowsMetaStateInitializer, apiRef, props);
58
56
  useGridInitializeState(columnMenuStateInitializer, apiRef, props);
59
57
  useGridInitializeState(columnGroupsStateInitializer, apiRef, props);
60
58
  useGridInitializeState(virtualizationStateInitializer, apiRef, props);
59
+ useGridInitializeState(dimensionsStateInitializer, apiRef, props);
60
+ useGridInitializeState(rowsMetaStateInitializer, apiRef, props);
61
61
  useGridInitializeState(listViewStateInitializer, apiRef, props);
62
62
  useGridKeyboardNavigation(apiRef, props);
63
63
  useGridRowSelection(apiRef, props);
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import _extends from "@babel/runtime/helpers/esm/extends";
2
4
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
5
  const _excluded = ["selected", "rowId", "row", "index", "style", "rowHeight", "className", "visibleColumns", "pinnedColumns", "offsetLeft", "columnsTotalWidth", "firstColumnIndex", "lastColumnIndex", "focusedColumnIndex", "isFirstVisible", "isLastVisible", "isNotVisible", "showBottomBorder", "scrollbarWidth", "gridHasFiller", "onClick", "onDoubleClick", "onMouseEnter", "onMouseLeave", "onMouseOut", "onMouseOver"];
@@ -78,7 +80,10 @@ const GridRow = forwardRef(function GridRow(props, refProp) {
78
80
  const isRowReorderingEnabled = useGridSelectorV8(apiRef, isRowReorderingEnabledSelector, rowReordering);
79
81
  const handleRef = useForkRef(ref, refProp);
80
82
  const rowNode = apiRef.current.getRowNode(rowId);
81
- const editing = useGridSelectorV8(apiRef, gridRowIsEditingSelector, rowId);
83
+ const editing = useGridSelectorV8(apiRef, gridRowIsEditingSelector, {
84
+ rowId,
85
+ editMode: rootProps.editMode
86
+ });
82
87
  const editable = rootProps.editMode === GridEditModes.Row;
83
88
  const hasFocusCell = focusedColumnIndex !== undefined;
84
89
  const hasVirtualFocusCellLeft = hasFocusCell && focusedColumnIndex >= pinnedColumns.left.length && focusedColumnIndex < firstColumnIndex;
@@ -296,7 +301,8 @@ const GridRow = forwardRef(function GridRow(props, refProp) {
296
301
  role: "presentation",
297
302
  className: clsx(gridClasses.cell, gridClasses.cellEmpty)
298
303
  }), rightCells, scrollbarWidth !== 0 && /*#__PURE__*/_jsx(ScrollbarFiller, {
299
- pinnedRight: pinnedColumns.right.length > 0
304
+ pinnedRight: pinnedColumns.right.length > 0,
305
+ borderTop: !isFirstVisible
300
306
  })]
301
307
  }));
302
308
  });
@@ -1,7 +1,10 @@
1
1
  import * as React from 'react';
2
+ import { RefObject } from '@mui/x-internals/types';
3
+ import { GridScrollParams } from '../models/params/gridScrollParams';
2
4
  interface ScrollAreaProps {
3
5
  scrollDirection: 'left' | 'right';
6
+ scrollPosition: RefObject<GridScrollParams>;
4
7
  }
5
- declare function GridScrollAreaRaw(props: ScrollAreaProps): React.JSX.Element | null;
6
- export declare const GridScrollArea: typeof GridScrollAreaRaw;
8
+ declare function GridScrollAreaWrapper(props: ScrollAreaProps): React.JSX.Element | null;
9
+ export declare const GridScrollArea: typeof GridScrollAreaWrapper;
7
10
  export {};
@@ -8,12 +8,12 @@ import { useGridRootProps } from "../hooks/utils/useGridRootProps.js";
8
8
  import { getDataGridUtilityClass, gridClasses } from "../constants/index.js";
9
9
  import { useGridApiContext } from "../hooks/utils/useGridApiContext.js";
10
10
  import { useGridApiEventHandler } from "../hooks/utils/useGridApiEventHandler.js";
11
- import { useGridSelector } from "../hooks/utils/useGridSelector.js";
12
- import { gridDimensionsSelector } from "../hooks/features/dimensions/gridDimensionsSelectors.js";
11
+ import { useGridSelector, useGridSelectorV8 } from "../hooks/utils/useGridSelector.js";
12
+ import { gridDimensionsSelector, gridColumnsTotalWidthSelector } from "../hooks/features/dimensions/gridDimensionsSelectors.js";
13
13
  import { gridDensityFactorSelector } from "../hooks/features/density/densitySelector.js";
14
- import { gridColumnsTotalWidthSelector } from "../hooks/features/columns/gridColumnsSelector.js";
15
14
  import { useTimeout } from "../hooks/utils/useTimeout.js";
16
15
  import { getTotalHeaderHeight } from "../hooks/features/columns/gridColumnsUtils.js";
16
+ import { createSelectorV8 } from "../utils/createSelector.js";
17
17
  import { jsx as _jsx } from "react/jsx-runtime";
18
18
  const CLIFF = 1;
19
19
  const SLOP = 1.5;
@@ -48,21 +48,38 @@ const GridScrollAreaRawRoot = styled('div', {
48
48
  right: 0
49
49
  }
50
50
  }));
51
- function GridScrollAreaRaw(props) {
51
+ const offsetSelector = createSelectorV8(gridDimensionsSelector, (dimensions, direction) => {
52
+ if (direction === 'left') {
53
+ return dimensions.leftPinnedWidth;
54
+ }
55
+ if (direction === 'right') {
56
+ return dimensions.rightPinnedWidth + (dimensions.hasScrollX ? dimensions.scrollbarSize : 0);
57
+ }
58
+ return 0;
59
+ });
60
+ function GridScrollAreaWrapper(props) {
61
+ const apiRef = useGridApiContext();
62
+ const [dragging, setDragging] = React.useState(false);
63
+ useGridApiEventHandler(apiRef, 'columnHeaderDragStart', () => setDragging(true));
64
+ useGridApiEventHandler(apiRef, 'columnHeaderDragEnd', () => setDragging(false));
65
+ if (!dragging) {
66
+ return null;
67
+ }
68
+ return /*#__PURE__*/_jsx(GridScrollAreaContent, _extends({}, props));
69
+ }
70
+ function GridScrollAreaContent(props) {
52
71
  const {
53
- scrollDirection
72
+ scrollDirection,
73
+ scrollPosition
54
74
  } = props;
55
75
  const rootRef = React.useRef(null);
56
76
  const apiRef = useGridApiContext();
57
77
  const timeout = useTimeout();
58
78
  const densityFactor = useGridSelector(apiRef, gridDensityFactorSelector);
59
79
  const columnsTotalWidth = useGridSelector(apiRef, gridColumnsTotalWidthSelector);
60
- const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
61
- const scrollPosition = React.useRef({
62
- left: 0,
63
- top: 0
64
- });
80
+ const sideOffset = useGridSelectorV8(apiRef, offsetSelector, scrollDirection);
65
81
  const getCanScrollMore = () => {
82
+ const dimensions = gridDimensionsSelector(apiRef.current.state);
66
83
  if (scrollDirection === 'left') {
67
84
  // Only render if the user has not reached yet the start of the list
68
85
  return scrollPosition.current.left > 0;
@@ -74,7 +91,6 @@ function GridScrollAreaRaw(props) {
74
91
  }
75
92
  return false;
76
93
  };
77
- const [dragging, setDragging] = React.useState(false);
78
94
  const [canScrollMore, setCanScrollMore] = React.useState(getCanScrollMore);
79
95
  const rootProps = useGridRootProps();
80
96
  const ownerState = _extends({}, rootProps, {
@@ -88,12 +104,11 @@ function GridScrollAreaRaw(props) {
88
104
  top: totalHeaderHeight - headerHeight
89
105
  };
90
106
  if (scrollDirection === 'left') {
91
- style.left = dimensions.leftPinnedWidth;
107
+ style.left = sideOffset;
92
108
  } else if (scrollDirection === 'right') {
93
- style.right = dimensions.rightPinnedWidth + (dimensions.hasScrollX ? dimensions.scrollbarSize : 0);
109
+ style.right = sideOffset;
94
110
  }
95
- const handleScrolling = newScrollPosition => {
96
- scrollPosition.current = newScrollPosition;
111
+ const handleScrolling = () => {
97
112
  setCanScrollMore(getCanScrollMore);
98
113
  };
99
114
  const handleDragOver = useEventCallback(event => {
@@ -118,16 +133,8 @@ function GridScrollAreaRaw(props) {
118
133
  });
119
134
  });
120
135
  });
121
- const handleColumnHeaderDragStart = useEventCallback(() => {
122
- setDragging(true);
123
- });
124
- const handleColumnHeaderDragEnd = useEventCallback(() => {
125
- setDragging(false);
126
- });
127
136
  useGridApiEventHandler(apiRef, 'scrollPositionChange', handleScrolling);
128
- useGridApiEventHandler(apiRef, 'columnHeaderDragStart', handleColumnHeaderDragStart);
129
- useGridApiEventHandler(apiRef, 'columnHeaderDragEnd', handleColumnHeaderDragEnd);
130
- if (!dragging || !canScrollMore) {
137
+ if (!canScrollMore) {
131
138
  return null;
132
139
  }
133
140
  return /*#__PURE__*/_jsx(GridScrollAreaRawRoot, {
@@ -138,4 +145,4 @@ function GridScrollAreaRaw(props) {
138
145
  style: style
139
146
  });
140
147
  }
141
- export const GridScrollArea = fastMemo(GridScrollAreaRaw);
148
+ export const GridScrollArea = fastMemo(GridScrollAreaWrapper);
@@ -8,8 +8,9 @@ import { useRtl } from '@mui/system/RtlProvider';
8
8
  import { forwardRef } from '@mui/x-internals/forwardRef';
9
9
  import { useGridApiContext } from "../hooks/utils/useGridApiContext.js";
10
10
  import { useGridRootProps } from "../hooks/utils/useGridRootProps.js";
11
- import { gridColumnPositionsSelector, gridColumnsTotalWidthSelector, gridDimensionsSelector, gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector, useGridApiEventHandler, useGridSelector } from "../hooks/index.js";
11
+ import { gridColumnPositionsSelector, gridDimensionsSelector, gridVisibleColumnDefinitionsSelector, gridVisiblePinnedColumnDefinitionsSelector, useGridApiEventHandler, useGridSelector } from "../hooks/index.js";
12
12
  import { PinnedColumnPosition } from "../internals/constants.js";
13
+ import { gridColumnsTotalWidthSelector } from "../hooks/features/dimensions/gridDimensionsSelectors.js";
13
14
  import { getDataGridUtilityClass, gridClasses } from "../constants/gridClasses.js";
14
15
  import { getPinnedCellOffset } from "../internals/utils/getPinnedCellOffset.js";
15
16
  import { shouldCellShowLeftBorder, shouldCellShowRightBorder } from "../utils/cellBorderUtils.js";
@@ -4,7 +4,7 @@ const _excluded = ["className", "children"];
4
4
  import * as React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import clsx from 'clsx';
7
- import { unstable_useForkRef as useForkRef, unstable_useEnhancedEffect as useEnhancedEffect, unstable_capitalize as capitalize, unstable_composeClasses as composeClasses } from '@mui/utils';
7
+ import { unstable_useForkRef as useForkRef, unstable_capitalize as capitalize, unstable_composeClasses as composeClasses } from '@mui/utils';
8
8
  import { fastMemo } from '@mui/x-internals/fastMemo';
9
9
  import { forwardRef } from '@mui/x-internals/forwardRef';
10
10
  import { GridRootStyles } from "./GridRootStyles.js";
@@ -13,6 +13,7 @@ import { useGridPrivateApiContext } from "../../hooks/utils/useGridPrivateApiCon
13
13
  import { useGridRootProps } from "../../hooks/utils/useGridRootProps.js";
14
14
  import { getDataGridUtilityClass } from "../../constants/gridClasses.js";
15
15
  import { gridDensitySelector } from "../../hooks/features/density/densitySelector.js";
16
+ import { useIsSSR } from "../../hooks/utils/useIsSSR.js";
16
17
  import { GridHeader } from "../GridHeader.js";
17
18
  import { GridBody, GridFooterPlaceholder } from "../base/index.js";
18
19
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
@@ -37,16 +38,17 @@ const GridRoot = forwardRef(function GridRoot(props, ref) {
37
38
  const apiRef = useGridPrivateApiContext();
38
39
  const density = useGridSelector(apiRef, gridDensitySelector);
39
40
  const rootElementRef = apiRef.current.rootElementRef;
40
- const handleRef = useForkRef(rootElementRef, ref);
41
+ const rootMountCallback = React.useCallback(node => {
42
+ if (node === null) {
43
+ return;
44
+ }
45
+ apiRef.current.publishEvent('rootMount', node);
46
+ }, [apiRef]);
47
+ const handleRef = useForkRef(rootElementRef, ref, rootMountCallback);
41
48
  const ownerState = rootProps;
42
49
  const classes = useUtilityClasses(ownerState, density);
43
-
44
- // Our implementation of <NoSsr />
45
- const [mountedState, setMountedState] = React.useState(false);
46
- useEnhancedEffect(() => {
47
- setMountedState(true);
48
- }, []);
49
- if (!mountedState) {
50
+ const isSSR = useIsSSR();
51
+ if (isSSR) {
50
52
  return null;
51
53
  }
52
54
  return /*#__PURE__*/_jsxs(GridRootStyles, _extends({
@@ -3,7 +3,6 @@ import { alpha, styled, darken, lighten, decomposeColor, recomposeColor } from '
3
3
  import { gridClasses as c } from "../../constants/gridClasses.js";
4
4
  import { useGridSelector } from "../../hooks/utils/useGridSelector.js";
5
5
  import { useGridPrivateApiContext } from "../../hooks/utils/useGridPrivateApiContext.js";
6
- import { gridDimensionsSelector } from "../../hooks/features/dimensions/gridDimensionsSelectors.js";
7
6
  function getBorderColor(theme) {
8
7
  if (theme.vars) {
9
8
  return theme.vars.palette.TableCell.border;
@@ -35,6 +34,7 @@ const separatorIconDragStyles = {
35
34
  // Emotion thinks it knows better than us which selector we should use.
36
35
  // https://github.com/emotion-js/emotion/issues/1105#issuecomment-1722524968
37
36
  const ignoreSsrWarning = '/* emotion-disable-server-rendering-unsafe-selector-warning-please-do-not-use-this-the-warning-exists-for-a-reason */';
37
+ const shouldShowBorderTopRightRadiusSelector = state => state.dimensions.hasScrollX && (!state.dimensions.hasScrollY || state.dimensions.scrollbarSize === 0);
38
38
  export const GridRootStyles = styled('div', {
39
39
  name: 'MuiDataGrid',
40
40
  slot: 'Root',
@@ -265,7 +265,7 @@ export const GridRootStyles = styled('div', {
265
265
  theme: t
266
266
  }) => {
267
267
  const apiRef = useGridPrivateApiContext();
268
- const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
268
+ const shouldShowBorderTopRightRadius = useGridSelector(apiRef, shouldShowBorderTopRightRadiusSelector);
269
269
  const borderColor = getBorderColor(t);
270
270
  const radius = t.shape.borderRadius;
271
271
  const containerBackground = t.vars ? t.vars.palette.background.default : t.mixins.MuiDataGrid?.containerBackground ?? t.palette.background.default;
@@ -417,7 +417,7 @@ export const GridRootStyles = styled('div', {
417
417
  borderTopLeftRadius: 'calc(var(--unstable_DataGrid-radius) - 1px)'
418
418
  },
419
419
  [`&.${c['root--noToolbar']} [aria-rowindex="1"] .${c['columnHeader--last']}`]: {
420
- borderTopRightRadius: dimensions.hasScrollX && (!dimensions.hasScrollY || dimensions.scrollbarSize === 0) ? 'calc(var(--unstable_DataGrid-radius) - 1px)' : undefined
420
+ borderTopRightRadius: shouldShowBorderTopRightRadius ? 'calc(var(--unstable_DataGrid-radius) - 1px)' : undefined
421
421
  },
422
422
  [`& .${c.columnHeaderCheckbox}, & .${c.cellCheckbox}`]: {
423
423
  padding: 0,
@@ -1,9 +1,9 @@
1
1
  import * as React from 'react';
2
2
  import { DataGridProcessedProps } from '../../models/props/DataGridProps';
3
- import { GridDimensions } from '../../hooks/features/dimensions';
4
3
  import { GridLoadingOverlayVariant } from '../GridLoadingOverlay';
5
4
  type OwnerState = Pick<DataGridProcessedProps, 'classes'> & {
6
- dimensions: GridDimensions;
5
+ hasScrollX: boolean;
6
+ hasPinnedRight: boolean;
7
7
  loadingOverlayVariant: GridLoadingOverlayVariant | null;
8
8
  };
9
9
  export declare const GridMainContainer: React.ForwardRefExoticComponent<React.PropsWithChildren<{
@@ -18,7 +18,7 @@ const Element = styled('div', {
18
18
  const {
19
19
  ownerState
20
20
  } = props;
21
- return [styles.main, ownerState.dimensions.rightPinnedWidth > 0 && styles['main--hasPinnedRight'], ownerState.loadingOverlayVariant === 'skeleton' && styles['main--hasSkeletonLoadingOverlay']];
21
+ return [styles.main, ownerState.hasPinnedRight && styles['main--hasPinnedRight'], ownerState.loadingOverlayVariant === 'skeleton' && styles['main--hasSkeletonLoadingOverlay']];
22
22
  }
23
23
  })({
24
24
  flexGrow: 1,
@@ -2,12 +2,12 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import * as React from 'react';
3
3
  import { styled } from '@mui/system';
4
4
  import composeClasses from '@mui/utils/composeClasses';
5
+ import { gridHasBottomFillerSelector, gridHasScrollXSelector, gridHasScrollYSelector } from "../../hooks/features/dimensions/gridDimensionsSelectors.js";
5
6
  import { GridScrollArea } from "../GridScrollArea.js";
6
7
  import { useGridRootProps } from "../../hooks/utils/useGridRootProps.js";
7
8
  import { useGridApiContext } from "../../hooks/utils/useGridApiContext.js";
8
9
  import { useGridSelector } from "../../hooks/utils/useGridSelector.js";
9
10
  import { getDataGridUtilityClass } from "../../constants/gridClasses.js";
10
- import { gridDimensionsSelector } from "../../hooks/features/dimensions/index.js";
11
11
  import { useGridVirtualScroller } from "../../hooks/features/virtualization/useGridVirtualScroller.js";
12
12
  import { useGridOverlays } from "../../hooks/features/overlays/useGridOverlays.js";
13
13
  import { GridOverlays as Overlays } from "../base/GridOverlays.js";
@@ -23,12 +23,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
23
23
  const useUtilityClasses = ownerState => {
24
24
  const {
25
25
  classes,
26
- dimensions,
26
+ hasScrollX,
27
+ hasPinnedRight,
27
28
  loadingOverlayVariant
28
29
  } = ownerState;
29
30
  const slots = {
30
- root: ['main', dimensions.rightPinnedWidth > 0 && 'main--hasPinnedRight', loadingOverlayVariant === 'skeleton' && 'main--hasSkeletonLoadingOverlay'],
31
- scroller: ['virtualScroller', dimensions.hasScrollX && 'virtualScroller--hasScrollX']
31
+ root: ['main', hasPinnedRight && 'main--hasPinnedRight', loadingOverlayVariant === 'skeleton' && 'main--hasSkeletonLoadingOverlay'],
32
+ scroller: ['virtualScroller', hasScrollX && 'virtualScroller--hasScrollX']
32
33
  };
33
34
  return composeClasses(slots, getDataGridUtilityClass, classes);
34
35
  };
@@ -39,7 +40,7 @@ const Scroller = styled('div', {
39
40
  const {
40
41
  ownerState
41
42
  } = props;
42
- return [styles.virtualScroller, ownerState.dimensions.hasScrollX && styles['virtualScroller--hasScrollX']];
43
+ return [styles.virtualScroller, ownerState.hasScrollX && styles['virtualScroller--hasScrollX']];
43
44
  }
44
45
  })({
45
46
  position: 'relative',
@@ -58,14 +59,19 @@ const Scroller = styled('div', {
58
59
  // See https://github.com/mui/mui-x/issues/10547
59
60
  zIndex: 0
60
61
  });
62
+ const hasPinnedRightSelector = state => state.dimensions.rightPinnedWidth > 0;
61
63
  function GridVirtualScroller(props) {
62
64
  const apiRef = useGridApiContext();
63
65
  const rootProps = useGridRootProps();
64
- const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
66
+ const hasScrollY = useGridSelector(apiRef, gridHasScrollYSelector);
67
+ const hasScrollX = useGridSelector(apiRef, gridHasScrollXSelector);
68
+ const hasPinnedRight = useGridSelector(apiRef, hasPinnedRightSelector);
69
+ const hasBottomFiller = useGridSelector(apiRef, gridHasBottomFillerSelector);
65
70
  const overlaysProps = useGridOverlays();
66
71
  const ownerState = {
67
72
  classes: rootProps.classes,
68
- dimensions,
73
+ hasScrollX,
74
+ hasPinnedRight,
69
75
  loadingOverlayVariant: overlaysProps.loadingOverlayVariant
70
76
  };
71
77
  const classes = useUtilityClasses(ownerState);
@@ -77,18 +83,19 @@ function GridVirtualScroller(props) {
77
83
  getRenderZoneProps,
78
84
  getScrollbarVerticalProps,
79
85
  getScrollbarHorizontalProps,
80
- getRows
86
+ getRows,
87
+ getScrollAreaProps
81
88
  } = virtualScroller;
82
89
  const rows = getRows();
83
90
  return /*#__PURE__*/_jsxs(Container, _extends({
84
91
  className: classes.root
85
92
  }, getContainerProps(), {
86
93
  ownerState: ownerState,
87
- children: [/*#__PURE__*/_jsx(GridScrollArea, {
94
+ children: [/*#__PURE__*/_jsx(GridScrollArea, _extends({
88
95
  scrollDirection: "left"
89
- }), /*#__PURE__*/_jsx(GridScrollArea, {
96
+ }, getScrollAreaProps())), /*#__PURE__*/_jsx(GridScrollArea, _extends({
90
97
  scrollDirection: "right"
91
- }), /*#__PURE__*/_jsxs(Scroller, _extends({
98
+ }, getScrollAreaProps())), /*#__PURE__*/_jsxs(Scroller, _extends({
92
99
  className: classes.scroller
93
100
  }, getScrollerProps(), {
94
101
  ownerState: ownerState,
@@ -103,7 +110,7 @@ function GridVirtualScroller(props) {
103
110
  virtualScroller: virtualScroller
104
111
  })]
105
112
  }))
106
- })), /*#__PURE__*/_jsx(SpaceFiller, {
113
+ })), hasBottomFiller && /*#__PURE__*/_jsx(SpaceFiller, {
107
114
  rowsLength: rows.length
108
115
  }), /*#__PURE__*/_jsx(BottomContainer, {
109
116
  children: /*#__PURE__*/_jsx(rootProps.slots.pinnedRows, {
@@ -111,9 +118,9 @@ function GridVirtualScroller(props) {
111
118
  virtualScroller: virtualScroller
112
119
  })
113
120
  })]
114
- })), dimensions.hasScrollX && !rootProps.unstable_listView && /*#__PURE__*/_jsx(Scrollbar, _extends({
121
+ })), hasScrollX && !rootProps.unstable_listView && /*#__PURE__*/_jsx(Scrollbar, _extends({
115
122
  position: "horizontal"
116
- }, getScrollbarHorizontalProps())), dimensions.hasScrollY && /*#__PURE__*/_jsx(Scrollbar, _extends({
123
+ }, getScrollbarHorizontalProps())), hasScrollY && /*#__PURE__*/_jsx(Scrollbar, _extends({
117
124
  position: "vertical"
118
125
  }, getScrollbarVerticalProps())), props.children]
119
126
  }));
@@ -1,4 +1,4 @@
1
1
  import { RefObject } from '@mui/x-internals/types';
2
2
  import { GridPrivateApiCommon } from '../../../models/api/gridApiCommon';
3
3
  import { GridPipeProcessorGroup, GridPipeProcessor } from './gridPipeProcessingApi';
4
- export declare const useGridRegisterPipeProcessor: <PrivateApi extends GridPrivateApiCommon, G extends GridPipeProcessorGroup>(apiRef: RefObject<PrivateApi>, group: G, callback: GridPipeProcessor<G>) => void;
4
+ export declare const useGridRegisterPipeProcessor: <PrivateApi extends GridPrivateApiCommon, G extends GridPipeProcessorGroup>(apiRef: RefObject<PrivateApi>, group: G, callback: GridPipeProcessor<G>, enabled?: boolean) => void;
@@ -1,19 +1,21 @@
1
1
  import * as React from 'react';
2
2
  import { useFirstRender } from "../../utils/useFirstRender.js";
3
- export const useGridRegisterPipeProcessor = (apiRef, group, callback) => {
3
+ export const useGridRegisterPipeProcessor = (apiRef, group, callback, enabled = true) => {
4
4
  const cleanup = React.useRef(null);
5
5
  const id = React.useRef(`mui-${Math.round(Math.random() * 1e9)}`);
6
6
  const registerPreProcessor = React.useCallback(() => {
7
7
  cleanup.current = apiRef.current.registerPipeProcessor(group, id.current, callback);
8
8
  }, [apiRef, callback, group]);
9
9
  useFirstRender(() => {
10
- registerPreProcessor();
10
+ if (enabled) {
11
+ registerPreProcessor();
12
+ }
11
13
  });
12
14
  const isFirstRender = React.useRef(true);
13
15
  React.useEffect(() => {
14
16
  if (isFirstRender.current) {
15
17
  isFirstRender.current = false;
16
- } else {
18
+ } else if (enabled) {
17
19
  registerPreProcessor();
18
20
  }
19
21
  return () => {
@@ -22,5 +24,5 @@ export const useGridRegisterPipeProcessor = (apiRef, group, callback) => {
22
24
  cleanup.current = null;
23
25
  }
24
26
  };
25
- }, [registerPreProcessor]);
27
+ }, [registerPreProcessor, enabled]);
26
28
  };
@@ -4,7 +4,6 @@ import { useGridApiMethod } from "../utils/index.js";
4
4
  import { isFunction } from "../../utils/utils.js";
5
5
  export const useGridStateInitialization = apiRef => {
6
6
  const controlStateMapRef = React.useRef({});
7
- const [, rawForceUpdate] = React.useState();
8
7
  const registerControlState = React.useCallback(controlStateItem => {
9
8
  controlStateMapRef.current[controlStateItem.stateId] = controlStateItem;
10
9
  }, []);
@@ -79,7 +78,9 @@ export const useGridStateInitialization = apiRef => {
79
78
  });
80
79
  }, reason);
81
80
  }, [apiRef]);
82
- const forceUpdate = React.useCallback(() => rawForceUpdate(() => apiRef.current.state), [apiRef]);
81
+ const forceUpdate = React.useCallback(() => {
82
+ // @deprecated - do nothing
83
+ }, []);
83
84
  const publicStateApi = {
84
85
  setState,
85
86
  forceUpdate
@@ -7,7 +7,7 @@ import { useGridRootProps } from "../../utils/useGridRootProps.js";
7
7
  import { useGridPrivateApiContext } from "../../utils/useGridPrivateApiContext.js";
8
8
  import { useGridApiEventHandler } from "../../utils/useGridApiEventHandler.js";
9
9
  import { GridColumnHeaderItem } from "../../../components/columnHeaders/GridColumnHeaderItem.js";
10
- import { gridDimensionsSelector } from "../dimensions/index.js";
10
+ import { gridColumnsTotalWidthSelector, gridGroupHeaderHeightSelector, gridHasFillerSelector, gridHeaderHeightSelector, gridVerticalScrollbarWidthSelector } from "../dimensions/gridDimensionsSelectors.js";
11
11
  import { gridRenderContextColumnsSelector } from "../virtualization/index.js";
12
12
  import { computeOffsetLeft } from "../virtualization/useGridVirtualScroller.js";
13
13
  import { GridColumnGroupHeader } from "../../../components/columnHeaders/GridColumnGroupHeader.js";
@@ -46,19 +46,17 @@ export const useGridColumnHeaders = props => {
46
46
  const [resizeCol, setResizeCol] = React.useState('');
47
47
  const apiRef = useGridPrivateApiContext();
48
48
  const rootProps = useGridRootProps();
49
- const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
50
49
  const columnGroupsModel = useGridSelector(apiRef, gridColumnGroupsUnwrappedModelSelector);
51
50
  const columnPositions = useGridSelector(apiRef, gridColumnPositionsSelector);
52
51
  const renderContext = useGridSelector(apiRef, gridRenderContextColumnsSelector);
53
52
  const pinnedColumns = useGridSelector(apiRef, gridVisiblePinnedColumnDefinitionsSelector);
54
53
  const columnsLookup = useGridSelector(apiRef, gridColumnLookupSelector);
55
54
  const offsetLeft = computeOffsetLeft(columnPositions, renderContext, pinnedColumns.left.length);
56
- const gridHasFiller = dimensions.columnsTotalWidth < dimensions.viewportOuterSize.width;
57
- React.useEffect(() => {
58
- if (apiRef.current.columnHeadersContainerRef.current) {
59
- apiRef.current.columnHeadersContainerRef.current.scrollLeft = 0;
60
- }
61
- }, [apiRef]);
55
+ const columnsTotalWidth = useGridSelector(apiRef, gridColumnsTotalWidthSelector);
56
+ const gridHasFiller = useGridSelector(apiRef, gridHasFillerSelector);
57
+ const headerHeight = useGridSelector(apiRef, gridHeaderHeightSelector);
58
+ const groupHeaderHeight = useGridSelector(apiRef, gridGroupHeaderHeightSelector);
59
+ const scrollbarWidth = useGridSelector(apiRef, gridVerticalScrollbarWidthSelector);
62
60
  const handleColumnResizeStart = React.useCallback(params => setResizeCol(params.field), []);
63
61
  const handleColumnResizeStop = React.useCallback(() => setResizeCol(''), []);
64
62
  const handleColumnReorderStart = React.useCallback(params => setDragCol(params.field), []);
@@ -130,8 +128,7 @@ export const useGridColumnHeaders = props => {
130
128
  const hasFocus = columnHeaderFocus !== null && columnHeaderFocus.field === colDef.field;
131
129
  const open = columnMenuState.open && columnMenuState.field === colDef.field;
132
130
  const pinnedPosition = params?.position;
133
- const scrollbarWidth = dimensions.hasScrollY ? dimensions.scrollbarSize : 0;
134
- const pinnedOffset = getPinnedCellOffset(pinnedPosition, colDef.computedWidth, columnIndex, columnPositions, dimensions.columnsTotalWidth, scrollbarWidth);
131
+ const pinnedOffset = getPinnedCellOffset(pinnedPosition, colDef.computedWidth, columnIndex, columnPositions, columnsTotalWidth, scrollbarWidth);
135
132
  const siblingWithBorderingSeparator = pinnedPosition === PinnedColumnPosition.RIGHT ? renderedColumns[i - 1] : renderedColumns[i + 1];
136
133
  const isSiblingFocused = siblingWithBorderingSeparator ? columnHeaderFocus !== null && columnHeaderFocus.field === siblingWithBorderingSeparator.field : false;
137
134
  const isLastUnpinned = columnIndex + 1 === columnPositions.length - pinnedColumns.right.length;
@@ -142,7 +139,7 @@ export const useGridColumnHeaders = props => {
142
139
  columns.push(/*#__PURE__*/_jsx(GridColumnHeaderItem, _extends({}, sortColumnLookup[colDef.field], {
143
140
  columnMenuOpen: open,
144
141
  filterItemsCounter: filterColumnLookup[colDef.field] && filterColumnLookup[colDef.field].length,
145
- headerHeight: dimensions.headerHeight,
142
+ headerHeight: headerHeight,
146
143
  isDragging: colDef.field === dragCol,
147
144
  colDef: colDef,
148
145
  colIndex: columnIndex,
@@ -234,8 +231,7 @@ export const useGridColumnHeaders = props => {
234
231
  tabIndex
235
232
  };
236
233
  const pinnedPosition = params.position;
237
- const scrollbarWidth = dimensions.hasScrollY ? dimensions.scrollbarSize : 0;
238
- const pinnedOffset = getPinnedCellOffset(pinnedPosition, headerInfo.width, columnIndex, columnPositions, dimensions.columnsTotalWidth, scrollbarWidth);
234
+ const pinnedOffset = getPinnedCellOffset(pinnedPosition, headerInfo.width, columnIndex, columnPositions, columnsTotalWidth, scrollbarWidth);
239
235
  columnIndex += columnFields.length;
240
236
  let indexInSection = index;
241
237
  if (pinnedPosition === PinnedColumnPosition.LEFT) {
@@ -250,7 +246,7 @@ export const useGridColumnHeaders = props => {
250
246
  depth: depth,
251
247
  isLastColumn: index === visibleColumnGroupHeader.length - 1,
252
248
  maxDepth: headerGroupingMaxDepth,
253
- height: dimensions.groupHeaderHeight,
249
+ height: groupHeaderHeight,
254
250
  hasFocus: hasFocus,
255
251
  tabIndex: tabIndex,
256
252
  pinnedPosition: pinnedPosition,
@@ -54,11 +54,6 @@ export declare const gridVisiblePinnedColumnDefinitionsSelector: import("../../.
54
54
  * @category Visible Columns
55
55
  */
56
56
  export declare const gridColumnPositionsSelector: import("../../..").OutputSelector<GridStateCommunity, number[]>;
57
- /**
58
- * Get the summed width of all the visible columns.
59
- * @category Visible Columns
60
- */
61
- export declare const gridColumnsTotalWidthSelector: import("../../..").OutputSelector<GridStateCommunity, number>;
62
57
  /**
63
58
  * Get the filterable columns as an array.
64
59
  * @category Columns
@@ -107,18 +107,6 @@ export const gridColumnPositionsSelector = createSelectorMemoized(gridVisibleCol
107
107
  return positions;
108
108
  });
109
109
 
110
- /**
111
- * Get the summed width of all the visible columns.
112
- * @category Visible Columns
113
- */
114
- export const gridColumnsTotalWidthSelector = createSelector(gridVisibleColumnDefinitionsSelector, gridColumnPositionsSelector, (visibleColumns, positions) => {
115
- const colCount = visibleColumns.length;
116
- if (colCount === 0) {
117
- return 0;
118
- }
119
- return positions[colCount - 1] + visibleColumns[colCount - 1].computedWidth;
120
- });
121
-
122
110
  /**
123
111
  * Get the filterable columns as an array.
124
112
  * @category Columns