@mui/x-data-grid 7.0.0-beta.7 → 7.1.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 (203) hide show
  1. package/CHANGELOG.md +266 -12
  2. package/DataGrid/DataGrid.js +18 -17
  3. package/DataGrid/useDataGridProps.js +4 -5
  4. package/README.md +1 -1
  5. package/components/GridFooter.js +2 -3
  6. package/components/GridHeader.js +1 -2
  7. package/components/GridPagination.d.ts +6 -5
  8. package/components/GridPagination.js +12 -4
  9. package/components/GridRow.js +13 -17
  10. package/components/base/GridFooterPlaceholder.js +1 -2
  11. package/components/base/GridOverlays.js +3 -6
  12. package/components/cell/GridActionsCell.js +4 -6
  13. package/components/cell/GridActionsCellItem.d.ts +8 -25
  14. package/components/cell/GridActionsCellItem.js +8 -5
  15. package/components/cell/GridBooleanCell.d.ts +1 -0
  16. package/components/cell/GridBooleanCell.js +3 -2
  17. package/components/cell/GridCell.js +7 -8
  18. package/components/cell/GridEditBooleanCell.js +1 -2
  19. package/components/cell/GridEditDateCell.js +2 -3
  20. package/components/cell/GridEditInputCell.js +2 -2
  21. package/components/cell/GridEditSingleSelectCell.js +5 -8
  22. package/components/columnHeaders/ColumnHeaderMenuIcon.js +2 -3
  23. package/components/columnHeaders/GridColumnGroupHeader.js +4 -5
  24. package/components/columnHeaders/GridColumnHeaderFilterIconButton.js +2 -3
  25. package/components/columnHeaders/GridColumnHeaderItem.js +8 -7
  26. package/components/columnHeaders/GridColumnHeaderSortIcon.js +1 -2
  27. package/components/columnHeaders/GridColumnHeaderTitle.js +2 -3
  28. package/components/columnHeaders/GridGenericColumnHeaderItem.js +4 -2
  29. package/components/columnSelection/GridCellCheckboxRenderer.js +3 -5
  30. package/components/columnSelection/GridHeaderCheckbox.js +1 -2
  31. package/components/columnsManagement/GridColumnsManagement.js +17 -21
  32. package/components/containers/GridRoot.js +3 -3
  33. package/components/menu/GridMenu.js +4 -6
  34. package/components/menu/columnMenu/GridColumnHeaderMenu.js +1 -1
  35. package/components/menu/columnMenu/menuItems/GridColumnMenuSortItem.js +2 -3
  36. package/components/panel/GridColumnsPanel.js +1 -2
  37. package/components/panel/GridPanel.d.ts +1 -10
  38. package/components/panel/GridPanel.js +1 -2
  39. package/components/panel/GridPreferencesPanel.js +2 -3
  40. package/components/panel/filterPanel/GridFilterForm.js +24 -27
  41. package/components/panel/filterPanel/GridFilterInputBoolean.d.ts +1 -1
  42. package/components/panel/filterPanel/GridFilterInputBoolean.js +6 -7
  43. package/components/panel/filterPanel/GridFilterInputDate.d.ts +1 -1
  44. package/components/panel/filterPanel/GridFilterInputDate.js +3 -4
  45. package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +11 -15
  46. package/components/panel/filterPanel/GridFilterInputMultipleValue.js +10 -14
  47. package/components/panel/filterPanel/GridFilterInputSingleSelect.d.ts +1 -1
  48. package/components/panel/filterPanel/GridFilterInputSingleSelect.js +10 -11
  49. package/components/panel/filterPanel/GridFilterInputValue.d.ts +1 -1
  50. package/components/panel/filterPanel/GridFilterInputValue.js +5 -7
  51. package/components/panel/filterPanel/GridFilterPanel.js +5 -9
  52. package/components/panel/filterPanel/filterPanelUtils.js +1 -1
  53. package/components/toolbar/GridToolbarColumnsButton.js +3 -5
  54. package/components/toolbar/GridToolbarDensitySelector.js +8 -10
  55. package/components/toolbar/GridToolbarExport.js +2 -2
  56. package/components/toolbar/GridToolbarExportContainer.js +3 -5
  57. package/components/toolbar/GridToolbarFilterButton.js +3 -5
  58. package/components/toolbar/GridToolbarQuickFilter.js +21 -7
  59. package/components/virtualization/GridVirtualScrollerContent.js +1 -2
  60. package/components/virtualization/GridVirtualScrollerRenderZone.js +1 -2
  61. package/hooks/core/strategyProcessing/useGridStrategyProcessing.js +1 -2
  62. package/hooks/core/useGridApiInitialization.js +4 -6
  63. package/hooks/features/clipboard/useGridClipboard.js +6 -5
  64. package/hooks/features/columnGrouping/gridColumnGroupsSelector.js +4 -16
  65. package/hooks/features/columnGrouping/gridColumnGroupsUtils.js +4 -8
  66. package/hooks/features/columnGrouping/useGridColumnGrouping.js +12 -23
  67. package/hooks/features/columnHeaders/useGridColumnHeaders.js +6 -8
  68. package/hooks/features/columnMenu/useGridColumnMenuSlots.js +2 -2
  69. package/hooks/features/columnResize/useGridColumnResize.js +9 -19
  70. package/hooks/features/columns/gridColumnsSelector.js +1 -2
  71. package/hooks/features/columns/gridColumnsUtils.d.ts +0 -9
  72. package/hooks/features/columns/gridColumnsUtils.js +2 -22
  73. package/hooks/features/columns/useGridColumnSpanning.js +1 -2
  74. package/hooks/features/columns/useGridColumns.js +11 -19
  75. package/hooks/features/density/densitySelector.d.ts +4 -2
  76. package/hooks/features/density/densitySelector.js +8 -2
  77. package/hooks/features/density/densityState.d.ts +1 -4
  78. package/hooks/features/density/useGridDensity.d.ts +2 -4
  79. package/hooks/features/density/useGridDensity.js +21 -29
  80. package/hooks/features/dimensions/useGridDimensions.d.ts +1 -1
  81. package/hooks/features/dimensions/useGridDimensions.js +6 -7
  82. package/hooks/features/editing/useGridCellEditing.js +4 -6
  83. package/hooks/features/editing/useGridEditing.js +1 -2
  84. package/hooks/features/editing/useGridRowEditing.js +17 -10
  85. package/hooks/features/export/serializers/csvSerializer.d.ts +2 -0
  86. package/hooks/features/export/serializers/csvSerializer.js +25 -16
  87. package/hooks/features/export/useGridCsvExport.js +9 -10
  88. package/hooks/features/export/useGridPrintExport.js +9 -15
  89. package/hooks/features/export/utils.js +2 -3
  90. package/hooks/features/filter/gridFilterSelector.js +15 -22
  91. package/hooks/features/filter/gridFilterUtils.js +10 -16
  92. package/hooks/features/filter/useGridFilter.js +9 -15
  93. package/hooks/features/focus/useGridFocus.js +5 -6
  94. package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.js +1 -4
  95. package/hooks/features/headerFiltering/useGridHeaderFiltering.js +12 -17
  96. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +1 -2
  97. package/hooks/features/pagination/gridPaginationSelector.js +1 -2
  98. package/hooks/features/pagination/useGridPagination.js +2 -3
  99. package/hooks/features/pagination/useGridPaginationModel.js +6 -11
  100. package/hooks/features/pagination/useGridRowCount.js +3 -6
  101. package/hooks/features/preferencesPanel/useGridPreferencesPanel.js +7 -12
  102. package/hooks/features/rowSelection/useGridRowSelection.js +11 -16
  103. package/hooks/features/rows/gridRowsSelector.js +11 -19
  104. package/hooks/features/rows/gridRowsUtils.js +7 -9
  105. package/hooks/features/rows/useGridParamsApi.js +1 -1
  106. package/hooks/features/rows/useGridRows.js +4 -13
  107. package/hooks/features/rows/useGridRowsMeta.js +7 -13
  108. package/hooks/features/scroll/useGridScroll.js +2 -3
  109. package/hooks/features/sorting/gridSortingSelector.js +4 -7
  110. package/hooks/features/sorting/useGridSorting.js +8 -14
  111. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
  112. package/hooks/features/virtualization/useGridVirtualScroller.js +220 -71
  113. package/hooks/utils/useGridApiEventHandler.js +5 -10
  114. package/hooks/utils/useGridNativeEventListener.js +1 -2
  115. package/index.js +1 -1
  116. package/internals/index.d.ts +2 -0
  117. package/internals/index.js +1 -0
  118. package/internals/utils/useProps.js +1 -2
  119. package/joy/joySlots.js +7 -13
  120. package/models/api/gridRowsMetaApi.d.ts +1 -1
  121. package/models/api/index.d.ts +1 -1
  122. package/models/api/index.js +0 -1
  123. package/models/events/gridEventLookup.d.ts +7 -0
  124. package/models/gridExport.d.ts +6 -0
  125. package/models/gridStateCommunity.d.ts +1 -0
  126. package/models/props/DataGridProps.d.ts +26 -25
  127. package/modern/DataGrid/DataGrid.js +18 -17
  128. package/modern/DataGrid/useDataGridProps.js +4 -5
  129. package/modern/components/GridPagination.js +11 -2
  130. package/modern/components/cell/GridActionsCell.js +1 -1
  131. package/modern/components/cell/GridActionsCellItem.js +4 -0
  132. package/modern/components/cell/GridBooleanCell.js +3 -2
  133. package/modern/components/columnHeaders/GridColumnHeaderItem.js +3 -1
  134. package/modern/components/columnHeaders/GridGenericColumnHeaderItem.js +3 -1
  135. package/modern/components/containers/GridRoot.js +3 -3
  136. package/modern/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  137. package/modern/components/panel/filterPanel/GridFilterInputDate.js +1 -1
  138. package/modern/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  139. package/modern/components/panel/filterPanel/GridFilterInputValue.js +1 -1
  140. package/modern/components/toolbar/GridToolbarDensitySelector.js +5 -5
  141. package/modern/components/toolbar/GridToolbarQuickFilter.js +17 -2
  142. package/modern/hooks/features/clipboard/useGridClipboard.js +4 -2
  143. package/modern/hooks/features/columnResize/useGridColumnResize.js +1 -1
  144. package/modern/hooks/features/columns/gridColumnsUtils.js +0 -19
  145. package/modern/hooks/features/density/densitySelector.js +8 -2
  146. package/modern/hooks/features/density/useGridDensity.js +21 -29
  147. package/modern/hooks/features/dimensions/useGridDimensions.js +3 -2
  148. package/modern/hooks/features/editing/useGridCellEditing.js +1 -1
  149. package/modern/hooks/features/editing/useGridRowEditing.js +14 -5
  150. package/modern/hooks/features/export/serializers/csvSerializer.js +23 -12
  151. package/modern/hooks/features/export/useGridCsvExport.js +2 -1
  152. package/modern/hooks/features/filter/gridFilterUtils.js +1 -1
  153. package/modern/hooks/features/rowSelection/useGridRowSelection.js +3 -2
  154. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
  155. package/modern/index.js +1 -1
  156. package/modern/internals/index.js +1 -0
  157. package/modern/models/api/index.js +0 -1
  158. package/modern/utils/createSelector.js +1 -1
  159. package/modern/utils/domUtils.js +1 -1
  160. package/modern/utils/keyboardUtils.js +1 -1
  161. package/modern/utils/throttle.js +19 -0
  162. package/node/DataGrid/DataGrid.js +18 -17
  163. package/node/DataGrid/useDataGridProps.js +4 -5
  164. package/node/components/GridPagination.js +9 -1
  165. package/node/components/cell/GridActionsCell.js +1 -1
  166. package/node/components/cell/GridActionsCellItem.js +4 -0
  167. package/node/components/cell/GridBooleanCell.js +3 -2
  168. package/node/components/columnHeaders/GridColumnHeaderItem.js +3 -1
  169. package/node/components/columnHeaders/GridGenericColumnHeaderItem.js +3 -1
  170. package/node/components/containers/GridRoot.js +2 -2
  171. package/node/components/panel/filterPanel/GridFilterInputBoolean.js +1 -1
  172. package/node/components/panel/filterPanel/GridFilterInputDate.js +1 -1
  173. package/node/components/panel/filterPanel/GridFilterInputSingleSelect.js +1 -1
  174. package/node/components/panel/filterPanel/GridFilterInputValue.js +1 -1
  175. package/node/components/toolbar/GridToolbarDensitySelector.js +4 -4
  176. package/node/components/toolbar/GridToolbarQuickFilter.js +17 -2
  177. package/node/hooks/features/clipboard/useGridClipboard.js +4 -2
  178. package/node/hooks/features/columnResize/useGridColumnResize.js +1 -1
  179. package/node/hooks/features/columns/gridColumnsUtils.js +0 -20
  180. package/node/hooks/features/density/densitySelector.js +9 -3
  181. package/node/hooks/features/density/useGridDensity.js +22 -30
  182. package/node/hooks/features/dimensions/useGridDimensions.js +2 -1
  183. package/node/hooks/features/editing/useGridCellEditing.js +1 -1
  184. package/node/hooks/features/editing/useGridRowEditing.js +14 -5
  185. package/node/hooks/features/export/serializers/csvSerializer.js +23 -12
  186. package/node/hooks/features/export/useGridCsvExport.js +2 -1
  187. package/node/hooks/features/filter/gridFilterUtils.js +1 -1
  188. package/node/hooks/features/rowSelection/useGridRowSelection.js +2 -1
  189. package/node/hooks/features/virtualization/useGridVirtualScroller.js +211 -57
  190. package/node/index.js +1 -1
  191. package/node/internals/index.js +12 -0
  192. package/node/models/api/index.js +0 -11
  193. package/node/utils/createSelector.js +1 -1
  194. package/node/utils/domUtils.js +1 -1
  195. package/node/utils/keyboardUtils.js +1 -1
  196. package/node/utils/throttle.js +25 -0
  197. package/package.json +4 -4
  198. package/utils/createSelector.js +9 -9
  199. package/utils/domUtils.js +4 -7
  200. package/utils/getGridLocalization.js +9 -12
  201. package/utils/keyboardUtils.js +1 -1
  202. package/utils/throttle.d.ts +4 -0
  203. package/utils/throttle.js +19 -0
@@ -137,7 +137,7 @@ function GridActionsCell(props) {
137
137
  }
138
138
  if (newIndex !== focusedButtonIndex) {
139
139
  event.preventDefault(); // Prevent scrolling
140
- event.stopPropagation(); // Don't stop propagation for other keys, e.g. ArrowUp
140
+ event.stopPropagation(); // Don't stop propagation for other keys, for example ArrowUp
141
141
  setFocusedButtonIndex(newIndex);
142
142
  }
143
143
  };
@@ -70,6 +70,10 @@ process.env.NODE_ENV !== "production" ? GridActionsCellItem.propTypes = {
70
70
  // | These PropTypes are generated from the TypeScript type definitions |
71
71
  // | To update them edit the TypeScript types and run "yarn proptypes" |
72
72
  // ----------------------------------------------------------------------
73
+ /**
74
+ * from https://mui.com/material-ui/api/button-base/#ButtonBase-prop-component
75
+ */
76
+ component: _propTypes.default.elementType,
73
77
  icon: _propTypes.default.element,
74
78
  label: _propTypes.default.string.isRequired,
75
79
  showInMenu: _propTypes.default.bool
@@ -15,7 +15,7 @@ var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
15
15
  var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
16
16
  var _gridRowsUtils = require("../../hooks/features/rows/gridRowsUtils");
17
17
  var _jsxRuntime = require("react/jsx-runtime");
18
- const _excluded = ["id", "value", "formattedValue", "api", "field", "row", "rowNode", "colDef", "cellMode", "isEditable", "hasFocus", "tabIndex"];
18
+ const _excluded = ["id", "value", "formattedValue", "api", "field", "row", "rowNode", "colDef", "cellMode", "isEditable", "hasFocus", "tabIndex", "hideDescendantCount"];
19
19
  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); }
20
20
  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 && Object.prototype.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; }
21
21
  const useUtilityClasses = ownerState => {
@@ -85,6 +85,7 @@ process.env.NODE_ENV !== "production" ? GridBooleanCellRaw.propTypes = {
85
85
  * If true, the cell is the active element.
86
86
  */
87
87
  hasFocus: _propTypes.default.bool.isRequired,
88
+ hideDescendantCount: _propTypes.default.bool,
88
89
  /**
89
90
  * The grid row id.
90
91
  */
@@ -113,7 +114,7 @@ process.env.NODE_ENV !== "production" ? GridBooleanCellRaw.propTypes = {
113
114
  } : void 0;
114
115
  const GridBooleanCell = exports.GridBooleanCell = /*#__PURE__*/React.memo(GridBooleanCellRaw);
115
116
  const renderBooleanCell = params => {
116
- if ((0, _gridRowsUtils.isAutoGeneratedRow)(params.rowNode)) {
117
+ if (params.field !== '__row_group_by_columns_group__' && (0, _gridRowsUtils.isAutoGeneratedRow)(params.rowNode)) {
117
118
  return '';
118
119
  }
119
120
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridBooleanCell, (0, _extends2.default)({}, params));
@@ -161,7 +161,9 @@ function GridColumnHeaderItem(props) {
161
161
  const focusableElement = headerCellRef.current.querySelector('[tabindex="0"]');
162
162
  const elementToFocus = focusableElement || headerCellRef.current;
163
163
  elementToFocus?.focus();
164
- apiRef.current.columnHeadersContainerRef.current.scrollLeft = 0;
164
+ if (apiRef.current.columnHeadersContainerRef?.current) {
165
+ apiRef.current.columnHeadersContainerRef.current.scrollLeft = 0;
166
+ }
165
167
  }
166
168
  }, [apiRef, hasFocus]);
167
169
  const headerClassName = typeof colDef.headerClassName === 'function' ? colDef.headerClassName({
@@ -64,7 +64,9 @@ const GridGenericColumnHeaderItem = exports.GridGenericColumnHeaderItem = /*#__P
64
64
  const focusableElement = headerCellRef.current.querySelector('[tabindex="0"]');
65
65
  const elementToFocus = focusableElement || headerCellRef.current;
66
66
  elementToFocus?.focus();
67
- apiRef.current.columnHeadersContainerRef.current.scrollLeft = 0;
67
+ if (apiRef.current.columnHeadersContainerRef?.current) {
68
+ apiRef.current.columnHeadersContainerRef.current.scrollLeft = 0;
69
+ }
68
70
  }
69
71
  }, [apiRef, hasFocus]);
70
72
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", (0, _extends2.default)({
@@ -47,11 +47,11 @@ const GridRoot = exports.GridRoot = /*#__PURE__*/React.forwardRef(function GridR
47
47
  } = props,
48
48
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
49
49
  const apiRef = (0, _useGridPrivateApiContext.useGridPrivateApiContext)();
50
- const densityValue = (0, _useGridSelector.useGridSelector)(apiRef, _densitySelector.gridDensityValueSelector);
50
+ const density = (0, _useGridSelector.useGridSelector)(apiRef, _densitySelector.gridDensitySelector);
51
51
  const rootElementRef = apiRef.current.rootElementRef;
52
52
  const handleRef = (0, _utils.unstable_useForkRef)(rootElementRef, ref);
53
53
  const ownerState = (0, _extends2.default)({}, rootProps, {
54
- density: densityValue
54
+ density
55
55
  });
56
56
  const classes = useUtilityClasses(ownerState);
57
57
 
@@ -107,7 +107,7 @@ process.env.NODE_ENV !== "production" ? GridFilterInputBoolean.propTypes = {
107
107
  focusElementRef: _utils.refType,
108
108
  /**
109
109
  * It is `true` if the filter either has a value or an operator with no value
110
- * required is selected (e.g. `isEmpty`)
110
+ * required is selected (for example `isEmpty`)
111
111
  */
112
112
  isFilterActive: _propTypes.default.bool,
113
113
  item: _propTypes.default.shape({
@@ -108,7 +108,7 @@ process.env.NODE_ENV !== "production" ? GridFilterInputDate.propTypes = {
108
108
  focusElementRef: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.func, _propTypes.default.object]),
109
109
  /**
110
110
  * It is `true` if the filter either has a value or an operator with no value
111
- * required is selected (e.g. `isEmpty`)
111
+ * required is selected (for example `isEmpty`)
112
112
  */
113
113
  isFilterActive: _propTypes.default.bool,
114
114
  item: _propTypes.default.shape({
@@ -142,7 +142,7 @@ process.env.NODE_ENV !== "production" ? GridFilterInputSingleSelect.propTypes =
142
142
  focusElementRef: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.func, _propTypes.default.object]),
143
143
  /**
144
144
  * It is `true` if the filter either has a value or an operator with no value
145
- * required is selected (e.g. `isEmpty`)
145
+ * required is selected (for example `isEmpty`)
146
146
  */
147
147
  isFilterActive: _propTypes.default.bool,
148
148
  item: _propTypes.default.shape({
@@ -95,7 +95,7 @@ process.env.NODE_ENV !== "production" ? GridFilterInputValue.propTypes = {
95
95
  focusElementRef: _propTypes.default /* @typescript-to-proptypes-ignore */.oneOfType([_propTypes.default.func, _propTypes.default.object]),
96
96
  /**
97
97
  * It is `true` if the filter either has a value or an operator with no value
98
- * required is selected (e.g. `isEmpty`)
98
+ * required is selected (for example `isEmpty`)
99
99
  */
100
100
  isFilterActive: _propTypes.default.bool,
101
101
  item: _propTypes.default.shape({
@@ -30,7 +30,7 @@ const GridToolbarDensitySelector = exports.GridToolbarDensitySelector = /*#__PUR
30
30
  const tooltipProps = slotProps.tooltip || {};
31
31
  const apiRef = (0, _useGridApiContext.useGridApiContext)();
32
32
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
33
- const densityValue = (0, _useGridSelector.useGridSelector)(apiRef, _densitySelector.gridDensityValueSelector);
33
+ const density = (0, _useGridSelector.useGridSelector)(apiRef, _densitySelector.gridDensitySelector);
34
34
  const densityButtonId = (0, _utils.unstable_useId)();
35
35
  const densityMenuId = (0, _utils.unstable_useId)();
36
36
  const [open, setOpen] = React.useState(false);
@@ -50,7 +50,7 @@ const GridToolbarDensitySelector = exports.GridToolbarDensitySelector = /*#__PUR
50
50
  value: 'comfortable'
51
51
  }];
52
52
  const startIcon = React.useMemo(() => {
53
- switch (densityValue) {
53
+ switch (density) {
54
54
  case 'compact':
55
55
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.densityCompactIcon, {});
56
56
  case 'comfortable':
@@ -58,7 +58,7 @@ const GridToolbarDensitySelector = exports.GridToolbarDensitySelector = /*#__PUR
58
58
  default:
59
59
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.densityStandardIcon, {});
60
60
  }
61
- }, [densityValue, rootProps]);
61
+ }, [density, rootProps]);
62
62
  const handleDensitySelectorOpen = event => {
63
63
  setOpen(prevOpen => !prevOpen);
64
64
  buttonProps.onClick?.(event);
@@ -85,7 +85,7 @@ const GridToolbarDensitySelector = exports.GridToolbarDensitySelector = /*#__PUR
85
85
  }
86
86
  const densityElements = densityOptions.map((option, index) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
87
87
  onClick: () => handleDensityUpdate(option.value),
88
- selected: option.value === densityValue,
88
+ selected: option.value === density,
89
89
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemIcon.default, {
90
90
  children: option.icon
91
91
  }), option.label]
@@ -8,19 +8,31 @@ exports.GridToolbarQuickFilter = GridToolbarQuickFilter;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
10
10
  var React = _interopRequireWildcard(require("react"));
11
+ var _clsx = _interopRequireDefault(require("clsx"));
11
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
13
  var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
13
14
  var _styles = require("@mui/material/styles");
14
15
  var _utils = require("@mui/utils");
16
+ var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
17
+ var _constants = require("../../constants");
15
18
  var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
16
19
  var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
17
20
  var _useGridSelector = require("../../hooks/utils/useGridSelector");
18
21
  var _filter = require("../../hooks/features/filter");
19
22
  var _utils2 = require("../../utils/utils");
20
23
  var _jsxRuntime = require("react/jsx-runtime");
21
- const _excluded = ["quickFilterParser", "quickFilterFormatter", "debounceMs"];
24
+ const _excluded = ["quickFilterParser", "quickFilterFormatter", "debounceMs", "className"];
22
25
  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); }
23
26
  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 && Object.prototype.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; }
27
+ const useUtilityClasses = ownerState => {
28
+ const {
29
+ classes
30
+ } = ownerState;
31
+ const slots = {
32
+ root: ['toolbarQuickFilter']
33
+ };
34
+ return (0, _composeClasses.default)(slots, _constants.getDataGridUtilityClass, classes);
35
+ };
24
36
  const GridToolbarQuickFilterRoot = (0, _styles.styled)(_TextField.default, {
25
37
  name: 'MuiDataGrid',
26
38
  slot: 'ToolbarQuickFilter',
@@ -56,11 +68,13 @@ const defaultSearchValueFormatter = values => values.join(' ');
56
68
  function GridToolbarQuickFilter(props) {
57
69
  const apiRef = (0, _useGridApiContext.useGridApiContext)();
58
70
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
71
+ const classes = useUtilityClasses(rootProps);
59
72
  const quickFilterValues = (0, _useGridSelector.useGridSelector)(apiRef, _filter.gridQuickFilterValuesSelector);
60
73
  const {
61
74
  quickFilterParser = defaultSearchValueParser,
62
75
  quickFilterFormatter = defaultSearchValueFormatter,
63
- debounceMs = rootProps.filterDebounceMs
76
+ debounceMs = rootProps.filterDebounceMs,
77
+ className
64
78
  } = props,
65
79
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
66
80
  const [searchValue, setSearchValue] = React.useState(() => quickFilterFormatter(quickFilterValues ?? []));
@@ -95,6 +109,7 @@ function GridToolbarQuickFilter(props) {
95
109
  variant: "standard",
96
110
  value: searchValue,
97
111
  onChange: handleSearchValueChange,
112
+ className: (0, _clsx.default)(className, classes.root),
98
113
  placeholder: apiRef.current.getLocaleText('toolbarQuickFilterPlaceholder'),
99
114
  "aria-label": apiRef.current.getLocaleText('toolbarQuickFilterLabel'),
100
115
  type: "search"
@@ -75,7 +75,8 @@ const useGridClipboard = (apiRef, props) => {
75
75
  textToCopy = apiRef.current.getDataAsCsv({
76
76
  includeHeaders: false,
77
77
  // TODO: make it configurable
78
- delimiter: clipboardCopyCellDelimiter
78
+ delimiter: clipboardCopyCellDelimiter,
79
+ shouldAppendQuotes: false
79
80
  });
80
81
  } else {
81
82
  const focusedCell = (0, _gridFocusStateSelector.gridFocusCellSelector)(apiRef);
@@ -83,7 +84,8 @@ const useGridClipboard = (apiRef, props) => {
83
84
  const cellParams = apiRef.current.getCellParams(focusedCell.id, focusedCell.field);
84
85
  textToCopy = (0, _csvSerializer.serializeCellValue)(cellParams, {
85
86
  delimiterCharacter: clipboardCopyCellDelimiter,
86
- ignoreValueFormatter
87
+ ignoreValueFormatter,
88
+ shouldAppendQuotes: false
87
89
  });
88
90
  }
89
91
  }
@@ -135,7 +135,7 @@ function excludeOutliers(inputValues, factor) {
135
135
  const iqr = q3 - q1;
136
136
 
137
137
  // We make a small adjustment if `iqr < 5` for the cases where the IQR is
138
- // very small (e.g. zero) due to very close by values in the input data.
138
+ // very small (for example zero) due to very close by values in the input data.
139
139
  // Otherwise, with an IQR of `0`, anything outside that would be considered
140
140
  // an outlier, but it makes more sense visually to allow for this 5px variance
141
141
  // rather than showing a cropped cell.
@@ -7,7 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.applyInitialState = exports.COLUMNS_DIMENSION_PROPERTIES = void 0;
8
8
  exports.computeFlexColumnsWidth = computeFlexColumnsWidth;
9
9
  exports.createColumnsState = void 0;
10
- exports.getFirstColumnIndexToRender = getFirstColumnIndexToRender;
11
10
  exports.getFirstNonSpannedColumnToRender = getFirstNonSpannedColumnToRender;
12
11
  exports.getTotalHeaderHeight = getTotalHeaderHeight;
13
12
  exports.hydrateColumnsWidth = void 0;
@@ -320,25 +319,6 @@ function getFirstNonSpannedColumnToRender({
320
319
  }
321
320
  return firstNonSpannedColumnToRender;
322
321
  }
323
- function getFirstColumnIndexToRender({
324
- firstColumnIndex,
325
- minColumnIndex,
326
- columnBuffer,
327
- firstRowToRender,
328
- lastRowToRender,
329
- apiRef,
330
- visibleRows
331
- }) {
332
- const initialFirstColumnToRender = Math.max(firstColumnIndex - columnBuffer, minColumnIndex);
333
- const firstColumnToRender = getFirstNonSpannedColumnToRender({
334
- firstColumnToRender: initialFirstColumnToRender,
335
- apiRef,
336
- firstRowToRender,
337
- lastRowToRender,
338
- visibleRows
339
- });
340
- return firstColumnToRender;
341
- }
342
322
  function getTotalHeaderHeight(apiRef, headerHeight) {
343
323
  const densityFactor = (0, _densitySelector.gridDensityFactorSelector)(apiRef);
344
324
  const maxDepth = (0, _gridColumnGroupsSelector.gridColumnGroupsHeaderMaxDepthSelector)(apiRef);
@@ -3,9 +3,15 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.gridDensityValueSelector = exports.gridDensitySelector = exports.gridDensityFactorSelector = void 0;
6
+ exports.gridDensitySelector = exports.gridDensityFactorSelector = exports.COMPACT_DENSITY_FACTOR = exports.COMFORTABLE_DENSITY_FACTOR = void 0;
7
7
  var _createSelector = require("../../../utils/createSelector");
8
+ const COMPACT_DENSITY_FACTOR = exports.COMPACT_DENSITY_FACTOR = 0.7;
9
+ const COMFORTABLE_DENSITY_FACTOR = exports.COMFORTABLE_DENSITY_FACTOR = 1.3;
10
+ const DENSITY_FACTORS = {
11
+ compact: COMPACT_DENSITY_FACTOR,
12
+ comfortable: COMFORTABLE_DENSITY_FACTOR,
13
+ standard: 1
14
+ };
8
15
  const gridDensitySelector = state => state.density;
9
16
  exports.gridDensitySelector = gridDensitySelector;
10
- const gridDensityValueSelector = exports.gridDensityValueSelector = (0, _createSelector.createSelector)(gridDensitySelector, density => density.value);
11
- const gridDensityFactorSelector = exports.gridDensityFactorSelector = (0, _createSelector.createSelector)(gridDensitySelector, density => density.factor);
17
+ const gridDensityFactorSelector = exports.gridDensityFactorSelector = (0, _createSelector.createSelector)(gridDensitySelector, density => DENSITY_FACTORS[density]);
@@ -4,50 +4,42 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useGridDensity = exports.densityStateInitializer = exports.COMPACT_DENSITY_FACTOR = exports.COMFORTABLE_DENSITY_FACTOR = void 0;
7
+ exports.useGridDensity = exports.densityStateInitializer = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var React = _interopRequireWildcard(require("react"));
10
+ var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
10
11
  var _useGridLogger = require("../../utils/useGridLogger");
11
12
  var _useGridApiMethod = require("../../utils/useGridApiMethod");
12
13
  var _densitySelector = require("./densitySelector");
13
- var _utils = require("../../../utils/utils");
14
14
  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); }
15
15
  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 && Object.prototype.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; }
16
- const COMPACT_DENSITY_FACTOR = exports.COMPACT_DENSITY_FACTOR = 0.7;
17
- const COMFORTABLE_DENSITY_FACTOR = exports.COMFORTABLE_DENSITY_FACTOR = 1.3;
18
- const DENSITY_FACTORS = {
19
- compact: COMPACT_DENSITY_FACTOR,
20
- comfortable: COMFORTABLE_DENSITY_FACTOR,
21
- standard: 1
22
- };
23
16
  const densityStateInitializer = (state, props) => (0, _extends2.default)({}, state, {
24
- density: {
25
- value: props.density,
26
- factor: DENSITY_FACTORS[props.density]
27
- }
17
+ density: props.initialState?.density ?? props.density ?? 'standard'
28
18
  });
29
19
  exports.densityStateInitializer = densityStateInitializer;
30
20
  const useGridDensity = (apiRef, props) => {
31
21
  const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useDensity');
32
- const setDensity = React.useCallback(newDensity => {
22
+ apiRef.current.registerControlState({
23
+ stateId: 'density',
24
+ propModel: props.density,
25
+ propOnChange: props.onDensityChange,
26
+ stateSelector: _densitySelector.gridDensitySelector,
27
+ changeEvent: 'densityChange'
28
+ });
29
+ const setDensity = (0, _useEventCallback.default)(newDensity => {
30
+ const currentDensity = (0, _densitySelector.gridDensitySelector)(apiRef.current.state);
31
+ if (currentDensity === newDensity) {
32
+ return;
33
+ }
33
34
  logger.debug(`Set grid density to ${newDensity}`);
34
- apiRef.current.setState(state => {
35
- const currentDensityState = (0, _densitySelector.gridDensitySelector)(state);
36
- const newDensityState = {
37
- value: newDensity,
38
- factor: DENSITY_FACTORS[newDensity]
39
- };
40
- if ((0, _utils.isDeepEqual)(currentDensityState, newDensityState)) {
41
- return state;
42
- }
43
- return (0, _extends2.default)({}, state, {
44
- density: newDensityState
45
- });
46
- });
47
- apiRef.current.forceUpdate();
48
- }, [logger, apiRef]);
35
+ apiRef.current.setState(state => (0, _extends2.default)({}, state, {
36
+ density: newDensity
37
+ }));
38
+ });
49
39
  React.useEffect(() => {
50
- apiRef.current.setDensity(props.density);
40
+ if (props.density) {
41
+ apiRef.current.setDensity(props.density);
42
+ }
51
43
  }, [apiRef, props.density]);
52
44
  const densityApi = {
53
45
  setDensity
@@ -11,6 +11,7 @@ var React = _interopRequireWildcard(require("react"));
11
11
  var _utils = require("@mui/utils");
12
12
  var _useGridApiEventHandler = require("../../utils/useGridApiEventHandler");
13
13
  var _useGridApiMethod = require("../../utils/useGridApiMethod");
14
+ var _throttle = require("../../../utils/throttle");
14
15
  var _useGridLogger = require("../../utils/useGridLogger");
15
16
  var _columns = require("../columns");
16
17
  var _gridDimensionsSelectors = require("./gridDimensionsSelectors");
@@ -68,7 +69,7 @@ function useGridDimensions(apiRef, props) {
68
69
  const leftPinnedWidth = pinnedColumns.left.reduce((w, col) => w + col.computedWidth, 0);
69
70
  const rightPinnedWidth = pinnedColumns.right.reduce((w, col) => w + col.computedWidth, 0);
70
71
  const [savedSize, setSavedSize] = React.useState();
71
- const debouncedSetSavedSize = React.useMemo(() => (0, _utils.unstable_debounce)(setSavedSize, 60), []);
72
+ const debouncedSetSavedSize = React.useMemo(() => (0, _throttle.throttle)(setSavedSize, props.resizeThrottleMs), [props.resizeThrottleMs]);
72
73
  const previousSize = React.useRef();
73
74
  const getRootDimensions = () => apiRef.current.state.dimensions;
74
75
  const setDimensions = (0, _utils.unstable_useEventCallback)(dimensions => {
@@ -23,7 +23,7 @@ const _excluded = ["id", "field"],
23
23
  _excluded2 = ["id", "field"];
24
24
  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); }
25
25
  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 && Object.prototype.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; }
26
- const missingOnProcessRowUpdateErrorWarning = (0, _warning.buildWarning)(['MUI X: A call to `processRowUpdate` threw an error which was not handled because `onProcessRowUpdateError` is missing.', 'To handle the error pass a callback to the `onProcessRowUpdateError` prop, e.g. `<DataGrid onProcessRowUpdateError={(error) => ...} />`.', 'For more detail, see https://mui.com/x/react-data-grid/editing/#server-side-persistence.'], 'error');
26
+ const missingOnProcessRowUpdateErrorWarning = (0, _warning.buildWarning)(['MUI X: A call to `processRowUpdate` threw an error which was not handled because `onProcessRowUpdateError` is missing.', 'To handle the error pass a callback to the `onProcessRowUpdateError` prop, for example `<DataGrid onProcessRowUpdateError={(error) => ...} />`.', 'For more detail, see https://mui.com/x/react-data-grid/editing/#server-side-persistence.'], 'error');
27
27
  const useGridCellEditing = (apiRef, props) => {
28
28
  const [cellModesModel, setCellModesModel] = React.useState({});
29
29
  const cellModesModelRef = React.useRef(cellModesModel);
@@ -25,7 +25,7 @@ const _excluded = ["id"],
25
25
  _excluded2 = ["id"];
26
26
  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); }
27
27
  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 && Object.prototype.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; }
28
- const missingOnProcessRowUpdateErrorWarning = (0, _warning.buildWarning)(['MUI X: A call to `processRowUpdate` threw an error which was not handled because `onProcessRowUpdateError` is missing.', 'To handle the error pass a callback to the `onProcessRowUpdateError` prop, e.g. `<DataGrid onProcessRowUpdateError={(error) => ...} />`.', 'For more detail, see https://mui.com/x/react-data-grid/editing/#server-side-persistence.'], 'error');
28
+ const missingOnProcessRowUpdateErrorWarning = (0, _warning.buildWarning)(['MUI X: A call to `processRowUpdate` threw an error which was not handled because `onProcessRowUpdateError` is missing.', 'To handle the error pass a callback to the `onProcessRowUpdateError` prop, for example `<DataGrid onProcessRowUpdateError={(error) => ...} />`.', 'For more detail, see https://mui.com/x/react-data-grid/editing/#server-side-persistence.'], 'error');
29
29
  const useGridRowEditing = (apiRef, props) => {
30
30
  const [rowModesModel, setRowModesModel] = React.useState({});
31
31
  const rowModesModelRef = React.useRef(rowModesModel);
@@ -54,6 +54,10 @@ const useGridRowEditing = (apiRef, props) => {
54
54
  throw new Error(`MUI X: The row with id=${id} is not in ${mode} mode.`);
55
55
  }
56
56
  }, [apiRef]);
57
+ const hasFieldsWithErrors = React.useCallback(rowId => {
58
+ const editingState = (0, _gridEditingSelectors.gridEditRowsStateSelector)(apiRef.current.state);
59
+ return Object.values(editingState[rowId]).some(fieldProps => fieldProps.error);
60
+ }, [apiRef]);
57
61
  const handleCellDoubleClick = React.useCallback((params, event) => {
58
62
  if (!params.isEditable) {
59
63
  return;
@@ -95,6 +99,9 @@ const useGridRowEditing = (apiRef, props) => {
95
99
  if (apiRef.current.getRowMode(params.id) === _gridEditRowModel.GridRowModes.View) {
96
100
  return;
97
101
  }
102
+ if (hasFieldsWithErrors(params.id)) {
103
+ return;
104
+ }
98
105
  const rowParams = apiRef.current.getRowParams(params.id);
99
106
  const newParams = (0, _extends2.default)({}, rowParams, {
100
107
  field: params.field,
@@ -103,7 +110,7 @@ const useGridRowEditing = (apiRef, props) => {
103
110
  apiRef.current.publishEvent('rowEditStop', newParams, event);
104
111
  }
105
112
  });
106
- }, [apiRef]);
113
+ }, [apiRef, hasFieldsWithErrors]);
107
114
  React.useEffect(() => {
108
115
  return () => {
109
116
  clearTimeout(focusTimeout.current);
@@ -149,6 +156,9 @@ const useGridRowEditing = (apiRef, props) => {
149
156
  }
150
157
  }
151
158
  if (reason) {
159
+ if (reason !== _gridRowParams.GridRowEditStopReasons.escapeKeyDown && hasFieldsWithErrors(params.id)) {
160
+ return;
161
+ }
152
162
  const newParams = (0, _extends2.default)({}, apiRef.current.getRowParams(params.id), {
153
163
  reason,
154
164
  field: params.field
@@ -183,7 +193,7 @@ const useGridRowEditing = (apiRef, props) => {
183
193
  apiRef.current.publishEvent('rowEditStart', newParams, event);
184
194
  }
185
195
  }
186
- }, [apiRef]);
196
+ }, [apiRef, hasFieldsWithErrors]);
187
197
  const handleRowEditStart = React.useCallback(params => {
188
198
  const {
189
199
  id,
@@ -367,8 +377,7 @@ const useGridRowEditing = (apiRef, props) => {
367
377
  prevRowModesModel.current[id].mode = _gridEditRowModel.GridRowModes.Edit;
368
378
  return;
369
379
  }
370
- const hasSomeFieldWithError = Object.values(editingState[id]).some(fieldProps => fieldProps.error);
371
- if (hasSomeFieldWithError) {
380
+ if (hasFieldsWithErrors(id)) {
372
381
  prevRowModesModel.current[id].mode = _gridEditRowModel.GridRowModes.Edit;
373
382
  // Revert the mode in the rowModesModel prop back to "edit"
374
383
  updateRowInRowModesModel(id, {
@@ -7,11 +7,14 @@ exports.buildCSV = buildCSV;
7
7
  exports.serializeCellValue = void 0;
8
8
  var _colDef = require("../../../../colDef");
9
9
  var _warning = require("../../../../utils/warning");
10
- function sanitizeCellValue(value, delimiterCharacter) {
10
+ function sanitizeCellValue(value, delimiterCharacter, shouldAppendQuotes) {
11
11
  if (typeof value === 'string') {
12
12
  // Make sure value containing delimiter or line break won't be split into multiple rows
13
13
  if ([delimiterCharacter, '\n', '\r', '"'].some(delimiter => value.includes(delimiter))) {
14
- return `"${value.replace(/"/g, '""')}"`;
14
+ if (shouldAppendQuotes) {
15
+ return `"${value.replace(/"/g, '""')}"`;
16
+ }
17
+ return `${value.replace(/"/g, '""')}`;
15
18
  }
16
19
  return value;
17
20
  }
@@ -20,7 +23,8 @@ function sanitizeCellValue(value, delimiterCharacter) {
20
23
  const serializeCellValue = (cellParams, options) => {
21
24
  const {
22
25
  delimiterCharacter,
23
- ignoreValueFormatter
26
+ ignoreValueFormatter,
27
+ shouldAppendQuotes
24
28
  } = options;
25
29
  let value;
26
30
  if (ignoreValueFormatter) {
@@ -37,7 +41,7 @@ const serializeCellValue = (cellParams, options) => {
37
41
  } else {
38
42
  value = cellParams.formattedValue;
39
43
  }
40
- return sanitizeCellValue(value, delimiterCharacter);
44
+ return sanitizeCellValue(value, delimiterCharacter, shouldAppendQuotes);
41
45
  };
42
46
  exports.serializeCellValue = serializeCellValue;
43
47
  const objectFormattedValueWarning = (0, _warning.buildWarning)(['MUI X: When the value of a field is an object or a `renderCell` is provided, the CSV export might not display the value correctly.', 'You can provide a `valueFormatter` with a string representation to be used.']);
@@ -55,7 +59,7 @@ class CSVRow {
55
59
  if (value === null || value === undefined) {
56
60
  this.rowString += '';
57
61
  } else if (typeof this.options.sanitizeCellValue === 'function') {
58
- this.rowString += this.options.sanitizeCellValue(value, this.options.delimiterCharacter);
62
+ this.rowString += this.options.sanitizeCellValue(value, this.options.delimiterCharacter, this.options.shouldAppendQuotes);
59
63
  } else {
60
64
  this.rowString += value;
61
65
  }
@@ -70,10 +74,12 @@ const serializeRow = ({
70
74
  columns,
71
75
  getCellParams,
72
76
  delimiterCharacter,
73
- ignoreValueFormatter
77
+ ignoreValueFormatter,
78
+ shouldAppendQuotes
74
79
  }) => {
75
80
  const row = new CSVRow({
76
- delimiterCharacter
81
+ delimiterCharacter,
82
+ shouldAppendQuotes
77
83
  });
78
84
  columns.forEach(column => {
79
85
  const cellParams = getCellParams(id, column.field);
@@ -84,7 +90,8 @@ const serializeRow = ({
84
90
  }
85
91
  row.addValue(serializeCellValue(cellParams, {
86
92
  delimiterCharacter,
87
- ignoreValueFormatter
93
+ ignoreValueFormatter,
94
+ shouldAppendQuotes
88
95
  }));
89
96
  });
90
97
  return row.getRowString();
@@ -97,14 +104,16 @@ function buildCSV(options) {
97
104
  includeHeaders,
98
105
  includeColumnGroupsHeaders,
99
106
  ignoreValueFormatter,
100
- apiRef
107
+ apiRef,
108
+ shouldAppendQuotes
101
109
  } = options;
102
110
  const CSVBody = rowIds.reduce((acc, id) => `${acc}${serializeRow({
103
111
  id,
104
112
  columns,
105
113
  getCellParams: apiRef.current.getCellParams,
106
114
  delimiterCharacter,
107
- ignoreValueFormatter
115
+ ignoreValueFormatter,
116
+ shouldAppendQuotes
108
117
  })}\r\n`, '').trim();
109
118
  if (!includeHeaders) {
110
119
  return CSVBody;
@@ -123,7 +132,8 @@ function buildCSV(options) {
123
132
  for (let i = 0; i < maxColumnGroupsDepth; i += 1) {
124
133
  const headerGroupRow = new CSVRow({
125
134
  delimiterCharacter,
126
- sanitizeCellValue
135
+ sanitizeCellValue,
136
+ shouldAppendQuotes
127
137
  });
128
138
  headerRows.push(headerGroupRow);
129
139
  filteredColumns.forEach(column => {
@@ -135,7 +145,8 @@ function buildCSV(options) {
135
145
  }
136
146
  const mainHeaderRow = new CSVRow({
137
147
  delimiterCharacter,
138
- sanitizeCellValue
148
+ sanitizeCellValue,
149
+ shouldAppendQuotes
139
150
  });
140
151
  filteredColumns.forEach(column => {
141
152
  mainHeaderRow.addValue(column.headerName || column.field);
@@ -43,7 +43,8 @@ const useGridCsvExport = (apiRef, props) => {
43
43
  includeHeaders: options.includeHeaders ?? true,
44
44
  includeColumnGroupsHeaders: options.includeColumnGroupsHeaders ?? true,
45
45
  ignoreValueFormatter,
46
- apiRef
46
+ apiRef,
47
+ shouldAppendQuotes: options.shouldAppendQuotes ?? true
47
48
  });
48
49
  }, [logger, apiRef, ignoreValueFormatter]);
49
50
  const exportDataAsCsv = React.useCallback(options => {
@@ -167,7 +167,7 @@ const buildAggregatedFilterItemsApplier = (filterModel, apiRef, disableEval) =>
167
167
  }
168
168
 
169
169
  // We generate a new function with `new Function()` to avoid expensive patterns for JS engines
170
- // such as a dynamic object assignment, e.g. `{ [dynamicKey]: value }`.
170
+ // such as a dynamic object assignment, for example `{ [dynamicKey]: value }`.
171
171
  const filterItemCore = new Function('appliers', 'row', 'shouldApplyFilter', `"use strict";
172
172
  ${appliers.map((applier, i) => `const shouldApply${i} = !shouldApplyFilter || shouldApplyFilter(${JSON.stringify(applier.item.field)});`).join('\n')}
173
173
 
@@ -284,7 +284,8 @@ const useGridRowSelection = (apiRef, props) => {
284
284
  const handleHeaderSelectionCheckboxChange = React.useCallback(params => {
285
285
  const shouldLimitSelectionToCurrentPage = props.checkboxSelectionVisibleOnly && props.pagination;
286
286
  const rowsToBeSelected = shouldLimitSelectionToCurrentPage ? (0, _pagination.gridPaginatedVisibleSortedGridRowIdsSelector)(apiRef) : (0, _gridFilterSelector.gridExpandedSortedRowIdsSelector)(apiRef);
287
- apiRef.current.selectRows(rowsToBeSelected, params.value);
287
+ const filterModel = (0, _gridFilterSelector.gridFilterModelSelector)(apiRef);
288
+ apiRef.current.selectRows(rowsToBeSelected, params.value, filterModel?.items.length > 0);
288
289
  }, [apiRef, props.checkboxSelectionVisibleOnly, props.pagination]);
289
290
  const handleCellKeyDown = React.useCallback((params, event) => {
290
291
  // Get the most recent cell mode because it may have been changed by another listener