@mui/x-data-grid 7.8.0 → 7.9.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 (57) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/DataGrid/useDataGridProps.js +9 -2
  3. package/components/GridLoadingOverlay.d.ts +15 -3
  4. package/components/GridLoadingOverlay.js +48 -4
  5. package/components/GridRow.js +2 -1
  6. package/components/GridSkeletonLoadingOverlay.d.ts +3 -0
  7. package/components/GridSkeletonLoadingOverlay.js +181 -0
  8. package/components/base/GridOverlays.d.ts +11 -1
  9. package/components/base/GridOverlays.js +25 -39
  10. package/components/cell/GridSkeletonCell.d.ts +13 -6
  11. package/components/cell/GridSkeletonCell.js +61 -19
  12. package/components/containers/GridRootStyles.js +11 -2
  13. package/components/virtualization/GridVirtualScroller.js +7 -5
  14. package/constants/gridClasses.d.ts +9 -0
  15. package/constants/gridClasses.js +1 -1
  16. package/hooks/features/overlays/useGridOverlays.d.ts +11 -0
  17. package/hooks/features/overlays/useGridOverlays.js +35 -0
  18. package/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
  19. package/hooks/utils/index.d.ts +0 -1
  20. package/hooks/utils/index.js +0 -1
  21. package/index.js +1 -1
  22. package/models/gridSlotsComponentsProps.d.ts +2 -1
  23. package/modern/DataGrid/useDataGridProps.js +9 -2
  24. package/modern/components/GridLoadingOverlay.js +48 -4
  25. package/modern/components/GridRow.js +2 -1
  26. package/modern/components/GridSkeletonLoadingOverlay.js +181 -0
  27. package/modern/components/base/GridOverlays.js +25 -39
  28. package/modern/components/cell/GridSkeletonCell.js +61 -19
  29. package/modern/components/containers/GridRootStyles.js +11 -2
  30. package/modern/components/virtualization/GridVirtualScroller.js +7 -5
  31. package/modern/constants/gridClasses.js +1 -1
  32. package/modern/hooks/features/overlays/useGridOverlays.js +35 -0
  33. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
  34. package/modern/hooks/utils/index.js +0 -1
  35. package/modern/index.js +1 -1
  36. package/modern/utils/utils.js +10 -2
  37. package/node/DataGrid/useDataGridProps.js +9 -2
  38. package/node/components/GridLoadingOverlay.js +48 -4
  39. package/node/components/GridRow.js +2 -1
  40. package/node/components/GridSkeletonLoadingOverlay.js +189 -0
  41. package/node/components/base/GridOverlays.js +25 -39
  42. package/node/components/cell/GridSkeletonCell.js +60 -18
  43. package/node/components/containers/GridRootStyles.js +11 -2
  44. package/node/components/virtualization/GridVirtualScroller.js +6 -4
  45. package/node/constants/gridClasses.js +1 -1
  46. package/node/hooks/features/overlays/useGridOverlays.js +42 -0
  47. package/node/hooks/features/virtualization/useGridVirtualScroller.js +1 -1
  48. package/node/hooks/utils/index.js +0 -12
  49. package/node/index.js +1 -1
  50. package/node/utils/utils.js +11 -3
  51. package/package.json +5 -4
  52. package/utils/utils.d.ts +8 -1
  53. package/utils/utils.js +10 -2
  54. package/hooks/utils/useResizeObserver.d.ts +0 -2
  55. package/hooks/utils/useResizeObserver.js +0 -36
  56. package/modern/hooks/utils/useResizeObserver.js +0 -36
  57. package/node/hooks/utils/useResizeObserver.js +0 -44
@@ -12,8 +12,6 @@ var _system = require("@mui/system");
12
12
  var _utils = require("@mui/utils");
13
13
  var _clsx = _interopRequireDefault(require("clsx"));
14
14
  var _useGridSelector = require("../../hooks/utils/useGridSelector");
15
- var _gridFilterSelector = require("../../hooks/features/filter/gridFilterSelector");
16
- var _gridRowsSelector = require("../../hooks/features/rows/gridRowsSelector");
17
15
  var _dimensions = require("../../hooks/features/dimensions");
18
16
  var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
19
17
  var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
@@ -26,11 +24,14 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
26
24
  const GridOverlayWrapperRoot = (0, _system.styled)('div', {
27
25
  name: 'MuiDataGrid',
28
26
  slot: 'OverlayWrapper',
29
- shouldForwardProp: prop => prop !== 'overlayType',
27
+ shouldForwardProp: prop => prop !== 'overlayType' && prop !== 'loadingOverlayVariant',
30
28
  overridesResolver: (props, styles) => styles.overlayWrapper
31
29
  })(({
32
- overlayType
33
- }) => ({
30
+ overlayType,
31
+ loadingOverlayVariant
32
+ }) =>
33
+ // Skeleton overlay should flow with the scroll container and not be sticky
34
+ loadingOverlayVariant !== 'skeleton' ? {
34
35
  position: 'sticky',
35
36
  // To stay in place while scrolling
36
37
  top: 'var(--DataGrid-headersTotalHeight)',
@@ -41,11 +42,11 @@ const GridOverlayWrapperRoot = (0, _system.styled)('div', {
41
42
  // To stay above the content instead of shifting it down
42
43
  zIndex: overlayType === 'loadingOverlay' ? 5 // Should be above pinned columns, pinned rows, and detail panel
43
44
  : 4 // Should be above pinned columns and detail panel
44
- }));
45
+ } : {});
45
46
  const GridOverlayWrapperInner = (0, _system.styled)('div', {
46
47
  name: 'MuiDataGrid',
47
48
  slot: 'OverlayWrapperInner',
48
- shouldForwardProp: prop => prop !== 'overlayType',
49
+ shouldForwardProp: prop => prop !== 'overlayType' && prop !== 'loadingOverlayVariant',
49
50
  overridesResolver: (props, styles) => styles.overlayWrapperInner
50
51
  })({});
51
52
  const useUtilityClasses = ownerState => {
@@ -70,9 +71,9 @@ function GridOverlayWrapper(props) {
70
71
  const classes = useUtilityClasses((0, _extends2.default)({}, props, {
71
72
  classes: rootProps.classes
72
73
  }));
73
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridOverlayWrapperRoot, {
74
- className: (0, _clsx.default)(classes.root),
75
- overlayType: props.overlayType,
74
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridOverlayWrapperRoot, (0, _extends2.default)({
75
+ className: (0, _clsx.default)(classes.root)
76
+ }, props, {
76
77
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(GridOverlayWrapperInner, (0, _extends2.default)({
77
78
  className: (0, _clsx.default)(classes.inner),
78
79
  style: {
@@ -80,42 +81,27 @@ function GridOverlayWrapper(props) {
80
81
  width: dimensions.viewportOuterSize.width
81
82
  }
82
83
  }, props))
83
- });
84
+ }));
84
85
  }
85
- process.env.NODE_ENV !== "production" ? GridOverlayWrapper.propTypes = {
86
+ process.env.NODE_ENV !== "production" ? GridOverlays.propTypes = {
86
87
  // ----------------------------- Warning --------------------------------
87
88
  // | These PropTypes are generated from the TypeScript type definitions |
88
89
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
89
90
  // ----------------------------------------------------------------------
90
- overlayType: _propTypes.default.string.isRequired
91
+ loadingOverlayVariant: _propTypes.default.oneOf(['circular-progress', 'linear-progress', 'skeleton']),
92
+ overlayType: _propTypes.default.oneOf(['loadingOverlay', 'noResultsOverlay', 'noRowsOverlay'])
91
93
  } : void 0;
92
- function GridOverlays() {
93
- const apiRef = (0, _useGridApiContext.useGridApiContext)();
94
+ function GridOverlays(props) {
95
+ const {
96
+ overlayType
97
+ } = props;
94
98
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
95
- const totalRowCount = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridRowCountSelector);
96
- const visibleRowCount = (0, _useGridSelector.useGridSelector)(apiRef, _gridFilterSelector.gridExpandedRowCountSelector);
97
- const loading = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridRowsLoadingSelector);
98
- const showNoRowsOverlay = !loading && totalRowCount === 0;
99
- const showNoResultsOverlay = !loading && totalRowCount > 0 && visibleRowCount === 0;
100
- let overlay = null;
101
- let overlayType = '';
102
- if (showNoRowsOverlay) {
103
- overlay = /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.noRowsOverlay, (0, _extends2.default)({}, rootProps.slotProps?.noRowsOverlay));
104
- overlayType = 'noRowsOverlay';
105
- }
106
- if (showNoResultsOverlay) {
107
- overlay = /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.noResultsOverlay, (0, _extends2.default)({}, rootProps.slotProps?.noResultsOverlay));
108
- overlayType = 'noResultsOverlay';
109
- }
110
- if (loading) {
111
- overlay = /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.loadingOverlay, (0, _extends2.default)({}, rootProps.slotProps?.loadingOverlay));
112
- overlayType = 'loadingOverlay';
113
- }
114
- if (overlay === null) {
99
+ if (!overlayType) {
115
100
  return null;
116
101
  }
117
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridOverlayWrapper, {
118
- overlayType: overlayType,
119
- children: overlay
120
- });
102
+ const Overlay = rootProps.slots?.[overlayType];
103
+ const overlayProps = rootProps.slotProps?.[overlayType];
104
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridOverlayWrapper, (0, _extends2.default)({}, props, {
105
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Overlay, (0, _extends2.default)({}, overlayProps))
106
+ }));
121
107
  }
@@ -11,51 +11,87 @@ var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _Skeleton = _interopRequireDefault(require("@mui/material/Skeleton"));
13
13
  var _utils = require("@mui/utils");
14
+ var _clsx = _interopRequireDefault(require("clsx"));
14
15
  var _fastMemo = require("../../utils/fastMemo");
15
16
  var _utils2 = require("../../utils/utils");
16
17
  var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
17
18
  var _gridClasses = require("../../constants/gridClasses");
18
19
  var _jsxRuntime = require("react/jsx-runtime");
19
- const _excluded = ["field", "align", "width", "height"];
20
+ const _excluded = ["field", "type", "align", "width", "height", "empty", "style", "className"];
20
21
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
21
22
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
22
- const randomWidth = (0, _utils2.randomNumberBetween)(10000, 20, 80);
23
+ const CIRCULAR_CONTENT_SIZE = '1.3em';
24
+ const CONTENT_HEIGHT = '1.2em';
25
+ const DEFAULT_CONTENT_WIDTH_RANGE = [40, 80];
26
+ const CONTENT_WIDTH_RANGE_BY_TYPE = {
27
+ number: [40, 60],
28
+ string: [40, 80],
29
+ date: [40, 60],
30
+ dateTime: [60, 80],
31
+ singleSelect: [40, 80]
32
+ };
23
33
  const useUtilityClasses = ownerState => {
24
34
  const {
25
35
  align,
26
- classes
36
+ classes,
37
+ empty
27
38
  } = ownerState;
28
39
  const slots = {
29
- root: ['cell', 'cellSkeleton', `cell--text${(0, _utils.unstable_capitalize)(align)}`, 'withBorderColor']
40
+ root: ['cell', 'cellSkeleton', `cell--text${align ? (0, _utils.unstable_capitalize)(align) : 'Left'}`, empty && 'cellEmpty']
30
41
  };
31
42
  return (0, _utils.unstable_composeClasses)(slots, _gridClasses.getDataGridUtilityClass, classes);
32
43
  };
44
+ const randomNumberGenerator = (0, _utils2.createRandomNumberGenerator)(12345);
33
45
  function GridSkeletonCell(props) {
34
46
  const {
47
+ field,
48
+ type,
35
49
  align,
36
50
  width,
37
- height
51
+ height,
52
+ empty = false,
53
+ style,
54
+ className
38
55
  } = props,
39
56
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
40
57
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
41
58
  const ownerState = {
42
59
  classes: rootProps.classes,
43
- align
60
+ align,
61
+ empty
44
62
  };
45
63
  const classes = useUtilityClasses(ownerState);
46
- const contentWidth = Math.round(randomWidth());
64
+
65
+ // Memo prevents the non-circular skeleton widths changing to random widths on every render
66
+ const skeletonProps = React.useMemo(() => {
67
+ const isCircularContent = type === 'boolean' || type === 'actions';
68
+ if (isCircularContent) {
69
+ return {
70
+ variant: 'circular',
71
+ width: CIRCULAR_CONTENT_SIZE,
72
+ height: CIRCULAR_CONTENT_SIZE
73
+ };
74
+ }
75
+
76
+ // The width of the skeleton is a random number between the min and max values
77
+ // The min and max values are determined by the type of the column
78
+ const [min, max] = type ? CONTENT_WIDTH_RANGE_BY_TYPE[type] ?? DEFAULT_CONTENT_WIDTH_RANGE : DEFAULT_CONTENT_WIDTH_RANGE;
79
+ return {
80
+ variant: 'text',
81
+ width: `${Math.round(randomNumberGenerator(min, max))}%`,
82
+ height: CONTENT_HEIGHT
83
+ };
84
+ }, [type]);
47
85
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _extends2.default)({
48
- className: classes.root,
49
- style: {
86
+ "data-field": field,
87
+ className: (0, _clsx.default)(classes.root, className),
88
+ style: (0, _extends2.default)({
50
89
  height,
51
90
  maxWidth: width,
52
91
  minWidth: width
53
- }
92
+ }, style)
54
93
  }, other, {
55
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.default, {
56
- width: `${contentWidth}%`,
57
- height: 25
58
- })
94
+ children: !empty && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.default, (0, _extends2.default)({}, skeletonProps))
59
95
  }));
60
96
  }
61
97
  process.env.NODE_ENV !== "production" ? GridSkeletonCell.propTypes = {
@@ -63,9 +99,15 @@ process.env.NODE_ENV !== "production" ? GridSkeletonCell.propTypes = {
63
99
  // | These PropTypes are generated from the TypeScript type definitions |
64
100
  // | To update them edit the TypeScript types and run "pnpm proptypes" |
65
101
  // ----------------------------------------------------------------------
66
- align: _propTypes.default.string.isRequired,
67
- field: _propTypes.default.string.isRequired,
68
- height: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number]).isRequired,
69
- width: _propTypes.default.number.isRequired
102
+ align: _propTypes.default.string,
103
+ /**
104
+ * If `true`, the cell will not display the skeleton but still reserve the cell space.
105
+ * @default false
106
+ */
107
+ empty: _propTypes.default.bool,
108
+ field: _propTypes.default.string,
109
+ height: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number]),
110
+ type: _propTypes.default.oneOf(['actions', 'boolean', 'custom', 'date', 'dateTime', 'number', 'singleSelect', 'string']),
111
+ width: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string])
70
112
  } : void 0;
71
113
  const Memoized = exports.GridSkeletonCell = (0, _fastMemo.fastMemo)(GridSkeletonCell);
@@ -168,7 +168,7 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
168
168
  const selectedOpacity = (t.vars || t).palette.action.selectedOpacity;
169
169
  const selectedBackground = t.vars ? `rgba(${t.vars.palette.primary.mainChannel} / ${selectedOpacity})` : (0, _styles.alpha)(t.palette.primary.main, selectedOpacity);
170
170
  const selectedHoverBackground = t.vars ? `rgba(${t.vars.palette.primary.mainChannel} / calc(
171
- ${t.vars.palette.action.selectedOpacity} +
171
+ ${t.vars.palette.action.selectedOpacity} +
172
172
  ${t.vars.palette.action.hoverOpacity}
173
173
  ))` : (0, _styles.alpha)(t.palette.primary.main, t.palette.action.selectedOpacity + t.palette.action.hoverOpacity);
174
174
  const pinnedHoverBackground = t.vars ? hoverColor : blend(pinnedBackground, hoverColor, hoverOpacity);
@@ -432,6 +432,9 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
432
432
  backgroundColor: 'transparent'
433
433
  }
434
434
  },
435
+ [`&.${_gridClasses.gridClasses.rowSkeleton}:hover`]: {
436
+ backgroundColor: 'transparent'
437
+ },
435
438
  '&.Mui-selected': selectedStyles
436
439
  },
437
440
  [`& .${_gridClasses.gridClasses['container--top']}, & .${_gridClasses.gridClasses['container--bottom']}`]: {
@@ -638,7 +641,7 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
638
641
  minWidth: 'calc(var(--DataGrid-hasScrollY) * var(--DataGrid-scrollbarSize))',
639
642
  alignSelf: 'stretch',
640
643
  [`&.${_gridClasses.gridClasses['scrollbarFiller--borderTop']}`]: {
641
- borderTop: '1px solid var(--DataGrid-rowBorderColor)'
644
+ borderTop: '1px solid var(--rowBorderColor)'
642
645
  },
643
646
  [`&.${_gridClasses.gridClasses['scrollbarFiller--pinnedRight']}`]: {
644
647
  backgroundColor: 'var(--DataGrid-pinnedBackground)',
@@ -651,6 +654,12 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
651
654
  },
652
655
  [`& .${_gridClasses.gridClasses['filler--borderTop']}`]: {
653
656
  borderTop: '1px solid var(--DataGrid-rowBorderColor)'
657
+ },
658
+ /* Hide grid rows and vertical scrollbar when skeleton overlay is visible */
659
+ [`& .${_gridClasses.gridClasses['main--hasSkeletonLoadingOverlay']}`]: {
660
+ [`& .${_gridClasses.gridClasses.virtualScrollerContent}, & .${_gridClasses.gridClasses['scrollbar--vertical']}, & .${_gridClasses.gridClasses.pinnedRows}`]: {
661
+ display: 'none'
662
+ }
654
663
  }
655
664
  });
656
665
  return gridStyle;
@@ -16,6 +16,7 @@ var _useGridSelector = require("../../hooks/utils/useGridSelector");
16
16
  var _gridClasses = require("../../constants/gridClasses");
17
17
  var _dimensions = require("../../hooks/features/dimensions");
18
18
  var _useGridVirtualScroller = require("../../hooks/features/virtualization/useGridVirtualScroller");
19
+ var _useGridOverlays = require("../../hooks/features/overlays/useGridOverlays");
19
20
  var _GridOverlays = require("../base/GridOverlays");
20
21
  var _GridHeaders = require("../GridHeaders");
21
22
  var _GridMainContainer = require("./GridMainContainer");
@@ -28,12 +29,12 @@ var _GridVirtualScrollbar = require("./GridVirtualScrollbar");
28
29
  var _jsxRuntime = require("react/jsx-runtime");
29
30
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
30
31
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
31
- const useUtilityClasses = (ownerState, dimensions) => {
32
+ const useUtilityClasses = (ownerState, dimensions, loadingOverlayVariant) => {
32
33
  const {
33
34
  classes
34
35
  } = ownerState;
35
36
  const slots = {
36
- root: ['main', dimensions.rightPinnedWidth > 0 && 'main--hasPinnedRight'],
37
+ root: ['main', dimensions.rightPinnedWidth > 0 && 'main--hasPinnedRight', loadingOverlayVariant === 'skeleton' && 'main--hasSkeletonLoadingOverlay'],
37
38
  scroller: ['virtualScroller']
38
39
  };
39
40
  return (0, _utils.unstable_composeClasses)(slots, _gridClasses.getDataGridUtilityClass, classes);
@@ -60,7 +61,8 @@ function GridVirtualScroller(props) {
60
61
  const apiRef = (0, _useGridApiContext.useGridApiContext)();
61
62
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
62
63
  const dimensions = (0, _useGridSelector.useGridSelector)(apiRef, _dimensions.gridDimensionsSelector);
63
- const classes = useUtilityClasses(rootProps, dimensions);
64
+ const overlaysProps = (0, _useGridOverlays.useGridOverlays)();
65
+ const classes = useUtilityClasses(rootProps, dimensions, overlaysProps.loadingOverlayVariant);
64
66
  const virtualScroller = (0, _useGridVirtualScroller.useGridVirtualScroller)();
65
67
  const {
66
68
  getContainerProps,
@@ -88,7 +90,7 @@ function GridVirtualScroller(props) {
88
90
  position: "top",
89
91
  virtualScroller: virtualScroller
90
92
  })]
91
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridOverlays.GridOverlays, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollerContent.GridVirtualScrollerContent, (0, _extends2.default)({}, getContentProps(), {
93
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridOverlays.GridOverlays, (0, _extends2.default)({}, overlaysProps)), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollerContent.GridVirtualScrollerContent, (0, _extends2.default)({}, getContentProps(), {
92
94
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridVirtualScrollerRenderZone.GridVirtualScrollerRenderZone, (0, _extends2.default)({}, getRenderZoneProps(), {
93
95
  children: [rows, /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.detailPanels, {
94
96
  virtualScroller: virtualScroller
@@ -9,4 +9,4 @@ var _utils = require("@mui/utils");
9
9
  function getDataGridUtilityClass(slot) {
10
10
  return (0, _utils.unstable_generateUtilityClass)('MuiDataGrid', slot);
11
11
  }
12
- const gridClasses = exports.gridClasses = (0, _utils.unstable_generateUtilityClasses)('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--flex', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--pinnedLeft', 'cell--pinnedRight', 'cell--selectionMode', 'cell', 'cellCheckbox', 'cellEmpty', 'cellSkeleton', 'cellOffsetLeft', 'checkboxInput', 'columnHeader', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader--pinnedLeft', 'columnHeader--pinnedRight', 'columnHeader--last', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeaders', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsManagement', 'columnsManagementRow', 'columnsManagementHeader', 'columnsManagementFooter', 'container--top', 'container--bottom', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filler', 'filler--borderTop', 'filler--pinnedLeft', 'filler--pinnedRight', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'main--hasPinnedRight', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--firstVisible', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'scrollbar', 'scrollbar--vertical', 'scrollbar--horizontal', 'scrollbarFiller', 'scrollbarFiller--header', 'scrollbarFiller--borderTop', 'scrollbarFiller--pinnedRight', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'withVerticalBorder', 'withBorderColor', 'cell--withRightBorder', 'cell--withLeftBorder', 'columnHeader--withRightBorder', 'columnHeader--withLeftBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'treeDataGroupingCellLoadingContainer', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
12
+ const gridClasses = exports.gridClasses = (0, _utils.unstable_generateUtilityClasses)('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--flex', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--pinnedLeft', 'cell--pinnedRight', 'cell--selectionMode', 'cell', 'cellCheckbox', 'cellEmpty', 'cellSkeleton', 'cellOffsetLeft', 'checkboxInput', 'columnHeader', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader--pinnedLeft', 'columnHeader--pinnedRight', 'columnHeader--last', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeaders', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsManagement', 'columnsManagementRow', 'columnsManagementHeader', 'columnsManagementFooter', 'container--top', 'container--bottom', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filler', 'filler--borderTop', 'filler--pinnedLeft', 'filler--pinnedRight', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'main--hasPinnedRight', 'main--hasSkeletonLoadingOverlay', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--firstVisible', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'rowSkeleton', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'scrollbar', 'scrollbar--vertical', 'scrollbar--horizontal', 'scrollbarFiller', 'scrollbarFiller--header', 'scrollbarFiller--borderTop', 'scrollbarFiller--pinnedRight', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'withVerticalBorder', 'withBorderColor', 'cell--withRightBorder', 'cell--withLeftBorder', 'columnHeader--withRightBorder', 'columnHeader--withLeftBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'treeDataGroupingCellLoadingContainer', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useGridOverlays = void 0;
7
+ var _utils = require("../../utils");
8
+ var _useGridApiContext = require("../../utils/useGridApiContext");
9
+ var _useGridRootProps = require("../../utils/useGridRootProps");
10
+ var _filter = require("../filter");
11
+ var _rows = require("../rows");
12
+ /**
13
+ * Uses the grid state to determine which overlay to display.
14
+ * Returns the active overlay type and the active loading overlay variant.
15
+ */
16
+ const useGridOverlays = () => {
17
+ const apiRef = (0, _useGridApiContext.useGridApiContext)();
18
+ const rootProps = (0, _useGridRootProps.useGridRootProps)();
19
+ const totalRowCount = (0, _utils.useGridSelector)(apiRef, _rows.gridRowCountSelector);
20
+ const visibleRowCount = (0, _utils.useGridSelector)(apiRef, _filter.gridExpandedRowCountSelector);
21
+ const noRows = totalRowCount === 0;
22
+ const loading = (0, _utils.useGridSelector)(apiRef, _rows.gridRowsLoadingSelector);
23
+ const showNoRowsOverlay = !loading && noRows;
24
+ const showNoResultsOverlay = !loading && totalRowCount > 0 && visibleRowCount === 0;
25
+ let overlayType = null;
26
+ let loadingOverlayVariant = null;
27
+ if (showNoRowsOverlay) {
28
+ overlayType = 'noRowsOverlay';
29
+ }
30
+ if (showNoResultsOverlay) {
31
+ overlayType = 'noResultsOverlay';
32
+ }
33
+ if (loading) {
34
+ overlayType = 'loadingOverlay';
35
+ loadingOverlayVariant = rootProps.slotProps?.loadingOverlay?.[noRows ? 'noRowsVariant' : 'variant'] || null;
36
+ }
37
+ return {
38
+ overlayType,
39
+ loadingOverlayVariant
40
+ };
41
+ };
42
+ exports.useGridOverlays = useGridOverlays;
@@ -14,11 +14,11 @@ var ReactDOM = _interopRequireWildcard(require("react-dom"));
14
14
  var _utils = require("@mui/utils");
15
15
  var _useLazyRef = _interopRequireDefault(require("@mui/utils/useLazyRef"));
16
16
  var _useTimeout = _interopRequireDefault(require("@mui/utils/useTimeout"));
17
+ var _useResizeObserver = require("@mui/x-internals/useResizeObserver");
17
18
  var _styles = require("@mui/material/styles");
18
19
  var _useGridPrivateApiContext = require("../../utils/useGridPrivateApiContext");
19
20
  var _useGridRootProps = require("../../utils/useGridRootProps");
20
21
  var _useGridSelector = require("../../utils/useGridSelector");
21
- var _useResizeObserver = require("../../utils/useResizeObserver");
22
22
  var _useRunOnce = require("../../utils/useRunOnce");
23
23
  var _gridColumnsSelector = require("../columns/gridColumnsSelector");
24
24
  var _gridDimensionsSelectors = require("../dimensions/gridDimensionsSelectors");
@@ -85,18 +85,6 @@ Object.keys(_useOnMount).forEach(function (key) {
85
85
  }
86
86
  });
87
87
  });
88
- var _useResizeObserver = require("./useResizeObserver");
89
- Object.keys(_useResizeObserver).forEach(function (key) {
90
- if (key === "default" || key === "__esModule") return;
91
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
92
- if (key in exports && exports[key] === _useResizeObserver[key]) return;
93
- Object.defineProperty(exports, key, {
94
- enumerable: true,
95
- get: function () {
96
- return _useResizeObserver[key];
97
- }
98
- });
99
- });
100
88
  var _useRunOnce = require("./useRunOnce");
101
89
  Object.keys(_useRunOnce).forEach(function (key) {
102
90
  if (key === "default" || key === "__esModule") return;
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v7.8.0
2
+ * @mui/x-data-grid v7.9.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.clamp = void 0;
7
+ exports.createRandomNumberGenerator = createRandomNumberGenerator;
7
8
  exports.deepClone = deepClone;
8
9
  exports.escapeRegExp = escapeRegExp;
9
10
  exports.eslintUseValue = eslintUseValue;
@@ -12,7 +13,6 @@ exports.isFunction = isFunction;
12
13
  exports.isNumber = isNumber;
13
14
  exports.isObject = isObject;
14
15
  exports.localStorageAvailable = localStorageAvailable;
15
- exports.randomNumberBetween = randomNumberBetween;
16
16
  exports.range = range;
17
17
  function isNumber(value) {
18
18
  return typeof value === 'number' && !Number.isNaN(value);
@@ -189,9 +189,17 @@ function mulberry32(a) {
189
189
  /* eslint-enable */
190
190
  };
191
191
  }
192
- function randomNumberBetween(seed, min, max) {
192
+
193
+ /**
194
+ * Create a random number generator from a seed. The seed
195
+ * ensures that the random number generator produces the
196
+ * same sequence of 'random' numbers on every render. It
197
+ * returns a function that generates a random number between
198
+ * a specified min and max.
199
+ */
200
+ function createRandomNumberGenerator(seed) {
193
201
  const random = mulberry32(seed);
194
- return () => min + (max - min) * random();
202
+ return (min, max) => min + (max - min) * random();
195
203
  }
196
204
  function deepClone(obj) {
197
205
  if (typeof structuredClone === 'function') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-data-grid",
3
- "version": "7.8.0",
3
+ "version": "7.9.0",
4
4
  "description": "The Community plan edition of the Data Grid components (MUI X).",
5
5
  "author": "MUI Team",
6
6
  "main": "./node/index.js",
@@ -38,11 +38,12 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@babel/runtime": "^7.24.7",
41
- "@mui/system": "^5.15.20",
42
- "@mui/utils": "^5.15.20",
41
+ "@mui/system": "^5.16.0",
42
+ "@mui/utils": "^5.16.0",
43
43
  "clsx": "^2.1.1",
44
44
  "prop-types": "^15.8.1",
45
- "reselect": "^4.1.8"
45
+ "reselect": "^4.1.8",
46
+ "@mui/x-internals": "7.9.0"
46
47
  },
47
48
  "peerDependencies": {
48
49
  "@mui/material": "^5.15.14",
package/utils/utils.d.ts CHANGED
@@ -39,7 +39,14 @@ export declare function range(from: number, to: number): number[];
39
39
  * We only type the public interface to avoid dozens of `as` in the function.
40
40
  */
41
41
  export declare function isDeepEqual<T>(actual: any, expected: T): actual is T;
42
- export declare function randomNumberBetween(seed: number, min: number, max: number): () => number;
42
+ /**
43
+ * Create a random number generator from a seed. The seed
44
+ * ensures that the random number generator produces the
45
+ * same sequence of 'random' numbers on every render. It
46
+ * returns a function that generates a random number between
47
+ * a specified min and max.
48
+ */
49
+ export declare function createRandomNumberGenerator(seed: number): (min: number, max: number) => number;
43
50
  export declare function deepClone(obj: Record<string, any>): any;
44
51
  /**
45
52
  * Mark a value as used so eslint doesn't complain. Use this instead
package/utils/utils.js CHANGED
@@ -172,9 +172,17 @@ function mulberry32(a) {
172
172
  /* eslint-enable */
173
173
  };
174
174
  }
175
- export function randomNumberBetween(seed, min, max) {
175
+
176
+ /**
177
+ * Create a random number generator from a seed. The seed
178
+ * ensures that the random number generator produces the
179
+ * same sequence of 'random' numbers on every render. It
180
+ * returns a function that generates a random number between
181
+ * a specified min and max.
182
+ */
183
+ export function createRandomNumberGenerator(seed) {
176
184
  const random = mulberry32(seed);
177
- return () => min + (max - min) * random();
185
+ return (min, max) => min + (max - min) * random();
178
186
  }
179
187
  export function deepClone(obj) {
180
188
  if (typeof structuredClone === 'function') {
@@ -1,2 +0,0 @@
1
- import * as React from 'react';
2
- export declare function useResizeObserver(ref: React.MutableRefObject<HTMLElement | undefined | null>, fn: (entries: ResizeObserverEntry[]) => void, enabled?: boolean): void;
@@ -1,36 +0,0 @@
1
- import * as React from 'react';
2
- import { unstable_useEnhancedEffect as useEnhancedEffect } from '@mui/utils';
3
- const isDevEnvironment = process.env.NODE_ENV === 'development';
4
- const noop = () => {};
5
- export function useResizeObserver(ref, fn, enabled) {
6
- const fnRef = React.useRef(null);
7
- fnRef.current = fn;
8
- useEnhancedEffect(() => {
9
- if (enabled === false || typeof ResizeObserver === 'undefined') {
10
- return noop;
11
- }
12
- let frameID = 0;
13
- const target = ref.current;
14
- const observer = new ResizeObserver(entries => {
15
- // See https://github.com/mui/mui-x/issues/8733
16
- // In dev, we avoid the React warning by moving the task to the next frame.
17
- // In prod, we want the task to run in the same frame as to avoid tear.
18
- if (isDevEnvironment) {
19
- frameID = requestAnimationFrame(() => {
20
- fnRef.current(entries);
21
- });
22
- } else {
23
- fnRef.current(entries);
24
- }
25
- });
26
- if (target) {
27
- observer.observe(target);
28
- }
29
- return () => {
30
- if (frameID) {
31
- cancelAnimationFrame(frameID);
32
- }
33
- observer.disconnect();
34
- };
35
- }, [ref, enabled]);
36
- }
@@ -1,36 +0,0 @@
1
- import * as React from 'react';
2
- import { unstable_useEnhancedEffect as useEnhancedEffect } from '@mui/utils';
3
- const isDevEnvironment = process.env.NODE_ENV === 'development';
4
- const noop = () => {};
5
- export function useResizeObserver(ref, fn, enabled) {
6
- const fnRef = React.useRef(null);
7
- fnRef.current = fn;
8
- useEnhancedEffect(() => {
9
- if (enabled === false || typeof ResizeObserver === 'undefined') {
10
- return noop;
11
- }
12
- let frameID = 0;
13
- const target = ref.current;
14
- const observer = new ResizeObserver(entries => {
15
- // See https://github.com/mui/mui-x/issues/8733
16
- // In dev, we avoid the React warning by moving the task to the next frame.
17
- // In prod, we want the task to run in the same frame as to avoid tear.
18
- if (isDevEnvironment) {
19
- frameID = requestAnimationFrame(() => {
20
- fnRef.current(entries);
21
- });
22
- } else {
23
- fnRef.current(entries);
24
- }
25
- });
26
- if (target) {
27
- observer.observe(target);
28
- }
29
- return () => {
30
- if (frameID) {
31
- cancelAnimationFrame(frameID);
32
- }
33
- observer.disconnect();
34
- };
35
- }, [ref, enabled]);
36
- }
@@ -1,44 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useResizeObserver = useResizeObserver;
7
- var React = _interopRequireWildcard(require("react"));
8
- var _utils = require("@mui/utils");
9
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
- const isDevEnvironment = process.env.NODE_ENV === 'development';
12
- const noop = () => {};
13
- function useResizeObserver(ref, fn, enabled) {
14
- const fnRef = React.useRef(null);
15
- fnRef.current = fn;
16
- (0, _utils.unstable_useEnhancedEffect)(() => {
17
- if (enabled === false || typeof ResizeObserver === 'undefined') {
18
- return noop;
19
- }
20
- let frameID = 0;
21
- const target = ref.current;
22
- const observer = new ResizeObserver(entries => {
23
- // See https://github.com/mui/mui-x/issues/8733
24
- // In dev, we avoid the React warning by moving the task to the next frame.
25
- // In prod, we want the task to run in the same frame as to avoid tear.
26
- if (isDevEnvironment) {
27
- frameID = requestAnimationFrame(() => {
28
- fnRef.current(entries);
29
- });
30
- } else {
31
- fnRef.current(entries);
32
- }
33
- });
34
- if (target) {
35
- observer.observe(target);
36
- }
37
- return () => {
38
- if (frameID) {
39
- cancelAnimationFrame(frameID);
40
- }
41
- observer.disconnect();
42
- };
43
- }, [ref, enabled]);
44
- }