@mui/x-data-grid 6.16.1 → 6.16.2

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 (82) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/DataGrid/DataGrid.d.ts +7 -0
  3. package/DataGrid/DataGrid.js +8 -1
  4. package/colDef/gridDateColDef.js +0 -4
  5. package/components/GridRow.js +7 -3
  6. package/components/cell/GridCell.js +7 -3
  7. package/components/containers/GridRootStyles.js +3 -0
  8. package/components/panel/filterPanel/GridFilterForm.d.ts +7 -0
  9. package/components/panel/filterPanel/GridFilterForm.js +8 -0
  10. package/components/panel/filterPanel/GridFilterPanel.d.ts +7 -0
  11. package/components/panel/filterPanel/GridFilterPanel.js +8 -0
  12. package/components/toolbar/GridToolbarQuickFilter.d.ts +8 -0
  13. package/components/toolbar/GridToolbarQuickFilter.js +9 -0
  14. package/components/virtualization/GridVirtualScroller.js +3 -1
  15. package/constants/gridClasses.d.ts +4 -0
  16. package/constants/gridClasses.js +1 -1
  17. package/hooks/features/columnGrouping/gridColumnGroupsUtils.d.ts +4 -1
  18. package/hooks/features/columnGrouping/gridColumnGroupsUtils.js +13 -2
  19. package/hooks/features/columnGrouping/useGridColumnGrouping.js +12 -6
  20. package/hooks/features/columns/gridColumnsUtils.js +0 -1
  21. package/hooks/features/filter/gridFilterUtils.js +4 -4
  22. package/hooks/features/virtualization/useGridVirtualScroller.js +8 -2
  23. package/index.js +1 -1
  24. package/legacy/DataGrid/DataGrid.js +8 -1
  25. package/legacy/colDef/gridDateColDef.js +0 -4
  26. package/legacy/components/GridRow.js +6 -2
  27. package/legacy/components/cell/GridCell.js +7 -3
  28. package/legacy/components/containers/GridRootStyles.js +2 -0
  29. package/legacy/components/panel/filterPanel/GridFilterForm.js +8 -0
  30. package/legacy/components/panel/filterPanel/GridFilterPanel.js +8 -0
  31. package/legacy/components/toolbar/GridToolbarQuickFilter.js +9 -0
  32. package/legacy/components/virtualization/GridVirtualScroller.js +3 -1
  33. package/legacy/constants/gridClasses.js +1 -1
  34. package/legacy/hooks/features/columnGrouping/gridColumnGroupsUtils.js +13 -2
  35. package/legacy/hooks/features/columnGrouping/useGridColumnGrouping.js +12 -6
  36. package/legacy/hooks/features/columns/gridColumnsUtils.js +0 -1
  37. package/legacy/hooks/features/filter/gridFilterUtils.js +4 -4
  38. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +8 -2
  39. package/legacy/index.js +1 -1
  40. package/legacy/locales/arSD.js +26 -28
  41. package/legacy/locales/roRO.js +1 -1
  42. package/locales/arSD.js +26 -28
  43. package/locales/roRO.js +1 -1
  44. package/models/events/gridEventLookup.d.ts +14 -0
  45. package/models/props/DataGridProps.d.ts +1 -1
  46. package/modern/DataGrid/DataGrid.js +8 -1
  47. package/modern/colDef/gridDateColDef.js +0 -4
  48. package/modern/components/GridRow.js +7 -3
  49. package/modern/components/cell/GridCell.js +6 -2
  50. package/modern/components/containers/GridRootStyles.js +3 -0
  51. package/modern/components/panel/filterPanel/GridFilterForm.js +8 -0
  52. package/modern/components/panel/filterPanel/GridFilterPanel.js +8 -0
  53. package/modern/components/toolbar/GridToolbarQuickFilter.js +9 -0
  54. package/modern/components/virtualization/GridVirtualScroller.js +3 -1
  55. package/modern/constants/gridClasses.js +1 -1
  56. package/modern/hooks/features/columnGrouping/gridColumnGroupsUtils.js +13 -2
  57. package/modern/hooks/features/columnGrouping/useGridColumnGrouping.js +10 -3
  58. package/modern/hooks/features/columns/gridColumnsUtils.js +0 -1
  59. package/modern/hooks/features/filter/gridFilterUtils.js +4 -4
  60. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +8 -2
  61. package/modern/index.js +1 -1
  62. package/modern/locales/arSD.js +26 -28
  63. package/modern/locales/roRO.js +1 -1
  64. package/node/DataGrid/DataGrid.js +8 -1
  65. package/node/colDef/gridDateColDef.js +0 -4
  66. package/node/components/GridRow.js +7 -3
  67. package/node/components/cell/GridCell.js +6 -2
  68. package/node/components/containers/GridRootStyles.js +3 -0
  69. package/node/components/panel/filterPanel/GridFilterForm.js +9 -1
  70. package/node/components/panel/filterPanel/GridFilterPanel.js +9 -1
  71. package/node/components/toolbar/GridToolbarQuickFilter.js +10 -1
  72. package/node/components/virtualization/GridVirtualScroller.js +3 -1
  73. package/node/constants/gridClasses.js +1 -1
  74. package/node/hooks/features/columnGrouping/gridColumnGroupsUtils.js +13 -2
  75. package/node/hooks/features/columnGrouping/useGridColumnGrouping.js +10 -3
  76. package/node/hooks/features/columns/gridColumnsUtils.js +0 -1
  77. package/node/hooks/features/filter/gridFilterUtils.js +4 -4
  78. package/node/hooks/features/virtualization/useGridVirtualScroller.js +8 -2
  79. package/node/index.js +1 -1
  80. package/node/locales/arSD.js +26 -28
  81. package/node/locales/roRO.js +1 -1
  82. package/package.json +1 -1
@@ -132,4 +132,13 @@ process.env.NODE_ENV !== "production" ? GridToolbarQuickFilter.propTypes = {
132
132
  */
133
133
  quickFilterParser: PropTypes.func
134
134
  } : void 0;
135
+
136
+ /**
137
+ * Demos:
138
+ * - [Filtering - overview](https://mui.com/x/react-data-grid/filtering/)
139
+ * - [Filtering - quick filter](https://mui.com/x/react-data-grid/filtering/quick-filter/)
140
+ *
141
+ * API:
142
+ * - [GridToolbarQuickFilter API](https://mui.com/x/api/data-grid/grid-toolbar-quick-filter/)
143
+ */
135
144
  export { GridToolbarQuickFilter };
@@ -26,8 +26,10 @@ const VirtualScrollerRoot = styled('div', {
26
26
  position: 'relative',
27
27
  '@media print': {
28
28
  overflow: 'hidden'
29
- }
29
+ },
30
+ zIndex: 0 // See https://github.com/mui/mui-x/issues/10547
30
31
  });
32
+
31
33
  const GridVirtualScroller = /*#__PURE__*/React.forwardRef(function GridVirtualScroller(props, ref) {
32
34
  const rootProps = useGridRootProps();
33
35
  const classes = useUtilityClasses(rootProps);
@@ -2,4 +2,4 @@ import { unstable_generateUtilityClasses as generateUtilityClasses, unstable_gen
2
2
  export function getDataGridUtilityClass(slot) {
3
3
  return generateUtilityClass('MuiDataGrid', slot);
4
4
  }
5
- export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--withRenderer', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell', 'cellContent', 'cellCheckbox', 'cellSkeleton', 'checkboxInput', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderDropZone', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnGroupHeader', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeader--showColumnBorder', 'columnHeaders', 'columnHeadersInner', 'columnHeadersInner--scrollable', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsPanel', 'columnsPanelRow', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'pinnedColumns--left', 'pinnedColumns--right', 'pinnedColumnHeaders', 'pinnedColumnHeaders--left', 'pinnedColumnHeaders--right', 'withBorderColor', 'cell--withRightBorder', 'columnHeader--withRightBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
5
+ export const gridClasses = generateUtilityClasses('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--withRenderer', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--selectionMode', 'cell', 'cellContent', 'cellCheckbox', 'cellSkeleton', 'checkboxInput', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderDropZone', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnGroupHeader', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeader--showColumnBorder', 'columnHeaders', 'columnHeadersInner', 'columnHeadersInner--scrollable', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsPanel', 'columnsPanelRow', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'pinnedColumns--left', 'pinnedColumns--right', 'pinnedColumnHeaders', 'pinnedColumnHeaders--left', 'pinnedColumnHeaders--right', 'withBorderColor', 'cell--withRightBorder', 'columnHeader--withRightBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
@@ -34,11 +34,20 @@ export const unwrapGroupingColumnModel = columnGroupingModel => {
34
34
  });
35
35
  return unwrappedSubTree;
36
36
  };
37
- export const getColumnGroupsHeaderStructure = (orderedColumns, unwrappedGroupingModel) => {
37
+ export const getColumnGroupsHeaderStructure = (orderedColumns, unwrappedGroupingModel, pinnedFields) => {
38
38
  const getParents = field => unwrappedGroupingModel[field] ?? [];
39
39
  const groupingHeaderStructure = [];
40
40
  const maxDepth = Math.max(...orderedColumns.map(field => getParents(field).length));
41
41
  const haveSameParents = (field1, field2, depth) => isDeepEqual(getParents(field1).slice(0, depth + 1), getParents(field2).slice(0, depth + 1));
42
+ const haveDifferentContainers = (field1, field2) => {
43
+ if (pinnedFields?.left && pinnedFields.left.includes(field1) && !pinnedFields.left.includes(field2)) {
44
+ return true;
45
+ }
46
+ if (pinnedFields?.right && !pinnedFields.right.includes(field1) && pinnedFields.right.includes(field2)) {
47
+ return true;
48
+ }
49
+ return false;
50
+ };
42
51
  for (let depth = 0; depth < maxDepth; depth += 1) {
43
52
  const depthStructure = orderedColumns.reduce((structure, newField) => {
44
53
  const groupId = getParents(newField)[depth] ?? null;
@@ -51,7 +60,9 @@ export const getColumnGroupsHeaderStructure = (orderedColumns, unwrappedGrouping
51
60
  const lastGroup = structure[structure.length - 1];
52
61
  const prevField = lastGroup.columnFields[lastGroup.columnFields.length - 1];
53
62
  const prevGroupId = lastGroup.groupId;
54
- if (prevGroupId !== groupId || !haveSameParents(prevField, newField, depth)) {
63
+ if (prevGroupId !== groupId || !haveSameParents(prevField, newField, depth) ||
64
+ // Fix for https://github.com/mui/mui-x/issues/7041
65
+ haveDifferentContainers(prevField, newField)) {
55
66
  // It's a new group
56
67
  return [...structure, {
57
68
  columnFields: [newField],
@@ -46,7 +46,9 @@ export const columnGroupsStateInitializer = (state, props, apiRef) => {
46
46
  const visibleColumnFields = gridVisibleColumnFieldsSelector(apiRef);
47
47
  const groupLookup = createGroupLookup(props.columnGroupingModel ?? []);
48
48
  const unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel ?? []);
49
- const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel);
49
+ const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel,
50
+ // @ts-expect-error Move this part to `Pro` package
51
+ apiRef.current.state.pinnedColumns ?? {});
50
52
  const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
51
53
  return _extends({}, state, {
52
54
  columnGrouping: {
@@ -83,7 +85,10 @@ export const useGridColumnGrouping = (apiRef, props) => {
83
85
  const unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel ?? []);
84
86
  apiRef.current.setState(state => {
85
87
  const orderedFields = state.columns?.orderedFields ?? [];
86
- const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(orderedFields, unwrappedGroupingModel);
88
+
89
+ // @ts-expect-error Move this logic to `Pro` package
90
+ const pinnedColumns = state.pinnedColumns ?? {};
91
+ const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(orderedFields, unwrappedGroupingModel, pinnedColumns);
87
92
  return _extends({}, state, {
88
93
  columnGrouping: _extends({}, state.columnGrouping, {
89
94
  headerStructure: columnGroupsHeaderStructure
@@ -95,11 +100,13 @@ export const useGridColumnGrouping = (apiRef, props) => {
95
100
  if (!props.experimentalFeatures?.columnGrouping) {
96
101
  return;
97
102
  }
103
+ // @ts-expect-error Move this logic to `Pro` package
104
+ const pinnedColumns = apiRef.current.getPinnedColumns?.() ?? {};
98
105
  const columnFields = gridColumnFieldsSelector(apiRef);
99
106
  const visibleColumnFields = gridVisibleColumnFieldsSelector(apiRef);
100
107
  const groupLookup = createGroupLookup(columnGroupingModel ?? []);
101
108
  const unwrappedGroupingModel = unwrapGroupingColumnModel(columnGroupingModel ?? []);
102
- const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel);
109
+ const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel, pinnedColumns);
103
110
  const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
104
111
  apiRef.current.setState(state => {
105
112
  return _extends({}, state, {
@@ -50,7 +50,6 @@ export function computeFlexColumnsWidth({
50
50
  for (let i = 0; i < flexColumns.length; i += 1) {
51
51
  const column = flexColumns[i];
52
52
  if (flexColumnsLookup.all[column.field] && flexColumnsLookup.all[column.field].frozen === true) {
53
- // eslint-disable-next-line no-continue
54
53
  continue;
55
54
  }
56
55
 
@@ -160,7 +160,7 @@ export const buildAggregatedFilterItemsApplier = (getRowId, filterModel, apiRef,
160
160
 
161
161
  // We generate a new function with `eval()` to avoid expensive patterns for JS engines
162
162
  // such as a dynamic object assignment, e.g. `{ [dynamicKey]: value }`.
163
- const filterItemTemplate = `(function filterItem$$(appliers, row, shouldApplyFilter) {
163
+ const filterItemTemplate = `(function filterItem$$(getRowId, appliers, row, shouldApplyFilter) {
164
164
  ${appliers.map((applier, i) => `const shouldApply${i} = !shouldApplyFilter || shouldApplyFilter(${JSON.stringify(applier.item.field)});`).join('\n')}
165
165
 
166
166
  const result$$ = {
@@ -174,7 +174,7 @@ export const buildAggregatedFilterItemsApplier = (getRowId, filterModel, apiRef,
174
174
  })`;
175
175
  const filterItemCore = evalCode(filterItemTemplate.replaceAll('$$', String(filterItemsApplierId)));
176
176
  const filterItem = (row, shouldApplyItem) => {
177
- return filterItemCore(appliers, row, shouldApplyItem);
177
+ return filterItemCore(getRowId, appliers, row, shouldApplyItem);
178
178
  };
179
179
  filterItemsApplierId += 1;
180
180
  return filterItem;
@@ -223,7 +223,7 @@ export const buildAggregatedQuickFilterApplier = (getRowId, filterModel, apiRef)
223
223
  const result = {};
224
224
  const usedCellParams = {};
225
225
 
226
- /* eslint-disable no-restricted-syntax, no-labels, no-continue */
226
+ /* eslint-disable no-restricted-syntax, no-labels */
227
227
  outer: for (let v = 0; v < quickFilterValues.length; v += 1) {
228
228
  const filterValue = quickFilterValues[v];
229
229
  for (let i = 0; i < appliersPerField.length; i += 1) {
@@ -260,7 +260,7 @@ export const buildAggregatedQuickFilterApplier = (getRowId, filterModel, apiRef)
260
260
  }
261
261
  result[filterValue] = false;
262
262
  }
263
- /* eslint-enable no-restricted-syntax, no-labels, no-continue */
263
+ /* eslint-enable no-restricted-syntax, no-labels */
264
264
 
265
265
  return result;
266
266
  };
@@ -348,10 +348,16 @@ export const useGridVirtualScroller = props => {
348
348
  }
349
349
  return -1;
350
350
  }, [cellFocus, currentPage.rows]);
351
- useGridApiEventHandler(apiRef, 'rowMouseEnter', params => {
351
+ useGridApiEventHandler(apiRef, 'rowMouseOver', (params, event) => {
352
+ if (event.currentTarget.contains(event.relatedTarget)) {
353
+ return;
354
+ }
352
355
  setHoveredRowId(params.id ?? null);
353
356
  });
354
- useGridApiEventHandler(apiRef, 'rowMouseLeave', () => {
357
+ useGridApiEventHandler(apiRef, 'rowMouseOut', (params, event) => {
358
+ if (event.currentTarget.contains(event.relatedTarget)) {
359
+ return;
360
+ }
355
361
  setHoveredRowId(null);
356
362
  });
357
363
  const getRows = (params = {
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v6.16.1
2
+ * @mui/x-data-grid v6.16.2
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -37,7 +37,7 @@ const arSDGrid = {
37
37
  columnsPanelHideAllButton: 'إخفاء الكل',
38
38
  // Filter panel text
39
39
  filterPanelAddFilter: 'إضافة مرشِح',
40
- // filterPanelRemoveAll: 'Remove all',
40
+ filterPanelRemoveAll: 'حذف الكل',
41
41
  filterPanelDeleteIconLabel: 'حذف',
42
42
  filterPanelLogicOperator: 'عامل منطقي',
43
43
  filterPanelOperator: 'عامل',
@@ -60,34 +60,32 @@ const arSDGrid = {
60
60
  filterOperatorIsEmpty: 'خالي',
61
61
  filterOperatorIsNotEmpty: 'غير خالي',
62
62
  filterOperatorIsAnyOf: 'أي من',
63
- // 'filterOperator=': '=',
64
- // 'filterOperator!=': '!=',
65
- // 'filterOperator>': '>',
66
- // 'filterOperator>=': '>=',
67
- // 'filterOperator<': '<',
68
- // 'filterOperator<=': '<=',
69
-
63
+ 'filterOperator=': '=',
64
+ 'filterOperator!=': '!=',
65
+ 'filterOperator>': '>',
66
+ 'filterOperator>=': '>=',
67
+ 'filterOperator<': '<',
68
+ 'filterOperator<=': '<=',
70
69
  // Header filter operators text
71
- // headerFilterOperatorContains: 'Contains',
72
- // headerFilterOperatorEquals: 'Equals',
73
- // headerFilterOperatorStartsWith: 'Starts with',
74
- // headerFilterOperatorEndsWith: 'Ends with',
75
- // headerFilterOperatorIs: 'Is',
76
- // headerFilterOperatorNot: 'Is not',
77
- // headerFilterOperatorAfter: 'Is after',
78
- // headerFilterOperatorOnOrAfter: 'Is on or after',
79
- // headerFilterOperatorBefore: 'Is before',
80
- // headerFilterOperatorOnOrBefore: 'Is on or before',
81
- // headerFilterOperatorIsEmpty: 'Is empty',
82
- // headerFilterOperatorIsNotEmpty: 'Is not empty',
83
- // headerFilterOperatorIsAnyOf: 'Is any of',
84
- // 'headerFilterOperator=': 'Equals',
85
- // 'headerFilterOperator!=': 'Not equals',
86
- // 'headerFilterOperator>': 'Greater than',
87
- // 'headerFilterOperator>=': 'Greater than or equal to',
88
- // 'headerFilterOperator<': 'Less than',
89
- // 'headerFilterOperator<=': 'Less than or equal to',
90
-
70
+ headerFilterOperatorContains: 'يحتوي على',
71
+ headerFilterOperatorEquals: 'يساوي',
72
+ headerFilterOperatorStartsWith: 'يبدأ ب',
73
+ headerFilterOperatorEndsWith: 'ينتهي ب',
74
+ headerFilterOperatorIs: 'هو',
75
+ headerFilterOperatorNot: 'هو ليس',
76
+ headerFilterOperatorAfter: 'يقع بعد',
77
+ headerFilterOperatorOnOrAfter: 'هو على او بعد',
78
+ headerFilterOperatorBefore: 'يقع قبل',
79
+ headerFilterOperatorOnOrBefore: 'هو على او بعد',
80
+ headerFilterOperatorIsEmpty: 'هو فارغ',
81
+ headerFilterOperatorIsNotEmpty: 'هو ليس فارغ',
82
+ headerFilterOperatorIsAnyOf: 'هو أي من',
83
+ 'headerFilterOperator=': 'يساوي',
84
+ 'headerFilterOperator!=': 'لا يساوي',
85
+ 'headerFilterOperator>': 'أكبر من',
86
+ 'headerFilterOperator>=': 'أكبر من او يساوي',
87
+ 'headerFilterOperator<': 'اصغر من',
88
+ 'headerFilterOperator<=': 'اصغر من او يساوي',
91
89
  // Filter values text
92
90
  filterValueAny: 'أي',
93
91
  filterValueTrue: 'صائب',
@@ -74,7 +74,7 @@ const roROGrid = {
74
74
  headerFilterOperatorIs: 'Este',
75
75
  headerFilterOperatorNot: 'Nu este',
76
76
  headerFilterOperatorAfter: 'Este după',
77
- headerFilterOperatorOnOrAfter: 'Este la sau „după”',
77
+ headerFilterOperatorOnOrAfter: 'Este la sau după',
78
78
  headerFilterOperatorBefore: 'Este înainte de',
79
79
  headerFilterOperatorOnOrBefore: 'este la sau înainte de',
80
80
  headerFilterOperatorIsEmpty: 'Este gol',
@@ -35,6 +35,13 @@ const DataGridRaw = /*#__PURE__*/React.forwardRef(function DataGrid(inProps, ref
35
35
  }))
36
36
  });
37
37
  });
38
+ /**
39
+ * Demos:
40
+ * - [DataGrid](https://mui.com/x/react-data-grid/demo/)
41
+ *
42
+ * API:
43
+ * - [DataGrid API](https://mui.com/x/api/data-grid/data-grid/)
44
+ */
38
45
  const DataGrid = exports.DataGrid = /*#__PURE__*/React.memo(DataGridRaw);
39
46
 
40
47
  /**
@@ -668,7 +675,7 @@ DataGridRaw.propTypes = {
668
675
  /**
669
676
  * If `true`, the grid will not use `valueFormatter` when exporting to CSV or copying to clipboard.
670
677
  * If an object is provided, you can choose to ignore the `valueFormatter` for CSV export or clipboard export.
671
- * @default: false
678
+ * @default false
672
679
  */
673
680
  unstable_ignoreValueFormatterDuringExport: _propTypes.default.oneOfType([_propTypes.default.shape({
674
681
  clipboardExport: _propTypes.default.bool,
@@ -60,8 +60,6 @@ const GRID_DATE_COL_DEF = exports.GRID_DATE_COL_DEF = (0, _extends2.default)({},
60
60
  valueFormatter: gridDateFormatter,
61
61
  filterOperators: (0, _gridDateOperators.getGridDateOperators)(),
62
62
  renderEditCell: _GridEditDateCell.renderEditDateCell,
63
- getApplyQuickFilterFn: undefined,
64
- getApplyQuickFilterFnV7: undefined,
65
63
  // @ts-ignore
66
64
  pastedValueParser: value => new Date(value)
67
65
  });
@@ -71,8 +69,6 @@ const GRID_DATETIME_COL_DEF = exports.GRID_DATETIME_COL_DEF = (0, _extends2.defa
71
69
  valueFormatter: gridDateTimeFormatter,
72
70
  filterOperators: (0, _gridDateOperators.getGridDateOperators)(true),
73
71
  renderEditCell: _GridEditDateCell.renderEditDateCell,
74
- getApplyQuickFilterFn: undefined,
75
- getApplyQuickFilterFnV7: undefined,
76
72
  // @ts-ignore
77
73
  pastedValueParser: value => new Date(value)
78
74
  });
@@ -30,7 +30,7 @@ var _utils2 = require("../utils/utils");
30
30
  var _GridCell = require("./cell/GridCell");
31
31
  var _gridEditingSelectors = require("../hooks/features/editing/gridEditingSelectors");
32
32
  var _jsxRuntime = require("react/jsx-runtime");
33
- const _excluded = ["selected", "hovered", "rowId", "row", "index", "style", "position", "rowHeight", "className", "visibleColumns", "renderedColumns", "containerWidth", "firstColumnToRender", "lastColumnToRender", "isLastVisible", "focusedCellColumnIndexNotInRange", "isNotVisible", "focusedCell", "tabbableCell", "onClick", "onDoubleClick", "onMouseEnter", "onMouseLeave"];
33
+ const _excluded = ["selected", "hovered", "rowId", "row", "index", "style", "position", "rowHeight", "className", "visibleColumns", "renderedColumns", "containerWidth", "firstColumnToRender", "lastColumnToRender", "isLastVisible", "focusedCellColumnIndexNotInRange", "isNotVisible", "focusedCell", "tabbableCell", "onClick", "onDoubleClick", "onMouseEnter", "onMouseLeave", "onMouseOut", "onMouseOver"];
34
34
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
35
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
36
36
  const useUtilityClasses = ownerState => {
@@ -84,7 +84,9 @@ const GridRow = /*#__PURE__*/React.forwardRef(function GridRow(props, refProp) {
84
84
  onClick,
85
85
  onDoubleClick,
86
86
  onMouseEnter,
87
- onMouseLeave
87
+ onMouseLeave,
88
+ onMouseOut,
89
+ onMouseOver
88
90
  } = props,
89
91
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
90
92
  const apiRef = (0, _useGridApiContext.useGridApiContext)();
@@ -329,7 +331,9 @@ const GridRow = /*#__PURE__*/React.forwardRef(function GridRow(props, refProp) {
329
331
  onClick: publishClick,
330
332
  onDoubleClick: publish('rowDoubleClick', onDoubleClick),
331
333
  onMouseEnter: publish('rowMouseEnter', onMouseEnter),
332
- onMouseLeave: publish('rowMouseLeave', onMouseLeave)
334
+ onMouseLeave: publish('rowMouseLeave', onMouseLeave),
335
+ onMouseOut: publish('rowMouseOut', onMouseOut),
336
+ onMouseOver: publish('rowMouseOver', onMouseOver)
333
337
  } : null;
334
338
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", (0, _extends2.default)({
335
339
  ref: handleRef,
@@ -57,10 +57,11 @@ const useUtilityClasses = ownerState => {
57
57
  showRightBorder,
58
58
  isEditable,
59
59
  isSelected,
60
+ isSelectionMode,
60
61
  classes
61
62
  } = ownerState;
62
63
  const slots = {
63
- root: ['cell', `cell--text${(0, _utils.unstable_capitalize)(align)}`, isEditable && 'cell--editable', isSelected && 'selected', showRightBorder && 'cell--withRightBorder', 'withBorderColor'],
64
+ root: ['cell', `cell--text${(0, _utils.unstable_capitalize)(align)}`, isEditable && 'cell--editable', isSelected && 'selected', showRightBorder && 'cell--withRightBorder', isSelectionMode && !isEditable && 'cell--selectionMode', 'withBorderColor'],
64
65
  content: ['cellContent']
65
66
  };
66
67
  return (0, _utils.unstable_composeClasses)(slots, _gridClasses.getDataGridUtilityClass, classes);
@@ -466,12 +467,15 @@ const GridCellV7 = /*#__PURE__*/React.forwardRef((props, ref) => {
466
467
  const cellRef = React.useRef(null);
467
468
  const handleRef = (0, _utils.unstable_useForkRef)(ref, cellRef);
468
469
  const focusElementRef = React.useRef(null);
470
+ // @ts-expect-error To access `unstable_cellSelection` flag as it's a `premium` feature
471
+ const isSelectionMode = rootProps.unstable_cellSelection ?? false;
469
472
  const ownerState = {
470
473
  align,
471
474
  showRightBorder,
472
475
  isEditable,
473
476
  classes: rootProps.classes,
474
- isSelected
477
+ isSelected,
478
+ isSelectionMode
475
479
  };
476
480
  const classes = useUtilityClasses(ownerState);
477
481
  const publishMouseUp = React.useCallback(eventName => event => {
@@ -402,6 +402,9 @@ const GridRootStyles = exports.GridRootStyles = (0, _styles.styled)('div', {
402
402
  overflow: 'hidden',
403
403
  textOverflow: 'ellipsis'
404
404
  },
405
+ [`& .${_gridClasses.gridClasses.cell}.${_gridClasses.gridClasses['cell--selectionMode']}`]: {
406
+ cursor: 'default'
407
+ },
405
408
  [`& .${_gridClasses.gridClasses.cell}.${_gridClasses.gridClasses['cell--editing']}`]: {
406
409
  padding: 1,
407
410
  display: 'flex',
@@ -435,4 +435,12 @@ process.env.NODE_ENV !== "production" ? GridFilterForm.propTypes = {
435
435
  * @default {}
436
436
  */
437
437
  valueInputProps: _propTypes.default.any
438
- } : void 0;
438
+ } : void 0;
439
+
440
+ /**
441
+ * Demos:
442
+ * - [Filtering - overview](https://mui.com/x/react-data-grid/filtering/)
443
+ *
444
+ * API:
445
+ * - [GridFilterForm API](https://mui.com/x/api/data-grid/grid-filter-form/)
446
+ */
@@ -219,4 +219,12 @@ process.env.NODE_ENV !== "production" ? GridFilterPanel.propTypes = {
219
219
  * The system prop that allows defining system overrides as well as additional CSS styles.
220
220
  */
221
221
  sx: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object, _propTypes.default.bool])), _propTypes.default.func, _propTypes.default.object])
222
- } : void 0;
222
+ } : void 0;
223
+
224
+ /**
225
+ * Demos:
226
+ * - [Filtering - overview](https://mui.com/x/react-data-grid/filtering/)
227
+ *
228
+ * API:
229
+ * - [GridFilterPanel API](https://mui.com/x/api/data-grid/grid-filter-panel/)
230
+ */
@@ -140,4 +140,13 @@ process.env.NODE_ENV !== "production" ? GridToolbarQuickFilter.propTypes = {
140
140
  * @returns {any[]} The array of value on which quick filter is applied
141
141
  */
142
142
  quickFilterParser: _propTypes.default.func
143
- } : void 0;
143
+ } : void 0;
144
+
145
+ /**
146
+ * Demos:
147
+ * - [Filtering - overview](https://mui.com/x/react-data-grid/filtering/)
148
+ * - [Filtering - quick filter](https://mui.com/x/react-data-grid/filtering/quick-filter/)
149
+ *
150
+ * API:
151
+ * - [GridToolbarQuickFilter API](https://mui.com/x/api/data-grid/grid-toolbar-quick-filter/)
152
+ */
@@ -35,8 +35,10 @@ const VirtualScrollerRoot = (0, _system.styled)('div', {
35
35
  position: 'relative',
36
36
  '@media print': {
37
37
  overflow: 'hidden'
38
- }
38
+ },
39
+ zIndex: 0 // See https://github.com/mui/mui-x/issues/10547
39
40
  });
41
+
40
42
  const GridVirtualScroller = exports.GridVirtualScroller = /*#__PURE__*/React.forwardRef(function GridVirtualScroller(props, ref) {
41
43
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
42
44
  const classes = useUtilityClasses(rootProps);
@@ -9,4 +9,4 @@ var _utils = require("@mui/utils");
9
9
  function getDataGridUtilityClass(slot) {
10
10
  return (0, _utils.unstable_generateUtilityClass)('MuiDataGrid', slot);
11
11
  }
12
- const gridClasses = exports.gridClasses = (0, _utils.unstable_generateUtilityClasses)('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--withRenderer', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell', 'cellContent', 'cellCheckbox', 'cellSkeleton', 'checkboxInput', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderDropZone', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnGroupHeader', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeader--showColumnBorder', 'columnHeaders', 'columnHeadersInner', 'columnHeadersInner--scrollable', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsPanel', 'columnsPanelRow', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'pinnedColumns--left', 'pinnedColumns--right', 'pinnedColumnHeaders', 'pinnedColumnHeaders--left', 'pinnedColumnHeaders--right', 'withBorderColor', 'cell--withRightBorder', 'columnHeader--withRightBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
12
+ const gridClasses = exports.gridClasses = (0, _utils.unstable_generateUtilityClasses)('MuiDataGrid', ['actionsCell', 'aggregationColumnHeader', 'aggregationColumnHeader--alignLeft', 'aggregationColumnHeader--alignCenter', 'aggregationColumnHeader--alignRight', 'aggregationColumnHeaderLabel', 'autoHeight', 'autosizing', 'booleanCell', 'cell--editable', 'cell--editing', 'cell--textCenter', 'cell--textLeft', 'cell--textRight', 'cell--withRenderer', 'cell--rangeTop', 'cell--rangeBottom', 'cell--rangeLeft', 'cell--rangeRight', 'cell--selectionMode', 'cell', 'cellContent', 'cellCheckbox', 'cellSkeleton', 'checkboxInput', 'columnHeader--alignCenter', 'columnHeader--alignLeft', 'columnHeader--alignRight', 'columnHeader--dragging', 'columnHeader--moving', 'columnHeader--numeric', 'columnHeader--sortable', 'columnHeader--sorted', 'columnHeader--filtered', 'columnHeader', 'columnHeaderCheckbox', 'columnHeaderDraggableContainer', 'columnHeaderDropZone', 'columnHeaderTitle', 'columnHeaderTitleContainer', 'columnHeaderTitleContainerContent', 'columnGroupHeader', 'columnHeader--filledGroup', 'columnHeader--emptyGroup', 'columnHeader--showColumnBorder', 'columnHeaders', 'columnHeadersInner', 'columnHeadersInner--scrollable', 'columnSeparator--resizable', 'columnSeparator--resizing', 'columnSeparator--sideLeft', 'columnSeparator--sideRight', 'columnSeparator', 'columnsPanel', 'columnsPanelRow', 'detailPanel', 'detailPanels', 'detailPanelToggleCell', 'detailPanelToggleCell--expanded', 'footerCell', 'panel', 'panelHeader', 'panelWrapper', 'panelContent', 'panelFooter', 'paper', 'editBooleanCell', 'editInputCell', 'filterForm', 'filterFormDeleteIcon', 'filterFormLogicOperatorInput', 'filterFormColumnInput', 'filterFormOperatorInput', 'filterFormValueInput', 'filterIcon', 'footerContainer', 'headerFilterRow', 'iconButtonContainer', 'iconSeparator', 'main', 'menu', 'menuIcon', 'menuIconButton', 'menuOpen', 'menuList', 'overlay', 'overlayWrapper', 'overlayWrapperInner', 'root', 'root--densityStandard', 'root--densityComfortable', 'root--densityCompact', 'root--disableUserSelection', 'row', 'row--editable', 'row--editing', 'row--lastVisible', 'row--dragging', 'row--dynamicHeight', 'row--detailPanelExpanded', 'rowReorderCellPlaceholder', 'rowCount', 'rowReorderCellContainer', 'rowReorderCell', 'rowReorderCell--draggable', 'scrollArea--left', 'scrollArea--right', 'scrollArea', 'selectedRowCount', 'sortIcon', 'toolbarContainer', 'toolbarFilterList', 'virtualScroller', 'virtualScrollerContent', 'virtualScrollerContent--overflowed', 'virtualScrollerRenderZone', 'pinnedColumns', 'pinnedColumns--left', 'pinnedColumns--right', 'pinnedColumnHeaders', 'pinnedColumnHeaders--left', 'pinnedColumnHeaders--right', 'withBorderColor', 'cell--withRightBorder', 'columnHeader--withRightBorder', 'treeDataGroupingCell', 'treeDataGroupingCellToggle', 'groupingCriteriaCell', 'groupingCriteriaCellToggle', 'pinnedRows', 'pinnedRows--top', 'pinnedRows--bottom', 'pinnedRowsRenderZone']);
@@ -41,11 +41,20 @@ const unwrapGroupingColumnModel = columnGroupingModel => {
41
41
  return unwrappedSubTree;
42
42
  };
43
43
  exports.unwrapGroupingColumnModel = unwrapGroupingColumnModel;
44
- const getColumnGroupsHeaderStructure = (orderedColumns, unwrappedGroupingModel) => {
44
+ const getColumnGroupsHeaderStructure = (orderedColumns, unwrappedGroupingModel, pinnedFields) => {
45
45
  const getParents = field => unwrappedGroupingModel[field] ?? [];
46
46
  const groupingHeaderStructure = [];
47
47
  const maxDepth = Math.max(...orderedColumns.map(field => getParents(field).length));
48
48
  const haveSameParents = (field1, field2, depth) => (0, _utils.isDeepEqual)(getParents(field1).slice(0, depth + 1), getParents(field2).slice(0, depth + 1));
49
+ const haveDifferentContainers = (field1, field2) => {
50
+ if (pinnedFields?.left && pinnedFields.left.includes(field1) && !pinnedFields.left.includes(field2)) {
51
+ return true;
52
+ }
53
+ if (pinnedFields?.right && !pinnedFields.right.includes(field1) && pinnedFields.right.includes(field2)) {
54
+ return true;
55
+ }
56
+ return false;
57
+ };
49
58
  for (let depth = 0; depth < maxDepth; depth += 1) {
50
59
  const depthStructure = orderedColumns.reduce((structure, newField) => {
51
60
  const groupId = getParents(newField)[depth] ?? null;
@@ -58,7 +67,9 @@ const getColumnGroupsHeaderStructure = (orderedColumns, unwrappedGroupingModel)
58
67
  const lastGroup = structure[structure.length - 1];
59
68
  const prevField = lastGroup.columnFields[lastGroup.columnFields.length - 1];
60
69
  const prevGroupId = lastGroup.groupId;
61
- if (prevGroupId !== groupId || !haveSameParents(prevField, newField, depth)) {
70
+ if (prevGroupId !== groupId || !haveSameParents(prevField, newField, depth) ||
71
+ // Fix for https://github.com/mui/mui-x/issues/7041
72
+ haveDifferentContainers(prevField, newField)) {
62
73
  // It's a new group
63
74
  return [...structure, {
64
75
  columnFields: [newField],
@@ -55,7 +55,9 @@ const columnGroupsStateInitializer = (state, props, apiRef) => {
55
55
  const visibleColumnFields = (0, _columns.gridVisibleColumnFieldsSelector)(apiRef);
56
56
  const groupLookup = createGroupLookup(props.columnGroupingModel ?? []);
57
57
  const unwrappedGroupingModel = (0, _gridColumnGroupsUtils.unwrapGroupingColumnModel)(props.columnGroupingModel ?? []);
58
- const columnGroupsHeaderStructure = (0, _gridColumnGroupsUtils.getColumnGroupsHeaderStructure)(columnFields, unwrappedGroupingModel);
58
+ const columnGroupsHeaderStructure = (0, _gridColumnGroupsUtils.getColumnGroupsHeaderStructure)(columnFields, unwrappedGroupingModel,
59
+ // @ts-expect-error Move this part to `Pro` package
60
+ apiRef.current.state.pinnedColumns ?? {});
59
61
  const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
60
62
  return (0, _extends2.default)({}, state, {
61
63
  columnGrouping: {
@@ -93,7 +95,10 @@ const useGridColumnGrouping = (apiRef, props) => {
93
95
  const unwrappedGroupingModel = (0, _gridColumnGroupsUtils.unwrapGroupingColumnModel)(props.columnGroupingModel ?? []);
94
96
  apiRef.current.setState(state => {
95
97
  const orderedFields = state.columns?.orderedFields ?? [];
96
- const columnGroupsHeaderStructure = (0, _gridColumnGroupsUtils.getColumnGroupsHeaderStructure)(orderedFields, unwrappedGroupingModel);
98
+
99
+ // @ts-expect-error Move this logic to `Pro` package
100
+ const pinnedColumns = state.pinnedColumns ?? {};
101
+ const columnGroupsHeaderStructure = (0, _gridColumnGroupsUtils.getColumnGroupsHeaderStructure)(orderedFields, unwrappedGroupingModel, pinnedColumns);
97
102
  return (0, _extends2.default)({}, state, {
98
103
  columnGrouping: (0, _extends2.default)({}, state.columnGrouping, {
99
104
  headerStructure: columnGroupsHeaderStructure
@@ -105,11 +110,13 @@ const useGridColumnGrouping = (apiRef, props) => {
105
110
  if (!props.experimentalFeatures?.columnGrouping) {
106
111
  return;
107
112
  }
113
+ // @ts-expect-error Move this logic to `Pro` package
114
+ const pinnedColumns = apiRef.current.getPinnedColumns?.() ?? {};
108
115
  const columnFields = (0, _columns.gridColumnFieldsSelector)(apiRef);
109
116
  const visibleColumnFields = (0, _columns.gridVisibleColumnFieldsSelector)(apiRef);
110
117
  const groupLookup = createGroupLookup(columnGroupingModel ?? []);
111
118
  const unwrappedGroupingModel = (0, _gridColumnGroupsUtils.unwrapGroupingColumnModel)(columnGroupingModel ?? []);
112
- const columnGroupsHeaderStructure = (0, _gridColumnGroupsUtils.getColumnGroupsHeaderStructure)(columnFields, unwrappedGroupingModel);
119
+ const columnGroupsHeaderStructure = (0, _gridColumnGroupsUtils.getColumnGroupsHeaderStructure)(columnFields, unwrappedGroupingModel, pinnedColumns);
113
120
  const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
114
121
  apiRef.current.setState(state => {
115
122
  return (0, _extends2.default)({}, state, {
@@ -63,7 +63,6 @@ function computeFlexColumnsWidth({
63
63
  for (let i = 0; i < flexColumns.length; i += 1) {
64
64
  const column = flexColumns[i];
65
65
  if (flexColumnsLookup.all[column.field] && flexColumnsLookup.all[column.field].frozen === true) {
66
- // eslint-disable-next-line no-continue
67
66
  continue;
68
67
  }
69
68
 
@@ -169,7 +169,7 @@ const buildAggregatedFilterItemsApplier = (getRowId, filterModel, apiRef, disabl
169
169
 
170
170
  // We generate a new function with `eval()` to avoid expensive patterns for JS engines
171
171
  // such as a dynamic object assignment, e.g. `{ [dynamicKey]: value }`.
172
- const filterItemTemplate = `(function filterItem$$(appliers, row, shouldApplyFilter) {
172
+ const filterItemTemplate = `(function filterItem$$(getRowId, appliers, row, shouldApplyFilter) {
173
173
  ${appliers.map((applier, i) => `const shouldApply${i} = !shouldApplyFilter || shouldApplyFilter(${JSON.stringify(applier.item.field)});`).join('\n')}
174
174
 
175
175
  const result$$ = {
@@ -183,7 +183,7 @@ const buildAggregatedFilterItemsApplier = (getRowId, filterModel, apiRef, disabl
183
183
  })`;
184
184
  const filterItemCore = evalCode(filterItemTemplate.replaceAll('$$', String(filterItemsApplierId)));
185
185
  const filterItem = (row, shouldApplyItem) => {
186
- return filterItemCore(appliers, row, shouldApplyItem);
186
+ return filterItemCore(getRowId, appliers, row, shouldApplyItem);
187
187
  };
188
188
  filterItemsApplierId += 1;
189
189
  return filterItem;
@@ -233,7 +233,7 @@ const buildAggregatedQuickFilterApplier = (getRowId, filterModel, apiRef) => {
233
233
  const result = {};
234
234
  const usedCellParams = {};
235
235
 
236
- /* eslint-disable no-restricted-syntax, no-labels, no-continue */
236
+ /* eslint-disable no-restricted-syntax, no-labels */
237
237
  outer: for (let v = 0; v < quickFilterValues.length; v += 1) {
238
238
  const filterValue = quickFilterValues[v];
239
239
  for (let i = 0; i < appliersPerField.length; i += 1) {
@@ -270,7 +270,7 @@ const buildAggregatedQuickFilterApplier = (getRowId, filterModel, apiRef) => {
270
270
  }
271
271
  result[filterValue] = false;
272
272
  }
273
- /* eslint-enable no-restricted-syntax, no-labels, no-continue */
273
+ /* eslint-enable no-restricted-syntax, no-labels */
274
274
 
275
275
  return result;
276
276
  };
@@ -359,10 +359,16 @@ const useGridVirtualScroller = props => {
359
359
  }
360
360
  return -1;
361
361
  }, [cellFocus, currentPage.rows]);
362
- (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'rowMouseEnter', params => {
362
+ (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'rowMouseOver', (params, event) => {
363
+ if (event.currentTarget.contains(event.relatedTarget)) {
364
+ return;
365
+ }
363
366
  setHoveredRowId(params.id ?? null);
364
367
  });
365
- (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'rowMouseLeave', () => {
368
+ (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'rowMouseOut', (params, event) => {
369
+ if (event.currentTarget.contains(event.relatedTarget)) {
370
+ return;
371
+ }
366
372
  setHoveredRowId(null);
367
373
  });
368
374
  const getRows = (params = {
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v6.16.1
2
+ * @mui/x-data-grid v6.16.2
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the