@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
package/CHANGELOG.md CHANGED
@@ -3,6 +3,62 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## v6.5.0
7
+
8
+ _May 19, 2023_
9
+
10
+ We'd like to offer a big thanks to the 10 contributors who made this release possible. Here are some highlights ✨:
11
+
12
+ - 💫 Introduce filtering on column headers for `DataGridPro` and `DataGridPremium`:
13
+
14
+ https://github.com/mui/mui-x/assets/12609561/c4c2bfec-59cf-4cab-932d-dc1983081de9
15
+
16
+ See [the documentation](https://mui.com/x/react-data-grid/filtering/#header-filters) for more information
17
+
18
+ - 🌍 Improve Hebrew (he-IL) and Czech (cs-CZ) locales
19
+ - 📝 Support for editing on pinned rows
20
+ - 🚀 Performance improvements
21
+ - 🐞 Bugfixes
22
+ - 📚 Documentation improvements
23
+
24
+ ### `@mui/x-data-grid@6.5.0` / `@mui/x-data-grid-pro@6.5.0` / `@mui/x-data-grid-premium@6.5.0`
25
+
26
+ #### Changes
27
+
28
+ - [DataGrid] Fix grid size calculation when `.MuiDataGrid-main` has border (#8882) @cherniavskii
29
+ - [DataGridPro] Filtering on Column Header (#7760) @MBilalShafi
30
+ - [DataGridPro] Improve `treeData` and `rowGrouping` performance (#8990) @MBilalShafi
31
+ - [DataGridPro] Support pinned rows editing (#8921) @cherniavskii
32
+ - [l10n] Improve Hebrew (he-IL) locale (#8943) @Itzik-Tech
33
+ - [l10n] Improve Czech (cs-CZ) locale (#8829) @harastaivan
34
+ - [l10n] Improve Czech (cs-CZ) locale (#8956) @davidzemancz
35
+
36
+ ### `@mui/x-date-pickers@6.5.0` / `@mui/x-date-pickers-pro@6.5.0`
37
+
38
+ #### Changes
39
+
40
+ - [fields] Select the first section instead of last when clicking right of content (#9005) @noraleonte
41
+ - [fields] Refactor prop drilling in fields (#8660) @flaviendelangle
42
+ - [pickers] Allow to render the months before `currentMonth` instead of the one after (#8592) @flaviendelangle
43
+ - [pickers] Fix view management when `openTo` or `views` is modified (#8997) @alexfauquette
44
+ - [l10n] Improve Czech (cs-CZ) locale (#8829) @harastaivan
45
+
46
+ ### Docs
47
+
48
+ - [docs] Clarify what Controlled / Uncontrolled means (#8926) @flaviendelangle
49
+ - [docs] Fix docs using wrong service worker (#9030) @cherniavskii
50
+ - [docs] Remove prop-types from JS demos (#9008) @flaviendelangle
51
+
52
+ ### Core
53
+
54
+ - [core] Add assertion about checkbox rerenders (#8974) @oliviertassinari
55
+ - [core] Allow selecting a section by type in field tests (#9009) @flaviendelangle
56
+ - [core] Fix `yarn.lock` (#8988) @flaviendelangle
57
+ - [core] Fix flacky adapter test (#8995) @flaviendelangle
58
+ - [charts] Clean the axis rendering (#8948) @alexfauquette
59
+ - [DataGrid] Memoize root props for better performance (#8942) @romgrk
60
+ - [test] Skip flaky unit tests in JSDOM (#8994) @cherniavskii
61
+
6
62
  ## v6.4.0
7
63
 
8
64
  _May 12, 2023_
@@ -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 const useDataGridProComponent = (inputApiRef, props) => {
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 const useDataGridProComponent = (inputApiRef, props) => {
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,8 @@
1
- import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
2
1
  import _extends from "@babel/runtime/helpers/esm/extends";
3
- const _excluded = ["components", "componentsProps"];
4
2
  import * as React from 'react';
5
3
  import { useThemeProps } from '@mui/material/styles';
6
4
  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';
5
+ import { computeSlots, uncapitalizeObjectKeys, useProps } from '@mui/x-data-grid/internals';
8
6
  import { DATA_GRID_PRO_DEFAULT_SLOTS_COMPONENTS } from '../constants/dataGridProDefaultSlotsComponents';
9
7
 
10
8
  /**
@@ -20,19 +18,15 @@ export const DATA_GRID_PRO_PROPS_DEFAULT_VALUES = _extends({}, DATA_GRID_PROPS_D
20
18
  disableChildrenSorting: false,
21
19
  rowReordering: false,
22
20
  rowsLoadingMode: 'client',
23
- getDetailPanelHeight: () => 500
21
+ getDetailPanelHeight: () => 500,
22
+ unstable_headerFilters: false
24
23
  });
25
24
  const defaultSlots = uncapitalizeObjectKeys(DATA_GRID_PRO_DEFAULT_SLOTS_COMPONENTS);
26
25
  export const useDataGridProProps = inProps => {
27
- const _useThemeProps = useThemeProps({
28
- props: inProps,
29
- name: 'MuiDataGrid'
30
- }),
31
- {
32
- components,
33
- componentsProps
34
- } = _useThemeProps,
35
- themedProps = _objectWithoutPropertiesLoose(_useThemeProps, _excluded);
26
+ const [components, componentsProps, themedProps] = useProps(useThemeProps({
27
+ props: inProps,
28
+ name: 'MuiDataGrid'
29
+ }));
36
30
  const localeText = React.useMemo(() => _extends({}, GRID_DEFAULT_LOCALE_TEXT, themedProps.localeText), [themedProps.localeText]);
37
31
  const slots = React.useMemo(() => computeSlots({
38
32
  defaultSlots,
@@ -6,11 +6,12 @@ import PropTypes from 'prop-types';
6
6
  import { unstable_composeClasses as composeClasses, unstable_useEventCallback as useEventCallback } from '@mui/utils';
7
7
  import { styled, alpha, useTheme } from '@mui/material/styles';
8
8
  import { getDataGridUtilityClass, gridClasses, useGridApiEventHandler, GridColumnHeaderSeparatorSides } from '@mui/x-data-grid';
9
- import { GridBaseColumnHeaders, GridColumnHeadersInner, useGridColumnHeaders } from '@mui/x-data-grid/internals';
9
+ import { GridBaseColumnHeaders, GridColumnHeadersInner } from '@mui/x-data-grid/internals';
10
10
  import { useGridRootProps } from '../hooks/utils/useGridRootProps';
11
11
  import { useGridApiContext } from '../hooks/utils/useGridApiContext';
12
12
  import { GridPinnedPosition } from '../hooks/features/columnPinning';
13
13
  import { filterColumns } from './DataGridProVirtualScroller';
14
+ import { useGridColumnHeaders } from '../hooks/features/columnHeaders/useGridColumnHeaders';
14
15
  import { jsxs as _jsxs } from "react/jsx-runtime";
15
16
  const useUtilityClasses = ownerState => {
16
17
  const {
@@ -122,6 +123,7 @@ const GridColumnHeaders = /*#__PURE__*/React.forwardRef(function GridColumnHeade
122
123
  getRootProps,
123
124
  getInnerProps,
124
125
  getColumnHeaders,
126
+ getColumnFilters,
125
127
  getColumnGroupHeaders
126
128
  } = useGridColumnHeaders({
127
129
  innerRef,
@@ -180,6 +182,10 @@ const GridColumnHeaders = /*#__PURE__*/React.forwardRef(function GridColumnHeade
180
182
  maxLastColumn: leftRenderContext.lastColumnIndex
181
183
  }, {
182
184
  disableReorder: true
185
+ }), getColumnFilters({
186
+ renderContext: leftRenderContext,
187
+ minFirstColumn: leftRenderContext.firstColumnIndex,
188
+ maxLastColumn: leftRenderContext.lastColumnIndex
183
189
  })]
184
190
  })), /*#__PURE__*/_jsxs(GridColumnHeadersInner, _extends({
185
191
  isDragging: isDragging
@@ -192,6 +198,10 @@ const GridColumnHeaders = /*#__PURE__*/React.forwardRef(function GridColumnHeade
192
198
  renderContext,
193
199
  minFirstColumn: leftPinnedColumns.length,
194
200
  maxLastColumn: visibleColumnFields.length - rightPinnedColumns.length
201
+ }), getColumnFilters({
202
+ renderContext,
203
+ minFirstColumn: leftPinnedColumns.length,
204
+ maxLastColumn: visibleColumnFields.length - rightPinnedColumns.length
195
205
  })]
196
206
  })), rightRenderContext && /*#__PURE__*/_jsxs(GridColumnHeadersPinnedColumnHeaders, _extends({
197
207
  ownerState: _extends({}, ownerState, {
@@ -214,6 +224,10 @@ const GridColumnHeaders = /*#__PURE__*/React.forwardRef(function GridColumnHeade
214
224
  }, {
215
225
  disableReorder: true,
216
226
  separatorSide: GridColumnHeaderSeparatorSides.Left
227
+ }), getColumnFilters({
228
+ renderContext: rightRenderContext,
229
+ minFirstColumn: rightRenderContext.firstColumnIndex,
230
+ maxLastColumn: rightRenderContext.lastColumnIndex
217
231
  })]
218
232
  }))]
219
233
  }));
@@ -4,7 +4,7 @@ const _excluded = ["rowId", "height", "style"];
4
4
  import * as React from 'react';
5
5
  import Box from '@mui/material/Box';
6
6
  import { styled } from '@mui/material/styles';
7
- import { useGridRootProps } from '@mui/x-data-grid';
7
+ import { useGridRootProps } from '../hooks/utils/useGridRootProps';
8
8
  import { useGridPrivateApiContext } from '../hooks/utils/useGridPrivateApiContext';
9
9
  import { jsx as _jsx } from "react/jsx-runtime";
10
10
  const DetailPanel = styled(Box, {
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ import { GridFilterItem, GridFilterOperator, GridColDef } from '@mui/x-data-grid';
3
+ declare function GridHeaderFilterAdornment(props: {
4
+ operators: GridFilterOperator<any, any, any>[];
5
+ field: GridColDef['field'];
6
+ item: GridFilterItem;
7
+ applyFilterChanges: (item: GridFilterItem) => void;
8
+ headerFilterMenuRef: React.MutableRefObject<HTMLButtonElement | null>;
9
+ buttonRef: React.Ref<HTMLButtonElement>;
10
+ }): JSX.Element | null;
11
+ declare namespace GridHeaderFilterAdornment {
12
+ var propTypes: any;
13
+ }
14
+ export { GridHeaderFilterAdornment };
@@ -0,0 +1,99 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _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
+ const 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
+ const {
21
+ operators,
22
+ item,
23
+ field,
24
+ buttonRef,
25
+ headerFilterMenuRef
26
+ } = props,
27
+ others = _objectWithoutPropertiesLoose(props, _excluded);
28
+ const buttonId = useId();
29
+ const menuId = useId();
30
+ const rootProps = useGridRootProps();
31
+ const apiRef = useGridApiContext();
32
+ const open = Boolean(unstable_gridHeaderFilteringMenuSelector(apiRef) === field && headerFilterMenuRef.current);
33
+ const handleClick = event => {
34
+ headerFilterMenuRef.current = event.currentTarget;
35
+ apiRef.current.showHeaderFilterMenu(field);
36
+ };
37
+ if (!rootProps.slots.headerFilterMenu) {
38
+ return null;
39
+ }
40
+ return /*#__PURE__*/_jsxs(React.Fragment, {
41
+ children: [/*#__PURE__*/_jsx(rootProps.slots.baseInputAdornment, {
42
+ position: "start",
43
+ children: /*#__PURE__*/_jsx(rootProps.slots.baseIconButton, _extends({
44
+ id: buttonId,
45
+ ref: buttonRef,
46
+ "aria-label": apiRef.current.getLocaleText('filterPanelOperator'),
47
+ title: apiRef.current.getLocaleText('filterPanelOperator'),
48
+ "aria-controls": menuId,
49
+ "aria-expanded": open ? 'true' : undefined,
50
+ "aria-haspopup": "true",
51
+ tabIndex: -1,
52
+ size: "small",
53
+ onClick: handleClick,
54
+ sx: sx
55
+ }, (_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.baseIconButton, {
56
+ children: (_OPERATOR_SYMBOL_MAPP = OPERATOR_SYMBOL_MAPPING[item == null ? void 0 : item.operator]) != null ? _OPERATOR_SYMBOL_MAPP : '='
57
+ }))
58
+ }), /*#__PURE__*/_jsx(rootProps.slots.headerFilterMenu, _extends({
59
+ field: field,
60
+ open: open,
61
+ item: item,
62
+ targetRef: headerFilterMenuRef,
63
+ operators: operators,
64
+ labelledBy: buttonId,
65
+ id: menuId
66
+ }, others))]
67
+ });
68
+ }
69
+ process.env.NODE_ENV !== "production" ? GridHeaderFilterAdornment.propTypes = {
70
+ // ----------------------------- Warning --------------------------------
71
+ // | These PropTypes are generated from the TypeScript type definitions |
72
+ // | To update them edit the TypeScript types and run "yarn proptypes" |
73
+ // ----------------------------------------------------------------------
74
+ applyFilterChanges: PropTypes.func.isRequired,
75
+ buttonRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({
76
+ current: PropTypes.object
77
+ })]),
78
+ field: PropTypes.string.isRequired,
79
+ headerFilterMenuRef: PropTypes.shape({
80
+ current: PropTypes.object
81
+ }).isRequired,
82
+ item: PropTypes.shape({
83
+ field: PropTypes.string.isRequired,
84
+ id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
85
+ operator: PropTypes.string.isRequired,
86
+ value: PropTypes.any
87
+ }).isRequired,
88
+ operators: PropTypes.arrayOf(PropTypes.shape({
89
+ getApplyFilterFn: PropTypes.func.isRequired,
90
+ getValueAsString: PropTypes.func,
91
+ headerLabel: PropTypes.string,
92
+ InputComponent: PropTypes.elementType,
93
+ InputComponentProps: PropTypes.object,
94
+ label: PropTypes.string,
95
+ requiresFilterValue: PropTypes.bool,
96
+ value: PropTypes.string.isRequired
97
+ })).isRequired
98
+ } : void 0;
99
+ export { GridHeaderFilterAdornment };
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import { GridFilterItem, GridFilterOperator, GridColDef } from '@mui/x-data-grid';
3
+ import { GridStateColDef } from '@mui/x-data-grid/internals';
4
+ export interface GridHeaderFilterCellProps extends Pick<GridStateColDef, 'headerClassName'> {
5
+ colIndex: number;
6
+ height: number;
7
+ sortIndex?: number;
8
+ hasFocus?: boolean;
9
+ tabIndex: 0 | -1;
10
+ headerFilterComponent?: React.ReactNode;
11
+ filterOperators?: GridFilterOperator[];
12
+ width: number;
13
+ colDef: GridColDef;
14
+ headerFilterMenuRef: React.MutableRefObject<HTMLButtonElement | null>;
15
+ item: GridFilterItem;
16
+ showClearIcon?: boolean;
17
+ InputComponentProps: GridFilterOperator['InputComponentProps'];
18
+ }
19
+ declare const GridHeaderFilterCell: React.ForwardRefExoticComponent<GridHeaderFilterCellProps & React.RefAttributes<HTMLDivElement>>;
20
+ export { GridHeaderFilterCell };
@@ -0,0 +1,224 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
+ const _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
+ const useUtilityClasses = ownerState => {
16
+ const {
17
+ colDef,
18
+ classes,
19
+ showColumnVerticalBorder
20
+ } = ownerState;
21
+ const slots = {
22
+ root: ['columnHeader', colDef.headerAlign === 'left' && 'columnHeader--alignLeft', colDef.headerAlign === 'center' && 'columnHeader--alignCenter', colDef.headerAlign === 'right' && 'columnHeader--alignRight', 'withBorderColor', showColumnVerticalBorder && 'columnHeader--withRightBorder']
23
+ };
24
+ return composeClasses(slots, getDataGridUtilityClass, classes);
25
+ };
26
+ const GridHeaderFilterCell = /*#__PURE__*/React.forwardRef((props, ref) => {
27
+ var _filterOperators$find, _currentOperator$head, _colDef$headerName;
28
+ const {
29
+ colIndex,
30
+ height,
31
+ hasFocus,
32
+ headerFilterComponent,
33
+ filterOperators,
34
+ width,
35
+ headerClassName,
36
+ colDef,
37
+ item,
38
+ headerFilterMenuRef,
39
+ InputComponentProps,
40
+ showClearIcon = true
41
+ } = props,
42
+ other = _objectWithoutPropertiesLoose(props, _excluded);
43
+ const apiRef = useGridPrivateApiContext();
44
+ const columnFields = gridVisibleColumnFieldsSelector(apiRef);
45
+ const rootProps = useGridRootProps();
46
+ const cellRef = React.useRef(null);
47
+ const handleRef = useForkRef(ref, cellRef);
48
+ const inputRef = React.useRef(null);
49
+ const buttonRef = React.useRef(null);
50
+ const isEditing = unstable_gridHeaderFilteringEditFieldSelector(apiRef) === colDef.field;
51
+ const isMenuOpen = unstable_gridHeaderFilteringMenuSelector(apiRef) === colDef.field;
52
+ const currentOperator = filterOperators[0];
53
+ const InputComponent = colDef.filterable ? currentOperator.InputComponent : null;
54
+ const applyFilterChanges = React.useCallback(updatedItem => {
55
+ if (item.value && !updatedItem.value) {
56
+ apiRef.current.deleteFilterItem(updatedItem);
57
+ return;
58
+ }
59
+ apiRef.current.upsertFilterItem(updatedItem);
60
+ }, [apiRef, item]);
61
+ const clearFilterItem = React.useCallback(() => {
62
+ apiRef.current.deleteFilterItem(item);
63
+ }, [apiRef, item]);
64
+ React.useLayoutEffect(() => {
65
+ if (hasFocus && !isMenuOpen) {
66
+ let focusableElement = cellRef.current.querySelector('[tabindex="0"]');
67
+ if (isEditing && InputComponent) {
68
+ focusableElement = inputRef.current;
69
+ }
70
+ const elementToFocus = focusableElement || cellRef.current;
71
+ elementToFocus == null ? void 0 : elementToFocus.focus();
72
+ apiRef.current.columnHeadersContainerElementRef.current.scrollLeft = 0;
73
+ }
74
+ }, [InputComponent, apiRef, hasFocus, isEditing, isMenuOpen]);
75
+ const onKeyDown = React.useCallback(event => {
76
+ if (isMenuOpen || isNavigationKey(event.key)) {
77
+ return;
78
+ }
79
+ switch (event.key) {
80
+ case 'Escape':
81
+ if (isEditing) {
82
+ apiRef.current.stopHeaderFilterEditMode();
83
+ }
84
+ break;
85
+ case 'Enter':
86
+ if (isEditing) {
87
+ apiRef.current.stopHeaderFilterEditMode();
88
+ break;
89
+ }
90
+ if (event.metaKey || event.ctrlKey) {
91
+ headerFilterMenuRef.current = buttonRef.current;
92
+ apiRef.current.showHeaderFilterMenu(colDef.field);
93
+ break;
94
+ }
95
+ apiRef.current.startHeaderFilterEditMode(colDef.field);
96
+ break;
97
+ case 'Tab':
98
+ {
99
+ if (isEditing) {
100
+ var _columnFields;
101
+ const fieldToFocus = (_columnFields = columnFields[colIndex + (event.shiftKey ? -1 : 1)]) != null ? _columnFields : null;
102
+ if (fieldToFocus) {
103
+ apiRef.current.startHeaderFilterEditMode(fieldToFocus);
104
+ apiRef.current.setColumnHeaderFilterFocus(fieldToFocus, event);
105
+ }
106
+ }
107
+ break;
108
+ }
109
+ default:
110
+ if (isEditing || event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {
111
+ break;
112
+ }
113
+ apiRef.current.startHeaderFilterEditMode(colDef.field);
114
+ break;
115
+ }
116
+ }, [apiRef, colDef.field, colIndex, columnFields, headerFilterMenuRef, isEditing, isMenuOpen]);
117
+ const publish = React.useCallback((eventName, propHandler) => event => {
118
+ apiRef.current.publishEvent(eventName, apiRef.current.getColumnHeaderParams(colDef.field), event);
119
+ if (propHandler) {
120
+ propHandler(event);
121
+ }
122
+ }, [apiRef, colDef.field]);
123
+ const onMouseDown = React.useCallback(event => {
124
+ if (!hasFocus) {
125
+ if (inputRef.current) {
126
+ inputRef.current.focus();
127
+ }
128
+ apiRef.current.setColumnHeaderFilterFocus(colDef.field, event);
129
+ }
130
+ }, [apiRef, colDef.field, hasFocus]);
131
+ const mouseEventsHandlers = React.useMemo(() => ({
132
+ onKeyDown: publish('headerFilterKeyDown', onKeyDown),
133
+ onClick: publish('headerFilterClick'),
134
+ onMouseDown: publish('headerFilterMouseDown', onMouseDown)
135
+ }), [onMouseDown, onKeyDown, publish]);
136
+ const ownerState = _extends({}, rootProps, {
137
+ colDef
138
+ });
139
+ const classes = useUtilityClasses(ownerState);
140
+ const isNoInputOperator = (filterOperators == null ? void 0 : (_filterOperators$find = filterOperators.find(({
141
+ value
142
+ }) => item.operator === value)) == null ? void 0 : _filterOperators$find.requiresFilterValue) === false;
143
+ const isApplied = Boolean(item == null ? void 0 : item.value) || isNoInputOperator;
144
+ const label = (_currentOperator$head = currentOperator.headerLabel) != null ? _currentOperator$head : apiRef.current.getLocaleText(`headerFilterOperator${capitalize(item.operator)}`);
145
+ const isFilterActive = isApplied || hasFocus;
146
+ return /*#__PURE__*/_jsxs("div", _extends({
147
+ className: clsx(classes.root, headerClassName),
148
+ ref: handleRef,
149
+ style: {
150
+ height,
151
+ width,
152
+ minWidth: width,
153
+ maxWidth: width
154
+ },
155
+ role: "columnheader",
156
+ "aria-colindex": colIndex + 1,
157
+ "aria-label": headerFilterComponent == null ? (_colDef$headerName = colDef.headerName) != null ? _colDef$headerName : colDef.field : undefined
158
+ }, other, mouseEventsHandlers, {
159
+ children: [headerFilterComponent, InputComponent && headerFilterComponent === undefined ? /*#__PURE__*/_jsx(InputComponent, _extends({
160
+ apiRef: apiRef,
161
+ item: item,
162
+ inputRef: inputRef,
163
+ applyValue: applyFilterChanges,
164
+ onFocus: () => apiRef.current.startHeaderFilterEditMode(colDef.field),
165
+ onBlur: () => apiRef.current.stopHeaderFilterEditMode(),
166
+ placeholder: apiRef.current.getLocaleText('columnMenuFilter'),
167
+ label: isFilterActive ? capitalize(label) : ' ',
168
+ isFilterActive: isFilterActive,
169
+ headerFilterMenu: /*#__PURE__*/_jsx(GridHeaderFilterAdornment, {
170
+ operators: filterOperators,
171
+ item: item,
172
+ field: colDef.field,
173
+ applyFilterChanges: applyFilterChanges,
174
+ headerFilterMenuRef: headerFilterMenuRef,
175
+ buttonRef: buttonRef
176
+ }),
177
+ clearButton: showClearIcon && isApplied ? /*#__PURE__*/_jsx(GridHeaderFilterClearButton, {
178
+ onClick: clearFilterItem
179
+ }) : null,
180
+ disabled: isNoInputOperator,
181
+ tabIndex: -1
182
+ }, currentOperator == null ? void 0 : currentOperator.InputComponentProps, InputComponentProps)) : null]
183
+ }));
184
+ });
185
+ process.env.NODE_ENV !== "production" ? GridHeaderFilterCell.propTypes = {
186
+ // ----------------------------- Warning --------------------------------
187
+ // | These PropTypes are generated from the TypeScript type definitions |
188
+ // | To update them edit the TypeScript types and run "yarn proptypes" |
189
+ // ----------------------------------------------------------------------
190
+ colDef: PropTypes.object.isRequired,
191
+ colIndex: PropTypes.number.isRequired,
192
+ filterOperators: PropTypes.arrayOf(PropTypes.shape({
193
+ getApplyFilterFn: PropTypes.func.isRequired,
194
+ getValueAsString: PropTypes.func,
195
+ headerLabel: PropTypes.string,
196
+ InputComponent: PropTypes.elementType,
197
+ InputComponentProps: PropTypes.object,
198
+ label: PropTypes.string,
199
+ requiresFilterValue: PropTypes.bool,
200
+ value: PropTypes.string.isRequired
201
+ })),
202
+ hasFocus: PropTypes.bool,
203
+ /**
204
+ * Class name that will be added in the column header cell.
205
+ */
206
+ headerClassName: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
207
+ headerFilterComponent: PropTypes.node,
208
+ headerFilterMenuRef: PropTypes.shape({
209
+ current: PropTypes.object
210
+ }).isRequired,
211
+ height: PropTypes.number.isRequired,
212
+ InputComponentProps: PropTypes.object,
213
+ item: PropTypes.shape({
214
+ field: PropTypes.string.isRequired,
215
+ id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
216
+ operator: PropTypes.string.isRequired,
217
+ value: PropTypes.any
218
+ }).isRequired,
219
+ showClearIcon: PropTypes.bool,
220
+ sortIndex: PropTypes.number,
221
+ tabIndex: PropTypes.oneOf([-1, 0]).isRequired,
222
+ width: PropTypes.number.isRequired
223
+ } : void 0;
224
+ export { GridHeaderFilterCell };
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ interface GridHeaderFilterClearIconProps {
3
+ onClick: () => void;
4
+ }
5
+ declare function GridHeaderFilterClearButton({ onClick }: GridHeaderFilterClearIconProps): JSX.Element;
6
+ export { GridHeaderFilterClearButton };
@@ -0,0 +1,25 @@
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
+ const sx = {
6
+ padding: '2px'
7
+ };
8
+ function GridHeaderFilterClearButton({
9
+ onClick
10
+ }) {
11
+ var _rootProps$slotProps;
12
+ const rootProps = useGridRootProps();
13
+ return /*#__PURE__*/_jsx(rootProps.slots.baseIconButton, _extends({
14
+ tabIndex: -1,
15
+ "aria-label": "Clear filter",
16
+ size: "small",
17
+ onClick: onClick,
18
+ sx: sx
19
+ }, (_rootProps$slotProps = rootProps.slotProps) == null ? void 0 : _rootProps$slotProps.baseIconButton, {
20
+ children: /*#__PURE__*/_jsx(rootProps.slots.headerFilterClearIcon, {
21
+ fontSize: "inherit"
22
+ })
23
+ }));
24
+ }
25
+ export { GridHeaderFilterClearButton };
@@ -0,0 +1,14 @@
1
+ import * as React from 'react';
2
+ import { GridFilterOperator, GridFilterItem, GridColDef } from '@mui/x-data-grid';
3
+ interface GridHeaderFilterMenuProps {
4
+ field: GridColDef['field'];
5
+ applyFilterChanges: (item: GridFilterItem) => void;
6
+ operators: GridFilterOperator<any, any, any>[];
7
+ item: GridFilterItem;
8
+ open: boolean;
9
+ id: string;
10
+ labelledBy: string;
11
+ targetRef: React.MutableRefObject<HTMLElement | null>;
12
+ }
13
+ declare function GridHeaderFilterMenu({ open, field, targetRef, applyFilterChanges, operators, item, id, labelledBy, }: GridHeaderFilterMenuProps): JSX.Element | null;
14
+ export { GridHeaderFilterMenu };