@mui/x-data-grid 6.9.2 → 6.10.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 (61) hide show
  1. package/CHANGELOG.md +232 -114
  2. package/DataGrid/DataGrid.js +1 -0
  3. package/components/toolbar/GridToolbarQuickFilter.d.ts +1 -1
  4. package/components/toolbar/GridToolbarQuickFilter.js +12 -9
  5. package/hooks/core/pipeProcessing/useGridPipeProcessing.js +4 -1
  6. package/hooks/core/useGridApiInitialization.d.ts +1 -0
  7. package/hooks/core/useGridApiInitialization.js +59 -36
  8. package/hooks/features/export/serializers/csvSerializer.d.ts +9 -6
  9. package/hooks/features/export/serializers/csvSerializer.js +78 -15
  10. package/hooks/features/export/useGridCsvExport.js +4 -3
  11. package/hooks/features/filter/gridFilterUtils.js +6 -5
  12. package/hooks/features/filter/useGridFilter.js +8 -0
  13. package/hooks/features/rows/gridRowsUtils.js +1 -1
  14. package/hooks/utils/useGridApiMethod.js +7 -23
  15. package/index.js +1 -1
  16. package/internals/index.d.ts +1 -0
  17. package/internals/index.js +1 -0
  18. package/legacy/DataGrid/DataGrid.js +1 -0
  19. package/legacy/components/toolbar/GridToolbarQuickFilter.js +12 -12
  20. package/legacy/hooks/core/pipeProcessing/useGridPipeProcessing.js +4 -1
  21. package/legacy/hooks/core/useGridApiInitialization.js +62 -39
  22. package/legacy/hooks/features/export/serializers/csvSerializer.js +84 -11
  23. package/legacy/hooks/features/export/useGridCsvExport.js +4 -3
  24. package/legacy/hooks/features/filter/gridFilterUtils.js +6 -5
  25. package/legacy/hooks/features/filter/useGridFilter.js +8 -0
  26. package/legacy/hooks/features/rows/gridRowsUtils.js +1 -1
  27. package/legacy/hooks/utils/useGridApiMethod.js +7 -25
  28. package/legacy/index.js +1 -1
  29. package/legacy/internals/index.js +1 -0
  30. package/legacy/locales/plPL.js +7 -7
  31. package/locales/plPL.js +7 -7
  32. package/models/events/gridEventLookup.d.ts +0 -1
  33. package/models/gridExport.d.ts +8 -1
  34. package/models/gridFilterModel.d.ts +5 -0
  35. package/modern/DataGrid/DataGrid.js +1 -0
  36. package/modern/components/toolbar/GridToolbarQuickFilter.js +12 -9
  37. package/modern/hooks/core/pipeProcessing/useGridPipeProcessing.js +4 -1
  38. package/modern/hooks/core/useGridApiInitialization.js +58 -36
  39. package/modern/hooks/features/export/serializers/csvSerializer.js +78 -15
  40. package/modern/hooks/features/export/useGridCsvExport.js +3 -2
  41. package/modern/hooks/features/filter/gridFilterUtils.js +3 -2
  42. package/modern/hooks/features/filter/useGridFilter.js +8 -0
  43. package/modern/hooks/features/rows/gridRowsUtils.js +1 -1
  44. package/modern/hooks/utils/useGridApiMethod.js +7 -23
  45. package/modern/index.js +1 -1
  46. package/modern/internals/index.js +1 -0
  47. package/modern/locales/plPL.js +7 -7
  48. package/node/DataGrid/DataGrid.js +1 -0
  49. package/node/components/toolbar/GridToolbarQuickFilter.js +12 -9
  50. package/node/hooks/core/pipeProcessing/useGridPipeProcessing.js +4 -1
  51. package/node/hooks/core/useGridApiInitialization.js +59 -36
  52. package/node/hooks/features/export/serializers/csvSerializer.js +78 -15
  53. package/node/hooks/features/export/useGridCsvExport.js +3 -2
  54. package/node/hooks/features/filter/gridFilterUtils.js +2 -1
  55. package/node/hooks/features/filter/useGridFilter.js +8 -0
  56. package/node/hooks/features/rows/gridRowsUtils.js +1 -1
  57. package/node/hooks/utils/useGridApiMethod.js +7 -23
  58. package/node/index.js +1 -1
  59. package/node/internals/index.js +8 -0
  60. package/node/locales/plPL.js +7 -7
  61. package/package.json +1 -1
@@ -1,64 +1,84 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
1
2
  import * as React from 'react';
2
3
  import { Store } from '../../utils/Store';
3
4
  import { useGridApiMethod } from '../utils/useGridApiMethod';
4
5
  import { GridSignature } from '../utils/useGridApiEventHandler';
5
6
  import { EventManager } from '../../utils/EventManager';
7
+ var SYMBOL_API_PRIVATE = Symbol('mui.api_private');
6
8
  var isSyntheticEvent = function isSyntheticEvent(event) {
7
9
  return event.isPropagationStopped !== undefined;
8
10
  };
11
+ export function unwrapPrivateAPI(publicApi) {
12
+ return publicApi[SYMBOL_API_PRIVATE];
13
+ }
9
14
  var globalId = 0;
10
- var wrapPublicApi = function wrapPublicApi(publicApi) {
11
- var privateOnlyApi = {};
12
- privateOnlyApi.getPublicApi = function () {
13
- return publicApi;
15
+ function createPrivateAPI(publicApiRef) {
16
+ var _publicApiRef$current;
17
+ var existingPrivateApi = (_publicApiRef$current = publicApiRef.current) == null ? void 0 : _publicApiRef$current[SYMBOL_API_PRIVATE];
18
+ if (existingPrivateApi) {
19
+ return existingPrivateApi;
20
+ }
21
+ var state = {};
22
+ var privateApi = {
23
+ state: state,
24
+ store: Store.create(state),
25
+ instanceId: {
26
+ id: globalId
27
+ }
28
+ };
29
+ globalId += 1;
30
+ privateApi.getPublicApi = function () {
31
+ return publicApiRef.current;
14
32
  };
15
- privateOnlyApi.register = function (visibility, methods) {
33
+ privateApi.register = function (visibility, methods) {
16
34
  Object.keys(methods).forEach(function (methodName) {
17
- if (visibility === 'public') {
18
- publicApi[methodName] = methods[methodName];
35
+ var method = methods[methodName];
36
+ var currentPrivateMethod = privateApi[methodName];
37
+ if ((currentPrivateMethod == null ? void 0 : currentPrivateMethod.spying) === true) {
38
+ currentPrivateMethod.target = method;
19
39
  } else {
20
- privateOnlyApi[methodName] = methods[methodName];
40
+ privateApi[methodName] = method;
41
+ }
42
+ if (visibility === 'public') {
43
+ var publicApi = publicApiRef.current;
44
+ var currentPublicMethod = publicApi[methodName];
45
+ if ((currentPublicMethod == null ? void 0 : currentPublicMethod.spying) === true) {
46
+ currentPublicMethod.target = method;
47
+ } else {
48
+ publicApi[methodName] = method;
49
+ }
21
50
  }
22
51
  });
23
52
  };
24
- var handler = {
25
- get: function get(obj, prop) {
26
- if (prop in obj) {
27
- return obj[prop];
28
- }
29
- return privateOnlyApi[prop];
53
+ privateApi.register('private', {
54
+ caches: {},
55
+ eventManager: new EventManager()
56
+ });
57
+ return privateApi;
58
+ }
59
+ function createPublicAPI(privateApiRef) {
60
+ var publicApi = _defineProperty({
61
+ get state() {
62
+ return privateApiRef.current.state;
63
+ },
64
+ get store() {
65
+ return privateApiRef.current.store;
30
66
  },
31
- set: function set(obj, prop, value) {
32
- obj[prop] = value;
33
- return true;
67
+ get instanceId() {
68
+ return privateApiRef.current.instanceId;
34
69
  }
35
- };
36
- return new Proxy(publicApi, handler);
37
- };
70
+ }, SYMBOL_API_PRIVATE, privateApiRef.current);
71
+ return publicApi;
72
+ }
38
73
  export function useGridApiInitialization(inputApiRef, props) {
39
74
  var publicApiRef = React.useRef();
40
- if (!publicApiRef.current) {
41
- var state = {};
42
- publicApiRef.current = {
43
- state: state,
44
- store: Store.create(state),
45
- instanceId: {
46
- id: globalId
47
- }
48
- };
49
- globalId += 1;
50
- }
51
75
  var privateApiRef = React.useRef();
52
76
  if (!privateApiRef.current) {
53
- privateApiRef.current = wrapPublicApi(publicApiRef.current);
54
- privateApiRef.current.register('private', {
55
- caches: {},
56
- eventManager: new EventManager()
57
- });
77
+ privateApiRef.current = createPrivateAPI(publicApiRef);
78
+ }
79
+ if (!publicApiRef.current) {
80
+ publicApiRef.current = createPublicAPI(privateApiRef);
58
81
  }
59
- React.useImperativeHandle(inputApiRef, function () {
60
- return publicApiRef.current;
61
- }, [publicApiRef]);
62
82
  var publishEvent = React.useCallback(function () {
63
83
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
64
84
  args[_key] = arguments[_key];
@@ -87,6 +107,9 @@ export function useGridApiInitialization(inputApiRef, props) {
87
107
  subscribeEvent: subscribeEvent,
88
108
  publishEvent: publishEvent
89
109
  }, 'public');
110
+ React.useImperativeHandle(inputApiRef, function () {
111
+ return publicApiRef.current;
112
+ }, [publicApiRef]);
90
113
  React.useEffect(function () {
91
114
  var api = privateApiRef.current;
92
115
  return function () {
@@ -1,3 +1,5 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/esm/createClass";
1
3
  import { GRID_CHECKBOX_SELECTION_COL_DEF } from '../../../../colDef';
2
4
  import { buildWarning } from '../../../../utils/warning';
3
5
  function sanitizeCellValue(value, delimiterCharacter) {
@@ -37,48 +39,119 @@ export var serializeCellValue = function serializeCellValue(cellParams, options)
37
39
  return sanitizeCellValue(value, delimiterCharacter);
38
40
  };
39
41
  var objectFormattedValueWarning = buildWarning(['MUI: When the value of a field is an object or a `renderCell` is provided, the CSV export might not display the value correctly.', 'You can provide a `valueFormatter` with a string representation to be used.']);
42
+ var CSVRow = /*#__PURE__*/function () {
43
+ function CSVRow(options) {
44
+ _classCallCheck(this, CSVRow);
45
+ this.options = void 0;
46
+ this.rowString = '';
47
+ this.isEmpty = true;
48
+ this.options = options;
49
+ }
50
+ _createClass(CSVRow, [{
51
+ key: "addValue",
52
+ value: function addValue(value) {
53
+ if (!this.isEmpty) {
54
+ this.rowString += this.options.delimiterCharacter;
55
+ }
56
+ if (value === null || value === undefined) {
57
+ this.rowString += '';
58
+ } else if (typeof this.options.sanitizeCellValue === 'function') {
59
+ this.rowString += this.options.sanitizeCellValue(value, this.options.delimiterCharacter);
60
+ } else {
61
+ this.rowString += value;
62
+ }
63
+ this.isEmpty = false;
64
+ }
65
+ }, {
66
+ key: "getRowString",
67
+ value: function getRowString() {
68
+ return this.rowString;
69
+ }
70
+ }]);
71
+ return CSVRow;
72
+ }();
40
73
  var serializeRow = function serializeRow(_ref) {
41
74
  var id = _ref.id,
42
75
  columns = _ref.columns,
43
76
  getCellParams = _ref.getCellParams,
44
77
  delimiterCharacter = _ref.delimiterCharacter,
45
78
  ignoreValueFormatter = _ref.ignoreValueFormatter;
46
- return columns.map(function (column) {
79
+ var row = new CSVRow({
80
+ delimiterCharacter: delimiterCharacter
81
+ });
82
+ columns.forEach(function (column) {
47
83
  var cellParams = getCellParams(id, column.field);
48
84
  if (process.env.NODE_ENV !== 'production') {
49
85
  if (String(cellParams.formattedValue) === '[object Object]') {
50
86
  objectFormattedValueWarning();
51
87
  }
52
88
  }
53
- return serializeCellValue(cellParams, {
89
+ row.addValue(serializeCellValue(cellParams, {
54
90
  delimiterCharacter: delimiterCharacter,
55
91
  ignoreValueFormatter: ignoreValueFormatter
56
- });
92
+ }));
57
93
  });
94
+ return row.getRowString();
58
95
  };
59
96
  export function buildCSV(options) {
60
97
  var columns = options.columns,
61
98
  rowIds = options.rowIds,
62
- getCellParams = options.getCellParams,
63
99
  delimiterCharacter = options.delimiterCharacter,
64
100
  includeHeaders = options.includeHeaders,
65
- ignoreValueFormatter = options.ignoreValueFormatter;
101
+ includeColumnGroupsHeaders = options.includeColumnGroupsHeaders,
102
+ ignoreValueFormatter = options.ignoreValueFormatter,
103
+ apiRef = options.apiRef;
66
104
  var CSVBody = rowIds.reduce(function (acc, id) {
67
105
  return "".concat(acc).concat(serializeRow({
68
106
  id: id,
69
107
  columns: columns,
70
- getCellParams: getCellParams,
108
+ getCellParams: apiRef.current.getCellParams,
71
109
  delimiterCharacter: delimiterCharacter,
72
110
  ignoreValueFormatter: ignoreValueFormatter
73
- }).join(delimiterCharacter), "\r\n");
111
+ }), "\r\n");
74
112
  }, '').trim();
75
113
  if (!includeHeaders) {
76
114
  return CSVBody;
77
115
  }
78
- var CSVHead = "".concat(columns.filter(function (column) {
116
+ var filteredColumns = columns.filter(function (column) {
79
117
  return column.field !== GRID_CHECKBOX_SELECTION_COL_DEF.field;
80
- }).map(function (column) {
81
- return sanitizeCellValue(column.headerName || column.field, delimiterCharacter);
82
- }).join(delimiterCharacter), "\r\n");
118
+ });
119
+ var headerRows = [];
120
+ if (includeColumnGroupsHeaders) {
121
+ var columnGroupLookup = apiRef.current.unstable_getAllGroupDetails();
122
+ var maxColumnGroupsDepth = 0;
123
+ var columnGroupPathsLookup = filteredColumns.reduce(function (acc, column) {
124
+ var columnGroupPath = apiRef.current.unstable_getColumnGroupPath(column.field);
125
+ acc[column.field] = columnGroupPath;
126
+ maxColumnGroupsDepth = Math.max(maxColumnGroupsDepth, columnGroupPath.length);
127
+ return acc;
128
+ }, {});
129
+ var _loop = function _loop(i) {
130
+ var headerGroupRow = new CSVRow({
131
+ delimiterCharacter: delimiterCharacter,
132
+ sanitizeCellValue: sanitizeCellValue
133
+ });
134
+ headerRows.push(headerGroupRow);
135
+ filteredColumns.forEach(function (column) {
136
+ var columnGroupId = (columnGroupPathsLookup[column.field] || [])[i];
137
+ var columnGroup = columnGroupLookup[columnGroupId];
138
+ headerGroupRow.addValue(columnGroup ? columnGroup.headerName || columnGroup.groupId : '');
139
+ });
140
+ };
141
+ for (var i = 0; i < maxColumnGroupsDepth; i += 1) {
142
+ _loop(i);
143
+ }
144
+ }
145
+ var mainHeaderRow = new CSVRow({
146
+ delimiterCharacter: delimiterCharacter,
147
+ sanitizeCellValue: sanitizeCellValue
148
+ });
149
+ filteredColumns.forEach(function (column) {
150
+ mainHeaderRow.addValue(column.headerName || column.field);
151
+ });
152
+ headerRows.push(mainHeaderRow);
153
+ var CSVHead = "".concat(headerRows.map(function (row) {
154
+ return row.getRowString();
155
+ }).join('\r\n'), "\r\n");
83
156
  return "".concat(CSVHead).concat(CSVBody).trim();
84
157
  }
@@ -21,7 +21,7 @@ export var useGridCsvExport = function useGridCsvExport(apiRef, props) {
21
21
  var ignoreValueFormatterProp = props.unstable_ignoreValueFormatterDuringExport;
22
22
  var ignoreValueFormatter = (_typeof(ignoreValueFormatterProp) === 'object' ? ignoreValueFormatterProp == null ? void 0 : ignoreValueFormatterProp.csvExport : ignoreValueFormatterProp) || false;
23
23
  var getDataAsCsv = React.useCallback(function () {
24
- var _options$getRowsToExp, _options$includeHeade;
24
+ var _options$getRowsToExp, _options$includeHeade, _options$includeColum;
25
25
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26
26
  logger.debug("Get data as CSV");
27
27
  var exportedColumns = getColumnsToExport({
@@ -35,10 +35,11 @@ export var useGridCsvExport = function useGridCsvExport(apiRef, props) {
35
35
  return buildCSV({
36
36
  columns: exportedColumns,
37
37
  rowIds: exportedRowIds,
38
- getCellParams: apiRef.current.getCellParams,
39
38
  delimiterCharacter: options.delimiter || ',',
40
39
  includeHeaders: (_options$includeHeade = options.includeHeaders) != null ? _options$includeHeade : true,
41
- ignoreValueFormatter: ignoreValueFormatter
40
+ includeColumnGroupsHeaders: (_options$includeColum = options.includeColumnGroupsHeaders) != null ? _options$includeColum : true,
41
+ ignoreValueFormatter: ignoreValueFormatter,
42
+ apiRef: apiRef
42
43
  });
43
44
  }, [logger, apiRef, ignoreValueFormatter]);
44
45
  var exportDataAsCsv = React.useCallback(function (options) {
@@ -3,7 +3,7 @@ import { GridLogicOperator } from '../../../models';
3
3
  import { GLOBAL_API_REF, isInternalFilter } from '../../../colDef/utils';
4
4
  import { getDefaultGridFilterModel } from './gridFilterState';
5
5
  import { buildWarning } from '../../../utils/warning';
6
- import { gridColumnFieldsSelector, gridColumnLookupSelector } from '../columns';
6
+ import { gridColumnFieldsSelector, gridColumnLookupSelector, gridVisibleColumnFieldsSelector } from '../columns';
7
7
  /**
8
8
  * Adds default values to the optional fields of a filter items.
9
9
  * @param {GridFilterItem} item The raw filter item.
@@ -170,12 +170,13 @@ export var buildAggregatedFilterItemsApplier = function buildAggregatedFilterIte
170
170
  * @returns {GridAggregatedFilterItemApplier | null} A method that checks if a row is matching the current filter model. If `null`, we consider that all the rows are matching the filters.
171
171
  */
172
172
  export var buildAggregatedQuickFilterApplier = function buildAggregatedQuickFilterApplier(getRowId, filterModel, apiRef) {
173
- var _filterModel$quickFil, _filterModel$quickFil2;
173
+ var _filterModel$quickFil, _filterModel$quickFil2, _filterModel$quickFil3;
174
174
  var quickFilterValues = (_filterModel$quickFil = (_filterModel$quickFil2 = filterModel.quickFilterValues) == null ? void 0 : _filterModel$quickFil2.filter(Boolean)) != null ? _filterModel$quickFil : [];
175
175
  if (quickFilterValues.length === 0) {
176
176
  return null;
177
177
  }
178
- var columnFields = gridColumnFieldsSelector(apiRef);
178
+ var quickFilterExcludeHiddenColumns = (_filterModel$quickFil3 = filterModel.quickFilterExcludeHiddenColumns) != null ? _filterModel$quickFil3 : false;
179
+ var columnFields = quickFilterExcludeHiddenColumns ? gridVisibleColumnFieldsSelector(apiRef) : gridColumnFieldsSelector(apiRef);
179
180
  var appliersPerField = [];
180
181
  columnFields.forEach(function (field) {
181
182
  var column = apiRef.current.getColumn(field);
@@ -299,14 +300,14 @@ export var passFilterLogic = function passFilterLogic(allFilterItemResults, allQ
299
300
 
300
301
  // get result for quick filter model
301
302
  if (cleanedQuickFilterResults.length > 0 && filterModel.quickFilterValues != null) {
302
- var _filterModel$quickFil3;
303
+ var _filterModel$quickFil4;
303
304
  // Return true if the item pass with one of the rows
304
305
  var quickFilterValuePredicate = function quickFilterValuePredicate(value) {
305
306
  return cleanedQuickFilterResults.some(function (quickFilterValueResult) {
306
307
  return quickFilterValueResult[value];
307
308
  });
308
309
  };
309
- var quickFilterLogicOperator = (_filterModel$quickFil3 = filterModel.quickFilterLogicOperator) != null ? _filterModel$quickFil3 : getDefaultGridFilterModel().quickFilterLogicOperator;
310
+ var quickFilterLogicOperator = (_filterModel$quickFil4 = filterModel.quickFilterLogicOperator) != null ? _filterModel$quickFil4 : getDefaultGridFilterModel().quickFilterLogicOperator;
310
311
  if (quickFilterLogicOperator === GridLogicOperator.And) {
311
312
  var passesAllQuickFilterValues = filterModel.quickFilterValues.every(quickFilterValuePredicate);
312
313
  if (!passesAllQuickFilterValues) {
@@ -22,6 +22,7 @@ export var filterStateInitializer = function filterStateInitializer(state, props
22
22
  return _extends({}, state, {
23
23
  filter: {
24
24
  filterModel: sanitizeFilterModel(filterModel, props.disableMultipleColumnsFiltering, apiRef),
25
+ filteredRowsLookup: {},
25
26
  filteredDescendantCountLookup: {}
26
27
  },
27
28
  visibleRowsLookup: {}
@@ -347,6 +348,13 @@ export var useGridFilter = function useGridFilter(apiRef, props) {
347
348
  useGridApiEventHandler(apiRef, 'columnsChange', handleColumnsChange);
348
349
  useGridApiEventHandler(apiRef, 'activeStrategyProcessorChange', handleStrategyProcessorChange);
349
350
  useGridApiEventHandler(apiRef, 'rowExpansionChange', updateVisibleRowsLookupState);
351
+ useGridApiEventHandler(apiRef, 'columnVisibilityModelChange', function () {
352
+ var filterModel = gridFilterModelSelector(apiRef);
353
+ if (filterModel.quickFilterValues && filterModel.quickFilterExcludeHiddenColumns) {
354
+ // re-apply filters because the quick filter results may have changed
355
+ apiRef.current.unstable_applyFilters();
356
+ }
357
+ });
350
358
 
351
359
  /**
352
360
  * 1ST RENDER
@@ -3,7 +3,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import { gridPinnedRowsSelector } from './gridRowsSelector';
4
4
  import { gridDensityFactorSelector } from '../density/densitySelector';
5
5
  export var GRID_ROOT_GROUP_ID = "auto-generated-group-node-root";
6
- export var GRID_ID_AUTOGENERATED = Symbol('mui-autogenerated-id');
6
+ export var GRID_ID_AUTOGENERATED = Symbol('mui.id_autogenerated');
7
7
  export var buildRootGroup = function buildRootGroup() {
8
8
  return {
9
9
  type: 'group',
@@ -1,29 +1,11 @@
1
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
1
  import * as React from 'react';
4
2
  export function useGridApiMethod(privateApiRef, apiMethods, visibility) {
5
- var apiMethodsRef = React.useRef(apiMethods);
6
- var _React$useState = React.useState(Object.keys(apiMethods)),
7
- _React$useState2 = _slicedToArray(_React$useState, 1),
8
- apiMethodsNames = _React$useState2[0];
9
- var installMethods = React.useCallback(function () {
10
- if (!privateApiRef.current) {
11
- return;
12
- }
13
- apiMethodsNames.forEach(function (methodName) {
14
- if (!privateApiRef.current.hasOwnProperty(methodName)) {
15
- privateApiRef.current.register(visibility, _defineProperty({}, methodName, function () {
16
- var fn = apiMethodsRef.current[methodName];
17
- return fn.apply(void 0, arguments);
18
- }));
19
- }
20
- });
21
- }, [apiMethodsNames, privateApiRef, visibility]);
3
+ var isFirstRender = React.useRef(true);
22
4
  React.useEffect(function () {
23
- apiMethodsRef.current = apiMethods;
24
- }, [apiMethods]);
25
- React.useEffect(function () {
26
- installMethods();
27
- }, [installMethods]);
28
- installMethods();
5
+ isFirstRender.current = false;
6
+ privateApiRef.current.register(visibility, apiMethods);
7
+ }, [privateApiRef, visibility, apiMethods]);
8
+ if (isFirstRender.current) {
9
+ privateApiRef.current.register(visibility, apiMethods);
10
+ }
29
11
  }
package/legacy/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v6.9.2
2
+ * @mui/x-data-grid v6.10.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -8,6 +8,7 @@ export { getGridFilter } from '../components/panel/filterPanel/GridFilterPanel';
8
8
  export { useGridRegisterPipeProcessor } from '../hooks/core/pipeProcessing';
9
9
  export { useGridRegisterStrategyProcessor, GRID_DEFAULT_STRATEGY } from '../hooks/core/strategyProcessing';
10
10
  export { useGridInitialization } from '../hooks/core/useGridInitialization';
11
+ export { unwrapPrivateAPI } from '../hooks/core/useGridApiInitialization';
11
12
  export { useGridClipboard } from '../hooks/features/clipboard/useGridClipboard';
12
13
  export { useGridColumnHeaders } from '../hooks/features/columnHeaders/useGridColumnHeaders';
13
14
  export { unstable_gridHeaderFilteringEditFieldSelector, unstable_gridHeaderFilteringMenuSelector } from '../hooks/features/headerFiltering/gridHeaderFilteringSelectors';
@@ -39,7 +39,7 @@ var plPLGrid = {
39
39
  columnsPanelHideAllButton: 'Ukryj wszystko',
40
40
  // Filter panel text
41
41
  filterPanelAddFilter: 'Dodaj filtr',
42
- // filterPanelRemoveAll: 'Remove all',
42
+ filterPanelRemoveAll: 'Usuń wszystkie',
43
43
  filterPanelDeleteIconLabel: 'Usuń',
44
44
  filterPanelLogicOperator: 'Operator logiczny',
45
45
  filterPanelOperator: 'Operator',
@@ -70,12 +70,12 @@ var plPLGrid = {
70
70
  // 'filterOperator<=': '<=',
71
71
 
72
72
  // Header filter operators text
73
- // headerFilterOperatorContains: 'Contains',
74
- // headerFilterOperatorEquals: 'Equals',
75
- // headerFilterOperatorStartsWith: 'Starts with',
76
- // headerFilterOperatorEndsWith: 'Ends with',
73
+ headerFilterOperatorContains: 'Zawiera',
74
+ headerFilterOperatorEquals: 'Równa się',
75
+ headerFilterOperatorStartsWith: 'Zaczyna się od',
76
+ headerFilterOperatorEndsWith: 'Kończy się na',
77
77
  // headerFilterOperatorIs: 'Is',
78
- // headerFilterOperatorNot: 'Is not',
78
+ headerFilterOperatorNot: 'Niepuste',
79
79
  // headerFilterOperatorAfter: 'Is after',
80
80
  // headerFilterOperatorOnOrAfter: 'Is on or after',
81
81
  // headerFilterOperatorBefore: 'Is before',
@@ -97,7 +97,7 @@ var plPLGrid = {
97
97
  // Column menu text
98
98
  columnMenuLabel: 'Menu',
99
99
  columnMenuShowColumns: 'Pokaż wszystkie kolumny',
100
- // columnMenuManageColumns: 'Manage columns',
100
+ columnMenuManageColumns: 'Zarządzaj kolumnami',
101
101
  columnMenuFilter: 'Filtr',
102
102
  columnMenuHideColumn: 'Ukryj',
103
103
  columnMenuUnsort: 'Anuluj sortowanie',
package/locales/plPL.js CHANGED
@@ -37,7 +37,7 @@ const plPLGrid = {
37
37
  columnsPanelHideAllButton: 'Ukryj wszystko',
38
38
  // Filter panel text
39
39
  filterPanelAddFilter: 'Dodaj filtr',
40
- // filterPanelRemoveAll: 'Remove all',
40
+ filterPanelRemoveAll: 'Usuń wszystkie',
41
41
  filterPanelDeleteIconLabel: 'Usuń',
42
42
  filterPanelLogicOperator: 'Operator logiczny',
43
43
  filterPanelOperator: 'Operator',
@@ -68,12 +68,12 @@ const plPLGrid = {
68
68
  // 'filterOperator<=': '<=',
69
69
 
70
70
  // Header filter operators text
71
- // headerFilterOperatorContains: 'Contains',
72
- // headerFilterOperatorEquals: 'Equals',
73
- // headerFilterOperatorStartsWith: 'Starts with',
74
- // headerFilterOperatorEndsWith: 'Ends with',
71
+ headerFilterOperatorContains: 'Zawiera',
72
+ headerFilterOperatorEquals: 'Równa się',
73
+ headerFilterOperatorStartsWith: 'Zaczyna się od',
74
+ headerFilterOperatorEndsWith: 'Kończy się na',
75
75
  // headerFilterOperatorIs: 'Is',
76
- // headerFilterOperatorNot: 'Is not',
76
+ headerFilterOperatorNot: 'Niepuste',
77
77
  // headerFilterOperatorAfter: 'Is after',
78
78
  // headerFilterOperatorOnOrAfter: 'Is on or after',
79
79
  // headerFilterOperatorBefore: 'Is before',
@@ -95,7 +95,7 @@ const plPLGrid = {
95
95
  // Column menu text
96
96
  columnMenuLabel: 'Menu',
97
97
  columnMenuShowColumns: 'Pokaż wszystkie kolumny',
98
- // columnMenuManageColumns: 'Manage columns',
98
+ columnMenuManageColumns: 'Zarządzaj kolumnami',
99
99
  columnMenuFilter: 'Filtr',
100
100
  columnMenuHideColumn: 'Ukryj',
101
101
  columnMenuUnsort: 'Anuluj sortowanie',
@@ -452,7 +452,6 @@ export interface GridEventLookup extends GridRowEventLookup, GridColumnHeaderEve
452
452
  sortedRowsSet: {};
453
453
  /**
454
454
  * Fired when the expansion of a row is changed. Called with a [[GridGroupNode]] object.
455
- * @ignore - do not document.
456
455
  */
457
456
  rowExpansionChange: {
458
457
  params: GridGroupNode;
@@ -69,10 +69,17 @@ export interface GridCsvExportOptions extends GridFileExportOptions {
69
69
  */
70
70
  utf8WithBom?: boolean;
71
71
  /**
72
- * If `true`, the first row of the CSV will include the headers of the grid.
72
+ * If `true`, the CSV will include the column headers and column groups.
73
+ * Use `includeColumnGroupsHeaders` to control whether the column groups are included.
73
74
  * @default true
74
75
  */
75
76
  includeHeaders?: boolean;
77
+ /**
78
+ * If `true`, the CSV will include the column groups.
79
+ * @see See {@link https://mui.com/x/react-data-grid/column-groups/ column groups docs} for more details.
80
+ * @default true
81
+ */
82
+ includeColumnGroupsHeaders?: boolean;
76
83
  /**
77
84
  * Function that returns the id of the rows to export on the order they should be exported.
78
85
  * @param {GridCsvGetRowsToExportParams} params With all properties from [[GridCsvGetRowsToExportParams]].
@@ -26,4 +26,9 @@ export interface GridFilterModel {
26
26
  * @default `GridLogicOperator.And`
27
27
  */
28
28
  quickFilterLogicOperator?: GridLogicOperator;
29
+ /**
30
+ * If `true`, the quick filter will skip cell values from hidden columns.
31
+ * @default false
32
+ */
33
+ quickFilterExcludeHiddenColumns?: boolean;
29
34
  }
@@ -181,6 +181,7 @@ DataGridRaw.propTypes = {
181
181
  value: PropTypes.any
182
182
  })).isRequired,
183
183
  logicOperator: PropTypes.oneOf(['and', 'or']),
184
+ quickFilterExcludeHiddenColumns: PropTypes.bool,
184
185
  quickFilterLogicOperator: PropTypes.oneOf(['and', 'or']),
185
186
  quickFilterValues: PropTypes.array
186
187
  }),
@@ -55,18 +55,20 @@ function GridToolbarQuickFilter(props) {
55
55
  const rootProps = useGridRootProps();
56
56
  const quickFilterValues = useGridSelector(apiRef, gridQuickFilterValuesSelector);
57
57
  const [searchValue, setSearchValue] = React.useState(() => quickFilterFormatter(quickFilterValues ?? []));
58
- const [prevQuickFilterValues, setPrevQuickFilterValues] = React.useState(quickFilterValues);
58
+ const prevQuickFilterValuesRef = React.useRef(quickFilterValues);
59
59
  React.useEffect(() => {
60
- if (!isDeepEqual(prevQuickFilterValues, quickFilterValues)) {
60
+ if (!isDeepEqual(prevQuickFilterValuesRef.current, quickFilterValues)) {
61
61
  // The model of quick filter value has been updated
62
- setPrevQuickFilterValues(quickFilterValues);
62
+ prevQuickFilterValuesRef.current = quickFilterValues;
63
63
 
64
64
  // Update the input value if needed to match the new model
65
65
  setSearchValue(prevSearchValue => isDeepEqual(quickFilterParser(prevSearchValue), quickFilterValues) ? prevSearchValue : quickFilterFormatter(quickFilterValues ?? []));
66
66
  }
67
- }, [prevQuickFilterValues, quickFilterValues, quickFilterFormatter, quickFilterParser]);
67
+ }, [quickFilterValues, quickFilterFormatter, quickFilterParser]);
68
68
  const updateSearchValue = React.useCallback(newSearchValue => {
69
- apiRef.current.setQuickFilterValues(quickFilterParser(newSearchValue));
69
+ const newQuickFilterValues = quickFilterParser(newSearchValue);
70
+ prevQuickFilterValuesRef.current = newQuickFilterValues;
71
+ apiRef.current.setQuickFilterValues(newQuickFilterValues);
70
72
  }, [apiRef, quickFilterParser]);
71
73
  const debouncedUpdateSearchValue = React.useMemo(() => debounce(updateSearchValue, debounceMs), [updateSearchValue, debounceMs]);
72
74
  const handleSearchValueChange = React.useCallback(event => {
@@ -86,8 +88,9 @@ function GridToolbarQuickFilter(props) {
86
88
  onChange: handleSearchValueChange,
87
89
  placeholder: apiRef.current.getLocaleText('toolbarQuickFilterPlaceholder'),
88
90
  "aria-label": apiRef.current.getLocaleText('toolbarQuickFilterLabel'),
89
- type: "search",
90
- InputProps: {
91
+ type: "search"
92
+ }, other, {
93
+ InputProps: _extends({
91
94
  startAdornment: /*#__PURE__*/_jsx(rootProps.slots.quickFilterIcon, {
92
95
  fontSize: "small"
93
96
  }),
@@ -103,8 +106,8 @@ function GridToolbarQuickFilter(props) {
103
106
  fontSize: "small"
104
107
  })
105
108
  }))
106
- }
107
- }, other, rootProps.slotProps?.baseTextField));
109
+ }, other.InputProps)
110
+ }, rootProps.slotProps?.baseTextField));
108
111
  }
109
112
  process.env.NODE_ENV !== "production" ? GridToolbarQuickFilter.propTypes = {
110
113
  // ----------------------------- Warning --------------------------------
@@ -33,13 +33,16 @@ import { useGridApiMethod } from '../../utils/useGridApiMethod';
33
33
  */
34
34
  export const useGridPipeProcessing = apiRef => {
35
35
  const processorsCache = React.useRef({});
36
+ const isRunning = React.useRef(false);
36
37
  const runAppliers = React.useCallback(groupCache => {
37
- if (!groupCache) {
38
+ if (isRunning.current || !groupCache) {
38
39
  return;
39
40
  }
41
+ isRunning.current = true;
40
42
  Object.values(groupCache.appliers).forEach(callback => {
41
43
  callback();
42
44
  });
45
+ isRunning.current = false;
43
46
  }, []);
44
47
  const registerPipeProcessor = React.useCallback((group, id, processor) => {
45
48
  if (!processorsCache.current[group]) {