@mui/x-data-grid 8.2.0 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,113 @@
5
5
  All notable changes to this project will be documented in this file.
6
6
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
7
7
 
8
+ ## 8.3.0
9
+
10
+ _May 8, 2025_
11
+
12
+ We'd like to offer a big thanks to the 11 contributors who made this release possible. Here are some highlights ✨:
13
+
14
+ - 🎨 Added new styling options and shapes for `<FunnelChart />`, including `variant`, `borderRadius`, `pyramid`, and `step-pyramid` curves.
15
+ - 📚 Documentation improvements
16
+ - 🐞 Bugfixes
17
+
18
+ Special thanks go out to this community member for a valuable contribution:
19
+ @ptuukkan.
20
+ Team members who have contributed to this release:
21
+ @alexfauquette, @arminmeh, @bernardobelchior, @flaviendelangle, @Janpot, @JCQuintas, @LukasTy, @MBilalShafi, @rita-codes, @romgrk.
22
+
23
+ ### Data Grid
24
+
25
+ #### `@mui/x-data-grid@8.3.0`
26
+
27
+ - [DataGrid] Fix cell editing of computed columns with data source (#17684) @ptuukkan
28
+ - [DataGrid] Fix lazy loading crash with `isRowSelectable` prop (#17629) @MBilalShafi
29
+ - [DataGrid] Fix: use CSS nonce (#17726) @romgrk
30
+ - [DataGrid] Ignore `preProcessEditCellProps` for non-editable columns when starting a row update (#17732) @arminmeh
31
+ - [DataGrid] Avoid applying row selection propagation on filtered rows (#17739) @MBilalShafi
32
+
33
+ #### `@mui/x-data-grid-pro@8.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
34
+
35
+ Same changes as in `@mui/x-data-grid@8.3.0`.
36
+
37
+ #### `@mui/x-data-grid-premium@8.3.0` [![premium](https://mui.com/r/x-premium-svg)](https://mui.com/r/x-premium-svg-link 'Premium plan')
38
+
39
+ Same changes as in `@mui/x-data-grid-pro@8.3.0`.
40
+
41
+ ### Date and Time Pickers
42
+
43
+ #### `@mui/x-date-pickers@8.3.0`
44
+
45
+ - [DateTimePicker] Fix focus behavior on desktop variant (#17719) @LukasTy
46
+ - [pickers] Avoid `DigitalClock` stealing focus from a Picker open button on close (#17686) @LukasTy
47
+
48
+ #### `@mui/x-date-pickers-pro@8.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
49
+
50
+ Same changes as in `@mui/x-date-pickers@8.3.0`, plus:
51
+
52
+ - [DateRangePicker] Fix to reset range position after closing mobile Picker (#17631) @LukasTy
53
+
54
+ ### Charts
55
+
56
+ - The `<FunnelChart />` series now accepts a `variant='outlined'` prop for a simpler style.
57
+ <img width="398" alt="Screenshot 2025-05-06 at 20 36 12" src="https://github.com/user-attachments/assets/00fef14f-9026-421e-a4b6-7e081adce1e8" />
58
+
59
+ - Add a `borderRadius` property to `<FunnelChart />`. All funnels have `8px` as a default value.
60
+ <img width="386" alt="Screenshot 2025-05-06 at 14 00 20" src="https://github.com/user-attachments/assets/4f4cc0e7-01ce-4ed6-a0e1-a387f78def23" />
61
+
62
+ - Add a `pyramid` curve to `<FunnelChart />`, which allows creation of a pyramid-shaped funnel.
63
+ <img width="344" alt="Screenshot 2025-05-06 at 14 32 59" src="https://github.com/user-attachments/assets/0b2896e0-0478-4766-bb1b-258a4977a751" />
64
+
65
+ - Add a `step-pyramid` curve to `<FunnelChart />`, which creates a stepped-pyramid like shape.
66
+ <img width="344" alt="Screenshot 2025-05-06 at 14 33 03" src="https://github.com/user-attachments/assets/894f0ab3-7898-40fe-b0df-560feea4085a" />
67
+
68
+ #### `@mui/x-charts@8.3.0`
69
+
70
+ - [charts] Add charts toolbar with zoom options (#17615) @bernardobelchior
71
+ - [charts] Add zoom slider (#17496) @bernardobelchior
72
+ - [charts] Cleanup compiler warnings (#17360) @alexfauquette
73
+ - [charts] Fix `<PieArcLabel />` not taking `arcLabelRadius` into account (#17655) @bernardobelchior
74
+ - [charts] Fix spark line not having clip path (#17501) @bernardobelchior
75
+ - [charts] Fix type issue with ESM (#17624) @alexfauquette
76
+ - [charts] Improve `<MarkElement />` performance (#17546) @bernardobelchior
77
+ - [charts] Rename `materialSlots` internal constant (#17710) @bernardobelchior
78
+ - [charts] Update zoom slider design (#17682) @bernardobelchior
79
+ - [charts] Fix zoom being documented as available for heatmap (#17657) @bernardobelchior
80
+
81
+ #### `@mui/x-charts-pro@8.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
82
+
83
+ Same changes as in `@mui/x-charts@8.3.0`, plus:
84
+
85
+ - [charts-pro] Add `pyramid` curve to `<FunnelChart />` (#17665) @JCQuintas
86
+ - [charts-pro] Add `variant='outlined'` to `<FunnelChart />` series (#17661) @JCQuintas
87
+ - [charts-pro] Add a `borderRadius` property to `<FunnelChart />` (#17660) @JCQuintas
88
+
89
+ ### Tree View
90
+
91
+ #### `@mui/x-tree-view@8.3.0`
92
+
93
+ - [tree view] Bug fix - Escape does not cancel Drag n Drop (#17735) @rita-codes
94
+ - [tree view] Fix keyboard navigation error (#17685) @rita-codes
95
+ - [tree view] Continue cleaning the plugin system (#17386) @flaviendelangle
96
+
97
+ #### `@mui/x-tree-view-pro@8.3.0` [![pro](https://mui.com/r/x-pro-svg)](https://mui.com/r/x-pro-svg-link 'Pro plan')
98
+
99
+ Same changes as in `@mui/x-tree-view@8.3.0`.
100
+
101
+ ### Docs
102
+
103
+ - [charts] Add population pyramid demo (#17652) @bernardobelchior
104
+ - [charts] Fix randomised argos test (#17658) @JCQuintas
105
+ - [docs] Make preview messaging consistent in charts @bernardobelchior
106
+
107
+ ### Core
108
+
109
+ - [code-infra] Avoid `node` types in the built packages (#17533) @LukasTy
110
+ - [code-infra] Add `pkg.pr.new` publishing (#17402) @Janpot
111
+ - [code-infra] Normalize author package in org @oliviertassinari
112
+ - [code-infra] Remove required checkout step (#17729) @JCQuintas
113
+ - [docs-infra] Normalize netlify.toml in org @oliviertassinari
114
+
8
115
  ## 8.2.0
9
116
 
10
117
  _May 1, 2025_
@@ -9,7 +9,6 @@ Object.defineProperty(exports, "__esModule", {
9
9
  exports.GridScrollArea = void 0;
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
11
  var React = _interopRequireWildcard(require("react"));
12
- var _clsx = _interopRequireDefault(require("clsx"));
13
12
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
14
13
  var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
15
14
  var _system = require("@mui/system");
@@ -149,7 +148,7 @@ function GridScrollAreaContent(props) {
149
148
  }
150
149
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridScrollAreaRawRoot, {
151
150
  ref: rootRef,
152
- className: (0, _clsx.default)(classes.root),
151
+ className: classes.root,
153
152
  ownerState: ownerState,
154
153
  onDragOver: handleDragOver,
155
154
  style: style
@@ -11,7 +11,6 @@ var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _system = require("@mui/system");
13
13
  var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
14
- var _clsx = _interopRequireDefault(require("clsx"));
15
14
  var _gridRowsUtils = require("../../hooks/features/rows/gridRowsUtils");
16
15
  var _useGridSelector = require("../../hooks/utils/useGridSelector");
17
16
  var _dimensions = require("../../hooks/features/dimensions");
@@ -70,11 +69,11 @@ function GridOverlayWrapper(props) {
70
69
  classes: rootProps.classes
71
70
  }));
72
71
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridOverlayWrapperRoot, (0, _extends2.default)({
73
- className: (0, _clsx.default)(classes.root)
72
+ className: classes.root
74
73
  }, props, {
75
74
  right: dimensions.columnsTotalWidth - dimensions.viewportOuterSize.width,
76
75
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(GridOverlayWrapperInner, (0, _extends2.default)({
77
- className: (0, _clsx.default)(classes.inner),
76
+ className: classes.inner,
78
77
  style: {
79
78
  height,
80
79
  width: dimensions.viewportOuterSize.width
@@ -83,6 +83,10 @@ const GridHeaderCheckbox = exports.GridHeaderCheckbox = (0, _forwardRef.forwardR
83
83
  const candidates = new Set();
84
84
  for (let i = 0; i < rowIds.length; i += 1) {
85
85
  const id = rowIds[i];
86
+ if (!apiRef.current.getRow(id)) {
87
+ // The row could have been removed
88
+ continue;
89
+ }
86
90
  if (apiRef.current.isRowSelectable(id)) {
87
91
  candidates.add(id);
88
92
  }
@@ -2,7 +2,6 @@
2
2
 
3
3
  import _extends from "@babel/runtime/helpers/esm/extends";
4
4
  import * as React from 'react';
5
- import clsx from 'clsx';
6
5
  import useEventCallback from '@mui/utils/useEventCallback';
7
6
  import composeClasses from '@mui/utils/composeClasses';
8
7
  import { styled } from '@mui/system';
@@ -142,7 +141,7 @@ function GridScrollAreaContent(props) {
142
141
  }
143
142
  return /*#__PURE__*/_jsx(GridScrollAreaRawRoot, {
144
143
  ref: rootRef,
145
- className: clsx(classes.root),
144
+ className: classes.root,
146
145
  ownerState: ownerState,
147
146
  onDragOver: handleDragOver,
148
147
  style: style
@@ -3,7 +3,6 @@ import * as React from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import { styled } from '@mui/system';
5
5
  import composeClasses from '@mui/utils/composeClasses';
6
- import clsx from 'clsx';
7
6
  import { minimalContentHeight } from "../../hooks/features/rows/gridRowsUtils.js";
8
7
  import { useGridSelector } from "../../hooks/utils/useGridSelector.js";
9
8
  import { gridDimensionsSelector } from "../../hooks/features/dimensions/index.js";
@@ -62,11 +61,11 @@ export function GridOverlayWrapper(props) {
62
61
  classes: rootProps.classes
63
62
  }));
64
63
  return /*#__PURE__*/_jsx(GridOverlayWrapperRoot, _extends({
65
- className: clsx(classes.root)
64
+ className: classes.root
66
65
  }, props, {
67
66
  right: dimensions.columnsTotalWidth - dimensions.viewportOuterSize.width,
68
67
  children: /*#__PURE__*/_jsx(GridOverlayWrapperInner, _extends({
69
- className: clsx(classes.inner),
68
+ className: classes.inner,
70
69
  style: {
71
70
  height,
72
71
  width: dimensions.viewportOuterSize.width
@@ -75,6 +75,10 @@ const GridHeaderCheckbox = forwardRef(function GridHeaderCheckbox(props, ref) {
75
75
  const candidates = new Set();
76
76
  for (let i = 0; i < rowIds.length; i += 1) {
77
77
  const id = rowIds[i];
78
+ if (!apiRef.current.getRow(id)) {
79
+ // The row could have been removed
80
+ continue;
81
+ }
78
82
  if (apiRef.current.isRowSelectable(id)) {
79
83
  candidates.add(id);
80
84
  }
@@ -7,6 +7,7 @@ import * as React from 'react';
7
7
  import { warnOnce } from '@mui/x-internals/warning';
8
8
  import useEventCallback from '@mui/utils/useEventCallback';
9
9
  import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
10
+ import { isDeepEqual } from '@mui/x-internals/isDeepEqual';
10
11
  import { useGridEvent, useGridEventPriority } from "../../utils/useGridEvent.js";
11
12
  import { GridEditModes, GridCellModes } from "../../../models/gridEditRowModel.js";
12
13
  import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
@@ -330,7 +331,7 @@ export const useGridCellEditing = (apiRef, props) => {
330
331
  }
331
332
  const rowUpdate = apiRef.current.getRowWithUpdatedValuesFromCellEditing(id, field);
332
333
  if (props.dataSource?.updateRow) {
333
- if (row[field] === rowUpdate[field]) {
334
+ if (isDeepEqual(row, rowUpdate)) {
334
335
  finishCellEditMode();
335
336
  return;
336
337
  }
@@ -13,7 +13,7 @@ import { GridEditModes, GridRowModes } from "../../../models/gridEditRowModel.js
13
13
  import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
14
14
  import { gridEditRowsStateSelector, gridRowIsEditingSelector } from "./gridEditingSelectors.js";
15
15
  import { isPrintableKey, isPasteShortcut } from "../../../utils/keyboardUtils.js";
16
- import { gridColumnFieldsSelector, gridVisibleColumnFieldsSelector } from "../columns/gridColumnsSelector.js";
16
+ import { gridColumnDefinitionsSelector, gridVisibleColumnFieldsSelector } from "../columns/gridColumnsSelector.js";
17
17
  import { gridRowsLookupSelector } from "../rows/gridRowsSelector.js";
18
18
  import { deepClone } from "../../../utils/utils.js";
19
19
  import { GridRowEditStopReasons, GridRowEditStartReasons } from "../../../models/params/gridRowParams.js";
@@ -313,8 +313,9 @@ export const useGridRowEditing = (apiRef, props) => {
313
313
  initialValue
314
314
  } = params;
315
315
  const row = apiRef.current.getRow(id);
316
- const columnFields = gridColumnFieldsSelector(apiRef);
317
- const newProps = columnFields.reduce((acc, field) => {
316
+ const columns = gridColumnDefinitionsSelector(apiRef);
317
+ const newProps = columns.reduce((acc, col) => {
318
+ const field = col.field;
318
319
  const cellParams = apiRef.current.getCellParams(id, field);
319
320
  if (!cellParams.isEditable) {
320
321
  return acc;
@@ -331,7 +332,7 @@ export const useGridRowEditing = (apiRef, props) => {
331
332
  acc[field] = {
332
333
  value: newValue,
333
334
  error: false,
334
- isProcessingProps: !!column.preProcessEditCellProps && deleteValue
335
+ isProcessingProps: column.editable && !!column.preProcessEditCellProps && deleteValue
335
336
  };
336
337
  return acc;
337
338
  }, {});
@@ -340,8 +341,8 @@ export const useGridRowEditing = (apiRef, props) => {
340
341
  if (fieldToFocus) {
341
342
  apiRef.current.setCellFocus(id, fieldToFocus);
342
343
  }
343
- columnFields.filter(field => !!apiRef.current.getColumn(field).preProcessEditCellProps && deleteValue).forEach(field => {
344
- const column = apiRef.current.getColumn(field);
344
+ columns.filter(column => column.editable && !!column.preProcessEditCellProps && deleteValue).forEach(column => {
345
+ const field = column.field;
345
346
  const value = apiRef.current.getCellValue(id, field);
346
347
  const newValue = deleteValue ? getDefaultCellValue(column) : initialValue ?? value;
347
348
  Promise.resolve(column.preProcessEditCellProps({
@@ -97,7 +97,7 @@ const getFilteredRowNodeSiblings = (tree, filteredRows, id) => {
97
97
  export const findRowsToSelect = (apiRef, tree, selectedRow, autoSelectDescendants, autoSelectParents, addRow, rowSelectionManager = gridRowSelectionManagerSelector(apiRef)) => {
98
98
  const filteredRows = gridFilteredRowsLookupSelector(apiRef);
99
99
  const selectedDescendants = new Set([]);
100
- if (!autoSelectDescendants && !autoSelectParents) {
100
+ if (!autoSelectDescendants && !autoSelectParents || filteredRows[selectedRow] === false) {
101
101
  return;
102
102
  }
103
103
  if (autoSelectDescendants) {
package/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v8.2.0
2
+ * @mui/x-data-grid v8.3.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -9,19 +9,19 @@ const _excluded = ["id", "label", "labelId", "material", "disabled", "slotProps"
9
9
  _excluded7 = ["material"],
10
10
  _excluded8 = ["material"],
11
11
  _excluded9 = ["material"],
12
+ _excluded0 = ["material"],
13
+ _excluded1 = ["material"],
12
14
  _excluded10 = ["material"],
13
- _excluded11 = ["material"],
15
+ _excluded11 = ["material", "label", "className"],
14
16
  _excluded12 = ["material"],
15
- _excluded13 = ["material", "label", "className"],
16
- _excluded14 = ["material"],
17
- _excluded15 = ["inert", "iconStart", "iconEnd", "children", "material"],
18
- _excluded16 = ["slotProps", "material"],
19
- _excluded17 = ["id", "multiple", "freeSolo", "options", "getOptionLabel", "isOptionEqualToValue", "value", "onChange", "label", "placeholder", "slotProps", "material"],
20
- _excluded18 = ["key"],
21
- _excluded19 = ["inputProps", "InputProps", "InputLabelProps"],
22
- _excluded20 = ["slotProps", "material"],
23
- _excluded21 = ["ref", "open", "children", "className", "clickAwayTouchEvent", "clickAwayMouseEvent", "flip", "focusTrap", "onExited", "onClickAway", "onDidShow", "onDidHide", "id", "target", "transition", "placement", "material"],
24
- _excluded22 = ["native"];
17
+ _excluded13 = ["inert", "iconStart", "iconEnd", "children", "material"],
18
+ _excluded14 = ["slotProps", "material"],
19
+ _excluded15 = ["id", "multiple", "freeSolo", "options", "getOptionLabel", "isOptionEqualToValue", "value", "onChange", "label", "placeholder", "slotProps", "material"],
20
+ _excluded16 = ["key"],
21
+ _excluded17 = ["inputProps", "InputProps", "InputLabelProps"],
22
+ _excluded18 = ["slotProps", "material"],
23
+ _excluded19 = ["ref", "open", "children", "className", "clickAwayTouchEvent", "clickAwayMouseEvent", "flip", "focusTrap", "onExited", "onClickAway", "onDidShow", "onDidHide", "id", "target", "transition", "placement", "material"],
24
+ _excluded20 = ["native"];
25
25
  import * as React from 'react';
26
26
  import clsx from 'clsx';
27
27
  import useForkRef from '@mui/utils/useForkRef';
@@ -327,7 +327,7 @@ const BaseIconButton = forwardRef(function BaseIconButton(props, ref) {
327
327
  const {
328
328
  material
329
329
  } = props,
330
- rest = _objectWithoutPropertiesLoose(props, _excluded10);
330
+ rest = _objectWithoutPropertiesLoose(props, _excluded0);
331
331
  return /*#__PURE__*/_jsx(MUIIconButton, _extends({}, rest, material, {
332
332
  ref: ref
333
333
  }));
@@ -336,7 +336,7 @@ const BaseTooltip = forwardRef(function BaseTooltip(props, ref) {
336
336
  const {
337
337
  material
338
338
  } = props,
339
- rest = _objectWithoutPropertiesLoose(props, _excluded11);
339
+ rest = _objectWithoutPropertiesLoose(props, _excluded1);
340
340
  return /*#__PURE__*/_jsx(MUITooltip, _extends({}, rest, material, {
341
341
  ref: ref
342
342
  }));
@@ -345,7 +345,7 @@ const BaseSkeleton = forwardRef(function BaseSkeleton(props, ref) {
345
345
  const {
346
346
  material
347
347
  } = props,
348
- rest = _objectWithoutPropertiesLoose(props, _excluded12);
348
+ rest = _objectWithoutPropertiesLoose(props, _excluded10);
349
349
  return /*#__PURE__*/_jsx(MUISkeleton, _extends({}, rest, material, {
350
350
  ref: ref
351
351
  }));
@@ -356,7 +356,7 @@ const BaseSwitch = forwardRef(function BaseSwitch(props, ref) {
356
356
  label,
357
357
  className
358
358
  } = props,
359
- rest = _objectWithoutPropertiesLoose(props, _excluded13);
359
+ rest = _objectWithoutPropertiesLoose(props, _excluded11);
360
360
  if (!label) {
361
361
  return /*#__PURE__*/_jsx(MUISwitch, _extends({}, rest, material, {
362
362
  className: className,
@@ -375,7 +375,7 @@ const BaseMenuList = forwardRef(function BaseMenuList(props, ref) {
375
375
  const {
376
376
  material
377
377
  } = props,
378
- rest = _objectWithoutPropertiesLoose(props, _excluded14);
378
+ rest = _objectWithoutPropertiesLoose(props, _excluded12);
379
379
  return /*#__PURE__*/_jsx(MUIMenuList, _extends({}, rest, material, {
380
380
  ref: ref
381
381
  }));
@@ -388,7 +388,7 @@ function BaseMenuItem(props) {
388
388
  children,
389
389
  material
390
390
  } = props,
391
- other = _objectWithoutPropertiesLoose(props, _excluded15);
391
+ other = _objectWithoutPropertiesLoose(props, _excluded13);
392
392
  if (inert) {
393
393
  other.disableRipple = true;
394
394
  }
@@ -407,7 +407,7 @@ function BaseTextField(props) {
407
407
  slotProps,
408
408
  material
409
409
  } = props,
410
- rest = _objectWithoutPropertiesLoose(props, _excluded16);
410
+ rest = _objectWithoutPropertiesLoose(props, _excluded14);
411
411
  return /*#__PURE__*/_jsx(MUITextField, _extends({
412
412
  variant: "outlined"
413
413
  }, rest, material, {
@@ -434,7 +434,7 @@ function BaseAutocomplete(props) {
434
434
  slotProps,
435
435
  material
436
436
  } = props,
437
- rest = _objectWithoutPropertiesLoose(props, _excluded17);
437
+ rest = _objectWithoutPropertiesLoose(props, _excluded15);
438
438
  return /*#__PURE__*/_jsx(MUIAutocomplete, _extends({
439
439
  id: id,
440
440
  multiple: multiple,
@@ -451,7 +451,7 @@ function BaseAutocomplete(props) {
451
451
  {
452
452
  key
453
453
  } = _getTagProps,
454
- tagProps = _objectWithoutPropertiesLoose(_getTagProps, _excluded18);
454
+ tagProps = _objectWithoutPropertiesLoose(_getTagProps, _excluded16);
455
455
  return /*#__PURE__*/_jsx(MUIChip, _extends({
456
456
  variant: "outlined",
457
457
  size: "small",
@@ -464,7 +464,7 @@ function BaseAutocomplete(props) {
464
464
  InputProps,
465
465
  InputLabelProps
466
466
  } = params,
467
- inputRest = _objectWithoutPropertiesLoose(params, _excluded19);
467
+ inputRest = _objectWithoutPropertiesLoose(params, _excluded17);
468
468
  return /*#__PURE__*/_jsx(MUITextField, _extends({}, inputRest, {
469
469
  label: label,
470
470
  placeholder: placeholder,
@@ -488,7 +488,7 @@ function transformInputProps(props, wrapAdornments = true) {
488
488
  slotProps,
489
489
  material
490
490
  } = props,
491
- rest = _objectWithoutPropertiesLoose(props, _excluded20);
491
+ rest = _objectWithoutPropertiesLoose(props, _excluded18);
492
492
  const result = rest;
493
493
  if (wrapAdornments) {
494
494
  if (result.startAdornment) {
@@ -537,7 +537,7 @@ function BasePopper(props) {
537
537
  placement,
538
538
  material
539
539
  } = props,
540
- rest = _objectWithoutPropertiesLoose(props, _excluded21);
540
+ rest = _objectWithoutPropertiesLoose(props, _excluded19);
541
541
  const modifiers = React.useMemo(() => {
542
542
  const result = [{
543
543
  name: 'preventOverflow',
@@ -635,7 +635,7 @@ function BaseSelectOption(_ref) {
635
635
  let {
636
636
  native
637
637
  } = _ref,
638
- props = _objectWithoutPropertiesLoose(_ref, _excluded22);
638
+ props = _objectWithoutPropertiesLoose(_ref, _excluded20);
639
639
  if (native) {
640
640
  return /*#__PURE__*/_jsx("option", _extends({}, props));
641
641
  }
@@ -1,6 +1,6 @@
1
1
  import { CleanupTracking, UnregisterToken, UnsubscribeFn } from "./CleanupTracking.js";
2
2
  export declare class TimerBasedCleanupTracking implements CleanupTracking {
3
- timeouts?: Map<number, NodeJS.Timeout> | undefined;
3
+ timeouts?: Map<number, number> | undefined;
4
4
  cleanupTimeout: number;
5
5
  constructor(timeout?: number);
6
6
  register(object: any, unsubscribe: UnsubscribeFn, unregisterToken: UnregisterToken): void;
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { useGridRootProps } from "../../hooks/utils/useGridRootProps.js";
2
3
  import { useGridConfiguration } from "../../hooks/utils/useGridConfiguration.js";
3
4
  import { jsx as _jsx } from "react/jsx-runtime";
4
5
  const CLASSNAME_PREFIX = 'MuiDataGridVariables';
@@ -25,19 +26,21 @@ export function GridPortalWrapper({
25
26
  }
26
27
  export function GridCSSVariablesContext(props) {
27
28
  const config = useGridConfiguration();
29
+ const rootProps = useGridRootProps();
28
30
  const description = config.hooks.useCSSVariables();
29
31
  const context = React.useMemo(() => {
30
32
  const className = `${CLASSNAME_PREFIX}-${description.id}`;
31
33
  const cssString = `.${className}{${variablesToString(description.variables)}}`;
32
34
  const tag = /*#__PURE__*/_jsx("style", {
33
35
  href: `/${className}`,
36
+ nonce: rootProps.nonce,
34
37
  children: cssString
35
38
  });
36
39
  return {
37
40
  className,
38
41
  tag
39
42
  };
40
- }, [description]);
43
+ }, [rootProps.nonce, description]);
41
44
  return /*#__PURE__*/_jsx(CSSVariablesContext.Provider, {
42
45
  value: context,
43
46
  children: props.children
@@ -13,6 +13,7 @@ var React = _interopRequireWildcard(require("react"));
13
13
  var _warning = require("@mui/x-internals/warning");
14
14
  var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback"));
15
15
  var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedEffect"));
16
+ var _isDeepEqual = require("@mui/x-internals/isDeepEqual");
16
17
  var _useGridEvent = require("../../utils/useGridEvent");
17
18
  var _gridEditRowModel = require("../../../models/gridEditRowModel");
18
19
  var _useGridApiMethod = require("../../utils/useGridApiMethod");
@@ -338,7 +339,7 @@ const useGridCellEditing = (apiRef, props) => {
338
339
  }
339
340
  const rowUpdate = apiRef.current.getRowWithUpdatedValuesFromCellEditing(id, field);
340
341
  if (props.dataSource?.updateRow) {
341
- if (row[field] === rowUpdate[field]) {
342
+ if ((0, _isDeepEqual.isDeepEqual)(row, rowUpdate)) {
342
343
  finishCellEditMode();
343
344
  return;
344
345
  }
@@ -321,8 +321,9 @@ const useGridRowEditing = (apiRef, props) => {
321
321
  initialValue
322
322
  } = params;
323
323
  const row = apiRef.current.getRow(id);
324
- const columnFields = (0, _gridColumnsSelector.gridColumnFieldsSelector)(apiRef);
325
- const newProps = columnFields.reduce((acc, field) => {
324
+ const columns = (0, _gridColumnsSelector.gridColumnDefinitionsSelector)(apiRef);
325
+ const newProps = columns.reduce((acc, col) => {
326
+ const field = col.field;
326
327
  const cellParams = apiRef.current.getCellParams(id, field);
327
328
  if (!cellParams.isEditable) {
328
329
  return acc;
@@ -339,7 +340,7 @@ const useGridRowEditing = (apiRef, props) => {
339
340
  acc[field] = {
340
341
  value: newValue,
341
342
  error: false,
342
- isProcessingProps: !!column.preProcessEditCellProps && deleteValue
343
+ isProcessingProps: column.editable && !!column.preProcessEditCellProps && deleteValue
343
344
  };
344
345
  return acc;
345
346
  }, {});
@@ -348,8 +349,8 @@ const useGridRowEditing = (apiRef, props) => {
348
349
  if (fieldToFocus) {
349
350
  apiRef.current.setCellFocus(id, fieldToFocus);
350
351
  }
351
- columnFields.filter(field => !!apiRef.current.getColumn(field).preProcessEditCellProps && deleteValue).forEach(field => {
352
- const column = apiRef.current.getColumn(field);
352
+ columns.filter(column => column.editable && !!column.preProcessEditCellProps && deleteValue).forEach(column => {
353
+ const field = column.field;
353
354
  const value = apiRef.current.getCellValue(id, field);
354
355
  const newValue = deleteValue ? (0, _utils2.getDefaultCellValue)(column) : initialValue ?? value;
355
356
  Promise.resolve(column.preProcessEditCellProps({
@@ -105,7 +105,7 @@ const getFilteredRowNodeSiblings = (tree, filteredRows, id) => {
105
105
  const findRowsToSelect = (apiRef, tree, selectedRow, autoSelectDescendants, autoSelectParents, addRow, rowSelectionManager = (0, _gridRowSelectionSelector.gridRowSelectionManagerSelector)(apiRef)) => {
106
106
  const filteredRows = (0, _gridFilterSelector.gridFilteredRowsLookupSelector)(apiRef);
107
107
  const selectedDescendants = new Set([]);
108
- if (!autoSelectDescendants && !autoSelectParents) {
108
+ if (!autoSelectDescendants && !autoSelectParents || filteredRows[selectedRow] === false) {
109
109
  return;
110
110
  }
111
111
  if (autoSelectDescendants) {
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v8.2.0
2
+ * @mui/x-data-grid v8.3.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
package/material/index.js CHANGED
@@ -64,19 +64,19 @@ const _excluded = ["id", "label", "labelId", "material", "disabled", "slotProps"
64
64
  _excluded7 = ["material"],
65
65
  _excluded8 = ["material"],
66
66
  _excluded9 = ["material"],
67
+ _excluded0 = ["material"],
68
+ _excluded1 = ["material"],
67
69
  _excluded10 = ["material"],
68
- _excluded11 = ["material"],
70
+ _excluded11 = ["material", "label", "className"],
69
71
  _excluded12 = ["material"],
70
- _excluded13 = ["material", "label", "className"],
71
- _excluded14 = ["material"],
72
- _excluded15 = ["inert", "iconStart", "iconEnd", "children", "material"],
73
- _excluded16 = ["slotProps", "material"],
74
- _excluded17 = ["id", "multiple", "freeSolo", "options", "getOptionLabel", "isOptionEqualToValue", "value", "onChange", "label", "placeholder", "slotProps", "material"],
75
- _excluded18 = ["key"],
76
- _excluded19 = ["inputProps", "InputProps", "InputLabelProps"],
77
- _excluded20 = ["slotProps", "material"],
78
- _excluded21 = ["ref", "open", "children", "className", "clickAwayTouchEvent", "clickAwayMouseEvent", "flip", "focusTrap", "onExited", "onClickAway", "onDidShow", "onDidHide", "id", "target", "transition", "placement", "material"],
79
- _excluded22 = ["native"];
72
+ _excluded13 = ["inert", "iconStart", "iconEnd", "children", "material"],
73
+ _excluded14 = ["slotProps", "material"],
74
+ _excluded15 = ["id", "multiple", "freeSolo", "options", "getOptionLabel", "isOptionEqualToValue", "value", "onChange", "label", "placeholder", "slotProps", "material"],
75
+ _excluded16 = ["key"],
76
+ _excluded17 = ["inputProps", "InputProps", "InputLabelProps"],
77
+ _excluded18 = ["slotProps", "material"],
78
+ _excluded19 = ["ref", "open", "children", "className", "clickAwayTouchEvent", "clickAwayMouseEvent", "flip", "focusTrap", "onExited", "onClickAway", "onDidShow", "onDidHide", "id", "target", "transition", "placement", "material"],
79
+ _excluded20 = ["native"];
80
80
  /* eslint-disable material-ui/disallow-react-api-in-server-components */
81
81
 
82
82
  const InputAdornment = (0, _styles.styled)(_InputAdornment.default)(({
@@ -340,7 +340,7 @@ const BaseIconButton = (0, _forwardRef.forwardRef)(function BaseIconButton(props
340
340
  const {
341
341
  material
342
342
  } = props,
343
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded10);
343
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded0);
344
344
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, (0, _extends2.default)({}, rest, material, {
345
345
  ref: ref
346
346
  }));
@@ -349,7 +349,7 @@ const BaseTooltip = (0, _forwardRef.forwardRef)(function BaseTooltip(props, ref)
349
349
  const {
350
350
  material
351
351
  } = props,
352
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded11);
352
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded1);
353
353
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tooltip.default, (0, _extends2.default)({}, rest, material, {
354
354
  ref: ref
355
355
  }));
@@ -358,7 +358,7 @@ const BaseSkeleton = (0, _forwardRef.forwardRef)(function BaseSkeleton(props, re
358
358
  const {
359
359
  material
360
360
  } = props,
361
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded12);
361
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded10);
362
362
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Skeleton.default, (0, _extends2.default)({}, rest, material, {
363
363
  ref: ref
364
364
  }));
@@ -369,7 +369,7 @@ const BaseSwitch = (0, _forwardRef.forwardRef)(function BaseSwitch(props, ref) {
369
369
  label,
370
370
  className
371
371
  } = props,
372
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded13);
372
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded11);
373
373
  if (!label) {
374
374
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Switch.default, (0, _extends2.default)({}, rest, material, {
375
375
  className: className,
@@ -388,7 +388,7 @@ const BaseMenuList = (0, _forwardRef.forwardRef)(function BaseMenuList(props, re
388
388
  const {
389
389
  material
390
390
  } = props,
391
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded14);
391
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded12);
392
392
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuList.default, (0, _extends2.default)({}, rest, material, {
393
393
  ref: ref
394
394
  }));
@@ -401,7 +401,7 @@ function BaseMenuItem(props) {
401
401
  children,
402
402
  material
403
403
  } = props,
404
- other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded15);
404
+ other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded13);
405
405
  if (inert) {
406
406
  other.disableRipple = true;
407
407
  }
@@ -420,7 +420,7 @@ function BaseTextField(props) {
420
420
  slotProps,
421
421
  material
422
422
  } = props,
423
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded16);
423
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded14);
424
424
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, (0, _extends2.default)({
425
425
  variant: "outlined"
426
426
  }, rest, material, {
@@ -447,7 +447,7 @@ function BaseAutocomplete(props) {
447
447
  slotProps,
448
448
  material
449
449
  } = props,
450
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded17);
450
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded15);
451
451
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Autocomplete.default, (0, _extends2.default)({
452
452
  id: id,
453
453
  multiple: multiple,
@@ -464,7 +464,7 @@ function BaseAutocomplete(props) {
464
464
  {
465
465
  key
466
466
  } = _getTagProps,
467
- tagProps = (0, _objectWithoutPropertiesLoose2.default)(_getTagProps, _excluded18);
467
+ tagProps = (0, _objectWithoutPropertiesLoose2.default)(_getTagProps, _excluded16);
468
468
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip.default, (0, _extends2.default)({
469
469
  variant: "outlined",
470
470
  size: "small",
@@ -477,7 +477,7 @@ function BaseAutocomplete(props) {
477
477
  InputProps,
478
478
  InputLabelProps
479
479
  } = params,
480
- inputRest = (0, _objectWithoutPropertiesLoose2.default)(params, _excluded19);
480
+ inputRest = (0, _objectWithoutPropertiesLoose2.default)(params, _excluded17);
481
481
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextField.default, (0, _extends2.default)({}, inputRest, {
482
482
  label: label,
483
483
  placeholder: placeholder,
@@ -501,7 +501,7 @@ function transformInputProps(props, wrapAdornments = true) {
501
501
  slotProps,
502
502
  material
503
503
  } = props,
504
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded20);
504
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded18);
505
505
  const result = rest;
506
506
  if (wrapAdornments) {
507
507
  if (result.startAdornment) {
@@ -550,7 +550,7 @@ function BasePopper(props) {
550
550
  placement,
551
551
  material
552
552
  } = props,
553
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded21);
553
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded19);
554
554
  const modifiers = React.useMemo(() => {
555
555
  const result = [{
556
556
  name: 'preventOverflow',
@@ -648,7 +648,7 @@ function BaseSelectOption(_ref) {
648
648
  let {
649
649
  native
650
650
  } = _ref,
651
- props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded22);
651
+ props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded20);
652
652
  if (native) {
653
653
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("option", (0, _extends2.default)({}, props));
654
654
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@mui/x-data-grid",
3
- "version": "8.2.0",
4
- "description": "The Community plan edition of the Data Grid components (MUI X).",
3
+ "version": "8.3.0",
5
4
  "author": "MUI Team",
5
+ "description": "The Community plan edition of the MUI X Data Grid components.",
6
6
  "main": "./index.js",
7
7
  "license": "MIT",
8
8
  "bugs": {
@@ -39,13 +39,13 @@
39
39
  "directory": "packages/x-data-grid"
40
40
  },
41
41
  "dependencies": {
42
- "@babel/runtime": "^7.27.0",
42
+ "@babel/runtime": "^7.27.1",
43
43
  "@mui/utils": "^7.0.2",
44
44
  "clsx": "^2.1.1",
45
45
  "prop-types": "^15.8.1",
46
46
  "reselect": "^5.1.1",
47
47
  "use-sync-external-store": "^1.5.0",
48
- "@mui/x-internals": "8.2.0"
48
+ "@mui/x-internals": "8.3.0"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@emotion/react": "^11.9.0",
@@ -1,6 +1,6 @@
1
1
  import { CleanupTracking, UnregisterToken, UnsubscribeFn } from "./CleanupTracking.js";
2
2
  export declare class TimerBasedCleanupTracking implements CleanupTracking {
3
- timeouts?: Map<number, NodeJS.Timeout> | undefined;
3
+ timeouts?: Map<number, number> | undefined;
4
4
  cleanupTimeout: number;
5
5
  constructor(timeout?: number);
6
6
  register(object: any, unsubscribe: UnsubscribeFn, unregisterToken: UnregisterToken): void;
@@ -9,6 +9,7 @@ exports.GridPortalWrapper = GridPortalWrapper;
9
9
  exports.useCSSVariablesClass = useCSSVariablesClass;
10
10
  exports.useCSSVariablesContext = useCSSVariablesContext;
11
11
  var React = _interopRequireWildcard(require("react"));
12
+ var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
12
13
  var _useGridConfiguration = require("../../hooks/utils/useGridConfiguration");
13
14
  var _jsxRuntime = require("react/jsx-runtime");
14
15
  const CLASSNAME_PREFIX = 'MuiDataGridVariables';
@@ -35,19 +36,21 @@ function GridPortalWrapper({
35
36
  }
36
37
  function GridCSSVariablesContext(props) {
37
38
  const config = (0, _useGridConfiguration.useGridConfiguration)();
39
+ const rootProps = (0, _useGridRootProps.useGridRootProps)();
38
40
  const description = config.hooks.useCSSVariables();
39
41
  const context = React.useMemo(() => {
40
42
  const className = `${CLASSNAME_PREFIX}-${description.id}`;
41
43
  const cssString = `.${className}{${variablesToString(description.variables)}}`;
42
44
  const tag = /*#__PURE__*/(0, _jsxRuntime.jsx)("style", {
43
45
  href: `/${className}`,
46
+ nonce: rootProps.nonce,
44
47
  children: cssString
45
48
  });
46
49
  return {
47
50
  className,
48
51
  tag
49
52
  };
50
- }, [description]);
53
+ }, [rootProps.nonce, description]);
51
54
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(CSSVariablesContext.Provider, {
52
55
  value: context,
53
56
  children: props.children