@mui/x-data-grid 6.1.0 → 6.2.1

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 (107) hide show
  1. package/CHANGELOG.md +101 -1
  2. package/components/GridHeader.d.ts +2 -2
  3. package/components/GridHeader.js +4 -6
  4. package/components/GridPagination.d.ts +2 -2
  5. package/components/base/GridBody.d.ts +0 -1
  6. package/components/base/GridBody.js +32 -15
  7. package/components/columnSelection/GridCellCheckboxRenderer.d.ts +1 -1
  8. package/components/columnSelection/GridCellCheckboxRenderer.js +1 -1
  9. package/components/columnSelection/GridHeaderCheckbox.d.ts +1 -1
  10. package/components/containers/GridMainContainer.d.ts +3 -1
  11. package/components/containers/GridMainContainer.js +3 -2
  12. package/components/containers/GridRoot.js +0 -5
  13. package/components/index.d.ts +0 -1
  14. package/components/index.js +0 -1
  15. package/components/panel/GridColumnsPanel.js +3 -2
  16. package/components/panel/GridPanel.d.ts +2 -2
  17. package/components/panel/GridPanel.js +2 -1
  18. package/components/panel/filterPanel/GridFilterInputBoolean.js +37 -29
  19. package/components/panel/filterPanel/GridFilterInputSingleSelect.js +34 -30
  20. package/components/panel/filterPanel/GridFilterPanel.js +5 -2
  21. package/hooks/features/dimensions/gridDimensionsApi.d.ts +4 -0
  22. package/hooks/features/dimensions/useGridDimensions.js +49 -10
  23. package/hooks/features/export/useGridPrintExport.js +3 -1
  24. package/hooks/features/rowSelection/useGridRowSelection.js +5 -26
  25. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +37 -16
  26. package/hooks/features/virtualization/useGridVirtualScroller.js +11 -5
  27. package/index.js +1 -1
  28. package/joy/index.d.ts +2 -0
  29. package/joy/index.js +2 -0
  30. package/joy/joySlots.d.ts +4 -0
  31. package/joy/joySlots.js +71 -0
  32. package/joy/package.json +6 -0
  33. package/legacy/components/GridHeader.js +4 -6
  34. package/legacy/components/base/GridBody.js +33 -16
  35. package/legacy/components/columnSelection/GridCellCheckboxRenderer.js +1 -1
  36. package/legacy/components/containers/GridMainContainer.js +3 -2
  37. package/legacy/components/containers/GridRoot.js +0 -5
  38. package/legacy/components/index.js +0 -1
  39. package/legacy/components/panel/GridColumnsPanel.js +3 -2
  40. package/legacy/components/panel/GridPanel.js +2 -1
  41. package/legacy/components/panel/filterPanel/GridFilterInputBoolean.js +37 -29
  42. package/legacy/components/panel/filterPanel/GridFilterInputSingleSelect.js +34 -30
  43. package/legacy/components/panel/filterPanel/GridFilterPanel.js +5 -2
  44. package/legacy/hooks/features/dimensions/useGridDimensions.js +55 -12
  45. package/legacy/hooks/features/export/useGridPrintExport.js +3 -1
  46. package/legacy/hooks/features/rowSelection/useGridRowSelection.js +5 -24
  47. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +12 -6
  48. package/legacy/index.js +1 -1
  49. package/legacy/joy/index.js +2 -0
  50. package/legacy/joy/joySlots.js +73 -0
  51. package/legacy/locales/frFR.js +7 -9
  52. package/legacy/locales/urPK.js +6 -6
  53. package/legacy/utils/utils.js +1 -1
  54. package/locales/frFR.js +7 -9
  55. package/locales/urPK.js +6 -6
  56. package/material/index.d.ts +1 -1
  57. package/models/gridSlotsComponent.d.ts +2 -2
  58. package/modern/components/GridHeader.js +4 -6
  59. package/modern/components/base/GridBody.js +32 -15
  60. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +1 -1
  61. package/modern/components/containers/GridMainContainer.js +3 -2
  62. package/modern/components/containers/GridRoot.js +0 -5
  63. package/modern/components/index.js +0 -1
  64. package/modern/components/panel/GridColumnsPanel.js +3 -2
  65. package/modern/components/panel/GridPanel.js +2 -1
  66. package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +36 -28
  67. package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +33 -29
  68. package/modern/components/panel/filterPanel/GridFilterPanel.js +5 -2
  69. package/modern/hooks/features/dimensions/useGridDimensions.js +48 -10
  70. package/modern/hooks/features/export/useGridPrintExport.js +3 -1
  71. package/modern/hooks/features/rowSelection/useGridRowSelection.js +5 -26
  72. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +11 -5
  73. package/modern/index.js +1 -1
  74. package/modern/joy/index.js +2 -0
  75. package/modern/joy/joySlots.js +71 -0
  76. package/modern/locales/frFR.js +7 -9
  77. package/modern/locales/urPK.js +6 -6
  78. package/modern/utils/utils.js +1 -1
  79. package/node/components/GridHeader.js +5 -8
  80. package/node/components/base/GridBody.js +32 -15
  81. package/node/components/columnSelection/GridCellCheckboxRenderer.js +1 -1
  82. package/node/components/containers/GridMainContainer.js +5 -3
  83. package/node/components/containers/GridRoot.js +0 -5
  84. package/node/components/index.js +0 -11
  85. package/node/components/panel/GridColumnsPanel.js +3 -2
  86. package/node/components/panel/GridPanel.js +2 -1
  87. package/node/components/panel/filterPanel/GridFilterInputBoolean.js +36 -28
  88. package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +32 -29
  89. package/node/components/panel/filterPanel/GridFilterPanel.js +5 -2
  90. package/node/hooks/features/dimensions/useGridDimensions.js +47 -9
  91. package/node/hooks/features/export/useGridPrintExport.js +3 -1
  92. package/node/hooks/features/rowSelection/useGridRowSelection.js +4 -25
  93. package/node/hooks/features/virtualization/useGridVirtualScroller.js +11 -5
  94. package/node/index.js +1 -1
  95. package/node/joy/index.js +13 -0
  96. package/node/joy/joySlots.js +79 -0
  97. package/node/locales/frFR.js +7 -9
  98. package/node/locales/urPK.js +6 -6
  99. package/node/utils/utils.js +1 -1
  100. package/package.json +1 -1
  101. package/utils/utils.d.ts +1 -1
  102. package/utils/utils.js +1 -1
  103. package/components/GridAutoSizer.d.ts +0 -44
  104. package/components/GridAutoSizer.js +0 -126
  105. package/legacy/components/GridAutoSizer.js +0 -132
  106. package/modern/components/GridAutoSizer.js +0 -125
  107. package/node/components/GridAutoSizer.js +0 -132
@@ -0,0 +1,71 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _excluded = ["touchRippleRef", "inputProps", "onChange", "color", "size", "checked", "sx", "value", "inputRef"];
4
+ import * as React from 'react';
5
+ import JoyCheckbox from '@mui/joy/Checkbox';
6
+ import JoyInput from '@mui/joy/Input';
7
+ import JoyFormControl from '@mui/joy/FormControl';
8
+ import JoyFormLabel from '@mui/joy/FormLabel';
9
+ import { jsx as _jsx } from "react/jsx-runtime";
10
+ import { jsxs as _jsxs } from "react/jsx-runtime";
11
+ const Checkbox = /*#__PURE__*/React.forwardRef((_ref, ref) => {
12
+ let {
13
+ inputProps,
14
+ onChange,
15
+ checked,
16
+ inputRef
17
+ } = _ref,
18
+ props = _objectWithoutPropertiesLoose(_ref, _excluded);
19
+ return /*#__PURE__*/_jsx(JoyCheckbox, _extends({}, props, {
20
+ slotProps: {
21
+ input: _extends({}, inputProps, {
22
+ ref: inputRef
23
+ })
24
+ },
25
+ ref: ref,
26
+ checked: checked,
27
+ onChange: onChange
28
+ }));
29
+ });
30
+ const TextField = /*#__PURE__*/React.forwardRef(({
31
+ onChange,
32
+ label,
33
+ placeholder,
34
+ value,
35
+ inputRef,
36
+ type
37
+ }, ref) => {
38
+ return /*#__PURE__*/_jsxs(JoyFormControl, {
39
+ ref: ref,
40
+ children: [/*#__PURE__*/_jsx(JoyFormLabel, {
41
+ sx: {
42
+ fontSize: 12
43
+ },
44
+ children: label
45
+ }), /*#__PURE__*/_jsx(JoyInput, {
46
+ type: type,
47
+ value: value,
48
+ onChange: onChange,
49
+ placeholder: placeholder,
50
+ size: "sm",
51
+ slotProps: {
52
+ input: {
53
+ ref: inputRef
54
+ }
55
+ }
56
+ })]
57
+ });
58
+ });
59
+ const joySlots = {
60
+ baseCheckbox: Checkbox,
61
+ baseTextField: TextField
62
+ // BaseFormControl: MUIFormControl,
63
+ // BaseSelect: MUISelect,
64
+ // BaseSwitch: MUISwitch,
65
+ // BaseButton: MUIButton,
66
+ // BaseIconButton: MUIIconButton,
67
+ // BaseTooltip: MUITooltip,
68
+ // BasePopper: MUIPopper,
69
+ };
70
+
71
+ export default joySlots;
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/joy/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -3,12 +3,10 @@ import * as React from 'react';
3
3
  import { useGridRootProps } from '../hooks/utils/useGridRootProps';
4
4
  import { jsx as _jsx } from "react/jsx-runtime";
5
5
  import { jsxs as _jsxs } from "react/jsx-runtime";
6
- export var GridHeader = /*#__PURE__*/React.forwardRef(function GridHeader(props, ref) {
6
+ export function GridHeader() {
7
7
  var _rootProps$slotProps, _rootProps$slotProps2;
8
8
  var rootProps = useGridRootProps();
9
- return /*#__PURE__*/_jsxs("div", _extends({
10
- ref: ref
11
- }, props, {
9
+ return /*#__PURE__*/_jsxs(React.Fragment, {
12
10
  children: [/*#__PURE__*/_jsx(rootProps.slots.preferencesPanel, _extends({}, (_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.preferencesPanel)), rootProps.slots.toolbar && /*#__PURE__*/_jsx(rootProps.slots.toolbar, _extends({}, (_rootProps$slotProps2 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps2.toolbar))]
13
- }));
14
- });
11
+ });
12
+ }
@@ -2,10 +2,10 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
3
  import * as React from 'react';
4
4
  import PropTypes from 'prop-types';
5
+ import { unstable_useEnhancedEffect as useEnhancedEffect } from '@mui/utils';
5
6
  import { useGridPrivateApiContext } from '../../hooks/utils/useGridPrivateApiContext';
6
7
  import { useGridSelector } from '../../hooks/utils/useGridSelector';
7
8
  import { GridMainContainer } from '../containers/GridMainContainer';
8
- import { GridAutoSizer } from '../GridAutoSizer';
9
9
  import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
10
10
  import { gridColumnPositionsSelector, gridColumnVisibilityModelSelector, gridVisibleColumnDefinitionsSelector } from '../../hooks/features/columns/gridColumnsSelector';
11
11
  import { gridFilterActiveItemsLookupSelector } from '../../hooks/features/filter/gridFilterSelector';
@@ -17,11 +17,11 @@ import { gridColumnMenuSelector } from '../../hooks/features/columnMenu/columnMe
17
17
  import { jsx as _jsx } from "react/jsx-runtime";
18
18
  import { jsxs as _jsxs } from "react/jsx-runtime";
19
19
  function GridBody(props) {
20
- var children = props.children,
21
- VirtualScrollerComponent = props.VirtualScrollerComponent,
20
+ var VirtualScrollerComponent = props.VirtualScrollerComponent,
22
21
  ColumnHeadersProps = props.ColumnHeadersProps;
23
22
  var apiRef = useGridPrivateApiContext();
24
23
  var rootProps = useGridRootProps();
24
+ var rootRef = React.useRef(null);
25
25
  var visibleColumns = useGridSelector(apiRef, gridVisibleColumnDefinitionsSelector);
26
26
  var filterColumnLookup = useGridSelector(apiRef, gridFilterActiveItemsLookupSelector);
27
27
  var sortColumnLookup = useGridSelector(apiRef, gridSortColumnLookupSelector);
@@ -41,6 +41,24 @@ function GridBody(props) {
41
41
  _React$useState2 = _slicedToArray(_React$useState, 2),
42
42
  isVirtualizationDisabled = _React$useState2[0],
43
43
  setIsVirtualizationDisabled = _React$useState2[1];
44
+ useEnhancedEffect(function () {
45
+ apiRef.current.computeSizeAndPublishResizeEvent();
46
+ var elementToObserve = rootRef.current;
47
+ if (typeof ResizeObserver === 'undefined') {
48
+ return function () {};
49
+ }
50
+ var observer = new ResizeObserver(function () {
51
+ apiRef.current.computeSizeAndPublishResizeEvent();
52
+ });
53
+ if (elementToObserve) {
54
+ observer.observe(elementToObserve);
55
+ }
56
+ return function () {
57
+ if (elementToObserve) {
58
+ observer.unobserve(elementToObserve);
59
+ }
60
+ };
61
+ }, [apiRef]);
44
62
  var disableVirtualization = React.useCallback(function () {
45
63
  setIsVirtualizationDisabled(true);
46
64
  }, []);
@@ -67,10 +85,9 @@ function GridBody(props) {
67
85
  columnHeadersElementRef: columnHeadersRef,
68
86
  virtualScrollerRef: virtualScrollerRef
69
87
  });
70
- var handleResize = React.useCallback(function (size) {
71
- apiRef.current.publishEvent('resize', size);
72
- }, [apiRef]);
88
+ var hasDimensions = !!apiRef.current.getRootDimensions();
73
89
  return /*#__PURE__*/_jsxs(GridMainContainer, {
90
+ ref: rootRef,
74
91
  children: [/*#__PURE__*/_jsx(rootProps.slots.columnHeaders, _extends({
75
92
  ref: columnsContainerRef,
76
93
  innerRef: columnHeadersRef,
@@ -88,15 +105,16 @@ function GridBody(props) {
88
105
  columnVisibility: columnVisibility,
89
106
  columnGroupsHeaderStructure: columnGroupsHeaderStructure,
90
107
  hasOtherElementInTabSequence: hasOtherElementInTabSequence
91
- }, ColumnHeadersProps)), /*#__PURE__*/_jsx(GridAutoSizer, {
92
- nonce: rootProps.nonce,
93
- disableHeight: rootProps.autoHeight,
94
- onResize: handleResize,
95
- children: /*#__PURE__*/_jsx(VirtualScrollerComponent, {
96
- ref: virtualScrollerRef,
97
- disableVirtualization: isVirtualizationDisabled
98
- })
99
- }), children]
108
+ }, ColumnHeadersProps)), hasDimensions && /*#__PURE__*/_jsx(VirtualScrollerComponent
109
+ // The content is only rendered after dimensions are computed because
110
+ // the lazy-loading hook is listening to `renderedRowsIntervalChange`,
111
+ // but only does something if the dimensions are also available.
112
+ // If this event is published while dimensions haven't been computed,
113
+ // the `onFetchRows` prop won't be called during mount.
114
+ , {
115
+ ref: virtualScrollerRef,
116
+ disableVirtualization: isVirtualizationDisabled
117
+ })]
100
118
  });
101
119
  }
102
120
  process.env.NODE_ENV !== "production" ? GridBody.propTypes = {
@@ -104,7 +122,6 @@ process.env.NODE_ENV !== "production" ? GridBody.propTypes = {
104
122
  // | These PropTypes are generated from the TypeScript type definitions |
105
123
  // | To update them edit the TypeScript types and run "yarn proptypes" |
106
124
  // ----------------------------------------------------------------------
107
- children: PropTypes.node,
108
125
  ColumnHeadersProps: PropTypes.object,
109
126
  VirtualScrollerComponent: PropTypes.elementType.isRequired
110
127
  } : void 0;
@@ -38,7 +38,7 @@ var GridCellCheckboxForwardRef = /*#__PURE__*/React.forwardRef(function GridCell
38
38
  };
39
39
  var classes = useUtilityClasses(ownerState);
40
40
  var checkboxElement = React.useRef(null);
41
- var rippleRef = React.useRef();
41
+ var rippleRef = React.useRef(null);
42
42
  var handleRef = useForkRef(checkboxElement, ref);
43
43
  var element = apiRef.current.getCellElement(id, field);
44
44
  var handleChange = function handleChange(event) {
@@ -26,12 +26,13 @@ var GridMainContainerRoot = styled('div', {
26
26
  overflow: 'hidden'
27
27
  };
28
28
  });
29
- export function GridMainContainer(props) {
29
+ export var GridMainContainer = /*#__PURE__*/React.forwardRef(function (props, ref) {
30
30
  var rootProps = useGridRootProps();
31
31
  var classes = useUtilityClasses(rootProps);
32
32
  return /*#__PURE__*/_jsx(GridMainContainerRoot, {
33
+ ref: ref,
33
34
  className: classes.root,
34
35
  ownerState: rootProps,
35
36
  children: props.children
36
37
  });
37
- }
38
+ });
@@ -54,11 +54,6 @@ var GridRoot = /*#__PURE__*/React.forwardRef(function GridRoot(props, ref) {
54
54
  useEnhancedEffect(function () {
55
55
  setMountedState(true);
56
56
  }, []);
57
- useEnhancedEffect(function () {
58
- if (mountedState) {
59
- apiRef.current.updateGridDimensionsRef();
60
- }
61
- }, [apiRef, mountedState]);
62
57
  if (!mountedState) {
63
58
  return null;
64
59
  }
@@ -8,7 +8,6 @@ export * from './menu';
8
8
  export * from './panel';
9
9
  export * from './toolbar';
10
10
  export * from './GridApiContext';
11
- export * from './GridAutoSizer';
12
11
  export * from './GridFooter';
13
12
  export * from './GridHeader';
14
13
  export * from './GridLoadingOverlay';
@@ -108,8 +108,9 @@ function GridColumnsPanel(props) {
108
108
  var toggleAllColumns = React.useCallback(function (isVisible) {
109
109
  var currentModel = gridColumnVisibilityModelSelector(apiRef);
110
110
  var newModel = _extends({}, currentModel);
111
+ var togglableColumns = getTogglableColumns ? getTogglableColumns(columns) : null;
111
112
  columns.forEach(function (col) {
112
- if (col.hideable) {
113
+ if (col.hideable && (togglableColumns == null || togglableColumns.includes(col.field))) {
113
114
  if (isVisible) {
114
115
  // delete the key from the model instead of setting it to `true`
115
116
  delete newModel[col.field];
@@ -119,7 +120,7 @@ function GridColumnsPanel(props) {
119
120
  }
120
121
  });
121
122
  return apiRef.current.setColumnVisibilityModel(newModel);
122
- }, [apiRef, columns]);
123
+ }, [apiRef, columns, getTogglableColumns]);
123
124
  var handleSearchValueChange = React.useCallback(function (event) {
124
125
  setSearchValue(event.target.value);
125
126
  }, []);
@@ -132,6 +132,7 @@ process.env.NODE_ENV !== "production" ? GridPanel.propTypes = {
132
132
  /**
133
133
  * If `true`, the component is shown.
134
134
  */
135
- open: PropTypes.bool.isRequired
135
+ open: PropTypes.bool.isRequired,
136
+ ownerState: PropTypes.object
136
137
  } : void 0;
137
138
  export { GridPanel };
@@ -3,11 +3,12 @@ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
4
4
  var _excluded = ["item", "applyValue", "apiRef", "focusElementRef"];
5
5
  import * as React from 'react';
6
+ import { unstable_useId as useId } from '@mui/utils';
6
7
  import { useGridRootProps } from '../../../hooks/utils/useGridRootProps';
7
8
  import { jsx as _jsx } from "react/jsx-runtime";
8
9
  import { jsxs as _jsxs } from "react/jsx-runtime";
9
10
  export function GridFilterInputBoolean(props) {
10
- var _rootProps$slotProps, _baseSelectProps$nati, _rootProps$slotProps2, _rootProps$slotProps3, _rootProps$slotProps4;
11
+ var _rootProps$slotProps, _baseSelectProps$nati, _rootProps$slotProps2, _rootProps$slotProps3;
11
12
  var item = props.item,
12
13
  applyValue = props.applyValue,
13
14
  apiRef = props.apiRef,
@@ -18,6 +19,8 @@ export function GridFilterInputBoolean(props) {
18
19
  filterValueState = _React$useState2[0],
19
20
  setFilterValueState = _React$useState2[1];
20
21
  var rootProps = useGridRootProps();
22
+ var labelId = useId();
23
+ var selectId = useId();
21
24
  var baseSelectProps = ((_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.baseSelect) || {};
22
25
  var isSelectNative = (_baseSelectProps$nati = baseSelectProps.native) != null ? _baseSelectProps$nati : true;
23
26
  var baseSelectOptionProps = ((_rootProps$slotProps2 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps2.baseSelectOption) || {};
@@ -31,34 +34,39 @@ export function GridFilterInputBoolean(props) {
31
34
  React.useEffect(function () {
32
35
  setFilterValueState(item.value || '');
33
36
  }, [item.value]);
34
- return /*#__PURE__*/_jsxs(rootProps.slots.baseTextField, _extends({
35
- // TODO: use baseSelect slot
36
- label: apiRef.current.getLocaleText('filterPanelInputLabel'),
37
- value: filterValueState,
38
- onChange: onFilterChange,
39
- select: true,
40
- variant: "standard",
41
- SelectProps: _extends({
37
+ var label = apiRef.current.getLocaleText('filterPanelInputLabel');
38
+ return /*#__PURE__*/_jsxs(React.Fragment, {
39
+ children: [/*#__PURE__*/_jsx(rootProps.slots.baseInputLabel, _extends({}, (_rootProps$slotProps3 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps3.baseInputLabel, {
40
+ id: labelId,
41
+ shrink: true,
42
+ variant: "standard",
43
+ children: label
44
+ })), /*#__PURE__*/_jsxs(rootProps.slots.baseSelect, _extends({
45
+ labelId: labelId,
46
+ id: selectId,
47
+ label: label,
48
+ value: filterValueState,
49
+ onChange: onFilterChange,
50
+ variant: "standard",
42
51
  native: isSelectNative,
43
- displayEmpty: true
44
- }, (_rootProps$slotProps3 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps3.baseSelect),
45
- InputLabelProps: {
46
- shrink: true
47
- },
48
- inputRef: focusElementRef
49
- }, others, (_rootProps$slotProps4 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps4.baseTextField, {
50
- children: [/*#__PURE__*/_jsx(rootProps.slots.baseSelectOption, _extends({}, baseSelectOptionProps, {
51
- native: isSelectNative,
52
- value: "",
53
- children: apiRef.current.getLocaleText('filterValueAny')
54
- })), /*#__PURE__*/_jsx(rootProps.slots.baseSelectOption, _extends({}, baseSelectOptionProps, {
55
- native: isSelectNative,
56
- value: "true",
57
- children: apiRef.current.getLocaleText('filterValueTrue')
58
- })), /*#__PURE__*/_jsx(rootProps.slots.baseSelectOption, _extends({}, baseSelectOptionProps, {
59
- native: isSelectNative,
60
- value: "false",
61
- children: apiRef.current.getLocaleText('filterValueFalse')
52
+ displayEmpty: true,
53
+ inputProps: {
54
+ ref: focusElementRef
55
+ }
56
+ }, others, baseSelectProps, {
57
+ children: [/*#__PURE__*/_jsx(rootProps.slots.baseSelectOption, _extends({}, baseSelectOptionProps, {
58
+ native: isSelectNative,
59
+ value: "",
60
+ children: apiRef.current.getLocaleText('filterValueAny')
61
+ })), /*#__PURE__*/_jsx(rootProps.slots.baseSelectOption, _extends({}, baseSelectOptionProps, {
62
+ native: isSelectNative,
63
+ value: "true",
64
+ children: apiRef.current.getLocaleText('filterValueTrue')
65
+ })), /*#__PURE__*/_jsx(rootProps.slots.baseSelectOption, _extends({}, baseSelectOptionProps, {
66
+ native: isSelectNative,
67
+ value: "false",
68
+ children: apiRef.current.getLocaleText('filterValueFalse')
69
+ }))]
62
70
  }))]
63
- }));
71
+ });
64
72
  }
@@ -10,6 +10,7 @@ import { useGridRootProps } from '../../../hooks/utils/useGridRootProps';
10
10
  import { getValueFromValueOptions, isSingleSelectColDef } from './filterPanelUtils';
11
11
  import { createElement as _createElement } from "react";
12
12
  import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { jsxs as _jsxs } from "react/jsx-runtime";
13
14
  var renderSingleSelectOptions = function renderSingleSelectOptions(_ref) {
14
15
  var _ref$column = _ref.column,
15
16
  valueOptions = _ref$column.valueOptions,
@@ -33,7 +34,7 @@ var renderSingleSelectOptions = function renderSingleSelectOptions(_ref) {
33
34
  });
34
35
  };
35
36
  function GridFilterInputSingleSelect(props) {
36
- var _item$value, _rootProps$slotProps, _baseSelectProps$nati, _rootProps$slotProps2, _resolvedColumn, _resolvedColumn2, _rootProps$slotProps3, _rootProps$slotProps4;
37
+ var _item$value, _rootProps$slotProps$, _rootProps$slotProps, _rootProps$slotProps$2, _resolvedColumn, _resolvedColumn2, _rootProps$slotProps2, _rootProps$slotProps3, _rootProps$slotProps4;
37
38
  var item = props.item,
38
39
  applyValue = props.applyValue,
39
40
  type = props.type,
@@ -47,10 +48,9 @@ function GridFilterInputSingleSelect(props) {
47
48
  filterValueState = _React$useState2[0],
48
49
  setFilterValueState = _React$useState2[1];
49
50
  var id = useId();
51
+ var labelId = useId();
50
52
  var rootProps = useGridRootProps();
51
- var baseSelectProps = ((_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.baseSelect) || {};
52
- var isSelectNative = (_baseSelectProps$nati = baseSelectProps.native) != null ? _baseSelectProps$nati : true;
53
- var baseSelectOptionProps = ((_rootProps$slotProps2 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps2.baseSelectOption) || {};
53
+ var isSelectNative = (_rootProps$slotProps$ = (_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : (_rootProps$slotProps$2 = _rootProps$slotProps.baseSelect) == null ? void 0 : _rootProps$slotProps$2.native) != null ? _rootProps$slotProps$ : true;
54
54
  var resolvedColumn = null;
55
55
  if (item.field) {
56
56
  var column = apiRef.current.getColumn(item.field);
@@ -102,33 +102,37 @@ function GridFilterInputSingleSelect(props) {
102
102
  if (!isSingleSelectColDef(resolvedColumn)) {
103
103
  return null;
104
104
  }
105
- return /*#__PURE__*/_jsx(rootProps.slots.baseTextField, _extends({
106
- // TODO: use baseSelect slot
107
- id: id,
108
- label: apiRef.current.getLocaleText('filterPanelInputLabel'),
109
- placeholder: apiRef.current.getLocaleText('filterPanelInputPlaceholder'),
110
- value: filterValueState,
111
- onChange: onFilterChange,
112
- variant: "standard",
113
- type: type || 'text',
114
- InputLabelProps: {
115
- shrink: true
116
- },
117
- inputRef: focusElementRef,
118
- select: true,
119
- SelectProps: _extends({
105
+ var label = apiRef.current.getLocaleText('filterPanelInputLabel');
106
+ return /*#__PURE__*/_jsxs(React.Fragment, {
107
+ children: [/*#__PURE__*/_jsx(rootProps.slots.baseInputLabel, _extends({}, (_rootProps$slotProps2 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps2.baseInputLabel, {
108
+ id: labelId,
109
+ shrink: true,
110
+ variant: "standard",
111
+ children: label
112
+ })), /*#__PURE__*/_jsx(rootProps.slots.baseSelect, _extends({
113
+ id: id,
114
+ label: label,
115
+ labelId: labelId,
116
+ value: filterValueState,
117
+ onChange: onFilterChange,
118
+ variant: "standard",
119
+ type: type || 'text',
120
+ inputProps: {
121
+ ref: focusElementRef,
122
+ placeholder: apiRef.current.getLocaleText('filterPanelInputPlaceholder')
123
+ },
120
124
  native: isSelectNative
121
- }, (_rootProps$slotProps3 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps3.baseSelect)
122
- }, others, (_rootProps$slotProps4 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps4.baseTextField, {
123
- children: renderSingleSelectOptions({
124
- column: resolvedColumn,
125
- OptionComponent: rootProps.slots.baseSelectOption,
126
- getOptionLabel: getOptionLabel,
127
- getOptionValue: getOptionValue,
128
- isSelectNative: isSelectNative,
129
- baseSelectOptionProps: baseSelectOptionProps
130
- })
131
- }));
125
+ }, others, (_rootProps$slotProps3 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps3.baseSelect, {
126
+ children: renderSingleSelectOptions({
127
+ column: resolvedColumn,
128
+ OptionComponent: rootProps.slots.baseSelectOption,
129
+ getOptionLabel: getOptionLabel,
130
+ getOptionValue: getOptionValue,
131
+ isSelectNative: isSelectNative,
132
+ baseSelectOptionProps: (_rootProps$slotProps4 = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps4.baseSelectOption
133
+ })
134
+ }))]
135
+ });
132
136
  }
133
137
  process.env.NODE_ENV !== "production" ? GridFilterInputSingleSelect.propTypes = {
134
138
  // ----------------------------- Warning --------------------------------
@@ -30,6 +30,7 @@ var GridFilterPanel = /*#__PURE__*/React.forwardRef(function GridFilterPanel(pro
30
30
  var filterModel = useGridSelector(apiRef, gridFilterModelSelector);
31
31
  var filterableColumns = useGridSelector(apiRef, gridFilterableColumnDefinitionsSelector);
32
32
  var lastFilterRef = React.useRef(null);
33
+ var placeholderFilter = React.useRef(null);
33
34
  var _props$logicOperators = props.logicOperators,
34
35
  logicOperators = _props$logicOperators === void 0 ? [GridLogicOperator.And, GridLogicOperator.Or] : _props$logicOperators,
35
36
  columnsSort = props.columnsSort,
@@ -100,8 +101,10 @@ var GridFilterPanel = /*#__PURE__*/React.forwardRef(function GridFilterPanel(pro
100
101
  if (filterModel.items.length) {
101
102
  return filterModel.items;
102
103
  }
103
- var defaultFilter = getDefaultFilter();
104
- return defaultFilter ? [defaultFilter] : [];
104
+ if (!placeholderFilter.current) {
105
+ placeholderFilter.current = getDefaultFilter();
106
+ }
107
+ return placeholderFilter.current ? [placeholderFilter.current] : [];
105
108
  }, [filterModel.items, getDefaultFilter]);
106
109
  var hasMultipleFilters = items.length > 1;
107
110
  var addNewFilter = function addNewFilter() {
@@ -1,5 +1,6 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
1
2
  import * as React from 'react';
2
- import { unstable_debounce as debounce, unstable_ownerDocument as ownerDocument, unstable_useEnhancedEffect as useEnhancedEffect } from '@mui/utils';
3
+ import { unstable_debounce as debounce, unstable_ownerDocument as ownerDocument, unstable_useEnhancedEffect as useEnhancedEffect, unstable_ownerWindow as ownerWindow } from '@mui/utils';
3
4
  import { useGridApiEventHandler, useGridApiOptionHandler } from '../../utils/useGridApiEventHandler';
4
5
  import { useGridApiMethod } from '../../utils/useGridApiMethod';
5
6
  import { useGridLogger } from '../../utils/useGridLogger';
@@ -10,6 +11,7 @@ import { getVisibleRows } from '../../utils/useGridVisibleRows';
10
11
  import { gridRowsMetaSelector } from '../rows/gridRowsMetaSelector';
11
12
  import { calculatePinnedRowsHeight } from '../rows/gridRowsUtils';
12
13
  import { getTotalHeaderHeight } from '../columns/gridColumnsUtils';
14
+ import { gridClasses } from '../../../constants/gridClasses';
13
15
  var isTestEnvironment = process.env.NODE_ENV === 'test';
14
16
  var hasScroll = function hasScroll(_ref) {
15
17
  var content = _ref.content,
@@ -113,10 +115,25 @@ export function useGridDimensions(apiRef, props) {
113
115
  apiRef.current.publishEvent('viewportInnerSizeChange', newFullDimensions.viewportInnerSize);
114
116
  }
115
117
  }, [apiRef, props.scrollbarSize, props.autoHeight, rowsMeta.currentPageTotalHeight, totalHeaderHeight]);
118
+ var _React$useState = React.useState(),
119
+ _React$useState2 = _slicedToArray(_React$useState, 2),
120
+ savedSize = _React$useState2[0],
121
+ setSavedSize = _React$useState2[1];
122
+ var debouncedSetSavedSize = React.useMemo(function () {
123
+ return debounce(setSavedSize, 60);
124
+ }, []);
125
+ var previousSize = React.useRef();
126
+ useEnhancedEffect(function () {
127
+ if (savedSize) {
128
+ updateGridDimensionsRef();
129
+ apiRef.current.publishEvent('debouncedResize', rootDimensionsRef.current);
130
+ }
131
+ }, [apiRef, savedSize, updateGridDimensionsRef]);
132
+
133
+ // This is the function called by apiRef.current.resize()
116
134
  var resize = React.useCallback(function () {
117
- updateGridDimensionsRef();
118
- apiRef.current.publishEvent('debouncedResize', rootDimensionsRef.current);
119
- }, [apiRef, updateGridDimensionsRef]);
135
+ apiRef.current.computeSizeAndPublishResizeEvent();
136
+ }, [apiRef]);
120
137
  var getRootDimensions = React.useCallback(function () {
121
138
  return fullDimensionsRef.current;
122
139
  }, []);
@@ -140,19 +157,45 @@ export function useGridDimensions(apiRef, props) {
140
157
  var maximumPageSizeWithoutScrollBar = Math.floor(dimensions.viewportInnerSize.height / rowHeight);
141
158
  return Math.min(maximumPageSizeWithoutScrollBar, currentPage.rows.length);
142
159
  }, [apiRef, props.pagination, props.paginationMode, props.getRowHeight, rowHeight]);
160
+ var computeSizeAndPublishResizeEvent = React.useCallback(function () {
161
+ var _apiRef$current$rootE2, _previousSize$current, _previousSize$current2;
162
+ var rootEl = (_apiRef$current$rootE2 = apiRef.current.rootElementRef) == null ? void 0 : _apiRef$current$rootE2.current;
163
+ var mainEl = rootEl == null ? void 0 : rootEl.querySelector(".".concat(gridClasses.main));
164
+ if (!mainEl) {
165
+ return;
166
+ }
167
+ var height = mainEl.offsetHeight || 0;
168
+ var width = mainEl.offsetWidth || 0;
169
+ var win = ownerWindow(mainEl);
170
+ var computedStyle = win.getComputedStyle(mainEl);
171
+ var paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
172
+ var paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
173
+ var paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
174
+ var paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
175
+ var newHeight = height - paddingTop - paddingBottom;
176
+ var newWidth = width - paddingLeft - paddingRight;
177
+ var hasHeightChanged = newHeight !== ((_previousSize$current = previousSize.current) == null ? void 0 : _previousSize$current.height);
178
+ var hasWidthChanged = newWidth !== ((_previousSize$current2 = previousSize.current) == null ? void 0 : _previousSize$current2.width);
179
+ if (!previousSize.current || hasHeightChanged || hasWidthChanged) {
180
+ var size = {
181
+ width: newWidth,
182
+ height: newHeight
183
+ };
184
+ apiRef.current.publishEvent('resize', size);
185
+ previousSize.current = size;
186
+ }
187
+ }, [apiRef]);
143
188
  var dimensionsApi = {
144
189
  resize: resize,
145
190
  getRootDimensions: getRootDimensions
146
191
  };
147
192
  var dimensionsPrivateApi = {
148
193
  getViewportPageSize: getViewportPageSize,
149
- updateGridDimensionsRef: updateGridDimensionsRef
194
+ updateGridDimensionsRef: updateGridDimensionsRef,
195
+ computeSizeAndPublishResizeEvent: computeSizeAndPublishResizeEvent
150
196
  };
151
197
  useGridApiMethod(apiRef, dimensionsApi, 'public');
152
198
  useGridApiMethod(apiRef, dimensionsPrivateApi, 'private');
153
- var debounceResize = React.useMemo(function () {
154
- return debounce(resize, 60);
155
- }, [resize]);
156
199
  var isFirstSizing = React.useRef(true);
157
200
  var handleResize = React.useCallback(function (size) {
158
201
  rootDimensionsRef.current = size;
@@ -169,18 +212,18 @@ export function useGridDimensions(apiRef, props) {
169
212
  }
170
213
  if (isTestEnvironment) {
171
214
  // We don't need to debounce the resize for tests.
172
- resize();
215
+ setSavedSize(size);
173
216
  isFirstSizing.current = false;
174
217
  return;
175
218
  }
176
219
  if (isFirstSizing.current) {
177
220
  // We want to initialize the grid dimensions as soon as possible to avoid flickering
178
- resize();
221
+ setSavedSize(size);
179
222
  isFirstSizing.current = false;
180
223
  return;
181
224
  }
182
- debounceResize();
183
- }, [props.autoHeight, debounceResize, logger, resize]);
225
+ debouncedSetSavedSize(size);
226
+ }, [props.autoHeight, debouncedSetSavedSize, logger]);
184
227
  useEnhancedEffect(function () {
185
228
  return updateGridDimensionsRef();
186
229
  }, [updateGridDimensionsRef]);
@@ -132,7 +132,9 @@ export var useGridPrintExport = function useGridPrintExport(apiRef, props) {
132
132
  (_printDoc$body$classL = printDoc.body.classList).add.apply(_printDoc$body$classL, _toConsumableArray(normalizeOptions.bodyClassName.split(' ')));
133
133
  }
134
134
  if (normalizeOptions.copyStyles) {
135
- var headStyleElements = doc.current.querySelectorAll("style, link[rel='stylesheet']");
135
+ var rootCandidate = gridRootElement.getRootNode();
136
+ var root = rootCandidate.constructor.name === 'ShadowRoot' ? rootCandidate : doc.current;
137
+ var headStyleElements = root.querySelectorAll("style, link[rel='stylesheet']");
136
138
  for (var i = 0; i < headStyleElements.length; i += 1) {
137
139
  var node = headStyleElements[i];
138
140
  if (node.tagName === 'STYLE') {