@mui/x-data-grid 6.3.0 → 6.4.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 (148) hide show
  1. package/CHANGELOG.md +105 -2
  2. package/DataGrid/DataGrid.js +20 -1
  3. package/DataGrid/useDataGridComponent.js +2 -2
  4. package/DataGrid/useDataGridProps.js +3 -1
  5. package/colDef/gridBooleanColDef.js +19 -1
  6. package/colDef/gridDateColDef.js +6 -2
  7. package/colDef/gridSingleSelectColDef.js +21 -1
  8. package/components/GridPagination.js +3 -1
  9. package/components/base/GridBody.d.ts +1 -0
  10. package/components/base/GridBody.js +6 -3
  11. package/components/containers/GridRootStyles.js +1 -0
  12. package/components/panel/GridPanel.d.ts +2 -1
  13. package/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +1 -2
  14. package/components/panel/filterPanel/GridFilterInputMultipleValue.js +1 -2
  15. package/components/toolbar/GridToolbarFilterButton.js +3 -1
  16. package/hooks/core/pipeProcessing/gridPipeProcessingApi.d.ts +12 -1
  17. package/hooks/features/clipboard/useGridClipboard.d.ts +2 -1
  18. package/hooks/features/clipboard/useGridClipboard.js +43 -26
  19. package/hooks/features/dimensions/useGridDimensions.js +2 -4
  20. package/hooks/features/editing/useGridCellEditing.js +7 -3
  21. package/hooks/features/editing/useGridRowEditing.js +7 -3
  22. package/hooks/features/export/serializers/csvSerializer.d.ts +5 -0
  23. package/hooks/features/export/serializers/csvSerializer.js +46 -6
  24. package/hooks/features/export/useGridCsvExport.d.ts +2 -1
  25. package/hooks/features/export/useGridCsvExport.js +7 -5
  26. package/hooks/features/focus/useGridFocus.js +2 -2
  27. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +11 -0
  28. package/index.js +1 -1
  29. package/internals/index.d.ts +3 -2
  30. package/internals/index.js +3 -2
  31. package/joy/icons.d.ts +33 -0
  32. package/joy/icons.js +433 -0
  33. package/joy/joySlots.js +254 -42
  34. package/legacy/DataGrid/DataGrid.js +20 -1
  35. package/legacy/DataGrid/useDataGridComponent.js +2 -2
  36. package/legacy/DataGrid/useDataGridProps.js +3 -1
  37. package/legacy/colDef/gridBooleanColDef.js +21 -1
  38. package/legacy/colDef/gridDateColDef.js +10 -2
  39. package/legacy/colDef/gridSingleSelectColDef.js +21 -1
  40. package/legacy/components/GridPagination.js +3 -1
  41. package/legacy/components/base/GridBody.js +6 -3
  42. package/legacy/components/containers/GridRootStyles.js +1 -0
  43. package/legacy/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +1 -2
  44. package/legacy/components/panel/filterPanel/GridFilterInputMultipleValue.js +1 -2
  45. package/legacy/components/toolbar/GridToolbarFilterButton.js +3 -1
  46. package/legacy/hooks/features/clipboard/useGridClipboard.js +44 -26
  47. package/legacy/hooks/features/dimensions/useGridDimensions.js +2 -4
  48. package/legacy/hooks/features/editing/useGridCellEditing.js +7 -3
  49. package/legacy/hooks/features/editing/useGridRowEditing.js +7 -3
  50. package/legacy/hooks/features/export/serializers/csvSerializer.js +43 -6
  51. package/legacy/hooks/features/export/useGridCsvExport.js +8 -5
  52. package/legacy/hooks/features/focus/useGridFocus.js +2 -2
  53. package/legacy/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +10 -0
  54. package/legacy/index.js +1 -1
  55. package/legacy/internals/index.js +3 -2
  56. package/legacy/joy/icons.js +432 -0
  57. package/legacy/joy/joySlots.js +273 -54
  58. package/legacy/locales/deDE.js +2 -2
  59. package/legacy/locales/frFR.js +6 -6
  60. package/legacy/locales/ptBR.js +1 -1
  61. package/legacy/locales/ukUA.js +8 -9
  62. package/legacy/material/index.js +3 -1
  63. package/legacy/models/api/index.js +0 -1
  64. package/legacy/utils/domUtils.js +14 -1
  65. package/locales/deDE.js +2 -2
  66. package/locales/frFR.js +6 -6
  67. package/locales/ptBR.js +1 -1
  68. package/locales/ukUA.js +8 -9
  69. package/material/index.d.ts +3 -1
  70. package/material/index.js +3 -1
  71. package/models/api/gridApiCommon.d.ts +1 -2
  72. package/models/api/gridCoreApi.d.ts +4 -0
  73. package/models/api/index.d.ts +0 -1
  74. package/models/api/index.js +0 -1
  75. package/models/events/gridEventLookup.d.ts +6 -0
  76. package/models/gridSlotsComponent.d.ts +5 -0
  77. package/models/gridSlotsComponentsProps.d.ts +4 -0
  78. package/models/props/DataGridProps.d.ts +19 -0
  79. package/modern/DataGrid/DataGrid.js +20 -1
  80. package/modern/DataGrid/useDataGridComponent.js +2 -2
  81. package/modern/DataGrid/useDataGridProps.js +3 -1
  82. package/modern/colDef/gridBooleanColDef.js +19 -1
  83. package/modern/colDef/gridDateColDef.js +6 -2
  84. package/modern/colDef/gridSingleSelectColDef.js +21 -1
  85. package/modern/components/GridPagination.js +2 -1
  86. package/modern/components/base/GridBody.js +6 -3
  87. package/modern/components/containers/GridRootStyles.js +1 -0
  88. package/modern/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +1 -2
  89. package/modern/components/panel/filterPanel/GridFilterInputMultipleValue.js +1 -2
  90. package/modern/components/toolbar/GridToolbarFilterButton.js +3 -1
  91. package/modern/hooks/features/clipboard/useGridClipboard.js +43 -26
  92. package/modern/hooks/features/dimensions/useGridDimensions.js +1 -3
  93. package/modern/hooks/features/editing/useGridCellEditing.js +7 -3
  94. package/modern/hooks/features/editing/useGridRowEditing.js +7 -3
  95. package/modern/hooks/features/export/serializers/csvSerializer.js +44 -6
  96. package/modern/hooks/features/export/useGridCsvExport.js +7 -5
  97. package/modern/hooks/features/focus/useGridFocus.js +2 -2
  98. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +11 -0
  99. package/modern/index.js +1 -1
  100. package/modern/internals/index.js +3 -2
  101. package/modern/joy/icons.js +433 -0
  102. package/modern/joy/joySlots.js +248 -41
  103. package/modern/locales/deDE.js +2 -2
  104. package/modern/locales/frFR.js +6 -6
  105. package/modern/locales/ptBR.js +1 -1
  106. package/modern/locales/ukUA.js +8 -9
  107. package/modern/material/index.js +3 -1
  108. package/modern/models/api/index.js +0 -1
  109. package/modern/utils/domUtils.js +13 -1
  110. package/node/DataGrid/DataGrid.js +20 -1
  111. package/node/DataGrid/useDataGridComponent.js +2 -2
  112. package/node/DataGrid/useDataGridProps.js +3 -1
  113. package/node/colDef/gridBooleanColDef.js +19 -1
  114. package/node/colDef/gridDateColDef.js +6 -2
  115. package/node/colDef/gridSingleSelectColDef.js +21 -1
  116. package/node/components/GridPagination.js +2 -1
  117. package/node/components/base/GridBody.js +6 -3
  118. package/node/components/containers/GridRootStyles.js +1 -0
  119. package/node/components/panel/filterPanel/GridFilterInputMultipleSingleSelect.js +1 -2
  120. package/node/components/panel/filterPanel/GridFilterInputMultipleValue.js +1 -2
  121. package/node/components/toolbar/GridToolbarFilterButton.js +3 -1
  122. package/node/hooks/features/clipboard/useGridClipboard.js +42 -25
  123. package/node/hooks/features/dimensions/useGridDimensions.js +1 -3
  124. package/node/hooks/features/editing/useGridCellEditing.js +7 -3
  125. package/node/hooks/features/editing/useGridRowEditing.js +7 -3
  126. package/node/hooks/features/export/serializers/csvSerializer.js +46 -6
  127. package/node/hooks/features/export/useGridCsvExport.js +6 -3
  128. package/node/hooks/features/focus/useGridFocus.js +2 -2
  129. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +11 -0
  130. package/node/index.js +1 -1
  131. package/node/internals/index.js +23 -1
  132. package/node/joy/icons.js +471 -0
  133. package/node/joy/joySlots.js +248 -40
  134. package/node/locales/deDE.js +2 -2
  135. package/node/locales/frFR.js +6 -6
  136. package/node/locales/ptBR.js +1 -1
  137. package/node/locales/ukUA.js +8 -9
  138. package/node/material/index.js +3 -1
  139. package/node/models/api/index.js +0 -11
  140. package/node/utils/domUtils.js +15 -1
  141. package/package.json +2 -2
  142. package/utils/domUtils.d.ts +1 -0
  143. package/utils/domUtils.js +13 -1
  144. package/legacy/models/api/gridClipboardApi.js +0 -1
  145. package/models/api/gridClipboardApi.d.ts +0 -11
  146. package/models/api/gridClipboardApi.js +0 -1
  147. package/modern/models/api/gridClipboardApi.js +0 -1
  148. package/node/models/api/gridClipboardApi.js +0 -5
@@ -58,6 +58,26 @@ const GRID_SINGLE_SELECT_COL_DEF = (0, _extends2.default)({}, _gridStringColDef.
58
58
  return valueOption ? colDef.getOptionLabel(valueOption) : '';
59
59
  },
60
60
  renderEditCell: _GridEditSingleSelectCell.renderEditSingleSelectCell,
61
- filterOperators: (0, _gridSingleSelectOperators.getGridSingleSelectOperators)()
61
+ filterOperators: (0, _gridSingleSelectOperators.getGridSingleSelectOperators)(),
62
+ // @ts-ignore
63
+ pastedValueParser: (value, params) => {
64
+ const colDef = params.colDef;
65
+ const colDefValueOptions = colDef.valueOptions;
66
+ const valueOptions = typeof colDefValueOptions === 'function' ? colDefValueOptions({
67
+ field: colDef.field
68
+ }) : colDefValueOptions || [];
69
+ const getOptionValue = colDef.getOptionValue;
70
+ const valueOption = valueOptions.find(option => {
71
+ if (getOptionValue(option) === value) {
72
+ return true;
73
+ }
74
+ return false;
75
+ });
76
+ if (valueOption) {
77
+ return value;
78
+ }
79
+ // do not paste the value if it is not in the valueOptions
80
+ return undefined;
81
+ }
62
82
  });
63
83
  exports.GRID_SINGLE_SELECT_COL_DEF = GRID_SINGLE_SELECT_COL_DEF;
@@ -50,7 +50,8 @@ const GridPagination = /*#__PURE__*/React.forwardRef(function GridPagination(pro
50
50
  if (process.env.NODE_ENV !== 'production') {
51
51
  // eslint-disable-next-line react-hooks/rules-of-hooks
52
52
  const warnedOnceMissingInPageSizeOptions = React.useRef(false);
53
- if (!warnedOnceMissingInPageSizeOptions.current && !rootProps.autoPageSize && !rootProps.pageSizeOptions.includes(paginationModel.pageSize)) {
53
+ const pageSize = rootProps.paginationModel?.pageSize ?? paginationModel.pageSize;
54
+ if (!warnedOnceMissingInPageSizeOptions.current && !rootProps.autoPageSize && !rootProps.pageSizeOptions.includes(pageSize)) {
54
55
  console.warn([`MUI: The page size \`${paginationModel.pageSize}\` is not preset in the \`pageSizeOptions\``, `Add it to show the pagination select.`].join('\n'));
55
56
  warnedOnceMissingInPageSizeOptions.current = true;
56
57
  }
@@ -26,7 +26,8 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
26
26
  function GridBody(props) {
27
27
  const {
28
28
  VirtualScrollerComponent,
29
- ColumnHeadersProps
29
+ ColumnHeadersProps,
30
+ children
30
31
  } = props;
31
32
  const apiRef = (0, _useGridPrivateApiContext.useGridPrivateApiContext)();
32
33
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
@@ -96,7 +97,8 @@ function GridBody(props) {
96
97
  apiRef.current.register('private', {
97
98
  columnHeadersContainerElementRef: columnsContainerRef,
98
99
  columnHeadersElementRef: columnHeadersRef,
99
- virtualScrollerRef
100
+ virtualScrollerRef,
101
+ mainElementRef: rootRef
100
102
  });
101
103
  const hasDimensions = !!apiRef.current.getRootDimensions();
102
104
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridMainContainer.GridMainContainer, {
@@ -127,7 +129,7 @@ function GridBody(props) {
127
129
  , {
128
130
  ref: virtualScrollerRef,
129
131
  disableVirtualization: isVirtualizationDisabled
130
- })]
132
+ }), children]
131
133
  });
132
134
  }
133
135
  process.env.NODE_ENV !== "production" ? GridBody.propTypes = {
@@ -135,6 +137,7 @@ process.env.NODE_ENV !== "production" ? GridBody.propTypes = {
135
137
  // | These PropTypes are generated from the TypeScript type definitions |
136
138
  // | To update them edit the TypeScript types and run "yarn proptypes" |
137
139
  // ----------------------------------------------------------------------
140
+ children: _propTypes.default.node,
138
141
  ColumnHeadersProps: _propTypes.default.object,
139
142
  VirtualScrollerComponent: _propTypes.default.elementType.isRequired
140
143
  } : void 0;
@@ -156,6 +156,7 @@ const GridRootStyles = (0, _styles.styled)('div', {
156
156
  outline: 'none',
157
157
  height: '100%',
158
158
  display: 'flex',
159
+ overflow: 'hidden',
159
160
  flexDirection: 'column',
160
161
  overflowAnchor: 'none',
161
162
  // Keep the same scrolling position
@@ -10,7 +10,6 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _Autocomplete = _interopRequireWildcard(require("@mui/material/Autocomplete"));
13
- var _Chip = _interopRequireDefault(require("@mui/material/Chip"));
14
13
  var _utils = require("@mui/utils");
15
14
  var _filterPanelUtils = require("./filterPanelUtils");
16
15
  var _useGridRootProps = require("../../../hooks/utils/useGridRootProps");
@@ -105,7 +104,7 @@ function GridFilterInputMultipleSingleSelect(props) {
105
104
  value: filteredValues,
106
105
  onChange: handleChange,
107
106
  getOptionLabel: getOptionLabel,
108
- renderTags: (value, getTagProps) => value.map((option, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip.default, (0, _extends2.default)({
107
+ renderTags: (value, getTagProps) => value.map((option, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.baseChip, (0, _extends2.default)({
109
108
  variant: "outlined",
110
109
  size: "small",
111
110
  label: getOptionLabel(option)
@@ -10,7 +10,6 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _Autocomplete = _interopRequireDefault(require("@mui/material/Autocomplete"));
13
- var _Chip = _interopRequireDefault(require("@mui/material/Chip"));
14
13
  var _utils = require("@mui/utils");
15
14
  var _useGridRootProps = require("../../../hooks/utils/useGridRootProps");
16
15
  var _jsxRuntime = require("react/jsx-runtime");
@@ -64,7 +63,7 @@ function GridFilterInputMultipleValue(props) {
64
63
  id: id,
65
64
  value: filterValueState,
66
65
  onChange: handleChange,
67
- renderTags: (value, getTagProps) => value.map((option, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_Chip.default, (0, _extends2.default)({
66
+ renderTags: (value, getTagProps) => value.map((option, index) => /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.baseChip, (0, _extends2.default)({
68
67
  variant: "outlined",
69
68
  size: "small",
70
69
  label: option
@@ -76,7 +76,9 @@ const GridToolbarFilterButton = /*#__PURE__*/React.forwardRef(function GridToolb
76
76
  children: activeFilters.map((item, index) => (0, _extends2.default)({}, lookup[item.field] && /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
77
77
  children: `${lookup[item.field].headerName || item.field}
78
78
  ${getOperatorLabel(item)}
79
- ${item.value ? getFilterItemValue(item) : ''}`
79
+ ${
80
+ // implicit check for null and undefined
81
+ item.value != null ? getFilterItemValue(item) : ''}`
80
82
  }, index)))
81
83
  })]
82
84
  });
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.useGridClipboard = void 0;
7
7
  var React = _interopRequireWildcard(require("react"));
8
8
  var _utils = require("../../utils");
9
+ var _gridFocusStateSelector = require("../focus/gridFocusStateSelector");
10
+ var _csvSerializer = require("../export/serializers/csvSerializer");
9
11
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
10
12
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
11
13
  function writeToClipboardPolyfill(data) {
@@ -26,6 +28,15 @@ function writeToClipboardPolyfill(data) {
26
28
  document.body.removeChild(span);
27
29
  }
28
30
  }
31
+ function copyToClipboard(data) {
32
+ if (navigator.clipboard) {
33
+ navigator.clipboard.writeText(data).catch(() => {
34
+ writeToClipboardPolyfill(data);
35
+ });
36
+ } else {
37
+ writeToClipboardPolyfill(data);
38
+ }
39
+ }
29
40
  function hasNativeSelection(element) {
30
41
  // When getSelection is called on an <iframe> that is not displayed Firefox will return null.
31
42
  if (window.getSelection()?.toString()) {
@@ -45,24 +56,11 @@ function hasNativeSelection(element) {
45
56
  * @requires useGridCsvExport (method)
46
57
  * @requires useGridSelection (method)
47
58
  */
48
- const useGridClipboard = apiRef => {
49
- const copySelectedRowsToClipboard = React.useCallback(() => {
50
- if (apiRef.current.getSelectedRows().size === 0) {
51
- return;
52
- }
53
- const data = apiRef.current.getDataAsCsv({
54
- includeHeaders: false,
55
- delimiter: '\t'
56
- });
57
- if (navigator.clipboard) {
58
- navigator.clipboard.writeText(data).catch(() => {
59
- writeToClipboardPolyfill(data);
60
- });
61
- } else {
62
- writeToClipboardPolyfill(data);
63
- }
64
- }, [apiRef]);
65
- const handleKeydown = React.useCallback(event => {
59
+ const useGridClipboard = (apiRef, props) => {
60
+ const ignoreValueFormatterProp = props.unstable_ignoreValueFormatterDuringExport;
61
+ const ignoreValueFormatter = (typeof ignoreValueFormatterProp === 'object' ? ignoreValueFormatterProp?.clipboardExport : ignoreValueFormatterProp) || false;
62
+ const clipboardCopyCellDelimiter = props.clipboardCopyCellDelimiter;
63
+ const handleCopy = React.useCallback(event => {
66
64
  const isModifierKeyPressed = event.ctrlKey || event.metaKey;
67
65
  // event.code === 'KeyC' is not enough as event.code assume a QWERTY keyboard layout which would
68
66
  // be wrong with a Dvorak keyboard (as if pressing J).
@@ -74,12 +72,31 @@ const useGridClipboard = apiRef => {
74
72
  if (hasNativeSelection(event.target)) {
75
73
  return;
76
74
  }
77
- apiRef.current.unstable_copySelectedRowsToClipboard();
78
- }, [apiRef]);
79
- (0, _utils.useGridNativeEventListener)(apiRef, apiRef.current.rootElementRef, 'keydown', handleKeydown);
80
- const clipboardApi = {
81
- unstable_copySelectedRowsToClipboard: copySelectedRowsToClipboard
82
- };
83
- (0, _utils.useGridApiMethod)(apiRef, clipboardApi, 'public');
75
+ let textToCopy = '';
76
+ const selectedRows = apiRef.current.getSelectedRows();
77
+ if (selectedRows.size > 0) {
78
+ textToCopy = apiRef.current.getDataAsCsv({
79
+ includeHeaders: false,
80
+ // TODO: make it configurable
81
+ delimiter: clipboardCopyCellDelimiter
82
+ });
83
+ } else {
84
+ const focusedCell = (0, _gridFocusStateSelector.gridFocusCellSelector)(apiRef);
85
+ if (focusedCell) {
86
+ const cellParams = apiRef.current.getCellParams(focusedCell.id, focusedCell.field);
87
+ textToCopy = (0, _csvSerializer.serializeCellValue)(cellParams, {
88
+ delimiterCharacter: clipboardCopyCellDelimiter,
89
+ ignoreValueFormatter
90
+ });
91
+ }
92
+ }
93
+ textToCopy = apiRef.current.unstable_applyPipeProcessors('clipboardCopy', textToCopy);
94
+ if (textToCopy) {
95
+ copyToClipboard(textToCopy);
96
+ apiRef.current.publishEvent('clipboardCopy', textToCopy);
97
+ }
98
+ }, [apiRef, ignoreValueFormatter, clipboardCopyCellDelimiter]);
99
+ (0, _utils.useGridNativeEventListener)(apiRef, apiRef.current.rootElementRef, 'keydown', handleCopy);
100
+ (0, _utils.useGridApiOptionHandler)(apiRef, 'clipboardCopy', props.onClipboardCopy);
84
101
  };
85
102
  exports.useGridClipboard = useGridClipboard;
@@ -16,7 +16,6 @@ var _useGridVisibleRows = require("../../utils/useGridVisibleRows");
16
16
  var _gridRowsMetaSelector = require("../rows/gridRowsMetaSelector");
17
17
  var _gridRowsUtils = require("../rows/gridRowsUtils");
18
18
  var _gridColumnsUtils = require("../columns/gridColumnsUtils");
19
- var _gridClasses = require("../../../constants/gridClasses");
20
19
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
21
20
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
22
21
  const isTestEnvironment = process.env.NODE_ENV === 'test';
@@ -158,8 +157,7 @@ function useGridDimensions(apiRef, props) {
158
157
  return Math.min(maximumPageSizeWithoutScrollBar, currentPage.rows.length);
159
158
  }, [apiRef, props.pagination, props.paginationMode, props.getRowHeight, rowHeight]);
160
159
  const computeSizeAndPublishResizeEvent = React.useCallback(() => {
161
- const rootEl = apiRef.current.rootElementRef?.current;
162
- const mainEl = rootEl?.querySelector(`.${_gridClasses.gridClasses.main}`);
160
+ const mainEl = apiRef.current.mainElementRef?.current;
163
161
  if (!mainEl) {
164
162
  return;
165
163
  }
@@ -99,10 +99,14 @@ const useGridCellEditing = (apiRef, props) => {
99
99
  }
100
100
  } else if (params.isEditable) {
101
101
  let reason;
102
- if (event.key === ' ') {
103
- return; // Space scrolls to the last row
102
+ const canStartEditing = apiRef.current.unstable_applyPipeProcessors('canStartEditing', true, {
103
+ event,
104
+ cellParams: params,
105
+ editMode: 'cell'
106
+ });
107
+ if (!canStartEditing) {
108
+ return;
104
109
  }
105
-
106
110
  if ((0, _keyboardUtils.isPrintableKey)(event)) {
107
111
  reason = _gridEditCellParams.GridCellEditStartReasons.printableKeyDown;
108
112
  } else if ((event.ctrlKey || event.metaKey) && event.key === 'v') {
@@ -152,10 +152,14 @@ const useGridRowEditing = (apiRef, props) => {
152
152
  }
153
153
  } else if (params.isEditable) {
154
154
  let reason;
155
- if (event.key === ' ') {
156
- return; // Space scrolls to the last row
155
+ const canStartEditing = apiRef.current.unstable_applyPipeProcessors('canStartEditing', true, {
156
+ event,
157
+ cellParams: params,
158
+ editMode: 'row'
159
+ });
160
+ if (!canStartEditing) {
161
+ return;
157
162
  }
158
-
159
163
  if ((0, _keyboardUtils.isPrintableKey)(event)) {
160
164
  reason = _gridRowParams.GridRowEditStartReasons.printableKeyDown;
161
165
  } else if ((event.ctrlKey || event.metaKey) && event.key === 'v') {
@@ -4,9 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.buildCSV = buildCSV;
7
+ exports.serializeCellValue = void 0;
7
8
  var _colDef = require("../../../../colDef");
8
9
  var _warning = require("../../../../utils/warning");
9
- const serializeCellValue = (value, delimiterCharacter) => {
10
+ function sanitizeCellValue(value, delimiterCharacter) {
10
11
  if (typeof value === 'string') {
11
12
  const formattedValue = value.replace(/"/g, '""');
12
13
 
@@ -17,16 +18,48 @@ const serializeCellValue = (value, delimiterCharacter) => {
17
18
  return formattedValue;
18
19
  }
19
20
  return value;
21
+ }
22
+ const serializeCellValue = (cellParams, options) => {
23
+ const {
24
+ delimiterCharacter,
25
+ ignoreValueFormatter
26
+ } = options;
27
+ let value;
28
+ if (ignoreValueFormatter) {
29
+ const columnType = cellParams.colDef.type;
30
+ if (columnType === 'number') {
31
+ value = String(cellParams.value);
32
+ } else if (columnType === 'date' || columnType === 'dateTime') {
33
+ value = cellParams.value?.toISOString();
34
+ } else if (typeof cellParams.value?.toString === 'function') {
35
+ value = cellParams.value.toString();
36
+ } else {
37
+ value = cellParams.value;
38
+ }
39
+ } else {
40
+ value = cellParams.formattedValue;
41
+ }
42
+ return sanitizeCellValue(value, delimiterCharacter);
20
43
  };
44
+ exports.serializeCellValue = serializeCellValue;
21
45
  const objectFormattedValueWarning = (0, _warning.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.']);
22
- const serializeRow = (id, columns, getCellParams, delimiterCharacter) => columns.map(column => {
46
+ const serializeRow = ({
47
+ id,
48
+ columns,
49
+ getCellParams,
50
+ delimiterCharacter,
51
+ ignoreValueFormatter
52
+ }) => columns.map(column => {
23
53
  const cellParams = getCellParams(id, column.field);
24
54
  if (process.env.NODE_ENV !== 'production') {
25
55
  if (String(cellParams.formattedValue) === '[object Object]') {
26
56
  objectFormattedValueWarning();
27
57
  }
28
58
  }
29
- return serializeCellValue(cellParams.formattedValue, delimiterCharacter);
59
+ return serializeCellValue(cellParams, {
60
+ delimiterCharacter,
61
+ ignoreValueFormatter
62
+ });
30
63
  });
31
64
  function buildCSV(options) {
32
65
  const {
@@ -34,12 +67,19 @@ function buildCSV(options) {
34
67
  rowIds,
35
68
  getCellParams,
36
69
  delimiterCharacter,
37
- includeHeaders
70
+ includeHeaders,
71
+ ignoreValueFormatter
38
72
  } = options;
39
- const CSVBody = rowIds.reduce((acc, id) => `${acc}${serializeRow(id, columns, getCellParams, delimiterCharacter).join(delimiterCharacter)}\r\n`, '').trim();
73
+ const CSVBody = rowIds.reduce((acc, id) => `${acc}${serializeRow({
74
+ id,
75
+ columns,
76
+ getCellParams,
77
+ delimiterCharacter,
78
+ ignoreValueFormatter
79
+ }).join(delimiterCharacter)}\r\n`, '').trim();
40
80
  if (!includeHeaders) {
41
81
  return CSVBody;
42
82
  }
43
- const CSVHead = `${columns.filter(column => column.field !== _colDef.GRID_CHECKBOX_SELECTION_COL_DEF.field).map(column => serializeCellValue(column.headerName || column.field, delimiterCharacter)).join(delimiterCharacter)}\r\n`;
83
+ const CSVHead = `${columns.filter(column => column.field !== _colDef.GRID_CHECKBOX_SELECTION_COL_DEF.field).map(column => sanitizeCellValue(column.headerName || column.field, delimiterCharacter)).join(delimiterCharacter)}\r\n`;
44
84
  return `${CSVHead}${CSVBody}`.trim();
45
85
  }
@@ -22,8 +22,10 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
22
22
  * @requires useGridSelection (state)
23
23
  * @requires useGridParamsApi (method)
24
24
  */
25
- const useGridCsvExport = apiRef => {
25
+ const useGridCsvExport = (apiRef, props) => {
26
26
  const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useGridCsvExport');
27
+ const ignoreValueFormatterProp = props.unstable_ignoreValueFormatterDuringExport;
28
+ const ignoreValueFormatter = (typeof ignoreValueFormatterProp === 'object' ? ignoreValueFormatterProp?.csvExport : ignoreValueFormatterProp) || false;
27
29
  const getDataAsCsv = React.useCallback((options = {}) => {
28
30
  logger.debug(`Get data as CSV`);
29
31
  const exportedColumns = (0, _utils.getColumnsToExport)({
@@ -39,9 +41,10 @@ const useGridCsvExport = apiRef => {
39
41
  rowIds: exportedRowIds,
40
42
  getCellParams: apiRef.current.getCellParams,
41
43
  delimiterCharacter: options.delimiter || ',',
42
- includeHeaders: options.includeHeaders ?? true
44
+ includeHeaders: options.includeHeaders ?? true,
45
+ ignoreValueFormatter
43
46
  });
44
- }, [logger, apiRef]);
47
+ }, [logger, apiRef, ignoreValueFormatter]);
45
48
  const exportDataAsCsv = React.useCallback(options => {
46
49
  logger.debug(`Export data as CSV`);
47
50
  const csv = getDataAsCsv(options);
@@ -308,9 +308,9 @@ const useGridFocus = (apiRef, props) => {
308
308
  (0, _useGridApiMethod.useGridApiMethod)(apiRef, focusPrivateApi, 'private');
309
309
  React.useEffect(() => {
310
310
  const doc = (0, _utils.unstable_ownerDocument)(apiRef.current.rootElementRef.current);
311
- doc.addEventListener('click', handleDocumentClick);
311
+ doc.addEventListener('mouseup', handleDocumentClick);
312
312
  return () => {
313
- doc.removeEventListener('click', handleDocumentClick);
313
+ doc.removeEventListener('mouseup', handleDocumentClick);
314
314
  };
315
315
  }, [apiRef, handleDocumentClick]);
316
316
  (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'columnHeaderBlur', handleBlur);
@@ -20,6 +20,7 @@ var _gridRowsSelector = require("../rows/gridRowsSelector");
20
20
  var _focus = require("../focus");
21
21
  var _gridColumnGroupsSelector = require("../columnGrouping/gridColumnGroupsSelector");
22
22
  var _useGridSelector = require("../../utils/useGridSelector");
23
+ var _pipeProcessing = require("../../core/pipeProcessing");
23
24
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
24
25
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
26
  function enrichPageRowsWithPinnedRows(apiRef, rows) {
@@ -458,6 +459,16 @@ const useGridKeyboardNavigation = (apiRef, props) => {
458
459
  event.preventDefault();
459
460
  }
460
461
  }, [apiRef, currentPageRows, theme.direction, getRowIdFromIndex, goToCell, goToHeader]);
462
+ const checkIfCanStartEditing = React.useCallback((initialValue, {
463
+ event
464
+ }) => {
465
+ if (event.key === ' ') {
466
+ // Space scrolls to the last row
467
+ return false;
468
+ }
469
+ return initialValue;
470
+ }, []);
471
+ (0, _pipeProcessing.useGridRegisterPipeProcessor)(apiRef, 'canStartEditing', checkIfCanStartEditing);
461
472
  (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'columnHeaderKeyDown', handleColumnHeaderKeyDown);
462
473
  (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'columnGroupHeaderKeyDown', handleColumnGroupHeaderKeyDown);
463
474
  (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'cellKeyDown', handleCellKeyDown);
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v6.3.0
2
+ * @mui/x-data-grid v6.4.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -65,12 +65,14 @@ var _exportNames = {
65
65
  useGridVirtualScroller: true,
66
66
  getRenderableIndexes: true,
67
67
  useGridVisibleRows: true,
68
+ getVisibleRows: true,
68
69
  useGridInitializeState: true,
69
70
  getColumnsToExport: true,
70
71
  defaultGetRowsToExport: true,
71
72
  createSelector: true,
72
73
  unstable_resetCreateSelectorCache: true,
73
74
  findParentElementFromClassName: true,
75
+ getActiveElement: true,
74
76
  isNavigationKey: true,
75
77
  clamp: true,
76
78
  isDeepEqual: true,
@@ -79,7 +81,8 @@ var _exportNames = {
79
81
  isObject: true,
80
82
  buildWarning: true,
81
83
  exportAs: true,
82
- useGridPrivateApiContext: true
84
+ useGridPrivateApiContext: true,
85
+ serializeCellValue: true
83
86
  };
84
87
  Object.defineProperty(exports, "DATA_GRID_DEFAULT_SLOTS_COMPONENTS", {
85
88
  enumerable: true,
@@ -213,6 +216,12 @@ Object.defineProperty(exports, "focusStateInitializer", {
213
216
  return _useGridFocus.focusStateInitializer;
214
217
  }
215
218
  });
219
+ Object.defineProperty(exports, "getActiveElement", {
220
+ enumerable: true,
221
+ get: function () {
222
+ return _domUtils.getActiveElement;
223
+ }
224
+ });
216
225
  Object.defineProperty(exports, "getColumnsToExport", {
217
226
  enumerable: true,
218
227
  get: function () {
@@ -237,6 +246,12 @@ Object.defineProperty(exports, "getTreeNodeDescendants", {
237
246
  return _gridRowsUtils.getTreeNodeDescendants;
238
247
  }
239
248
  });
249
+ Object.defineProperty(exports, "getVisibleRows", {
250
+ enumerable: true,
251
+ get: function () {
252
+ return _useGridVisibleRows.getVisibleRows;
253
+ }
254
+ });
240
255
  Object.defineProperty(exports, "gridAdditionalRowGroupsSelector", {
241
256
  enumerable: true,
242
257
  get: function () {
@@ -327,6 +342,12 @@ Object.defineProperty(exports, "rowsStateInitializer", {
327
342
  return _useGridRows.rowsStateInitializer;
328
343
  }
329
344
  });
345
+ Object.defineProperty(exports, "serializeCellValue", {
346
+ enumerable: true,
347
+ get: function () {
348
+ return _csvSerializer.serializeCellValue;
349
+ }
350
+ });
330
351
  Object.defineProperty(exports, "sortingStateInitializer", {
331
352
  enumerable: true,
332
353
  get: function () {
@@ -588,6 +609,7 @@ var _utils2 = require("../utils/utils");
588
609
  var _warning = require("../utils/warning");
589
610
  var _exportAs = require("../utils/exportAs");
590
611
  var _useGridPrivateApiContext = require("../hooks/utils/useGridPrivateApiContext");
612
+ var _csvSerializer = require("../hooks/features/export/serializers/csvSerializer");
591
613
  var _utils3 = require("./utils");
592
614
  Object.keys(_utils3).forEach(function (key) {
593
615
  if (key === "default" || key === "__esModule") return;