@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,230 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
+ var _excluded = ["colIndex", "height", "hasFocus", "headerFilterComponent", "filterOperators", "width", "headerClassName", "colDef", "item", "headerFilterMenuRef", "InputComponentProps", "showClearIcon"];
4
+ import * as React from 'react';
5
+ import PropTypes from 'prop-types';
6
+ import clsx from 'clsx';
7
+ import { unstable_useForkRef as useForkRef, unstable_composeClasses as composeClasses, unstable_capitalize as capitalize } from '@mui/utils';
8
+ import { gridVisibleColumnFieldsSelector, getDataGridUtilityClass } from '@mui/x-data-grid';
9
+ import { useGridPrivateApiContext, unstable_gridHeaderFilteringEditFieldSelector, unstable_gridHeaderFilteringMenuSelector, isNavigationKey } from '@mui/x-data-grid/internals';
10
+ import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
11
+ import { GridHeaderFilterAdornment } from './GridHeaderFilterAdornment';
12
+ import { GridHeaderFilterClearButton } from './GridHeaderFilterClearButton';
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+ import { jsxs as _jsxs } from "react/jsx-runtime";
15
+ var useUtilityClasses = function useUtilityClasses(ownerState) {
16
+ var colDef = ownerState.colDef,
17
+ classes = ownerState.classes,
18
+ showColumnVerticalBorder = ownerState.showColumnVerticalBorder;
19
+ var slots = {
20
+ root: ['columnHeader', colDef.headerAlign === 'left' && 'columnHeader--alignLeft', colDef.headerAlign === 'center' && 'columnHeader--alignCenter', colDef.headerAlign === 'right' && 'columnHeader--alignRight', 'withBorderColor', showColumnVerticalBorder && 'columnHeader--withRightBorder']
21
+ };
22
+ return composeClasses(slots, getDataGridUtilityClass, classes);
23
+ };
24
+ var GridHeaderFilterCell = /*#__PURE__*/React.forwardRef(function (props, ref) {
25
+ var _filterOperators$find, _currentOperator$head, _colDef$headerName;
26
+ var colIndex = props.colIndex,
27
+ height = props.height,
28
+ hasFocus = props.hasFocus,
29
+ headerFilterComponent = props.headerFilterComponent,
30
+ filterOperators = props.filterOperators,
31
+ width = props.width,
32
+ headerClassName = props.headerClassName,
33
+ colDef = props.colDef,
34
+ item = props.item,
35
+ headerFilterMenuRef = props.headerFilterMenuRef,
36
+ InputComponentProps = props.InputComponentProps,
37
+ _props$showClearIcon = props.showClearIcon,
38
+ showClearIcon = _props$showClearIcon === void 0 ? true : _props$showClearIcon,
39
+ other = _objectWithoutProperties(props, _excluded);
40
+ var apiRef = useGridPrivateApiContext();
41
+ var columnFields = gridVisibleColumnFieldsSelector(apiRef);
42
+ var rootProps = useGridRootProps();
43
+ var cellRef = React.useRef(null);
44
+ var handleRef = useForkRef(ref, cellRef);
45
+ var inputRef = React.useRef(null);
46
+ var buttonRef = React.useRef(null);
47
+ var isEditing = unstable_gridHeaderFilteringEditFieldSelector(apiRef) === colDef.field;
48
+ var isMenuOpen = unstable_gridHeaderFilteringMenuSelector(apiRef) === colDef.field;
49
+ var currentOperator = filterOperators[0];
50
+ var InputComponent = colDef.filterable ? currentOperator.InputComponent : null;
51
+ var applyFilterChanges = React.useCallback(function (updatedItem) {
52
+ if (item.value && !updatedItem.value) {
53
+ apiRef.current.deleteFilterItem(updatedItem);
54
+ return;
55
+ }
56
+ apiRef.current.upsertFilterItem(updatedItem);
57
+ }, [apiRef, item]);
58
+ var clearFilterItem = React.useCallback(function () {
59
+ apiRef.current.deleteFilterItem(item);
60
+ }, [apiRef, item]);
61
+ React.useLayoutEffect(function () {
62
+ if (hasFocus && !isMenuOpen) {
63
+ var focusableElement = cellRef.current.querySelector('[tabindex="0"]');
64
+ if (isEditing && InputComponent) {
65
+ focusableElement = inputRef.current;
66
+ }
67
+ var elementToFocus = focusableElement || cellRef.current;
68
+ elementToFocus == null ? void 0 : elementToFocus.focus();
69
+ apiRef.current.columnHeadersContainerElementRef.current.scrollLeft = 0;
70
+ }
71
+ }, [InputComponent, apiRef, hasFocus, isEditing, isMenuOpen]);
72
+ var onKeyDown = React.useCallback(function (event) {
73
+ if (isMenuOpen || isNavigationKey(event.key)) {
74
+ return;
75
+ }
76
+ switch (event.key) {
77
+ case 'Escape':
78
+ if (isEditing) {
79
+ apiRef.current.stopHeaderFilterEditMode();
80
+ }
81
+ break;
82
+ case 'Enter':
83
+ if (isEditing) {
84
+ apiRef.current.stopHeaderFilterEditMode();
85
+ break;
86
+ }
87
+ if (event.metaKey || event.ctrlKey) {
88
+ headerFilterMenuRef.current = buttonRef.current;
89
+ apiRef.current.showHeaderFilterMenu(colDef.field);
90
+ break;
91
+ }
92
+ apiRef.current.startHeaderFilterEditMode(colDef.field);
93
+ break;
94
+ case 'Tab':
95
+ {
96
+ if (isEditing) {
97
+ var _columnFields;
98
+ var fieldToFocus = (_columnFields = columnFields[colIndex + (event.shiftKey ? -1 : 1)]) != null ? _columnFields : null;
99
+ if (fieldToFocus) {
100
+ apiRef.current.startHeaderFilterEditMode(fieldToFocus);
101
+ apiRef.current.setColumnHeaderFilterFocus(fieldToFocus, event);
102
+ }
103
+ }
104
+ break;
105
+ }
106
+ default:
107
+ if (isEditing || event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {
108
+ break;
109
+ }
110
+ apiRef.current.startHeaderFilterEditMode(colDef.field);
111
+ break;
112
+ }
113
+ }, [apiRef, colDef.field, colIndex, columnFields, headerFilterMenuRef, isEditing, isMenuOpen]);
114
+ var publish = React.useCallback(function (eventName, propHandler) {
115
+ return function (event) {
116
+ apiRef.current.publishEvent(eventName, apiRef.current.getColumnHeaderParams(colDef.field), event);
117
+ if (propHandler) {
118
+ propHandler(event);
119
+ }
120
+ };
121
+ }, [apiRef, colDef.field]);
122
+ var onMouseDown = React.useCallback(function (event) {
123
+ if (!hasFocus) {
124
+ if (inputRef.current) {
125
+ inputRef.current.focus();
126
+ }
127
+ apiRef.current.setColumnHeaderFilterFocus(colDef.field, event);
128
+ }
129
+ }, [apiRef, colDef.field, hasFocus]);
130
+ var mouseEventsHandlers = React.useMemo(function () {
131
+ return {
132
+ onKeyDown: publish('headerFilterKeyDown', onKeyDown),
133
+ onClick: publish('headerFilterClick'),
134
+ onMouseDown: publish('headerFilterMouseDown', onMouseDown)
135
+ };
136
+ }, [onMouseDown, onKeyDown, publish]);
137
+ var ownerState = _extends({}, rootProps, {
138
+ colDef: colDef
139
+ });
140
+ var classes = useUtilityClasses(ownerState);
141
+ var isNoInputOperator = (filterOperators == null ? void 0 : (_filterOperators$find = filterOperators.find(function (_ref) {
142
+ var value = _ref.value;
143
+ return item.operator === value;
144
+ })) == null ? void 0 : _filterOperators$find.requiresFilterValue) === false;
145
+ var isApplied = Boolean(item == null ? void 0 : item.value) || isNoInputOperator;
146
+ var label = (_currentOperator$head = currentOperator.headerLabel) != null ? _currentOperator$head : apiRef.current.getLocaleText("headerFilterOperator".concat(capitalize(item.operator)));
147
+ var isFilterActive = isApplied || hasFocus;
148
+ return /*#__PURE__*/_jsxs("div", _extends({
149
+ className: clsx(classes.root, headerClassName),
150
+ ref: handleRef,
151
+ style: {
152
+ height: height,
153
+ width: width,
154
+ minWidth: width,
155
+ maxWidth: width
156
+ },
157
+ role: "columnheader",
158
+ "aria-colindex": colIndex + 1,
159
+ "aria-label": headerFilterComponent == null ? (_colDef$headerName = colDef.headerName) != null ? _colDef$headerName : colDef.field : undefined
160
+ }, other, mouseEventsHandlers, {
161
+ children: [headerFilterComponent, InputComponent && headerFilterComponent === undefined ? /*#__PURE__*/_jsx(InputComponent, _extends({
162
+ apiRef: apiRef,
163
+ item: item,
164
+ inputRef: inputRef,
165
+ applyValue: applyFilterChanges,
166
+ onFocus: function onFocus() {
167
+ return apiRef.current.startHeaderFilterEditMode(colDef.field);
168
+ },
169
+ onBlur: function onBlur() {
170
+ return apiRef.current.stopHeaderFilterEditMode();
171
+ },
172
+ placeholder: apiRef.current.getLocaleText('columnMenuFilter'),
173
+ label: isFilterActive ? capitalize(label) : ' ',
174
+ isFilterActive: isFilterActive,
175
+ headerFilterMenu: /*#__PURE__*/_jsx(GridHeaderFilterAdornment, {
176
+ operators: filterOperators,
177
+ item: item,
178
+ field: colDef.field,
179
+ applyFilterChanges: applyFilterChanges,
180
+ headerFilterMenuRef: headerFilterMenuRef,
181
+ buttonRef: buttonRef
182
+ }),
183
+ clearButton: showClearIcon && isApplied ? /*#__PURE__*/_jsx(GridHeaderFilterClearButton, {
184
+ onClick: clearFilterItem
185
+ }) : null,
186
+ disabled: isNoInputOperator,
187
+ tabIndex: -1
188
+ }, currentOperator == null ? void 0 : currentOperator.InputComponentProps, InputComponentProps)) : null]
189
+ }));
190
+ });
191
+ process.env.NODE_ENV !== "production" ? GridHeaderFilterCell.propTypes = {
192
+ // ----------------------------- Warning --------------------------------
193
+ // | These PropTypes are generated from the TypeScript type definitions |
194
+ // | To update them edit the TypeScript types and run "yarn proptypes" |
195
+ // ----------------------------------------------------------------------
196
+ colDef: PropTypes.object.isRequired,
197
+ colIndex: PropTypes.number.isRequired,
198
+ filterOperators: PropTypes.arrayOf(PropTypes.shape({
199
+ getApplyFilterFn: PropTypes.func.isRequired,
200
+ getValueAsString: PropTypes.func,
201
+ headerLabel: PropTypes.string,
202
+ InputComponent: PropTypes.elementType,
203
+ InputComponentProps: PropTypes.object,
204
+ label: PropTypes.string,
205
+ requiresFilterValue: PropTypes.bool,
206
+ value: PropTypes.string.isRequired
207
+ })),
208
+ hasFocus: PropTypes.bool,
209
+ /**
210
+ * Class name that will be added in the column header cell.
211
+ */
212
+ headerClassName: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
213
+ headerFilterComponent: PropTypes.node,
214
+ headerFilterMenuRef: PropTypes.shape({
215
+ current: PropTypes.object
216
+ }).isRequired,
217
+ height: PropTypes.number.isRequired,
218
+ InputComponentProps: PropTypes.object,
219
+ item: PropTypes.shape({
220
+ field: PropTypes.string.isRequired,
221
+ id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
222
+ operator: PropTypes.string.isRequired,
223
+ value: PropTypes.any
224
+ }).isRequired,
225
+ showClearIcon: PropTypes.bool,
226
+ sortIndex: PropTypes.number,
227
+ tabIndex: PropTypes.oneOf([-1, 0]).isRequired,
228
+ width: PropTypes.number.isRequired
229
+ } : void 0;
230
+ export { GridHeaderFilterCell };
@@ -0,0 +1,24 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import * as React from 'react';
3
+ import { useGridRootProps } from '../../hooks/utils/useGridRootProps';
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ var sx = {
6
+ padding: '2px'
7
+ };
8
+ function GridHeaderFilterClearButton(_ref) {
9
+ var _rootProps$slotProps;
10
+ var onClick = _ref.onClick;
11
+ var rootProps = useGridRootProps();
12
+ return /*#__PURE__*/_jsx(rootProps.slots.baseIconButton, _extends({
13
+ tabIndex: -1,
14
+ "aria-label": "Clear filter",
15
+ size: "small",
16
+ onClick: onClick,
17
+ sx: sx
18
+ }, (_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.baseIconButton, {
19
+ children: /*#__PURE__*/_jsx(rootProps.slots.headerFilterClearIcon, {
20
+ fontSize: "inherit"
21
+ })
22
+ }));
23
+ }
24
+ export { GridHeaderFilterClearButton };
@@ -0,0 +1,68 @@
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(_ref) {
13
+ var open = _ref.open,
14
+ field = _ref.field,
15
+ targetRef = _ref.targetRef,
16
+ applyFilterChanges = _ref.applyFilterChanges,
17
+ operators = _ref.operators,
18
+ item = _ref.item,
19
+ id = _ref.id,
20
+ labelledBy = _ref.labelledBy;
21
+ var apiRef = useGridApiContext();
22
+ var hideMenu = React.useCallback(function () {
23
+ apiRef.current.hideHeaderFilterMenu();
24
+ }, [apiRef]);
25
+ var handleListKeyDown = React.useCallback(function (event) {
26
+ if (event.key === 'Tab') {
27
+ event.preventDefault();
28
+ }
29
+ if (event.key === 'Escape' || event.key === 'Tab') {
30
+ hideMenu();
31
+ }
32
+ }, [hideMenu]);
33
+ if (!targetRef.current) {
34
+ return null;
35
+ }
36
+ return /*#__PURE__*/_jsx(GridMenu, {
37
+ placement: "bottom-start",
38
+ open: open,
39
+ target: targetRef.current,
40
+ onClickAway: hideMenu,
41
+ onExited: hideMenu,
42
+ children: /*#__PURE__*/_jsx(MenuList, {
43
+ "aria-labelledby": labelledBy,
44
+ id: id,
45
+ onKeyDown: handleListKeyDown,
46
+ children: operators.map(function (op, i) {
47
+ var _op$headerLabel;
48
+ var label = (_op$headerLabel = op == null ? void 0 : op.headerLabel) != null ? _op$headerLabel : apiRef.current.getLocaleText("headerFilterOperator".concat(capitalize(op.value)));
49
+ return /*#__PURE__*/_jsxs(MenuItem, {
50
+ onClick: function onClick() {
51
+ applyFilterChanges(_extends({}, item, {
52
+ operator: op.value
53
+ }));
54
+ hideMenu();
55
+ },
56
+ autoFocus: i === 0 ? open : false,
57
+ selected: op.value === item.operator,
58
+ children: [/*#__PURE__*/_jsx(ListItemIcon, {
59
+ children: OPERATOR_SYMBOL_MAPPING[op.value]
60
+ }), /*#__PURE__*/_jsx(ListItemText, {
61
+ children: label
62
+ })]
63
+ }, "".concat(field, "-").concat(op.value));
64
+ })
65
+ })
66
+ });
67
+ }
68
+ export { GridHeaderFilterMenu };
@@ -0,0 +1,30 @@
1
+ export var 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';
@@ -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 var 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,120 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
3
+ var _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
+ var GridHeaderFilterRow = styled('div', {
11
+ name: 'MuiDataGrid',
12
+ slot: 'HeaderFilterRow',
13
+ overridesResolver: function overridesResolver(props, styles) {
14
+ return styles.headerFilterRow;
15
+ }
16
+ })(function () {
17
+ return {
18
+ display: 'flex',
19
+ borderTop: '1px solid rgba(224, 224, 224, 1)'
20
+ };
21
+ });
22
+ export var useGridColumnHeaders = function useGridColumnHeaders(props) {
23
+ var apiRef = useGridPrivateApiContext();
24
+ var headerGroupingMaxDepth = props.headerGroupingMaxDepth,
25
+ hasOtherElementInTabSequence = props.hasOtherElementInTabSequence;
26
+ var columnHeaderFilterTabIndexState = useGridSelector(apiRef, unstable_gridTabIndexColumnHeaderFilterSelector);
27
+ var _useGridColumnHeaders = useGridColumnHeadersCommunity(_extends({}, props, {
28
+ hasOtherElementInTabSequence: hasOtherElementInTabSequence || columnHeaderFilterTabIndexState !== null
29
+ })),
30
+ getColumnsToRender = _useGridColumnHeaders.getColumnsToRender,
31
+ getRootProps = _useGridColumnHeaders.getRootProps,
32
+ otherProps = _objectWithoutProperties(_useGridColumnHeaders, _excluded);
33
+ var headerFiltersRef = React.useRef(null);
34
+ apiRef.current.register('private', {
35
+ headerFiltersElementRef: headerFiltersRef
36
+ });
37
+ var headerFilterMenuRef = React.useRef(null);
38
+ var rootProps = useGridRootProps();
39
+ var disableHeaderFiltering = !rootProps.unstable_headerFilters;
40
+ var headerHeight = Math.floor(rootProps.columnHeaderHeight * props.densityFactor);
41
+ var filterModel = useGridSelector(apiRef, gridFilterModelSelector);
42
+ var totalHeaderHeight = getTotalHeaderHeight(apiRef, rootProps.columnHeaderHeight) + (disableHeaderFiltering ? 0 : headerHeight);
43
+ var columnHeaderFilterFocus = useGridSelector(apiRef, unstable_gridFocusColumnHeaderFilterSelector);
44
+ var getColumnFilters = function getColumnFilters(params) {
45
+ var other = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
46
+ if (disableHeaderFiltering) {
47
+ return null;
48
+ }
49
+ var columnsToRender = getColumnsToRender(params);
50
+ if (columnsToRender == null) {
51
+ return null;
52
+ }
53
+ var renderedColumns = columnsToRender.renderedColumns,
54
+ firstColumnToRender = columnsToRender.firstColumnToRender;
55
+ var filters = [];
56
+ var _loop = function _loop() {
57
+ var _colDef$filterOperato, _colDef$filterOperato2, _filterModel$items$fi, _rootProps$slotProps;
58
+ var colDef = renderedColumns[i];
59
+ var columnIndex = firstColumnToRender + i;
60
+ var hasFocus = (columnHeaderFilterFocus == null ? void 0 : columnHeaderFilterFocus.field) === colDef.field;
61
+ var isFirstColumn = columnIndex === 0;
62
+ var tabIndexField = columnHeaderFilterTabIndexState == null ? void 0 : columnHeaderFilterTabIndexState.field;
63
+ var tabIndex = tabIndexField === colDef.field || isFirstColumn && !props.hasOtherElementInTabSequence ? 0 : -1;
64
+ var headerFilterComponent;
65
+ if (colDef.renderHeaderFilter) {
66
+ headerFilterComponent = colDef.renderHeaderFilter(apiRef.current.getColumnHeaderParams(colDef.field));
67
+ }
68
+ var headerClassName = typeof colDef.headerClassName === 'function' ? colDef.headerClassName({
69
+ field: colDef.field,
70
+ colDef: colDef
71
+ }) : colDef.headerClassName;
72
+
73
+ // TODO: Support for `isAnyOf` operator
74
+ var filterOperators = (_colDef$filterOperato = (_colDef$filterOperato2 = colDef.filterOperators) == null ? void 0 : _colDef$filterOperato2.filter(function (operator) {
75
+ return operator.value !== 'isAnyOf';
76
+ })) != null ? _colDef$filterOperato : [];
77
+ var item = (_filterModel$items$fi = filterModel == null ? void 0 : filterModel.items.find(function (it) {
78
+ return it.field === colDef.field && it.operator !== 'isAnyOf';
79
+ })) != null ? _filterModel$items$fi : getGridFilter(colDef);
80
+ filters.push( /*#__PURE__*/_jsx(rootProps.slots.headerFilterCell, _extends({
81
+ colIndex: columnIndex,
82
+ height: headerHeight,
83
+ width: colDef.computedWidth,
84
+ colDef: colDef,
85
+ hasFocus: hasFocus,
86
+ tabIndex: tabIndex,
87
+ headerFilterMenuRef: headerFilterMenuRef,
88
+ headerFilterComponent: headerFilterComponent,
89
+ headerClassName: headerClassName,
90
+ filterOperators: filterOperators,
91
+ "data-field": colDef.field,
92
+ item: item
93
+ }, (_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.headerFilterCell, other), "".concat(colDef.field, "-filter")));
94
+ };
95
+ for (var i = 0; i < renderedColumns.length; i += 1) {
96
+ _loop();
97
+ }
98
+ return /*#__PURE__*/_jsx(GridHeaderFilterRow, {
99
+ ref: headerFiltersRef,
100
+ ownerState: rootProps,
101
+ role: "row",
102
+ "aria-rowindex": headerGroupingMaxDepth + 2,
103
+ children: filters
104
+ });
105
+ };
106
+ var rootStyle = {
107
+ minHeight: totalHeaderHeight,
108
+ maxHeight: totalHeaderHeight,
109
+ lineHeight: "".concat(headerHeight, "px")
110
+ };
111
+ return _extends({}, otherProps, {
112
+ getColumnFilters: getColumnFilters,
113
+ getRootProps: disableHeaderFiltering ? getRootProps : function () {
114
+ var other = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
115
+ return _extends({
116
+ style: rootStyle
117
+ }, other);
118
+ }
119
+ });
120
+ };
@@ -90,6 +90,7 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
90
90
  var logger = useGridLogger(apiRef, 'useGridColumnResize');
91
91
  var colDefRef = React.useRef();
92
92
  var colElementRef = React.useRef();
93
+ var headerFilterElementRef = React.useRef();
93
94
  var colGroupingElementRef = React.useRef();
94
95
  var colCellElementsRef = React.useRef();
95
96
  var theme = useTheme();
@@ -111,6 +112,12 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
111
112
  colElementRef.current.style.width = "".concat(newWidth, "px");
112
113
  colElementRef.current.style.minWidth = "".concat(newWidth, "px");
113
114
  colElementRef.current.style.maxWidth = "".concat(newWidth, "px");
115
+ var headerFilterElement = headerFilterElementRef.current;
116
+ if (headerFilterElement) {
117
+ headerFilterElement.style.width = "".concat(newWidth, "px");
118
+ headerFilterElement.style.minWidth = "".concat(newWidth, "px");
119
+ headerFilterElement.style.maxWidth = "".concat(newWidth, "px");
120
+ }
114
121
  [].concat(_toConsumableArray(colCellElementsRef.current), _toConsumableArray(colGroupingElementRef.current)).forEach(function (element) {
115
122
  var div = element;
116
123
  var finalWidth;
@@ -161,7 +168,7 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
161
168
  apiRef.current.publishEvent('columnResize', params, nativeEvent);
162
169
  });
163
170
  var handleColumnResizeMouseDown = useEventCallback(function (_ref, event) {
164
- var _apiRef$current$colum, _apiRef$current$colum2;
171
+ var _apiRef$current$colum, _apiRef$current$heade, _apiRef$current$colum2;
165
172
  var colDef = _ref.colDef;
166
173
  // Only handle left clicks
167
174
  if (event.button !== 0) {
@@ -181,6 +188,10 @@ export var useGridColumnResize = function useGridColumnResize(apiRef, props) {
181
188
  }, event);
182
189
  colDefRef.current = colDef;
183
190
  colElementRef.current = (_apiRef$current$colum = apiRef.current.columnHeadersContainerElementRef) == null ? void 0 : _apiRef$current$colum.current.querySelector("[data-field=\"".concat(colDef.field, "\"]"));
191
+ var headerFilterRowElement = (_apiRef$current$heade = apiRef.current.headerFiltersElementRef) == null ? void 0 : _apiRef$current$heade.current;
192
+ if (headerFilterRowElement) {
193
+ headerFilterElementRef.current = headerFilterRowElement.querySelector("[data-field=\"".concat(colDef.field, "\"]"));
194
+ }
184
195
  colGroupingElementRef.current = findGroupHeaderElementsFromField((_apiRef$current$colum2 = apiRef.current.columnHeadersContainerElementRef) == null ? void 0 : _apiRef$current$colum2.current, colDef.field);
185
196
  colCellElementsRef.current = findGridCellElementsFromCol(colElementRef.current, apiRef.current);
186
197
  var doc = ownerDocument(apiRef.current.rootElementRef.current);
@@ -28,6 +28,7 @@ export function addPinnedRow(_ref) {
28
28
  isAutoGenerated: isAutoGenerated
29
29
  };
30
30
  insertNodeInTree({
31
+ previousTree: null,
31
32
  node: node,
32
33
  tree: tree,
33
34
  treeDepths: treeDepths
@@ -91,6 +91,7 @@ export var useGridTreeDataPreProcessors = function useGridTreeDataPreProcessors(
91
91
  };
92
92
  if (params.updates.type === 'full') {
93
93
  return createRowTree({
94
+ previousTree: params.previousTree,
94
95
  nodes: params.updates.rows.map(getRowTreeBuilderNode),
95
96
  defaultGroupingExpansionDepth: props.defaultGroupingExpansionDepth,
96
97
  isGroupExpandedByDefault: props.isGroupExpandedByDefault,
package/legacy/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
@@ -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';
@@ -14,4 +14,7 @@ export var GridPushPinLeftIcon = createSvgIcon( /*#__PURE__*/_jsx("g", {
14
14
  d: "M16,9V4l1,0c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H7C6.45,2,6,2.45,6,3v0 c0,0.55,0.45,1,1,1l1,0v5c0,1.66-1.34,3-3,3h0v2h5.97v7l1,1l1-1v-7H19v-2h0C17.34,12,16,10.66,16,9z",
15
15
  fillRule: "evenodd"
16
16
  })
17
- }), 'PushPinLeft');
17
+ }), 'PushPinLeft');
18
+ export var GridHighlightOffIcon = createSvgIcon( /*#__PURE__*/_jsx("path", {
19
+ d: "M14.59 8L12 10.59 9.41 8 8 9.41 10.59 12 8 14.59 9.41 16 12 13.41 14.59 16 16 14.59 13.41 12 16 9.41 14.59 8zM12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"
20
+ }), 'HighlightOff');
@@ -1,8 +1,9 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
- import { GridPushPinRightIcon, GridPushPinLeftIcon } from './icons';
2
+ import { GridPushPinRightIcon, GridPushPinLeftIcon, GridHighlightOffIcon } from './icons';
3
3
  var iconSlots = {
4
4
  ColumnMenuPinRightIcon: GridPushPinRightIcon,
5
- ColumnMenuPinLeftIcon: GridPushPinLeftIcon
5
+ ColumnMenuPinLeftIcon: GridPushPinLeftIcon,
6
+ HeaderFilterClearIcon: GridHighlightOffIcon
6
7
  };
7
8
  var materialSlots = _extends({}, iconSlots);
8
9
  export default materialSlots;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { ponyfillGlobal } from '@mui/utils';
2
2
  export var getReleaseInfo = function getReleaseInfo() {
3
- var releaseInfo = "MTY4Mzg0MjQwMDAwMA==";
3
+ var releaseInfo = "MTY4NDQ0MzYwMDAwMA==";
4
4
  if (process.env.NODE_ENV !== 'production') {
5
5
  // A simple hack to set the value in the test environment (has no build step).
6
6
  // eslint-disable-next-line no-useless-concat
@@ -14,6 +14,7 @@ export var createRowTree = function createRowTree(params) {
14
14
  dataRowIds.push(node.id);
15
15
  insertDataRowInTree({
16
16
  tree: tree,
17
+ previousTree: params.previousTree,
17
18
  id: node.id,
18
19
  path: node.path,
19
20
  onDuplicatePath: params.onDuplicatePath,
@@ -10,6 +10,7 @@ export var insertDataRowInTree = function insertDataRowInTree(_ref) {
10
10
  var id = _ref.id,
11
11
  path = _ref.path,
12
12
  updatedGroupsManager = _ref.updatedGroupsManager,
13
+ previousTree = _ref.previousTree,
13
14
  tree = _ref.tree,
14
15
  treeDepths = _ref.treeDepths,
15
16
  onDuplicatePath = _ref.onDuplicatePath,
@@ -41,6 +42,7 @@ export var insertDataRowInTree = function insertDataRowInTree(_ref) {
41
42
  updatedGroupsManager == null ? void 0 : updatedGroupsManager.addAction(parentNodeId, 'insertChildren');
42
43
  insertNodeInTree({
43
44
  node: leafNode,
45
+ previousTree: previousTree,
44
46
  tree: tree,
45
47
  treeDepths: treeDepths
46
48
  });
@@ -54,6 +56,7 @@ export var insertDataRowInTree = function insertDataRowInTree(_ref) {
54
56
  updatedGroupsManager == null ? void 0 : updatedGroupsManager.addAction(parentNodeId, 'insertChildren');
55
57
  updateGroupNodeIdAndAutoGenerated({
56
58
  tree: tree,
59
+ previousTree: previousTree,
57
60
  treeDepths: treeDepths,
58
61
  node: existingNodeWithPartialPath,
59
62
  updatedNode: {
@@ -93,6 +96,7 @@ export var insertDataRowInTree = function insertDataRowInTree(_ref) {
93
96
  defaultGroupingExpansionDepth: defaultGroupingExpansionDepth,
94
97
  isGroupExpandedByDefault: isGroupExpandedByDefault
95
98
  }),
99
+ previousTree: previousTree,
96
100
  tree: tree,
97
101
  treeDepths: treeDepths
98
102
  });