@mui/x-data-grid-pro 6.4.0 → 6.5.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 (133) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/DataGridPro/DataGridPro.js +5 -0
  3. package/DataGridPro/useDataGridProComponent.js +3 -1
  4. package/DataGridPro/useDataGridProProps.js +7 -13
  5. package/components/GridColumnHeaders.js +15 -1
  6. package/components/GridDetailPanel.js +1 -1
  7. package/components/headerFiltering/GridHeaderFilterAdornment.d.ts +14 -0
  8. package/components/headerFiltering/GridHeaderFilterAdornment.js +99 -0
  9. package/components/headerFiltering/GridHeaderFilterCell.d.ts +20 -0
  10. package/components/headerFiltering/GridHeaderFilterCell.js +224 -0
  11. package/components/headerFiltering/GridHeaderFilterClearButton.d.ts +6 -0
  12. package/components/headerFiltering/GridHeaderFilterClearButton.js +25 -0
  13. package/components/headerFiltering/GridHeaderFilterMenu.d.ts +14 -0
  14. package/components/headerFiltering/GridHeaderFilterMenu.js +69 -0
  15. package/components/headerFiltering/constants.d.ts +3 -0
  16. package/components/headerFiltering/constants.js +30 -0
  17. package/components/headerFiltering/index.d.ts +2 -0
  18. package/components/headerFiltering/index.js +2 -0
  19. package/components/index.d.ts +1 -0
  20. package/components/index.js +2 -1
  21. package/constants/dataGridProDefaultSlotsComponents.js +5 -1
  22. package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +21 -0
  23. package/hooks/features/columnHeaders/useGridColumnHeaders.js +111 -0
  24. package/hooks/features/columnResize/useGridColumnResize.js +12 -1
  25. package/hooks/features/rowPinning/useGridRowPinningPreProcessors.js +1 -0
  26. package/hooks/features/treeData/useGridTreeDataPreProcessors.js +1 -0
  27. package/index.js +1 -1
  28. package/internals/index.d.ts +1 -0
  29. package/internals/index.js +4 -0
  30. package/legacy/DataGridPro/DataGridPro.js +5 -0
  31. package/legacy/DataGridPro/useDataGridProComponent.js +3 -1
  32. package/legacy/DataGridPro/useDataGridProProps.js +10 -9
  33. package/legacy/components/GridColumnHeaders.js +15 -1
  34. package/legacy/components/GridDetailPanel.js +1 -1
  35. package/legacy/components/headerFiltering/GridHeaderFilterAdornment.js +97 -0
  36. package/legacy/components/headerFiltering/GridHeaderFilterCell.js +230 -0
  37. package/legacy/components/headerFiltering/GridHeaderFilterClearButton.js +24 -0
  38. package/legacy/components/headerFiltering/GridHeaderFilterMenu.js +68 -0
  39. package/legacy/components/headerFiltering/constants.js +30 -0
  40. package/legacy/components/headerFiltering/index.js +2 -0
  41. package/legacy/components/index.js +2 -1
  42. package/legacy/constants/dataGridProDefaultSlotsComponents.js +5 -1
  43. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +120 -0
  44. package/legacy/hooks/features/columnResize/useGridColumnResize.js +12 -1
  45. package/legacy/hooks/features/rowPinning/useGridRowPinningPreProcessors.js +1 -0
  46. package/legacy/hooks/features/treeData/useGridTreeDataPreProcessors.js +1 -0
  47. package/legacy/index.js +1 -1
  48. package/legacy/internals/index.js +4 -0
  49. package/legacy/material/icons.js +4 -1
  50. package/legacy/material/index.js +3 -2
  51. package/legacy/models/gridProSlotProps.js +1 -0
  52. package/legacy/utils/releaseInfo.js +1 -1
  53. package/legacy/utils/tree/createRowTree.js +1 -0
  54. package/legacy/utils/tree/insertDataRowInTree.js +4 -0
  55. package/legacy/utils/tree/removeDataRowFromTree.js +1 -0
  56. package/legacy/utils/tree/updateRowTree.js +2 -0
  57. package/legacy/utils/tree/utils.js +20 -12
  58. package/material/icons.d.ts +3 -0
  59. package/material/icons.js +4 -1
  60. package/material/index.d.ts +1 -0
  61. package/material/index.js +3 -2
  62. package/models/dataGridProProps.d.ts +16 -1
  63. package/models/gridProIconSlotsComponent.d.ts +5 -0
  64. package/models/gridProSlotProps.d.ts +9 -0
  65. package/models/gridProSlotProps.js +1 -0
  66. package/models/gridProSlotsComponent.d.ts +13 -2
  67. package/modern/DataGridPro/DataGridPro.js +5 -0
  68. package/modern/DataGridPro/useDataGridProComponent.js +3 -1
  69. package/modern/DataGridPro/useDataGridProProps.js +7 -13
  70. package/modern/components/GridColumnHeaders.js +15 -1
  71. package/modern/components/GridDetailPanel.js +1 -1
  72. package/modern/components/headerFiltering/GridHeaderFilterAdornment.js +98 -0
  73. package/modern/components/headerFiltering/GridHeaderFilterCell.js +222 -0
  74. package/modern/components/headerFiltering/GridHeaderFilterClearButton.js +24 -0
  75. package/modern/components/headerFiltering/GridHeaderFilterMenu.js +68 -0
  76. package/modern/components/headerFiltering/constants.js +30 -0
  77. package/modern/components/headerFiltering/index.js +2 -0
  78. package/modern/components/index.js +2 -1
  79. package/modern/constants/dataGridProDefaultSlotsComponents.js +5 -1
  80. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +110 -0
  81. package/modern/hooks/features/columnResize/useGridColumnResize.js +11 -0
  82. package/modern/hooks/features/rowPinning/useGridRowPinningPreProcessors.js +1 -0
  83. package/modern/hooks/features/treeData/useGridTreeDataPreProcessors.js +1 -0
  84. package/modern/index.js +1 -1
  85. package/modern/internals/index.js +4 -0
  86. package/modern/material/icons.js +4 -1
  87. package/modern/material/index.js +3 -2
  88. package/modern/models/gridProSlotProps.js +1 -0
  89. package/modern/utils/releaseInfo.js +1 -1
  90. package/modern/utils/tree/createRowTree.js +1 -0
  91. package/modern/utils/tree/insertDataRowInTree.js +4 -0
  92. package/modern/utils/tree/removeDataRowFromTree.js +1 -0
  93. package/modern/utils/tree/updateRowTree.js +2 -0
  94. package/modern/utils/tree/utils.js +19 -13
  95. package/node/DataGridPro/DataGridPro.js +5 -0
  96. package/node/DataGridPro/useDataGridProComponent.js +2 -0
  97. package/node/DataGridPro/useDataGridProProps.js +6 -12
  98. package/node/components/GridColumnHeaders.js +15 -1
  99. package/node/components/GridDetailPanel.js +2 -2
  100. package/node/components/headerFiltering/GridHeaderFilterAdornment.js +105 -0
  101. package/node/components/headerFiltering/GridHeaderFilterCell.js +230 -0
  102. package/node/components/headerFiltering/GridHeaderFilterClearButton.js +32 -0
  103. package/node/components/headerFiltering/GridHeaderFilterMenu.js +75 -0
  104. package/node/components/headerFiltering/constants.js +37 -0
  105. package/node/components/headerFiltering/index.js +27 -0
  106. package/node/components/index.js +11 -0
  107. package/node/constants/dataGridProDefaultSlotsComponents.js +5 -1
  108. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +120 -0
  109. package/node/hooks/features/columnResize/useGridColumnResize.js +11 -0
  110. package/node/hooks/features/rowPinning/useGridRowPinningPreProcessors.js +1 -0
  111. package/node/hooks/features/treeData/useGridTreeDataPreProcessors.js +1 -0
  112. package/node/index.js +1 -1
  113. package/node/internals/index.js +8 -0
  114. package/node/material/icons.js +6 -2
  115. package/node/material/index.js +2 -1
  116. package/node/models/gridProSlotProps.js +5 -0
  117. package/node/utils/releaseInfo.js +1 -1
  118. package/node/utils/tree/createRowTree.js +1 -0
  119. package/node/utils/tree/insertDataRowInTree.js +4 -0
  120. package/node/utils/tree/removeDataRowFromTree.js +1 -0
  121. package/node/utils/tree/updateRowTree.js +2 -0
  122. package/node/utils/tree/utils.js +19 -13
  123. package/package.json +2 -2
  124. package/typeOverloads/modules.d.ts +13 -1
  125. package/utils/releaseInfo.js +1 -1
  126. package/utils/tree/createRowTree.d.ts +2 -0
  127. package/utils/tree/createRowTree.js +1 -0
  128. package/utils/tree/insertDataRowInTree.d.ts +5 -1
  129. package/utils/tree/insertDataRowInTree.js +4 -0
  130. package/utils/tree/removeDataRowFromTree.js +1 -0
  131. package/utils/tree/updateRowTree.js +2 -0
  132. package/utils/tree/utils.d.ts +4 -2
  133. package/utils/tree/utils.js +19 -13
@@ -0,0 +1,69 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import MenuList from '@mui/material/MenuList';
4
+ import MenuItem from '@mui/material/MenuItem';
5
+ import ListItemIcon from '@mui/material/ListItemIcon';
6
+ import ListItemText from '@mui/material/ListItemText';
7
+ import { unstable_capitalize as capitalize } from '@mui/utils';
8
+ import { useGridApiContext, GridMenu } from '@mui/x-data-grid';
9
+ import { OPERATOR_SYMBOL_MAPPING } from './constants';
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { jsxs as _jsxs } from "react/jsx-runtime";
12
+ function GridHeaderFilterMenu({
13
+ open,
14
+ field,
15
+ targetRef,
16
+ applyFilterChanges,
17
+ operators,
18
+ item,
19
+ id,
20
+ labelledBy
21
+ }) {
22
+ const apiRef = useGridApiContext();
23
+ const hideMenu = React.useCallback(() => {
24
+ apiRef.current.hideHeaderFilterMenu();
25
+ }, [apiRef]);
26
+ const handleListKeyDown = React.useCallback(event => {
27
+ if (event.key === 'Tab') {
28
+ event.preventDefault();
29
+ }
30
+ if (event.key === 'Escape' || event.key === 'Tab') {
31
+ hideMenu();
32
+ }
33
+ }, [hideMenu]);
34
+ if (!targetRef.current) {
35
+ return null;
36
+ }
37
+ return /*#__PURE__*/_jsx(GridMenu, {
38
+ placement: "bottom-start",
39
+ open: open,
40
+ target: targetRef.current,
41
+ onClickAway: hideMenu,
42
+ onExited: hideMenu,
43
+ children: /*#__PURE__*/_jsx(MenuList, {
44
+ "aria-labelledby": labelledBy,
45
+ id: id,
46
+ onKeyDown: handleListKeyDown,
47
+ children: operators.map((op, i) => {
48
+ var _op$headerLabel;
49
+ const label = (_op$headerLabel = op == null ? void 0 : op.headerLabel) != null ? _op$headerLabel : apiRef.current.getLocaleText(`headerFilterOperator${capitalize(op.value)}`);
50
+ return /*#__PURE__*/_jsxs(MenuItem, {
51
+ onClick: () => {
52
+ applyFilterChanges(_extends({}, item, {
53
+ operator: op.value
54
+ }));
55
+ hideMenu();
56
+ },
57
+ autoFocus: i === 0 ? open : false,
58
+ selected: op.value === item.operator,
59
+ children: [/*#__PURE__*/_jsx(ListItemIcon, {
60
+ children: OPERATOR_SYMBOL_MAPPING[op.value]
61
+ }), /*#__PURE__*/_jsx(ListItemText, {
62
+ children: label
63
+ })]
64
+ }, `${field}-${op.value}`);
65
+ })
66
+ })
67
+ });
68
+ }
69
+ export { GridHeaderFilterMenu };
@@ -0,0 +1,3 @@
1
+ export declare const OPERATOR_SYMBOL_MAPPING: {
2
+ [key: string]: string;
3
+ };
@@ -0,0 +1,30 @@
1
+ export const OPERATOR_SYMBOL_MAPPING = {
2
+ contains: '∋',
3
+ equals: '=',
4
+ '=': '=',
5
+ '!=': '≠',
6
+ '>': '>',
7
+ '>=': '≥',
8
+ '<': '<',
9
+ '<=': '≤',
10
+ startsWith: '⊃',
11
+ endsWith: '⊂',
12
+ is: '=',
13
+ not: '≠',
14
+ isNot: '≠',
15
+ isEmpty: '∅',
16
+ isNotEmpty: '∉',
17
+ isIn: '∈',
18
+ isNotIn: '∉',
19
+ isLessThan: '<',
20
+ isLessThanOrEqual: '≤',
21
+ isGreaterThan: '>',
22
+ isGreaterThanOrEqual: '≥',
23
+ isBetween: '∈',
24
+ isNotBetween: '∉',
25
+ isAnyOf: '∈',
26
+ after: '>',
27
+ onOrAfter: '≥',
28
+ before: '<',
29
+ onOrBefore: '≤'
30
+ };
@@ -0,0 +1,2 @@
1
+ export * from './GridHeaderFilterAdornment';
2
+ export * from './GridHeaderFilterCell';
@@ -0,0 +1,2 @@
1
+ export * from './GridHeaderFilterAdornment';
2
+ export * from './GridHeaderFilterCell';
@@ -2,3 +2,4 @@ export * from './GridTreeDataGroupingCell';
2
2
  export * from './GridColumnMenuPinningItem';
3
3
  export * from './GridDetailPanelToggleCell';
4
4
  export * from '../material/icons';
5
+ export * from './headerFiltering';
@@ -2,4 +2,5 @@
2
2
  export * from './GridTreeDataGroupingCell';
3
3
  export * from './GridColumnMenuPinningItem';
4
4
  export * from './GridDetailPanelToggleCell';
5
- export * from '../material/icons';
5
+ export * from '../material/icons';
6
+ export * from './headerFiltering';
@@ -2,8 +2,12 @@ import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import { DATA_GRID_DEFAULT_SLOTS_COMPONENTS } from '@mui/x-data-grid/internals';
3
3
  import { GridProColumnMenu } from '../components/GridProColumnMenu';
4
4
  import { GridColumnHeaders } from '../components/GridColumnHeaders';
5
+ import { GridHeaderFilterMenu } from '../components/headerFiltering/GridHeaderFilterMenu';
6
+ import { GridHeaderFilterCell } from '../components/headerFiltering/GridHeaderFilterCell';
5
7
  import materialSlots from '../material';
6
8
  export const DATA_GRID_PRO_DEFAULT_SLOTS_COMPONENTS = _extends({}, DATA_GRID_DEFAULT_SLOTS_COMPONENTS, materialSlots, {
7
9
  ColumnMenu: GridProColumnMenu,
8
- ColumnHeaders: GridColumnHeaders
10
+ ColumnHeaders: GridColumnHeaders,
11
+ HeaderFilterCell: GridHeaderFilterCell,
12
+ HeaderFilterMenu: GridHeaderFilterMenu
9
13
  });
@@ -0,0 +1,21 @@
1
+ /// <reference types="react" />
2
+ import { UseGridColumnHeadersProps, GetHeadersParams } from '@mui/x-data-grid/internals';
3
+ export declare const useGridColumnHeaders: (props: UseGridColumnHeadersProps) => {
4
+ getColumnFilters: (params?: GetHeadersParams, other?: {}) => JSX.Element | null;
5
+ getRootProps: (other?: {} | undefined) => {
6
+ style: {
7
+ minHeight: number;
8
+ maxHeight: number;
9
+ lineHeight: string;
10
+ };
11
+ };
12
+ renderContext: import("@mui/x-data-grid").GridRenderContext | null;
13
+ getColumnHeaders: (params?: GetHeadersParams | undefined, other?: {} | undefined) => JSX.Element | null;
14
+ getColumnGroupHeaders: (params?: GetHeadersParams | undefined) => JSX.Element[] | null;
15
+ isDragging: boolean;
16
+ getInnerProps: () => {
17
+ ref: ((instance: HTMLDivElement | null) => void) | null;
18
+ role: string;
19
+ };
20
+ headerHeight: number;
21
+ };
@@ -0,0 +1,111 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _excluded = ["getColumnsToRender", "getRootProps"];
4
+ import * as React from 'react';
5
+ import { unstable_gridFocusColumnHeaderFilterSelector, useGridSelector, gridFilterModelSelector, unstable_gridTabIndexColumnHeaderFilterSelector } from '@mui/x-data-grid';
6
+ import { styled } from '@mui/system';
7
+ import { useGridColumnHeaders as useGridColumnHeadersCommunity, getTotalHeaderHeight, useGridPrivateApiContext, getGridFilter } from '@mui/x-data-grid/internals';
8
+ import { useGridRootProps } from '../../utils/useGridRootProps';
9
+ import { jsx as _jsx } from "react/jsx-runtime";
10
+ const GridHeaderFilterRow = styled('div', {
11
+ name: 'MuiDataGrid',
12
+ slot: 'HeaderFilterRow',
13
+ overridesResolver: (props, styles) => styles.headerFilterRow
14
+ })(() => ({
15
+ display: 'flex',
16
+ borderTop: '1px solid rgba(224, 224, 224, 1)'
17
+ }));
18
+ export const useGridColumnHeaders = props => {
19
+ const apiRef = useGridPrivateApiContext();
20
+ const {
21
+ headerGroupingMaxDepth,
22
+ hasOtherElementInTabSequence
23
+ } = props;
24
+ const columnHeaderFilterTabIndexState = useGridSelector(apiRef, unstable_gridTabIndexColumnHeaderFilterSelector);
25
+ const _useGridColumnHeaders = useGridColumnHeadersCommunity(_extends({}, props, {
26
+ hasOtherElementInTabSequence: hasOtherElementInTabSequence || columnHeaderFilterTabIndexState !== null
27
+ })),
28
+ {
29
+ getColumnsToRender,
30
+ getRootProps
31
+ } = _useGridColumnHeaders,
32
+ otherProps = _objectWithoutPropertiesLoose(_useGridColumnHeaders, _excluded);
33
+ const headerFiltersRef = React.useRef(null);
34
+ apiRef.current.register('private', {
35
+ headerFiltersElementRef: headerFiltersRef
36
+ });
37
+ const headerFilterMenuRef = React.useRef(null);
38
+ const rootProps = useGridRootProps();
39
+ const disableHeaderFiltering = !rootProps.unstable_headerFilters;
40
+ const headerHeight = Math.floor(rootProps.columnHeaderHeight * props.densityFactor);
41
+ const filterModel = useGridSelector(apiRef, gridFilterModelSelector);
42
+ const totalHeaderHeight = getTotalHeaderHeight(apiRef, rootProps.columnHeaderHeight) + (disableHeaderFiltering ? 0 : headerHeight);
43
+ const columnHeaderFilterFocus = useGridSelector(apiRef, unstable_gridFocusColumnHeaderFilterSelector);
44
+ const getColumnFilters = (params, other = {}) => {
45
+ if (disableHeaderFiltering) {
46
+ return null;
47
+ }
48
+ const columnsToRender = getColumnsToRender(params);
49
+ if (columnsToRender == null) {
50
+ return null;
51
+ }
52
+ const {
53
+ renderedColumns,
54
+ firstColumnToRender
55
+ } = columnsToRender;
56
+ const filters = [];
57
+ for (let i = 0; i < renderedColumns.length; i += 1) {
58
+ var _colDef$filterOperato, _colDef$filterOperato2, _filterModel$items$fi, _rootProps$slotProps;
59
+ const colDef = renderedColumns[i];
60
+ const columnIndex = firstColumnToRender + i;
61
+ const hasFocus = (columnHeaderFilterFocus == null ? void 0 : columnHeaderFilterFocus.field) === colDef.field;
62
+ const isFirstColumn = columnIndex === 0;
63
+ const tabIndexField = columnHeaderFilterTabIndexState == null ? void 0 : columnHeaderFilterTabIndexState.field;
64
+ const tabIndex = tabIndexField === colDef.field || isFirstColumn && !props.hasOtherElementInTabSequence ? 0 : -1;
65
+ let headerFilterComponent;
66
+ if (colDef.renderHeaderFilter) {
67
+ headerFilterComponent = colDef.renderHeaderFilter(apiRef.current.getColumnHeaderParams(colDef.field));
68
+ }
69
+ const headerClassName = typeof colDef.headerClassName === 'function' ? colDef.headerClassName({
70
+ field: colDef.field,
71
+ colDef
72
+ }) : colDef.headerClassName;
73
+
74
+ // TODO: Support for `isAnyOf` operator
75
+ const filterOperators = (_colDef$filterOperato = (_colDef$filterOperato2 = colDef.filterOperators) == null ? void 0 : _colDef$filterOperato2.filter(operator => operator.value !== 'isAnyOf')) != null ? _colDef$filterOperato : [];
76
+ const item = (_filterModel$items$fi = filterModel == null ? void 0 : filterModel.items.find(it => it.field === colDef.field && it.operator !== 'isAnyOf')) != null ? _filterModel$items$fi : getGridFilter(colDef);
77
+ filters.push( /*#__PURE__*/_jsx(rootProps.slots.headerFilterCell, _extends({
78
+ colIndex: columnIndex,
79
+ height: headerHeight,
80
+ width: colDef.computedWidth,
81
+ colDef: colDef,
82
+ hasFocus: hasFocus,
83
+ tabIndex: tabIndex,
84
+ headerFilterMenuRef: headerFilterMenuRef,
85
+ headerFilterComponent: headerFilterComponent,
86
+ headerClassName: headerClassName,
87
+ filterOperators: filterOperators,
88
+ "data-field": colDef.field,
89
+ item: item
90
+ }, (_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.headerFilterCell, other), `${colDef.field}-filter`));
91
+ }
92
+ return /*#__PURE__*/_jsx(GridHeaderFilterRow, {
93
+ ref: headerFiltersRef,
94
+ ownerState: rootProps,
95
+ role: "row",
96
+ "aria-rowindex": headerGroupingMaxDepth + 2,
97
+ children: filters
98
+ });
99
+ };
100
+ const rootStyle = {
101
+ minHeight: totalHeaderHeight,
102
+ maxHeight: totalHeaderHeight,
103
+ lineHeight: `${headerHeight}px`
104
+ };
105
+ return _extends({}, otherProps, {
106
+ getColumnFilters,
107
+ getRootProps: disableHeaderFiltering ? getRootProps : (other = {}) => _extends({
108
+ style: rootStyle
109
+ }, other)
110
+ });
111
+ };
@@ -87,6 +87,7 @@ export const useGridColumnResize = (apiRef, props) => {
87
87
  const logger = useGridLogger(apiRef, 'useGridColumnResize');
88
88
  const colDefRef = React.useRef();
89
89
  const colElementRef = React.useRef();
90
+ const headerFilterElementRef = React.useRef();
90
91
  const colGroupingElementRef = React.useRef();
91
92
  const colCellElementsRef = React.useRef();
92
93
  const theme = useTheme();
@@ -108,6 +109,12 @@ export const useGridColumnResize = (apiRef, props) => {
108
109
  colElementRef.current.style.width = `${newWidth}px`;
109
110
  colElementRef.current.style.minWidth = `${newWidth}px`;
110
111
  colElementRef.current.style.maxWidth = `${newWidth}px`;
112
+ const headerFilterElement = headerFilterElementRef.current;
113
+ if (headerFilterElement) {
114
+ headerFilterElement.style.width = `${newWidth}px`;
115
+ headerFilterElement.style.minWidth = `${newWidth}px`;
116
+ headerFilterElement.style.maxWidth = `${newWidth}px`;
117
+ }
111
118
  [...colCellElementsRef.current, ...colGroupingElementRef.current].forEach(element => {
112
119
  const div = element;
113
120
  let finalWidth;
@@ -160,7 +167,7 @@ export const useGridColumnResize = (apiRef, props) => {
160
167
  const handleColumnResizeMouseDown = useEventCallback(({
161
168
  colDef
162
169
  }, event) => {
163
- var _apiRef$current$colum, _apiRef$current$colum2;
170
+ var _apiRef$current$colum, _apiRef$current$heade, _apiRef$current$colum2;
164
171
  // Only handle left clicks
165
172
  if (event.button !== 0) {
166
173
  return;
@@ -179,6 +186,10 @@ export const useGridColumnResize = (apiRef, props) => {
179
186
  }, event);
180
187
  colDefRef.current = colDef;
181
188
  colElementRef.current = (_apiRef$current$colum = apiRef.current.columnHeadersContainerElementRef) == null ? void 0 : _apiRef$current$colum.current.querySelector(`[data-field="${colDef.field}"]`);
189
+ const headerFilterRowElement = (_apiRef$current$heade = apiRef.current.headerFiltersElementRef) == null ? void 0 : _apiRef$current$heade.current;
190
+ if (headerFilterRowElement) {
191
+ headerFilterElementRef.current = headerFilterRowElement.querySelector(`[data-field="${colDef.field}"]`);
192
+ }
182
193
  colGroupingElementRef.current = findGroupHeaderElementsFromField((_apiRef$current$colum2 = apiRef.current.columnHeadersContainerElementRef) == null ? void 0 : _apiRef$current$colum2.current, colDef.field);
183
194
  colCellElementsRef.current = findGridCellElementsFromCol(colElementRef.current, apiRef.current);
184
195
  const doc = ownerDocument(apiRef.current.rootElementRef.current);
@@ -27,6 +27,7 @@ export function addPinnedRow({
27
27
  isAutoGenerated
28
28
  };
29
29
  insertNodeInTree({
30
+ previousTree: null,
30
31
  node,
31
32
  tree,
32
33
  treeDepths
@@ -78,6 +78,7 @@ export const useGridTreeDataPreProcessors = (privateApiRef, props) => {
78
78
  };
79
79
  if (params.updates.type === 'full') {
80
80
  return createRowTree({
81
+ previousTree: params.previousTree,
81
82
  nodes: params.updates.rows.map(getRowTreeBuilderNode),
82
83
  defaultGroupingExpansionDepth: props.defaultGroupingExpansionDepth,
83
84
  isGroupExpandedByDefault: props.isGroupExpandedByDefault,
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid-pro v6.4.0
2
+ * @mui/x-data-grid-pro v6.5.0
3
3
  *
4
4
  * @license MUI X Commercial
5
5
  * This source code is licensed under the commercial license found in the
@@ -2,6 +2,7 @@ export * from '@mui/x-data-grid/internals';
2
2
  export { DataGridProVirtualScroller } from '../components/DataGridProVirtualScroller';
3
3
  export { GridColumnHeaders } from '../components/GridColumnHeaders';
4
4
  export { DATA_GRID_PRO_DEFAULT_SLOTS_COMPONENTS } from '../constants/dataGridProDefaultSlotsComponents';
5
+ export { useGridColumnHeaders } from '../hooks/features/columnHeaders/useGridColumnHeaders';
5
6
  export { useGridColumnResize, columnResizeStateInitializer, } from '../hooks/features/columnResize/useGridColumnResize';
6
7
  export { useGridColumnPinning, columnPinningStateInitializer, } from '../hooks/features/columnPinning/useGridColumnPinning';
7
8
  export { useGridColumnPinningPreProcessors } from '../hooks/features/columnPinning/useGridColumnPinningPreProcessors';
@@ -1,7 +1,11 @@
1
+ // eslint-disable-next-line import/export
1
2
  export * from '@mui/x-data-grid/internals';
2
3
  export { DataGridProVirtualScroller } from '../components/DataGridProVirtualScroller';
3
4
  export { GridColumnHeaders } from '../components/GridColumnHeaders';
4
5
  export { DATA_GRID_PRO_DEFAULT_SLOTS_COMPONENTS } from '../constants/dataGridProDefaultSlotsComponents';
6
+
7
+ // eslint-disable-next-line import/export
8
+ export { useGridColumnHeaders } from '../hooks/features/columnHeaders/useGridColumnHeaders';
5
9
  export { useGridColumnResize, columnResizeStateInitializer } from '../hooks/features/columnResize/useGridColumnResize';
6
10
  export { useGridColumnPinning, columnPinningStateInitializer } from '../hooks/features/columnPinning/useGridColumnPinning';
7
11
  export { useGridColumnPinningPreProcessors } from '../hooks/features/columnPinning/useGridColumnPinningPreProcessors';
@@ -827,6 +827,11 @@ DataGridProRaw.propTypes = {
827
827
  * @default false
828
828
  */
829
829
  treeData: PropTypes.bool,
830
+ /**
831
+ * If `true`, enables the data grid filtering on header feature.
832
+ * @default false
833
+ */
834
+ unstable_headerFilters: PropTypes.bool,
830
835
  /**
831
836
  * If `true`, the grid will not use `valueFormatter` when exporting to CSV or copying to clipboard.
832
837
  * If an object is provided, you can choose to ignore the `valueFormatter` for CSV export or clipboard export.
@@ -1,4 +1,4 @@
1
- import { useGridInitialization, useGridInitializeState, useGridClipboard, useGridColumnMenu, useGridColumns, columnsStateInitializer, useGridDensity, useGridCsvExport, useGridPrintExport, useGridFilter, filterStateInitializer, useGridFocus, useGridKeyboardNavigation, useGridPagination, paginationStateInitializer, useGridPreferencesPanel, useGridEditing, editingStateInitializer, useGridRows, useGridRowsPreProcessors, rowsStateInitializer, useGridRowsMeta, useGridParamsApi, useGridRowSelection, useGridSorting, sortingStateInitializer, useGridScroll, useGridEvents, useGridDimensions, useGridStatePersistence, useGridRowSelectionPreProcessors, useGridColumnSpanning, columnMenuStateInitializer, densityStateInitializer, focusStateInitializer, preferencePanelStateInitializer, rowsMetaStateInitializer, rowSelectionStateInitializer, useGridColumnGrouping, columnGroupsStateInitializer } from '@mui/x-data-grid/internals';
1
+ import { useGridInitialization, useGridInitializeState, useGridClipboard, useGridColumnMenu, useGridColumns, columnsStateInitializer, useGridDensity, useGridCsvExport, useGridPrintExport, useGridFilter, filterStateInitializer, useGridFocus, useGridKeyboardNavigation, useGridPagination, paginationStateInitializer, useGridPreferencesPanel, useGridEditing, editingStateInitializer, useGridRows, useGridRowsPreProcessors, rowsStateInitializer, useGridRowsMeta, useGridParamsApi, useGridRowSelection, useGridSorting, sortingStateInitializer, useGridScroll, useGridEvents, useGridDimensions, useGridStatePersistence, useGridRowSelectionPreProcessors, useGridColumnSpanning, columnMenuStateInitializer, densityStateInitializer, focusStateInitializer, preferencePanelStateInitializer, rowsMetaStateInitializer, rowSelectionStateInitializer, useGridColumnGrouping, columnGroupsStateInitializer, headerFilteringStateInitializer, useGridHeaderFiltering } from '@mui/x-data-grid/internals';
2
2
  // Pro-only features
3
3
  import { useGridInfiniteLoader } from '../hooks/features/infiniteLoader/useGridInfiniteLoader';
4
4
  import { useGridColumnReorder, columnReorderStateInitializer } from '../hooks/features/columnReorder/useGridColumnReorder';
@@ -35,6 +35,7 @@ export var useDataGridProComponent = function useDataGridProComponent(inputApiRe
35
35
  /**
36
36
  * Register all state initializers here.
37
37
  */
38
+ useGridInitializeState(headerFilteringStateInitializer, apiRef, props);
38
39
  useGridInitializeState(rowSelectionStateInitializer, apiRef, props);
39
40
  useGridInitializeState(detailPanelStateInitializer, apiRef, props);
40
41
  useGridInitializeState(columnPinningStateInitializer, apiRef, props);
@@ -53,6 +54,7 @@ export var useDataGridProComponent = function useDataGridProComponent(inputApiRe
53
54
  useGridInitializeState(rowsMetaStateInitializer, apiRef, props);
54
55
  useGridInitializeState(columnMenuStateInitializer, apiRef, props);
55
56
  useGridInitializeState(columnGroupsStateInitializer, apiRef, props);
57
+ useGridHeaderFiltering(apiRef, props);
56
58
  useGridTreeData(apiRef);
57
59
  useGridKeyboardNavigation(apiRef, props);
58
60
  useGridRowSelection(apiRef, props);
@@ -1,10 +1,9 @@
1
- import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- var _excluded = ["components", "componentsProps"];
4
3
  import * as React from 'react';
5
4
  import { useThemeProps } from '@mui/material/styles';
6
5
  import { GRID_DEFAULT_LOCALE_TEXT, DATA_GRID_PROPS_DEFAULT_VALUES } from '@mui/x-data-grid';
7
- import { computeSlots, uncapitalizeObjectKeys } from '@mui/x-data-grid/internals';
6
+ import { computeSlots, uncapitalizeObjectKeys, useProps } from '@mui/x-data-grid/internals';
8
7
  import { DATA_GRID_PRO_DEFAULT_SLOTS_COMPONENTS } from '../constants/dataGridProDefaultSlotsComponents';
9
8
 
10
9
  /**
@@ -22,17 +21,19 @@ export var DATA_GRID_PRO_PROPS_DEFAULT_VALUES = _extends({}, DATA_GRID_PROPS_DEF
22
21
  rowsLoadingMode: 'client',
23
22
  getDetailPanelHeight: function getDetailPanelHeight() {
24
23
  return 500;
25
- }
24
+ },
25
+ unstable_headerFilters: false
26
26
  });
27
27
  var defaultSlots = uncapitalizeObjectKeys(DATA_GRID_PRO_DEFAULT_SLOTS_COMPONENTS);
28
28
  export var useDataGridProProps = function useDataGridProProps(inProps) {
29
- var _useThemeProps = useThemeProps({
29
+ var _useProps = useProps(useThemeProps({
30
30
  props: inProps,
31
31
  name: 'MuiDataGrid'
32
- }),
33
- components = _useThemeProps.components,
34
- componentsProps = _useThemeProps.componentsProps,
35
- themedProps = _objectWithoutProperties(_useThemeProps, _excluded);
32
+ })),
33
+ _useProps2 = _slicedToArray(_useProps, 3),
34
+ components = _useProps2[0],
35
+ componentsProps = _useProps2[1],
36
+ themedProps = _useProps2[2];
36
37
  var localeText = React.useMemo(function () {
37
38
  return _extends({}, GRID_DEFAULT_LOCALE_TEXT, themedProps.localeText);
38
39
  }, [themedProps.localeText]);
@@ -8,11 +8,12 @@ import PropTypes from 'prop-types';
8
8
  import { unstable_composeClasses as composeClasses, unstable_useEventCallback as useEventCallback } from '@mui/utils';
9
9
  import { styled, alpha, useTheme } from '@mui/material/styles';
10
10
  import { getDataGridUtilityClass, gridClasses, useGridApiEventHandler, GridColumnHeaderSeparatorSides } from '@mui/x-data-grid';
11
- import { GridBaseColumnHeaders, GridColumnHeadersInner, useGridColumnHeaders } from '@mui/x-data-grid/internals';
11
+ import { GridBaseColumnHeaders, GridColumnHeadersInner } from '@mui/x-data-grid/internals';
12
12
  import { useGridRootProps } from '../hooks/utils/useGridRootProps';
13
13
  import { useGridApiContext } from '../hooks/utils/useGridApiContext';
14
14
  import { GridPinnedPosition } from '../hooks/features/columnPinning';
15
15
  import { filterColumns } from './DataGridProVirtualScroller';
16
+ import { useGridColumnHeaders } from '../hooks/features/columnHeaders/useGridColumnHeaders';
16
17
  import { jsxs as _jsxs } from "react/jsx-runtime";
17
18
  var useUtilityClasses = function useUtilityClasses(ownerState) {
18
19
  var leftPinnedColumns = ownerState.leftPinnedColumns,
@@ -144,6 +145,7 @@ var GridColumnHeaders = /*#__PURE__*/React.forwardRef(function GridColumnHeaders
144
145
  getRootProps = _useGridColumnHeaders.getRootProps,
145
146
  getInnerProps = _useGridColumnHeaders.getInnerProps,
146
147
  getColumnHeaders = _useGridColumnHeaders.getColumnHeaders,
148
+ getColumnFilters = _useGridColumnHeaders.getColumnFilters,
147
149
  getColumnGroupHeaders = _useGridColumnHeaders.getColumnGroupHeaders;
148
150
  var ownerState = _extends({}, rootProps, {
149
151
  leftPinnedColumns: leftPinnedColumns,
@@ -184,6 +186,10 @@ var GridColumnHeaders = /*#__PURE__*/React.forwardRef(function GridColumnHeaders
184
186
  maxLastColumn: leftRenderContext.lastColumnIndex
185
187
  }, {
186
188
  disableReorder: true
189
+ }), getColumnFilters({
190
+ renderContext: leftRenderContext,
191
+ minFirstColumn: leftRenderContext.firstColumnIndex,
192
+ maxLastColumn: leftRenderContext.lastColumnIndex
187
193
  })]
188
194
  })), /*#__PURE__*/_jsxs(GridColumnHeadersInner, _extends({
189
195
  isDragging: isDragging
@@ -196,6 +202,10 @@ var GridColumnHeaders = /*#__PURE__*/React.forwardRef(function GridColumnHeaders
196
202
  renderContext: renderContext,
197
203
  minFirstColumn: leftPinnedColumns.length,
198
204
  maxLastColumn: visibleColumnFields.length - rightPinnedColumns.length
205
+ }), getColumnFilters({
206
+ renderContext: renderContext,
207
+ minFirstColumn: leftPinnedColumns.length,
208
+ maxLastColumn: visibleColumnFields.length - rightPinnedColumns.length
199
209
  })]
200
210
  })), rightRenderContext && /*#__PURE__*/_jsxs(GridColumnHeadersPinnedColumnHeaders, _extends({
201
211
  ownerState: _extends({}, ownerState, {
@@ -218,6 +228,10 @@ var GridColumnHeaders = /*#__PURE__*/React.forwardRef(function GridColumnHeaders
218
228
  }, {
219
229
  disableReorder: true,
220
230
  separatorSide: GridColumnHeaderSeparatorSides.Left
231
+ }), getColumnFilters({
232
+ renderContext: rightRenderContext,
233
+ minFirstColumn: rightRenderContext.firstColumnIndex,
234
+ maxLastColumn: rightRenderContext.lastColumnIndex
221
235
  })]
222
236
  }))]
223
237
  }));
@@ -5,7 +5,7 @@ var _excluded = ["rowId", "height", "style"];
5
5
  import * as React from 'react';
6
6
  import Box from '@mui/material/Box';
7
7
  import { styled } from '@mui/material/styles';
8
- import { useGridRootProps } from '@mui/x-data-grid';
8
+ import { useGridRootProps } from '../hooks/utils/useGridRootProps';
9
9
  import { useGridPrivateApiContext } from '../hooks/utils/useGridPrivateApiContext';
10
10
  import { jsx as _jsx } from "react/jsx-runtime";
11
11
  var DetailPanel = styled(Box, {
@@ -0,0 +1,97 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
+ var _excluded = ["operators", "item", "field", "buttonRef", "headerFilterMenuRef"];
4
+ import * as React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import { useGridApiContext } from '@mui/x-data-grid';
7
+ import { unstable_useId as useId } from '@mui/utils';
8
+ import { unstable_gridHeaderFilteringMenuSelector } from '@mui/x-data-grid/internals';
9
+ import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
10
+ import { OPERATOR_SYMBOL_MAPPING } from './constants';
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ import { jsxs as _jsxs } from "react/jsx-runtime";
13
+ var sx = {
14
+ width: 22,
15
+ height: 22,
16
+ padding: '0px 0px 2px 2px'
17
+ };
18
+ function GridHeaderFilterAdornment(props) {
19
+ var _rootProps$slotProps, _OPERATOR_SYMBOL_MAPP;
20
+ var operators = props.operators,
21
+ item = props.item,
22
+ field = props.field,
23
+ buttonRef = props.buttonRef,
24
+ headerFilterMenuRef = props.headerFilterMenuRef,
25
+ others = _objectWithoutProperties(props, _excluded);
26
+ var buttonId = useId();
27
+ var menuId = useId();
28
+ var rootProps = useGridRootProps();
29
+ var apiRef = useGridApiContext();
30
+ var open = Boolean(unstable_gridHeaderFilteringMenuSelector(apiRef) === field && headerFilterMenuRef.current);
31
+ var handleClick = function handleClick(event) {
32
+ headerFilterMenuRef.current = event.currentTarget;
33
+ apiRef.current.showHeaderFilterMenu(field);
34
+ };
35
+ if (!rootProps.slots.headerFilterMenu) {
36
+ return null;
37
+ }
38
+ return /*#__PURE__*/_jsxs(React.Fragment, {
39
+ children: [/*#__PURE__*/_jsx(rootProps.slots.baseInputAdornment, {
40
+ position: "start",
41
+ children: /*#__PURE__*/_jsx(rootProps.slots.baseIconButton, _extends({
42
+ id: buttonId,
43
+ ref: buttonRef,
44
+ "aria-label": apiRef.current.getLocaleText('filterPanelOperator'),
45
+ title: apiRef.current.getLocaleText('filterPanelOperator'),
46
+ "aria-controls": menuId,
47
+ "aria-expanded": open ? 'true' : undefined,
48
+ "aria-haspopup": "true",
49
+ tabIndex: -1,
50
+ size: "small",
51
+ onClick: handleClick,
52
+ sx: sx
53
+ }, (_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.baseIconButton, {
54
+ children: (_OPERATOR_SYMBOL_MAPP = OPERATOR_SYMBOL_MAPPING[item == null ? void 0 : item.operator]) != null ? _OPERATOR_SYMBOL_MAPP : '='
55
+ }))
56
+ }), /*#__PURE__*/_jsx(rootProps.slots.headerFilterMenu, _extends({
57
+ field: field,
58
+ open: open,
59
+ item: item,
60
+ targetRef: headerFilterMenuRef,
61
+ operators: operators,
62
+ labelledBy: buttonId,
63
+ id: menuId
64
+ }, others))]
65
+ });
66
+ }
67
+ process.env.NODE_ENV !== "production" ? GridHeaderFilterAdornment.propTypes = {
68
+ // ----------------------------- Warning --------------------------------
69
+ // | These PropTypes are generated from the TypeScript type definitions |
70
+ // | To update them edit the TypeScript types and run "yarn proptypes" |
71
+ // ----------------------------------------------------------------------
72
+ applyFilterChanges: PropTypes.func.isRequired,
73
+ buttonRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({
74
+ current: PropTypes.object
75
+ })]),
76
+ field: PropTypes.string.isRequired,
77
+ headerFilterMenuRef: PropTypes.shape({
78
+ current: PropTypes.object
79
+ }).isRequired,
80
+ item: PropTypes.shape({
81
+ field: PropTypes.string.isRequired,
82
+ id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
83
+ operator: PropTypes.string.isRequired,
84
+ value: PropTypes.any
85
+ }).isRequired,
86
+ operators: PropTypes.arrayOf(PropTypes.shape({
87
+ getApplyFilterFn: PropTypes.func.isRequired,
88
+ getValueAsString: PropTypes.func,
89
+ headerLabel: PropTypes.string,
90
+ InputComponent: PropTypes.elementType,
91
+ InputComponentProps: PropTypes.object,
92
+ label: PropTypes.string,
93
+ requiresFilterValue: PropTypes.bool,
94
+ value: PropTypes.string.isRequired
95
+ })).isRequired
96
+ } : void 0;
97
+ export { GridHeaderFilterAdornment };