@mui/x-data-grid 7.24.1 → 7.25.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 (118) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/DataGrid/DataGrid.js +1 -7
  3. package/components/GridRow.d.ts +0 -1
  4. package/components/GridRow.js +25 -19
  5. package/components/cell/GridCell.d.ts +9 -6
  6. package/components/cell/GridCell.js +29 -52
  7. package/components/containers/GridRootStyles.js +135 -37
  8. package/components/toolbar/GridToolbarColumnsButton.js +5 -4
  9. package/components/toolbar/GridToolbarDensitySelector.js +2 -2
  10. package/components/toolbar/GridToolbarExportContainer.js +2 -2
  11. package/components/toolbar/GridToolbarFilterButton.js +4 -3
  12. package/components/virtualization/GridMainContainer.d.ts +10 -0
  13. package/components/virtualization/GridMainContainer.js +10 -2
  14. package/components/virtualization/GridVirtualScrollbar.d.ts +4 -0
  15. package/components/virtualization/GridVirtualScrollbar.js +5 -5
  16. package/components/virtualization/GridVirtualScroller.js +18 -5
  17. package/components/virtualization/GridVirtualScrollerContent.js +11 -2
  18. package/hooks/features/columnResize/useGridColumnResize.js +2 -1
  19. package/hooks/features/columns/useGridColumns.js +7 -3
  20. package/hooks/features/dimensions/useGridDimensions.js +6 -8
  21. package/hooks/features/editing/gridEditingSelectors.d.ts +6 -0
  22. package/hooks/features/editing/gridEditingSelectors.js +7 -1
  23. package/hooks/features/editing/index.d.ts +1 -1
  24. package/hooks/features/editing/index.js +1 -1
  25. package/hooks/features/editing/useGridCellEditing.js +3 -3
  26. package/hooks/features/editing/useGridRowEditing.js +5 -6
  27. package/hooks/features/focus/useGridFocus.js +3 -2
  28. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +24 -16
  29. package/hooks/features/keyboardNavigation/utils.d.ts +1 -2
  30. package/hooks/features/keyboardNavigation/utils.js +0 -5
  31. package/hooks/features/listView/useGridListView.js +2 -1
  32. package/hooks/features/rowSelection/useGridRowSelection.js +3 -3
  33. package/hooks/features/rows/useGridParamsApi.d.ts +1 -1
  34. package/hooks/features/rows/useGridParamsApi.js +33 -14
  35. package/hooks/features/rows/useGridRowSpanning.js +94 -91
  36. package/hooks/features/rows/useGridRows.js +7 -8
  37. package/hooks/features/rows/useGridRowsMeta.js +3 -2
  38. package/hooks/features/virtualization/gridFocusedVirtualCellSelector.js +2 -2
  39. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +9 -1
  40. package/hooks/features/virtualization/useGridVirtualScroller.js +31 -45
  41. package/index.js +1 -1
  42. package/models/api/gridApiCommon.d.ts +2 -2
  43. package/models/api/gridParamsApi.d.ts +29 -2
  44. package/models/api/index.d.ts +1 -1
  45. package/models/api/index.js +0 -1
  46. package/modern/DataGrid/DataGrid.js +1 -7
  47. package/modern/components/GridRow.js +25 -19
  48. package/modern/components/cell/GridCell.js +29 -52
  49. package/modern/components/containers/GridRootStyles.js +135 -37
  50. package/modern/components/toolbar/GridToolbarColumnsButton.js +5 -4
  51. package/modern/components/toolbar/GridToolbarDensitySelector.js +2 -2
  52. package/modern/components/toolbar/GridToolbarExportContainer.js +2 -2
  53. package/modern/components/toolbar/GridToolbarFilterButton.js +4 -3
  54. package/modern/components/virtualization/GridMainContainer.js +10 -2
  55. package/modern/components/virtualization/GridVirtualScrollbar.js +5 -5
  56. package/modern/components/virtualization/GridVirtualScroller.js +18 -5
  57. package/modern/components/virtualization/GridVirtualScrollerContent.js +11 -2
  58. package/modern/hooks/features/columnResize/useGridColumnResize.js +2 -1
  59. package/modern/hooks/features/columns/useGridColumns.js +7 -3
  60. package/modern/hooks/features/dimensions/useGridDimensions.js +6 -8
  61. package/modern/hooks/features/editing/gridEditingSelectors.js +7 -1
  62. package/modern/hooks/features/editing/index.js +1 -1
  63. package/modern/hooks/features/editing/useGridCellEditing.js +3 -3
  64. package/modern/hooks/features/editing/useGridRowEditing.js +5 -6
  65. package/modern/hooks/features/focus/useGridFocus.js +3 -2
  66. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +24 -16
  67. package/modern/hooks/features/keyboardNavigation/utils.js +0 -5
  68. package/modern/hooks/features/listView/useGridListView.js +2 -1
  69. package/modern/hooks/features/rowSelection/useGridRowSelection.js +3 -3
  70. package/modern/hooks/features/rows/useGridParamsApi.js +33 -14
  71. package/modern/hooks/features/rows/useGridRowSpanning.js +94 -91
  72. package/modern/hooks/features/rows/useGridRows.js +7 -8
  73. package/modern/hooks/features/rows/useGridRowsMeta.js +3 -2
  74. package/modern/hooks/features/virtualization/gridFocusedVirtualCellSelector.js +2 -2
  75. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +31 -45
  76. package/modern/index.js +1 -1
  77. package/modern/models/api/index.js +0 -1
  78. package/modern/utils/roundToDecimalPlaces.js +3 -0
  79. package/modern/utils/utils.js +6 -1
  80. package/node/DataGrid/DataGrid.js +1 -7
  81. package/node/components/GridRow.js +22 -16
  82. package/node/components/cell/GridCell.js +27 -50
  83. package/node/components/containers/GridRootStyles.js +135 -37
  84. package/node/components/toolbar/GridToolbarColumnsButton.js +5 -4
  85. package/node/components/toolbar/GridToolbarDensitySelector.js +2 -2
  86. package/node/components/toolbar/GridToolbarExportContainer.js +2 -2
  87. package/node/components/toolbar/GridToolbarFilterButton.js +4 -3
  88. package/node/components/virtualization/GridMainContainer.js +10 -2
  89. package/node/components/virtualization/GridVirtualScrollbar.js +5 -5
  90. package/node/components/virtualization/GridVirtualScroller.js +18 -5
  91. package/node/components/virtualization/GridVirtualScrollerContent.js +11 -2
  92. package/node/hooks/features/columnResize/useGridColumnResize.js +2 -1
  93. package/node/hooks/features/columns/useGridColumns.js +7 -3
  94. package/node/hooks/features/dimensions/useGridDimensions.js +6 -8
  95. package/node/hooks/features/editing/gridEditingSelectors.js +8 -2
  96. package/node/hooks/features/editing/index.js +7 -11
  97. package/node/hooks/features/editing/useGridCellEditing.js +2 -2
  98. package/node/hooks/features/editing/useGridRowEditing.js +3 -4
  99. package/node/hooks/features/focus/useGridFocus.js +3 -2
  100. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +24 -15
  101. package/node/hooks/features/keyboardNavigation/utils.js +0 -6
  102. package/node/hooks/features/listView/useGridListView.js +2 -1
  103. package/node/hooks/features/rowSelection/useGridRowSelection.js +2 -2
  104. package/node/hooks/features/rows/useGridParamsApi.js +33 -14
  105. package/node/hooks/features/rows/useGridRowSpanning.js +92 -89
  106. package/node/hooks/features/rows/useGridRows.js +7 -8
  107. package/node/hooks/features/rows/useGridRowsMeta.js +5 -4
  108. package/node/hooks/features/virtualization/gridFocusedVirtualCellSelector.js +2 -2
  109. package/node/hooks/features/virtualization/useGridVirtualScroller.js +31 -45
  110. package/node/index.js +1 -1
  111. package/node/models/api/index.js +0 -11
  112. package/node/utils/roundToDecimalPlaces.js +9 -0
  113. package/node/utils/utils.js +8 -1
  114. package/package.json +2 -2
  115. package/utils/roundToDecimalPlaces.d.ts +1 -0
  116. package/utils/roundToDecimalPlaces.js +3 -0
  117. package/utils/utils.d.ts +1 -0
  118. package/utils/utils.js +6 -1
@@ -38,50 +38,76 @@ const ignoreSsrWarning = '/* emotion-disable-server-rendering-unsafe-selector-wa
38
38
  export const GridRootStyles = styled('div', {
39
39
  name: 'MuiDataGrid',
40
40
  slot: 'Root',
41
- overridesResolver: (props, styles) => [{
41
+ overridesResolver: (props, styles) => [
42
+ // Root overrides
43
+ styles.root, {
42
44
  [`&.${c.autoHeight}`]: styles.autoHeight
43
45
  }, {
44
- [`&.${c.aggregationColumnHeader}`]: styles.aggregationColumnHeader
46
+ [`&.${c.autosizing}`]: styles.autosizing
45
47
  }, {
46
- [`&.${c['aggregationColumnHeader--alignLeft']}`]: styles['aggregationColumnHeader--alignLeft']
48
+ [`&.${c['root--densityStandard']}`]: styles['root--densityStandard']
47
49
  }, {
48
- [`&.${c['aggregationColumnHeader--alignCenter']}`]: styles['aggregationColumnHeader--alignCenter']
50
+ [`&.${c['root--densityComfortable']}`]: styles['root--densityComfortable']
49
51
  }, {
50
- [`&.${c['aggregationColumnHeader--alignRight']}`]: styles['aggregationColumnHeader--alignRight']
52
+ [`&.${c['root--densityCompact']}`]: styles['root--densityCompact']
51
53
  }, {
52
- [`&.${c.aggregationColumnHeaderLabel}`]: styles.aggregationColumnHeaderLabel
54
+ [`&.${c['root--disableUserSelection']}`]: styles['root--disableUserSelection']
53
55
  }, {
54
- [`&.${c['root--disableUserSelection']} .${c.cell}`]: styles['root--disableUserSelection']
56
+ [`&.${c['root--noToolbar']}`]: styles['root--noToolbar']
55
57
  }, {
56
- [`&.${c.autosizing}`]: styles.autosizing
58
+ [`&.${c.withVerticalBorder}`]: styles.withVerticalBorder
59
+ },
60
+ // Child element overrides
61
+ // - Only declare overrides here for class names that are not applied to `styled` components.
62
+ // - For `styled` components, declare overrides in the component itself.
63
+ {
64
+ [`& .${c.actionsCell}`]: styles.actionsCell
57
65
  }, {
58
- [`& .${c.editBooleanCell}`]: styles.editBooleanCell
66
+ [`& .${c.booleanCell}`]: styles.booleanCell
59
67
  }, {
60
68
  [`& .${c.cell}`]: styles.cell
69
+ }, {
70
+ [`& .${c['cell--editable']}`]: styles['cell--editable']
61
71
  }, {
62
72
  [`& .${c['cell--editing']}`]: styles['cell--editing']
63
73
  }, {
64
- [`& .${c['cell--textCenter']}`]: styles['cell--textCenter']
74
+ [`& .${c['cell--flex']}`]: styles['cell--flex']
65
75
  }, {
66
- [`& .${c['cell--textLeft']}`]: styles['cell--textLeft']
76
+ [`& .${c['cell--pinnedLeft']}`]: styles['cell--pinnedLeft']
67
77
  }, {
68
- [`& .${c['cell--textRight']}`]: styles['cell--textRight']
69
- }, {
70
- [`& .${c['cell--rangeTop']}`]: styles['cell--rangeTop']
78
+ [`& .${c['cell--pinnedRight']}`]: styles['cell--pinnedRight']
71
79
  }, {
72
80
  [`& .${c['cell--rangeBottom']}`]: styles['cell--rangeBottom']
73
81
  }, {
74
82
  [`& .${c['cell--rangeLeft']}`]: styles['cell--rangeLeft']
75
83
  }, {
76
84
  [`& .${c['cell--rangeRight']}`]: styles['cell--rangeRight']
85
+ }, {
86
+ [`& .${c['cell--rangeTop']}`]: styles['cell--rangeTop']
87
+ }, {
88
+ [`& .${c['cell--selectionMode']}`]: styles['cell--selectionMode']
89
+ }, {
90
+ [`& .${c['cell--textCenter']}`]: styles['cell--textCenter']
91
+ }, {
92
+ [`& .${c['cell--textLeft']}`]: styles['cell--textLeft']
93
+ }, {
94
+ [`& .${c['cell--textRight']}`]: styles['cell--textRight']
95
+ }, {
96
+ [`& .${c['cell--withLeftBorder']}`]: styles['cell--withLeftBorder']
77
97
  }, {
78
98
  [`& .${c['cell--withRightBorder']}`]: styles['cell--withRightBorder']
79
99
  }, {
80
100
  [`& .${c.cellCheckbox}`]: styles.cellCheckbox
101
+ }, {
102
+ [`& .${c.cellEmpty}`]: styles.cellEmpty
103
+ }, {
104
+ [`& .${c.cellOffsetLeft}`]: styles.cellOffsetLeft
81
105
  }, {
82
106
  [`& .${c.cellSkeleton}`]: styles.cellSkeleton
83
107
  }, {
84
108
  [`& .${c.checkboxInput}`]: styles.checkboxInput
109
+ }, {
110
+ [`& .${c.columnHeader}`]: styles.columnHeader
85
111
  }, {
86
112
  [`& .${c['columnHeader--alignCenter']}`]: styles['columnHeader--alignCenter']
87
113
  }, {
@@ -90,75 +116,151 @@ export const GridRootStyles = styled('div', {
90
116
  [`& .${c['columnHeader--alignRight']}`]: styles['columnHeader--alignRight']
91
117
  }, {
92
118
  [`& .${c['columnHeader--dragging']}`]: styles['columnHeader--dragging']
119
+ }, {
120
+ [`& .${c['columnHeader--emptyGroup']}`]: styles['columnHeader--emptyGroup']
121
+ }, {
122
+ [`& .${c['columnHeader--filledGroup']}`]: styles['columnHeader--filledGroup']
123
+ }, {
124
+ [`& .${c['columnHeader--filtered']}`]: styles['columnHeader--filtered']
125
+ }, {
126
+ [`& .${c['columnHeader--last']}`]: styles['columnHeader--last']
127
+ }, {
128
+ [`& .${c['columnHeader--lastUnpinned']}`]: styles['columnHeader--lastUnpinned']
93
129
  }, {
94
130
  [`& .${c['columnHeader--moving']}`]: styles['columnHeader--moving']
95
131
  }, {
96
132
  [`& .${c['columnHeader--numeric']}`]: styles['columnHeader--numeric']
133
+ }, {
134
+ [`& .${c['columnHeader--pinnedLeft']}`]: styles['columnHeader--pinnedLeft']
135
+ }, {
136
+ [`& .${c['columnHeader--pinnedRight']}`]: styles['columnHeader--pinnedRight']
137
+ }, {
138
+ [`& .${c['columnHeader--siblingFocused']}`]: styles['columnHeader--siblingFocused']
97
139
  }, {
98
140
  [`& .${c['columnHeader--sortable']}`]: styles['columnHeader--sortable']
99
141
  }, {
100
142
  [`& .${c['columnHeader--sorted']}`]: styles['columnHeader--sorted']
101
143
  }, {
102
- [`& .${c['columnHeader--withRightBorder']}`]: styles['columnHeader--withRightBorder']
103
- }, {
104
- [`& .${c.columnHeader}`]: styles.columnHeader
144
+ [`& .${c['columnHeader--withLeftBorder']}`]: styles['columnHeader--withLeftBorder']
105
145
  }, {
106
- [`& .${c.headerFilterRow}`]: styles.headerFilterRow
146
+ [`& .${c['columnHeader--withRightBorder']}`]: styles['columnHeader--withRightBorder']
107
147
  }, {
108
148
  [`& .${c.columnHeaderCheckbox}`]: styles.columnHeaderCheckbox
109
149
  }, {
110
150
  [`& .${c.columnHeaderDraggableContainer}`]: styles.columnHeaderDraggableContainer
111
151
  }, {
112
152
  [`& .${c.columnHeaderTitleContainer}`]: styles.columnHeaderTitleContainer
153
+ }, {
154
+ [`& .${c.columnHeaderTitleContainerContent}`]: styles.columnHeaderTitleContainerContent
155
+ }, {
156
+ [`& .${c.columnSeparator}`]: styles.columnSeparator
113
157
  }, {
114
158
  [`& .${c['columnSeparator--resizable']}`]: styles['columnSeparator--resizable']
115
159
  }, {
116
160
  [`& .${c['columnSeparator--resizing']}`]: styles['columnSeparator--resizing']
117
161
  }, {
118
- [`& .${c.columnSeparator}`]: styles.columnSeparator
162
+ [`& .${c['columnSeparator--sideLeft']}`]: styles['columnSeparator--sideLeft']
163
+ }, {
164
+ [`& .${c['columnSeparator--sideRight']}`]: styles['columnSeparator--sideRight']
165
+ }, {
166
+ [`& .${c['container--bottom']}`]: styles['container--bottom']
167
+ }, {
168
+ [`& .${c['container--top']}`]: styles['container--top']
169
+ }, {
170
+ [`& .${c.detailPanelToggleCell}`]: styles.detailPanelToggleCell
171
+ }, {
172
+ [`& .${c['detailPanelToggleCell--expanded']}`]: styles['detailPanelToggleCell--expanded']
173
+ }, {
174
+ [`& .${c.editBooleanCell}`]: styles.editBooleanCell
119
175
  }, {
120
176
  [`& .${c.filterIcon}`]: styles.filterIcon
177
+ }, {
178
+ [`& .${c['filler--borderBottom']}`]: styles['filler--borderBottom']
179
+ }, {
180
+ [`& .${c['filler--pinnedLeft']}`]: styles['filler--pinnedLeft']
181
+ }, {
182
+ [`& .${c['filler--pinnedRight']}`]: styles['filler--pinnedRight']
183
+ }, {
184
+ [`& .${c.groupingCriteriaCell}`]: styles.groupingCriteriaCell
185
+ }, {
186
+ [`& .${c.groupingCriteriaCellLoadingContainer}`]: styles.groupingCriteriaCellLoadingContainer
187
+ }, {
188
+ [`& .${c.groupingCriteriaCellToggle}`]: styles.groupingCriteriaCellToggle
189
+ }, {
190
+ [`& .${c.headerFilterRow}`]: styles.headerFilterRow
121
191
  }, {
122
192
  [`& .${c.iconSeparator}`]: styles.iconSeparator
123
193
  }, {
124
194
  [`& .${c.menuIcon}`]: styles.menuIcon
125
195
  }, {
126
196
  [`& .${c.menuIconButton}`]: styles.menuIconButton
197
+ }, {
198
+ [`& .${c.menuList}`]: styles.menuList
127
199
  }, {
128
200
  [`& .${c.menuOpen}`]: styles.menuOpen
129
201
  }, {
130
- [`& .${c.menuList}`]: styles.menuList
202
+ [`& .${c.overlayWrapperInner}`]: styles.overlayWrapperInner
131
203
  }, {
132
- [`& .${c['row--editable']}`]: styles['row--editable']
204
+ [`& .${c.pinnedRows}`]: styles.pinnedRows
133
205
  }, {
134
- [`& .${c['row--editing']}`]: styles['row--editing']
206
+ [`& .${c['pinnedRows--bottom']}`]: styles['pinnedRows--bottom']
135
207
  }, {
136
- [`& .${c['row--dragging']}`]: styles['row--dragging']
208
+ [`& .${c['pinnedRows--top']}`]: styles['pinnedRows--top']
137
209
  }, {
138
210
  [`& .${c.row}`]: styles.row
139
211
  }, {
140
- [`& .${c.rowReorderCellPlaceholder}`]: styles.rowReorderCellPlaceholder
212
+ [`& .${c['row--borderBottom']}`]: styles['row--borderBottom']
213
+ }, {
214
+ [`& .${c['row--detailPanelExpanded']}`]: styles['row--detailPanelExpanded']
215
+ }, {
216
+ [`& .${c['row--dragging']}`]: styles['row--dragging']
217
+ }, {
218
+ [`& .${c['row--dynamicHeight']}`]: styles['row--dynamicHeight']
219
+ }, {
220
+ [`& .${c['row--editable']}`]: styles['row--editable']
221
+ }, {
222
+ [`& .${c['row--editing']}`]: styles['row--editing']
223
+ }, {
224
+ [`& .${c['row--firstVisible']}`]: styles['row--firstVisible']
225
+ }, {
226
+ [`& .${c['row--lastVisible']}`]: styles['row--lastVisible']
141
227
  }, {
142
228
  [`& .${c.rowReorderCell}`]: styles.rowReorderCell
143
229
  }, {
144
230
  [`& .${c['rowReorderCell--draggable']}`]: styles['rowReorderCell--draggable']
145
231
  }, {
146
- [`& .${c.sortIcon}`]: styles.sortIcon
232
+ [`& .${c.rowReorderCellContainer}`]: styles.rowReorderCellContainer
147
233
  }, {
148
- [`& .${c.withBorderColor}`]: styles.withBorderColor
234
+ [`& .${c.rowReorderCellPlaceholder}`]: styles.rowReorderCellPlaceholder
149
235
  }, {
150
- [`& .${c.treeDataGroupingCell}`]: styles.treeDataGroupingCell
236
+ [`& .${c.rowSkeleton}`]: styles.rowSkeleton
151
237
  }, {
152
- [`& .${c.treeDataGroupingCellToggle}`]: styles.treeDataGroupingCellToggle
238
+ [`& .${c.scrollbar}`]: styles.scrollbar
153
239
  }, {
154
- [`& .${c.treeDataGroupingCellLoadingContainer}`]: styles.treeDataGroupingCellLoadingContainer
240
+ [`& .${c['scrollbar--horizontal']}`]: styles['scrollbar--horizontal']
155
241
  }, {
156
- [`& .${c.groupingCriteriaCellLoadingContainer}`]: styles.groupingCriteriaCellLoadingContainer
242
+ [`& .${c['scrollbar--vertical']}`]: styles['scrollbar--vertical']
157
243
  }, {
158
- [`& .${c.detailPanelToggleCell}`]: styles.detailPanelToggleCell
244
+ [`& .${c.scrollbarFiller}`]: styles.scrollbarFiller
159
245
  }, {
160
- [`& .${c['detailPanelToggleCell--expanded']}`]: styles['detailPanelToggleCell--expanded']
161
- }, styles.root]
246
+ [`& .${c['scrollbarFiller--borderBottom']}`]: styles['scrollbarFiller--borderBottom']
247
+ }, {
248
+ [`& .${c['scrollbarFiller--borderTop']}`]: styles['scrollbarFiller--borderTop']
249
+ }, {
250
+ [`& .${c['scrollbarFiller--header']}`]: styles['scrollbarFiller--header']
251
+ }, {
252
+ [`& .${c['scrollbarFiller--pinnedRight']}`]: styles['scrollbarFiller--pinnedRight']
253
+ }, {
254
+ [`& .${c.sortIcon}`]: styles.sortIcon
255
+ }, {
256
+ [`& .${c.treeDataGroupingCell}`]: styles.treeDataGroupingCell
257
+ }, {
258
+ [`& .${c.treeDataGroupingCellLoadingContainer}`]: styles.treeDataGroupingCellLoadingContainer
259
+ }, {
260
+ [`& .${c.treeDataGroupingCellToggle}`]: styles.treeDataGroupingCellToggle
261
+ }, {
262
+ [`& .${c.withBorderColor}`]: styles.withBorderColor
263
+ }]
162
264
  })(({
163
265
  theme: t
164
266
  }) => {
@@ -255,10 +357,6 @@ export const GridRootStyles = styled('div', {
255
357
  overflow: 'visible !important'
256
358
  },
257
359
  '@media (hover: hover)': {
258
- [`& .${c.iconButtonContainer}`]: {
259
- width: '0 !important',
260
- visibility: 'hidden !important'
261
- },
262
360
  [`& .${c.menuIcon}`]: {
263
361
  width: '0 !important',
264
362
  visibility: 'hidden !important'
@@ -45,14 +45,15 @@ const GridToolbarColumnsButton = forwardRef(function GridToolbarColumnsButton(pr
45
45
  "aria-haspopup": "menu",
46
46
  "aria-expanded": isOpen,
47
47
  "aria-controls": isOpen ? columnPanelId : undefined,
48
- startIcon: /*#__PURE__*/_jsx(rootProps.slots.columnSelectorIcon, {}),
49
- onClick: showColumns,
48
+ startIcon: /*#__PURE__*/_jsx(rootProps.slots.columnSelectorIcon, {})
49
+ }, rootProps.slotProps?.baseButton, buttonProps, {
50
50
  onPointerUp: event => {
51
51
  if (preferencePanel.open) {
52
52
  event.stopPropagation();
53
53
  }
54
- }
55
- }, rootProps.slotProps?.baseButton, buttonProps, {
54
+ buttonProps.onPointerUp?.(event);
55
+ },
56
+ onClick: showColumns,
56
57
  ref: ref,
57
58
  children: apiRef.current.getLocaleText('toolbarColumns')
58
59
  }))
@@ -94,9 +94,9 @@ const GridToolbarDensitySelector = forwardRef(function GridToolbarDensitySelecto
94
94
  "aria-haspopup": "menu",
95
95
  "aria-expanded": open,
96
96
  "aria-controls": open ? densityMenuId : undefined,
97
- id: densityButtonId,
98
- onClick: handleDensitySelectorOpen
97
+ id: densityButtonId
99
98
  }, rootProps.slotProps?.baseButton, buttonProps, {
99
+ onClick: handleDensitySelectorOpen,
100
100
  ref: handleRef,
101
101
  children: apiRef.current.getLocaleText('toolbarDensity')
102
102
  }))
@@ -52,9 +52,9 @@ const GridToolbarExportContainer = forwardRef(function GridToolbarExportContaine
52
52
  "aria-label": apiRef.current.getLocaleText('toolbarExportLabel'),
53
53
  "aria-haspopup": "menu",
54
54
  "aria-controls": open ? exportMenuId : undefined,
55
- id: exportButtonId,
56
- onClick: handleMenuOpen
55
+ id: exportButtonId
57
56
  }, rootProps.slotProps?.baseButton, buttonProps, {
57
+ onClick: handleMenuOpen,
58
58
  ref: handleRef,
59
59
  children: apiRef.current.getLocaleText('toolbarExport')
60
60
  }))
@@ -109,14 +109,15 @@ const GridToolbarFilterButton = forwardRef(function GridToolbarFilterButton(prop
109
109
  color: "primary"
110
110
  }, rootProps.slotProps?.baseBadge, badgeProps, {
111
111
  children: /*#__PURE__*/_jsx(rootProps.slots.openFilterButtonIcon, {})
112
- })),
112
+ }))
113
+ }, rootProps.slotProps?.baseButton, buttonProps, {
113
114
  onClick: toggleFilter,
114
115
  onPointerUp: event => {
115
116
  if (preferencePanel.open) {
116
117
  event.stopPropagation();
117
118
  }
118
- }
119
- }, rootProps.slotProps?.baseButton, buttonProps, {
119
+ buttonProps.onPointerUp?.(event);
120
+ },
120
121
  ref: ref,
121
122
  children: apiRef.current.getLocaleText('toolbarFilters')
122
123
  }))
@@ -14,7 +14,12 @@ const GridPanelAnchor = styled('div')({
14
14
  const Element = styled('div', {
15
15
  name: 'MuiDataGrid',
16
16
  slot: 'Main',
17
- overridesResolver: (props, styles) => styles.main
17
+ overridesResolver: (props, styles) => {
18
+ const {
19
+ ownerState
20
+ } = props;
21
+ return [styles.main, ownerState.dimensions.rightPinnedWidth > 0 && styles['main--hasPinnedRight'], ownerState.loadingOverlayVariant === 'skeleton' && styles['main--hasSkeletonLoadingOverlay']];
22
+ }
18
23
  })({
19
24
  flexGrow: 1,
20
25
  position: 'relative',
@@ -23,11 +28,14 @@ const Element = styled('div', {
23
28
  flexDirection: 'column'
24
29
  });
25
30
  export const GridMainContainer = forwardRef((props, ref) => {
31
+ const {
32
+ ownerState
33
+ } = props;
26
34
  const rootProps = useGridRootProps();
27
35
  const configuration = useGridConfiguration();
28
36
  const ariaAttributes = configuration.hooks.useGridAriaAttributes();
29
37
  return /*#__PURE__*/_jsxs(Element, _extends({
30
- ownerState: rootProps,
38
+ ownerState: ownerState,
31
39
  className: props.className,
32
40
  tabIndex: -1
33
41
  }, ariaAttributes, rootProps.slotProps?.main, {
@@ -67,26 +67,27 @@ const GridVirtualScrollbar = forwardRef(function GridVirtualScrollbar(props, ref
67
67
  const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
68
68
  const propertyDimension = props.position === 'vertical' ? 'height' : 'width';
69
69
  const propertyScroll = props.position === 'vertical' ? 'scrollTop' : 'scrollLeft';
70
+ const propertyScrollPosition = props.position === 'vertical' ? 'top' : 'left';
70
71
  const hasScroll = props.position === 'vertical' ? dimensions.hasScrollX : dimensions.hasScrollY;
71
72
  const contentSize = dimensions.minimumSize[propertyDimension] + (hasScroll ? dimensions.scrollbarSize : 0);
72
73
  const scrollbarSize = props.position === 'vertical' ? dimensions.viewportInnerSize.height : dimensions.viewportOuterSize.width;
73
74
  const scrollbarInnerSize = scrollbarSize * (contentSize / dimensions.viewportOuterSize[propertyDimension]);
74
75
  const onScrollerScroll = useEventCallback(() => {
75
- const scroller = apiRef.current.virtualScrollerRef.current;
76
76
  const scrollbar = scrollbarRef.current;
77
+ const scrollPosition = props.scrollPosition.current;
77
78
  if (!scrollbar) {
78
79
  return;
79
80
  }
80
- if (scroller[propertyScroll] === lastPosition.current) {
81
+ if (scrollPosition[propertyScrollPosition] === lastPosition.current) {
81
82
  return;
82
83
  }
83
- lastPosition.current = scroller[propertyScroll];
84
+ lastPosition.current = scrollPosition[propertyScrollPosition];
84
85
  if (isLocked.current) {
85
86
  isLocked.current = false;
86
87
  return;
87
88
  }
88
89
  isLocked.current = true;
89
- const value = scroller[propertyScroll] / contentSize;
90
+ const value = scrollPosition[propertyScrollPosition] / contentSize;
90
91
  scrollbar[propertyScroll] = value * scrollbarInnerSize;
91
92
  });
92
93
  const onScrollbarScroll = useEventCallback(() => {
@@ -107,7 +108,6 @@ const GridVirtualScrollbar = forwardRef(function GridVirtualScrollbar(props, ref
107
108
  const scroller = apiRef.current.virtualScrollerRef.current;
108
109
  const scrollbar = scrollbarRef.current;
109
110
  const options = {
110
- capture: true,
111
111
  passive: true
112
112
  };
113
113
  scroller.addEventListener('scroll', onScrollerScroll, options);
@@ -20,9 +20,11 @@ import { GridVirtualScrollerFiller as SpaceFiller } from "./GridVirtualScrollerF
20
20
  import { GridVirtualScrollerRenderZone as RenderZone } from "./GridVirtualScrollerRenderZone.js";
21
21
  import { GridVirtualScrollbar as Scrollbar } from "./GridVirtualScrollbar.js";
22
22
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
23
- const useUtilityClasses = (ownerState, dimensions, loadingOverlayVariant) => {
23
+ const useUtilityClasses = ownerState => {
24
24
  const {
25
- classes
25
+ classes,
26
+ dimensions,
27
+ loadingOverlayVariant
26
28
  } = ownerState;
27
29
  const slots = {
28
30
  root: ['main', dimensions.rightPinnedWidth > 0 && 'main--hasPinnedRight', loadingOverlayVariant === 'skeleton' && 'main--hasSkeletonLoadingOverlay'],
@@ -33,7 +35,12 @@ const useUtilityClasses = (ownerState, dimensions, loadingOverlayVariant) => {
33
35
  const Scroller = styled('div', {
34
36
  name: 'MuiDataGrid',
35
37
  slot: 'VirtualScroller',
36
- overridesResolver: (props, styles) => styles.virtualScroller
38
+ overridesResolver: (props, styles) => {
39
+ const {
40
+ ownerState
41
+ } = props;
42
+ return [styles.virtualScroller, ownerState.dimensions.hasScrollX && styles['virtualScroller--hasScrollX']];
43
+ }
37
44
  })({
38
45
  position: 'relative',
39
46
  height: '100%',
@@ -56,7 +63,12 @@ function GridVirtualScroller(props) {
56
63
  const rootProps = useGridRootProps();
57
64
  const dimensions = useGridSelector(apiRef, gridDimensionsSelector);
58
65
  const overlaysProps = useGridOverlays();
59
- const classes = useUtilityClasses(rootProps, dimensions, overlaysProps.loadingOverlayVariant);
66
+ const ownerState = {
67
+ classes: rootProps.classes,
68
+ dimensions,
69
+ loadingOverlayVariant: overlaysProps.loadingOverlayVariant
70
+ };
71
+ const classes = useUtilityClasses(ownerState);
60
72
  const virtualScroller = useGridVirtualScroller();
61
73
  const {
62
74
  getContainerProps,
@@ -71,6 +83,7 @@ function GridVirtualScroller(props) {
71
83
  return /*#__PURE__*/_jsxs(Container, _extends({
72
84
  className: classes.root
73
85
  }, getContainerProps(), {
86
+ ownerState: ownerState,
74
87
  children: [/*#__PURE__*/_jsx(GridScrollArea, {
75
88
  scrollDirection: "left"
76
89
  }), /*#__PURE__*/_jsx(GridScrollArea, {
@@ -78,7 +91,7 @@ function GridVirtualScroller(props) {
78
91
  }), /*#__PURE__*/_jsxs(Scroller, _extends({
79
92
  className: classes.scroller
80
93
  }, getScrollerProps(), {
81
- ownerState: rootProps,
94
+ ownerState: ownerState,
82
95
  children: [/*#__PURE__*/_jsxs(TopContainer, {
83
96
  children: [!rootProps.unstable_listView && /*#__PURE__*/_jsx(GridHeaders, {}), /*#__PURE__*/_jsx(rootProps.slots.pinnedRows, {
84
97
  position: "top",
@@ -19,14 +19,23 @@ const useUtilityClasses = (props, overflowedContent) => {
19
19
  const VirtualScrollerContentRoot = styled('div', {
20
20
  name: 'MuiDataGrid',
21
21
  slot: 'VirtualScrollerContent',
22
- overridesResolver: (props, styles) => styles.virtualScrollerContent
22
+ overridesResolver: (props, styles) => {
23
+ const {
24
+ ownerState
25
+ } = props;
26
+ return [styles.virtualScrollerContent, ownerState.overflowedContent && styles['virtualScrollerContent--overflowed']];
27
+ }
23
28
  })({});
24
29
  const GridVirtualScrollerContent = forwardRef(function GridVirtualScrollerContent(props, ref) {
25
30
  const rootProps = useGridRootProps();
26
31
  const overflowedContent = !rootProps.autoHeight && props.style?.minHeight === 'auto';
27
32
  const classes = useUtilityClasses(rootProps, overflowedContent);
33
+ const ownerState = {
34
+ classes: rootProps.classes,
35
+ overflowedContent
36
+ };
28
37
  return /*#__PURE__*/_jsx(VirtualScrollerContentRoot, _extends({}, props, {
29
- ownerState: rootProps,
38
+ ownerState: ownerState,
30
39
  className: clsx(classes.root, props.className),
31
40
  ref: ref
32
41
  }));
@@ -500,7 +500,8 @@ export const useGridColumnResize = (apiRef, props) => {
500
500
  if (options.expand) {
501
501
  const visibleColumns = state.orderedFields.map(field => state.lookup[field]).filter(c => state.columnVisibilityModel[c.field] !== false);
502
502
  const totalWidth = visibleColumns.reduce((total, column) => total + (widthByField[column.field] ?? column.computedWidth ?? column.width), 0);
503
- const availableWidth = apiRef.current.getRootDimensions().viewportInnerSize.width;
503
+ const dimensions = apiRef.current.getRootDimensions();
504
+ const availableWidth = dimensions.viewportInnerSize.width;
504
505
  const remainingWidth = availableWidth - totalWidth;
505
506
  if (remainingWidth > 0) {
506
507
  const widthPerColumn = remainingWidth / (newColumns.length || 1);
@@ -242,9 +242,13 @@ export function useGridColumns(apiRef, props) {
242
242
  */
243
243
 
244
244
  const prevInnerWidth = React.useRef(null);
245
- const handleGridSizeChange = viewportInnerSize => {
246
- if (prevInnerWidth.current !== viewportInnerSize.width) {
247
- prevInnerWidth.current = viewportInnerSize.width;
245
+ const handleGridSizeChange = size => {
246
+ if (prevInnerWidth.current !== size.width) {
247
+ prevInnerWidth.current = size.width;
248
+ const hasFlexColumns = gridVisibleColumnDefinitionsSelector(apiRef).some(col => col.flex && col.flex > 0);
249
+ if (!hasFlexColumns) {
250
+ return;
251
+ }
248
252
  setGridColumnsState(hydrateColumnsWidth(gridColumnsStateSelector(apiRef.current.state), apiRef.current.getRootDimensions()));
249
253
  }
250
254
  };
@@ -15,6 +15,7 @@ import { gridRowsMetaSelector } from "../rows/gridRowsMetaSelector.js";
15
15
  import { calculatePinnedRowsHeight, getValidRowHeight, rowHeightWarning } from "../rows/gridRowsUtils.js";
16
16
  import { getTotalHeaderHeight } from "../columns/gridColumnsUtils.js";
17
17
  import { DATA_GRID_PROPS_DEFAULT_VALUES } from "../../../constants/dataGridPropsDefaultValues.js";
18
+ import { roundToDecimalPlaces } from "../../../utils/roundToDecimalPlaces.js";
18
19
  import { isJSDOM } from "../../../utils/isJSDOM.js";
19
20
  const EMPTY_SIZE = {
20
21
  width: 0,
@@ -61,7 +62,7 @@ export function useGridDimensions(apiRef, props) {
61
62
  const headerHeight = Math.floor(props.columnHeaderHeight * densityFactor);
62
63
  const groupHeaderHeight = Math.floor((props.columnGroupHeaderHeight ?? props.columnHeaderHeight) * densityFactor);
63
64
  const headerFilterHeight = Math.floor((props.headerFilterHeight ?? props.columnHeaderHeight) * densityFactor);
64
- const columnsTotalWidth = roundToDecimalPlaces(gridColumnsTotalWidthSelector(apiRef), 6);
65
+ const columnsTotalWidth = roundToDecimalPlaces(gridColumnsTotalWidthSelector(apiRef), 1);
65
66
  const headersTotalHeight = getTotalHeaderHeight(apiRef, props);
66
67
  const leftPinnedWidth = pinnedColumns.left.reduce((w, col) => w + col.computedWidth, 0);
67
68
  const rightPinnedWidth = pinnedColumns.right.reduce((w, col) => w + col.computedWidth, 0);
@@ -111,6 +112,9 @@ export function useGridDimensions(apiRef, props) {
111
112
  return Math.min(maximumPageSizeWithoutScrollBar, currentPage.rows.length);
112
113
  }, [apiRef, props.pagination, props.paginationMode, props.getRowHeight, rowHeight]);
113
114
  const updateDimensions = React.useCallback(() => {
115
+ // All the floating point dimensions should be rounded to .1 decimal places to avoid subpixel rendering issues
116
+ // https://github.com/mui/mui-x/issues/9550#issuecomment-1619020477
117
+ // https://github.com/mui/mui-x/issues/15721
114
118
  const rootElement = apiRef.current.rootElementRef.current;
115
119
  const pinnedRowsHeight = calculatePinnedRowsHeight(apiRef);
116
120
  const scrollbarSize = measureScrollbarSize(rootElement, columnsTotalWidth, props.scrollbarSize);
@@ -119,7 +123,7 @@ export function useGridDimensions(apiRef, props) {
119
123
  const nonPinnedColumnsTotalWidth = columnsTotalWidth - leftPinnedWidth - rightPinnedWidth;
120
124
  const contentSize = {
121
125
  width: nonPinnedColumnsTotalWidth,
122
- height: rowsMeta.currentPageTotalHeight
126
+ height: roundToDecimalPlaces(rowsMeta.currentPageTotalHeight, 1)
123
127
  };
124
128
  let viewportOuterSize;
125
129
  let viewportInnerSize;
@@ -280,12 +284,6 @@ function measureScrollbarSize(rootElement, columnsTotalWidth, scrollbarSize) {
280
284
  rootElement.removeChild(scrollDiv);
281
285
  return size;
282
286
  }
283
-
284
- // Get rid of floating point imprecision errors
285
- // https://github.com/mui/mui-x/issues/9550#issuecomment-1619020477
286
- function roundToDecimalPlaces(value, decimals) {
287
- return Math.round(value * 10 ** decimals) / 10 ** decimals;
288
- }
289
287
  function areElementSizesEqual(a, b) {
290
288
  return a.width === b.width && a.height === b.height;
291
289
  }
@@ -1,4 +1,10 @@
1
+ import { createSelectorV8 } from "../../../utils/createSelector.js";
1
2
  /**
2
3
  * Select the row editing state.
3
4
  */
4
- export const gridEditRowsStateSelector = state => state.editRows;
5
+ export const gridEditRowsStateSelector = state => state.editRows;
6
+ export const gridRowIsEditingSelector = createSelectorV8(gridEditRowsStateSelector, (editRows, rowId) => Boolean(editRows[rowId]));
7
+ export const gridEditCellStateSelector = createSelectorV8(gridEditRowsStateSelector, (editRows, {
8
+ rowId,
9
+ field
10
+ }) => editRows[rowId]?.[field] ?? null);
@@ -1 +1 @@
1
- export * from "./gridEditingSelectors.js";
1
+ export { gridEditRowsStateSelector } from "./gridEditingSelectors.js";
@@ -11,7 +11,7 @@ import { GridEditModes, GridCellModes } from "../../../models/gridEditRowModel.j
11
11
  import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
12
12
  import { gridEditRowsStateSelector } from "./gridEditingSelectors.js";
13
13
  import { isPrintableKey, isPasteShortcut } from "../../../utils/keyboardUtils.js";
14
- import { gridRowsDataRowIdToIdLookupSelector } from "../rows/gridRowsSelector.js";
14
+ import { gridRowsLookupSelector } from "../rows/gridRowsSelector.js";
15
15
  import { deepClone } from "../../../utils/utils.js";
16
16
  import { GridCellEditStartReasons, GridCellEditStopReasons } from "../../../models/params/gridEditCellParams.js";
17
17
  import { getDefaultCellValue } from "./utils.js";
@@ -442,7 +442,7 @@ export const useGridCellEditing = (apiRef, props) => {
442
442
 
443
443
  // Run this effect synchronously so that the keyboard event can impact the yet-to-be-rendered input.
444
444
  useEnhancedEffect(() => {
445
- const idToIdLookup = gridRowsDataRowIdToIdLookupSelector(apiRef);
445
+ const rowsLookup = gridRowsLookupSelector(apiRef);
446
446
 
447
447
  // Update the ref here because updateStateToStopCellEditMode may change it later
448
448
  const copyOfPrevCellModes = prevCellModesModel.current;
@@ -451,7 +451,7 @@ export const useGridCellEditing = (apiRef, props) => {
451
451
  Object.entries(cellModesModel).forEach(([id, fields]) => {
452
452
  Object.entries(fields).forEach(([field, params]) => {
453
453
  const prevMode = copyOfPrevCellModes[id]?.[field]?.mode || GridCellModes.View;
454
- const originalId = idToIdLookup[id] ?? id;
454
+ const originalId = rowsLookup[id] ? apiRef.current.getRowId(rowsLookup[id]) : id;
455
455
  if (params.mode === GridCellModes.Edit && prevMode === GridCellModes.View) {
456
456
  updateStateToStartCellEditMode(_extends({
457
457
  id: originalId,