@mui/x-data-grid 7.22.2 → 7.23.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 (232) hide show
  1. package/CHANGELOG.md +169 -0
  2. package/DataGrid/DataGrid.js +9 -1
  3. package/README.md +3 -3
  4. package/components/GridDetailPanels.js +0 -1
  5. package/components/GridPinnedRows.js +0 -1
  6. package/components/GridRow.d.ts +2 -2
  7. package/components/GridRow.js +1 -1
  8. package/components/base/GridOverlays.js +5 -6
  9. package/components/cell/GridCell.d.ts +41 -3
  10. package/components/cell/GridCell.js +11 -19
  11. package/components/cell/GridEditInputCell.js +0 -67
  12. package/components/columnsManagement/GridColumnsManagement.d.ts +2 -0
  13. package/components/columnsManagement/GridColumnsManagement.js +53 -6
  14. package/components/panel/GridPanel.d.ts +1 -1
  15. package/components/toolbar/GridToolbar.d.ts +2 -2
  16. package/components/toolbar/GridToolbar.js +12 -4
  17. package/components/toolbar/GridToolbarColumnsButton.js +3 -4
  18. package/components/toolbar/GridToolbarDensitySelector.js +3 -4
  19. package/components/toolbar/GridToolbarExport.d.ts +2 -2
  20. package/components/toolbar/GridToolbarExport.js +4 -3
  21. package/components/toolbar/GridToolbarExportContainer.js +3 -4
  22. package/components/toolbar/GridToolbarFilterButton.d.ts +2 -0
  23. package/components/toolbar/GridToolbarFilterButton.js +7 -6
  24. package/components/toolbar/GridToolbarQuickFilter.js +1 -0
  25. package/components/toolbar/index.d.ts +1 -1
  26. package/constants/dataGridPropsDefaultValues.js +2 -1
  27. package/constants/gridClasses.d.ts +4 -0
  28. package/constants/gridClasses.js +1 -1
  29. package/constants/localeTextConstants.js +1 -0
  30. package/hooks/features/columnHeaders/useGridColumnHeaders.js +2 -2
  31. package/hooks/features/dimensions/useGridDimensions.js +2 -1
  32. package/hooks/features/export/useGridCsvExport.js +1 -1
  33. package/hooks/features/export/useGridPrintExport.js +1 -1
  34. package/hooks/features/index.d.ts +1 -0
  35. package/hooks/features/index.js +1 -0
  36. package/hooks/features/listView/gridListViewSelectors.d.ts +3 -1
  37. package/hooks/features/listView/gridListViewSelectors.js +3 -1
  38. package/hooks/features/listView/index.d.ts +1 -0
  39. package/hooks/features/listView/index.js +1 -0
  40. package/hooks/features/pagination/useGridPaginationModel.js +2 -2
  41. package/hooks/features/rowSelection/useGridRowSelection.js +0 -9
  42. package/hooks/features/rows/gridRowsUtils.d.ts +1 -1
  43. package/hooks/features/rows/gridRowsUtils.js +1 -5
  44. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +1 -1
  45. package/hooks/features/virtualization/useGridVirtualScroller.js +59 -19
  46. package/hooks/utils/useGridSelector.d.ts +3 -2
  47. package/hooks/utils/useGridSelector.js +27 -2
  48. package/index.d.ts +0 -1
  49. package/index.js +1 -1
  50. package/joy/joySlots.js +7 -2
  51. package/locales/arSD.js +1 -0
  52. package/locales/beBY.js +1 -0
  53. package/locales/bgBG.js +2 -0
  54. package/locales/csCZ.js +2 -0
  55. package/locales/daDK.js +2 -0
  56. package/locales/deDE.js +2 -0
  57. package/locales/elGR.js +1 -0
  58. package/locales/esES.js +5 -4
  59. package/locales/faIR.js +2 -0
  60. package/locales/fiFI.js +2 -0
  61. package/locales/frFR.js +2 -0
  62. package/locales/heIL.js +2 -0
  63. package/locales/hrHR.js +2 -0
  64. package/locales/huHU.js +2 -0
  65. package/locales/isIS.js +1 -0
  66. package/locales/itIT.js +2 -0
  67. package/locales/jaJP.js +2 -0
  68. package/locales/koKR.js +1 -0
  69. package/locales/nbNO.js +2 -0
  70. package/locales/nlNL.js +2 -0
  71. package/locales/nnNO.js +2 -0
  72. package/locales/plPL.js +1 -0
  73. package/locales/ptBR.js +1 -0
  74. package/locales/ptPT.js +1 -0
  75. package/locales/roRO.js +1 -0
  76. package/locales/ruRU.js +2 -0
  77. package/locales/skSK.js +1 -0
  78. package/locales/svSE.js +6 -5
  79. package/locales/trTR.js +4 -2
  80. package/locales/ukUA.js +1 -0
  81. package/locales/urPK.js +1 -0
  82. package/locales/viVN.js +2 -0
  83. package/locales/zhCN.js +5 -4
  84. package/locales/zhHK.js +1 -0
  85. package/locales/zhTW.js +1 -0
  86. package/models/api/gridCoreApi.d.ts +1 -1
  87. package/models/api/gridLocaleTextApi.d.ts +1 -0
  88. package/models/colDef/gridColDef.d.ts +24 -24
  89. package/models/gridDataSource.d.ts +12 -12
  90. package/models/props/DataGridProps.d.ts +9 -1
  91. package/modern/DataGrid/DataGrid.js +9 -1
  92. package/modern/components/GridDetailPanels.js +0 -1
  93. package/modern/components/GridPinnedRows.js +0 -1
  94. package/modern/components/GridRow.js +1 -1
  95. package/modern/components/base/GridOverlays.js +5 -6
  96. package/modern/components/cell/GridCell.js +11 -19
  97. package/modern/components/cell/GridEditInputCell.js +0 -67
  98. package/modern/components/columnsManagement/GridColumnsManagement.js +53 -6
  99. package/modern/components/toolbar/GridToolbar.js +12 -4
  100. package/modern/components/toolbar/GridToolbarColumnsButton.js +3 -4
  101. package/modern/components/toolbar/GridToolbarDensitySelector.js +3 -4
  102. package/modern/components/toolbar/GridToolbarExport.js +4 -3
  103. package/modern/components/toolbar/GridToolbarExportContainer.js +3 -4
  104. package/modern/components/toolbar/GridToolbarFilterButton.js +7 -6
  105. package/modern/components/toolbar/GridToolbarQuickFilter.js +1 -0
  106. package/modern/constants/dataGridPropsDefaultValues.js +2 -1
  107. package/modern/constants/gridClasses.js +1 -1
  108. package/modern/constants/localeTextConstants.js +1 -0
  109. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +2 -2
  110. package/modern/hooks/features/dimensions/useGridDimensions.js +2 -1
  111. package/modern/hooks/features/export/useGridCsvExport.js +1 -1
  112. package/modern/hooks/features/export/useGridPrintExport.js +1 -1
  113. package/modern/hooks/features/index.js +1 -0
  114. package/modern/hooks/features/listView/gridListViewSelectors.js +3 -1
  115. package/modern/hooks/features/listView/index.js +1 -0
  116. package/modern/hooks/features/pagination/useGridPaginationModel.js +2 -2
  117. package/modern/hooks/features/rowSelection/useGridRowSelection.js +0 -9
  118. package/modern/hooks/features/rows/gridRowsUtils.js +1 -5
  119. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +59 -19
  120. package/modern/hooks/utils/useGridSelector.js +27 -2
  121. package/modern/index.js +1 -1
  122. package/modern/joy/joySlots.js +7 -2
  123. package/modern/locales/arSD.js +1 -0
  124. package/modern/locales/beBY.js +1 -0
  125. package/modern/locales/bgBG.js +2 -0
  126. package/modern/locales/csCZ.js +2 -0
  127. package/modern/locales/daDK.js +2 -0
  128. package/modern/locales/deDE.js +2 -0
  129. package/modern/locales/elGR.js +1 -0
  130. package/modern/locales/esES.js +5 -4
  131. package/modern/locales/faIR.js +2 -0
  132. package/modern/locales/fiFI.js +2 -0
  133. package/modern/locales/frFR.js +2 -0
  134. package/modern/locales/heIL.js +2 -0
  135. package/modern/locales/hrHR.js +2 -0
  136. package/modern/locales/huHU.js +2 -0
  137. package/modern/locales/isIS.js +1 -0
  138. package/modern/locales/itIT.js +2 -0
  139. package/modern/locales/jaJP.js +2 -0
  140. package/modern/locales/koKR.js +1 -0
  141. package/modern/locales/nbNO.js +2 -0
  142. package/modern/locales/nlNL.js +2 -0
  143. package/modern/locales/nnNO.js +2 -0
  144. package/modern/locales/plPL.js +1 -0
  145. package/modern/locales/ptBR.js +1 -0
  146. package/modern/locales/ptPT.js +1 -0
  147. package/modern/locales/roRO.js +1 -0
  148. package/modern/locales/ruRU.js +2 -0
  149. package/modern/locales/skSK.js +1 -0
  150. package/modern/locales/svSE.js +6 -5
  151. package/modern/locales/trTR.js +4 -2
  152. package/modern/locales/ukUA.js +1 -0
  153. package/modern/locales/urPK.js +1 -0
  154. package/modern/locales/viVN.js +2 -0
  155. package/modern/locales/zhCN.js +5 -4
  156. package/modern/locales/zhHK.js +1 -0
  157. package/modern/locales/zhTW.js +1 -0
  158. package/modern/utils/createSelector.js +11 -1
  159. package/modern/utils/utils.js +1 -3
  160. package/node/DataGrid/DataGrid.js +9 -1
  161. package/node/components/GridDetailPanels.js +0 -1
  162. package/node/components/GridPinnedRows.js +0 -1
  163. package/node/components/GridRow.js +1 -1
  164. package/node/components/base/GridOverlays.js +5 -6
  165. package/node/components/cell/GridCell.js +11 -19
  166. package/node/components/cell/GridEditInputCell.js +0 -67
  167. package/node/components/columnsManagement/GridColumnsManagement.js +53 -6
  168. package/node/components/toolbar/GridToolbar.js +12 -4
  169. package/node/components/toolbar/GridToolbarColumnsButton.js +3 -4
  170. package/node/components/toolbar/GridToolbarDensitySelector.js +3 -4
  171. package/node/components/toolbar/GridToolbarExport.js +4 -3
  172. package/node/components/toolbar/GridToolbarExportContainer.js +3 -4
  173. package/node/components/toolbar/GridToolbarFilterButton.js +7 -6
  174. package/node/components/toolbar/GridToolbarQuickFilter.js +1 -0
  175. package/node/constants/dataGridPropsDefaultValues.js +2 -1
  176. package/node/constants/gridClasses.js +1 -1
  177. package/node/constants/localeTextConstants.js +1 -0
  178. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +2 -2
  179. package/node/hooks/features/dimensions/useGridDimensions.js +2 -1
  180. package/node/hooks/features/export/useGridCsvExport.js +2 -2
  181. package/node/hooks/features/export/useGridPrintExport.js +2 -2
  182. package/node/hooks/features/index.js +11 -0
  183. package/node/hooks/features/listView/gridListViewSelectors.js +3 -1
  184. package/node/hooks/features/listView/index.js +16 -0
  185. package/node/hooks/features/pagination/useGridPaginationModel.js +2 -2
  186. package/node/hooks/features/rowSelection/useGridRowSelection.js +0 -9
  187. package/node/hooks/features/rows/gridRowsUtils.js +2 -8
  188. package/node/hooks/features/virtualization/useGridVirtualScroller.js +59 -19
  189. package/node/hooks/utils/useGridSelector.js +29 -3
  190. package/node/index.js +1 -1
  191. package/node/joy/joySlots.js +7 -2
  192. package/node/locales/arSD.js +1 -0
  193. package/node/locales/beBY.js +1 -0
  194. package/node/locales/bgBG.js +2 -0
  195. package/node/locales/csCZ.js +2 -0
  196. package/node/locales/daDK.js +2 -0
  197. package/node/locales/deDE.js +2 -0
  198. package/node/locales/elGR.js +1 -0
  199. package/node/locales/esES.js +5 -4
  200. package/node/locales/faIR.js +2 -0
  201. package/node/locales/fiFI.js +2 -0
  202. package/node/locales/frFR.js +2 -0
  203. package/node/locales/heIL.js +2 -0
  204. package/node/locales/hrHR.js +2 -0
  205. package/node/locales/huHU.js +2 -0
  206. package/node/locales/isIS.js +1 -0
  207. package/node/locales/itIT.js +2 -0
  208. package/node/locales/jaJP.js +2 -0
  209. package/node/locales/koKR.js +1 -0
  210. package/node/locales/nbNO.js +2 -0
  211. package/node/locales/nlNL.js +2 -0
  212. package/node/locales/nnNO.js +2 -0
  213. package/node/locales/plPL.js +1 -0
  214. package/node/locales/ptBR.js +1 -0
  215. package/node/locales/ptPT.js +1 -0
  216. package/node/locales/roRO.js +1 -0
  217. package/node/locales/ruRU.js +2 -0
  218. package/node/locales/skSK.js +1 -0
  219. package/node/locales/svSE.js +6 -5
  220. package/node/locales/trTR.js +4 -2
  221. package/node/locales/ukUA.js +1 -0
  222. package/node/locales/urPK.js +1 -0
  223. package/node/locales/viVN.js +2 -0
  224. package/node/locales/zhCN.js +5 -4
  225. package/node/locales/zhHK.js +1 -0
  226. package/node/locales/zhTW.js +1 -0
  227. package/node/utils/createSelector.js +11 -1
  228. package/node/utils/utils.js +1 -3
  229. package/package.json +4 -4
  230. package/utils/createSelector.d.ts +1 -1
  231. package/utils/createSelector.js +11 -1
  232. package/utils/utils.js +1 -3
@@ -257,11 +257,7 @@ const useGridRowSelection = (apiRef, props) => {
257
257
  /*
258
258
  * EVENTS
259
259
  */
260
- const isFirstRender = React.useRef(true);
261
260
  const removeOutdatedSelection = React.useCallback((sortModelUpdated = false) => {
262
- if (isFirstRender.current) {
263
- return;
264
- }
265
261
  const currentSelection = (0, _gridRowSelectionSelector.gridRowSelectionStateSelector)(apiRef.current.state);
266
262
  const rowsLookup = (0, _gridRowsSelector.gridRowsLookupSelector)(apiRef);
267
263
  const filteredRowsLookup = (0, _gridFilterSelector.gridFilteredRowsLookupSelector)(apiRef);
@@ -489,10 +485,5 @@ const useGridRowSelection = (apiRef, props) => {
489
485
  React.useEffect(() => {
490
486
  runIfRowSelectionIsEnabled(removeOutdatedSelection);
491
487
  }, [removeOutdatedSelection, runIfRowSelectionIsEnabled]);
492
- React.useEffect(() => {
493
- if (isFirstRender.current) {
494
- isFirstRender.current = false;
495
- }
496
- }, []);
497
488
  };
498
489
  exports.useGridRowSelection = useGridRowSelection;
@@ -8,12 +8,9 @@ exports.buildRootGroup = exports.GRID_ROOT_GROUP_ID = exports.GRID_ID_AUTOGENERA
8
8
  exports.calculatePinnedRowsHeight = calculatePinnedRowsHeight;
9
9
  exports.checkGridRowIdIsValid = checkGridRowIdIsValid;
10
10
  exports.computeRowsUpdates = computeRowsUpdates;
11
- exports.createRowsInternalCache = void 0;
12
- exports.getMinimalContentHeight = getMinimalContentHeight;
13
- exports.updateCacheWithNewRows = exports.rowHeightWarning = exports.isAutogeneratedRowNode = exports.isAutogeneratedRow = exports.getValidRowHeight = exports.getTreeNodeDescendants = exports.getTopLevelRowCount = exports.getRowsStateFromCache = exports.getRowIdFromRowModel = exports.getRowHeightWarning = void 0;
11
+ exports.updateCacheWithNewRows = exports.rowHeightWarning = exports.minimalContentHeight = exports.isAutogeneratedRowNode = exports.isAutogeneratedRow = exports.getValidRowHeight = exports.getTreeNodeDescendants = exports.getTopLevelRowCount = exports.getRowsStateFromCache = exports.getRowIdFromRowModel = exports.getRowHeightWarning = exports.createRowsInternalCache = void 0;
14
12
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
15
13
  var _gridRowsSelector = require("./gridRowsSelector");
16
- var _gridDimensionsSelectors = require("../dimensions/gridDimensionsSelectors");
17
14
  const GRID_ROOT_GROUP_ID = exports.GRID_ROOT_GROUP_ID = `auto-generated-group-node-root`;
18
15
  const GRID_ID_AUTOGENERATED = exports.GRID_ID_AUTOGENERATED = Symbol('mui.id_autogenerated');
19
16
  const buildRootGroup = () => ({
@@ -307,10 +304,7 @@ function calculatePinnedRowsHeight(apiRef) {
307
304
  bottom: bottomPinnedRowsHeight
308
305
  };
309
306
  }
310
- function getMinimalContentHeight(apiRef) {
311
- const dimensions = (0, _gridDimensionsSelectors.gridDimensionsSelector)(apiRef.current.state);
312
- return `var(--DataGrid-overlayHeight, ${2 * dimensions.rowHeight}px)`;
313
- }
307
+ const minimalContentHeight = exports.minimalContentHeight = 'var(--DataGrid-overlayHeight, calc(var(--height) * 2))';
314
308
  function computeRowsUpdates(apiRef, updates, getRowId) {
315
309
  const nonPinnedRowsUpdates = [];
316
310
  updates.forEach(update => {
@@ -15,8 +15,8 @@ var ReactDOM = _interopRequireWildcard(require("react-dom"));
15
15
  var _utils = require("@mui/utils");
16
16
  var _useLazyRef = _interopRequireDefault(require("@mui/utils/useLazyRef"));
17
17
  var _useTimeout = _interopRequireDefault(require("@mui/utils/useTimeout"));
18
- var _useResizeObserver = require("@mui/x-internals/useResizeObserver");
19
18
  var _RtlProvider = require("@mui/system/RtlProvider");
19
+ var _reactMajor = _interopRequireDefault(require("@mui/x-internals/reactMajor"));
20
20
  var _useGridPrivateApiContext = require("../../utils/useGridPrivateApiContext");
21
21
  var _useGridRootProps = require("../../utils/useGridRootProps");
22
22
  var _useGridSelector = require("../../utils/useGridSelector");
@@ -32,11 +32,11 @@ var _utils3 = require("../../../utils/utils");
32
32
  var _gridRowSelectionSelector = require("../rowSelection/gridRowSelectionSelector");
33
33
  var _gridRowsMetaSelector = require("../rows/gridRowsMetaSelector");
34
34
  var _gridColumnsUtils = require("../columns/gridColumnsUtils");
35
- var _gridRowsUtils = require("../rows/gridRowsUtils");
36
35
  var _gridVirtualizationSelectors = require("./gridVirtualizationSelectors");
37
36
  var _useGridVirtualization = require("./useGridVirtualization");
38
37
  var _gridRowSpanningSelectors = require("../rows/gridRowSpanningSelectors");
39
38
  var _gridListViewSelectors = require("../listView/gridListViewSelectors");
39
+ var _gridRowsUtils = require("../rows/gridRowsUtils");
40
40
  var _jsxRuntime = require("react/jsx-runtime");
41
41
  const MINIMUM_COLUMN_WIDTH = 50;
42
42
  var ScrollDirection = /*#__PURE__*/function (ScrollDirection) {
@@ -59,7 +59,7 @@ const createScrollCache = (isRtl, rowBufferPx, columnBufferPx, verticalBuffer, h
59
59
  let isJSDOM = false;
60
60
  try {
61
61
  if (typeof window !== 'undefined') {
62
- isJSDOM = /jsdom/.test(window.navigator.userAgent);
62
+ isJSDOM = /jsdom|HappyDOM/.test(window.navigator.userAgent);
63
63
  }
64
64
  } catch (_) {
65
65
  /* ignore */
@@ -97,7 +97,44 @@ const useGridVirtualScroller = () => {
97
97
  const contentHeight = dimensions.contentSize.height;
98
98
  const columnsTotalWidth = dimensions.columnsTotalWidth;
99
99
  const hasColSpan = (0, _useGridSelector.useGridSelector)(apiRef, _gridColumnsSelector.gridHasColSpanSelector);
100
- (0, _useResizeObserver.useResizeObserver)(mainRef, () => apiRef.current.resize());
100
+ const mainRefCallback = React.useCallback(node => {
101
+ mainRef.current = node;
102
+ if (!node) {
103
+ return undefined;
104
+ }
105
+ const initialRect = node.getBoundingClientRect();
106
+ let lastSize = {
107
+ width: initialRect.width,
108
+ height: initialRect.height
109
+ };
110
+ apiRef.current.publishEvent('resize', lastSize);
111
+ if (typeof ResizeObserver === 'undefined') {
112
+ return undefined;
113
+ }
114
+ const observer = new ResizeObserver(entries => {
115
+ const entry = entries[0];
116
+ if (!entry) {
117
+ return;
118
+ }
119
+ const newSize = {
120
+ width: entry.contentRect.width,
121
+ height: entry.contentRect.height
122
+ };
123
+ if (newSize.width === lastSize.width && newSize.height === lastSize.height) {
124
+ return;
125
+ }
126
+ apiRef.current.publishEvent('resize', newSize);
127
+ lastSize = newSize;
128
+ });
129
+ observer.observe(node);
130
+ if (_reactMajor.default >= 19) {
131
+ return () => {
132
+ mainRef.current = null;
133
+ observer.disconnect();
134
+ };
135
+ }
136
+ return undefined;
137
+ }, [apiRef, mainRef]);
101
138
 
102
139
  /*
103
140
  * Scroll context logic
@@ -148,9 +185,13 @@ const useGridVirtualScroller = () => {
148
185
  previousContextScrollPosition.current = scrollPosition.current;
149
186
  }, [apiRef, dimensions.isReady]);
150
187
  const triggerUpdateRenderContext = (0, _utils.unstable_useEventCallback)(() => {
188
+ const scroller = scrollerRef.current;
189
+ if (!scroller) {
190
+ return undefined;
191
+ }
151
192
  const newScroll = {
152
- top: scrollerRef.current.scrollTop,
153
- left: scrollerRef.current.scrollLeft
193
+ top: scroller.scrollTop,
194
+ left: scroller.scrollLeft
154
195
  };
155
196
  const dx = newScroll.left - scrollPosition.current.left;
156
197
  const dy = newScroll.top - scrollPosition.current.top;
@@ -392,18 +433,14 @@ const useGridVirtualScroller = () => {
392
433
  flexBasis: contentHeight,
393
434
  flexShrink: 0
394
435
  };
395
- if (rootProps.autoHeight && currentPage.rows.length === 0) {
396
- size.flexBasis = (0, _gridRowsUtils.getMinimalContentHeight)(apiRef); // Give room to show the overlay when there no rows.
436
+ if (size.flexBasis === 0) {
437
+ size.flexBasis = _gridRowsUtils.minimalContentHeight; // Give room to show the overlay when there no rows.
397
438
  }
398
439
  return size;
399
- }, [apiRef, columnsTotalWidth, contentHeight, needsHorizontalScrollbar, rootProps.autoHeight, currentPage.rows.length]);
440
+ }, [columnsTotalWidth, contentHeight, needsHorizontalScrollbar]);
400
441
  React.useEffect(() => {
401
442
  apiRef.current.publishEvent('virtualScrollerContentSizeChange');
402
443
  }, [apiRef, contentSize]);
403
- (0, _utils.unstable_useEnhancedEffect)(() => {
404
- // FIXME: Is this really necessary?
405
- apiRef.current.resize();
406
- }, [apiRef, rowsMeta.currentPageTotalHeight]);
407
444
  (0, _utils.unstable_useEnhancedEffect)(() => {
408
445
  // TODO a scroll reset should not be necessary
409
446
  if (enabledForColumns) {
@@ -439,7 +476,7 @@ const useGridVirtualScroller = () => {
439
476
  setPanels,
440
477
  getRows,
441
478
  getContainerProps: () => ({
442
- ref: mainRef
479
+ ref: mainRefCallback
443
480
  }),
444
481
  getScrollerProps: () => ({
445
482
  ref: scrollerRef,
@@ -497,7 +534,8 @@ function inputsSelector(apiRef, rootProps, enabledForRows, enabledForColumns) {
497
534
  pinnedColumns: (0, _gridColumnsSelector.gridVisiblePinnedColumnDefinitionsSelector)(apiRef),
498
535
  visibleColumns,
499
536
  hiddenCellsOriginMap,
500
- listView: rootProps.unstable_listView ?? false
537
+ listView: rootProps.unstable_listView ?? false,
538
+ virtualizeColumnsWithAutoRowHeight: rootProps.virtualizeColumnsWithAutoRowHeight
501
539
  };
502
540
  }
503
541
  function computeRenderContext(inputs, scrollPosition, scrollCache) {
@@ -545,11 +583,13 @@ function computeRenderContext(inputs, scrollPosition, scrollCache) {
545
583
  positions: inputs.rowsMeta.positions,
546
584
  lastSize: inputs.lastRowHeight
547
585
  });
548
- for (let i = firstRowToRender; i < lastRowToRender && !hasRowWithAutoHeight; i += 1) {
549
- const row = inputs.rows[i];
550
- hasRowWithAutoHeight = inputs.apiRef.current.rowHasAutoHeight(row.id);
586
+ if (!inputs.virtualizeColumnsWithAutoRowHeight) {
587
+ for (let i = firstRowToRender; i < lastRowToRender && !hasRowWithAutoHeight; i += 1) {
588
+ const row = inputs.rows[i];
589
+ hasRowWithAutoHeight = inputs.apiRef.current.rowHasAutoHeight(row.id);
590
+ }
551
591
  }
552
- if (!hasRowWithAutoHeight) {
592
+ if (!hasRowWithAutoHeight || inputs.virtualizeColumnsWithAutoRowHeight) {
553
593
  firstColumnIndex = binarySearch(realLeft, inputs.columnPositions, {
554
594
  atStart: true,
555
595
  lastPosition: inputs.columnsTotalWidth
@@ -4,7 +4,7 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useGridSelectorV8 = exports.useGridSelector = exports.objectShallowCompare = void 0;
7
+ exports.useGridSelectorV8 = exports.useGridSelector = exports.objectShallowCompare = exports.argsEqual = void 0;
8
8
  var React = _interopRequireWildcard(require("react"));
9
9
  var _fastObjectShallowCompare = require("@mui/x-internals/fastObjectShallowCompare");
10
10
  var _warning = require("@mui/x-internals/warning");
@@ -30,10 +30,27 @@ function applySelectorV8(apiRef, selector, args, instanceId) {
30
30
  }
31
31
  const defaultCompare = Object.is;
32
32
  const objectShallowCompare = exports.objectShallowCompare = _fastObjectShallowCompare.fastObjectShallowCompare;
33
+ const arrayShallowCompare = (a, b) => {
34
+ if (a === b) {
35
+ return true;
36
+ }
37
+ return a.length === b.length && a.every((v, i) => v === b[i]);
38
+ };
39
+ const argsEqual = (prev, curr) => {
40
+ let fn = Object.is;
41
+ if (curr instanceof Array) {
42
+ fn = arrayShallowCompare;
43
+ } else if (curr instanceof Object) {
44
+ fn = objectShallowCompare;
45
+ }
46
+ return fn(prev, curr);
47
+ };
48
+ exports.argsEqual = argsEqual;
33
49
  const createRefs = () => ({
34
50
  state: null,
35
51
  equals: null,
36
- selector: null
52
+ selector: null,
53
+ args: null
37
54
  });
38
55
 
39
56
  // TODO v8: Remove this function
@@ -79,9 +96,18 @@ const useGridSelectorV8 = (apiRef, selector, args = undefined, equals = defaultC
79
96
  refs.current.state = state;
80
97
  refs.current.equals = equals;
81
98
  refs.current.selector = selector;
99
+ const prevArgs = refs.current.args;
100
+ refs.current.args = args;
101
+ if (didInit && !argsEqual(prevArgs, args)) {
102
+ const newState = applySelectorV8(apiRef, refs.current.selector, refs.current.args, apiRef.current.instanceId);
103
+ if (!refs.current.equals(refs.current.state, newState)) {
104
+ refs.current.state = newState;
105
+ setState(newState);
106
+ }
107
+ }
82
108
  (0, _useOnMount.useOnMount)(() => {
83
109
  return apiRef.current.store.subscribe(() => {
84
- const newState = applySelectorV8(apiRef, refs.current.selector, args, apiRef.current.instanceId);
110
+ const newState = applySelectorV8(apiRef, refs.current.selector, refs.current.args, apiRef.current.instanceId);
85
111
  if (!refs.current.equals(refs.current.state, newState)) {
86
112
  refs.current.state = newState;
87
113
  setState(newState);
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v7.22.2
2
+ * @mui/x-data-grid v7.23.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -30,7 +30,7 @@ var _useGridRootProps = require("../hooks/utils/useGridRootProps");
30
30
  var _hooks = require("../hooks");
31
31
  var _GridOverlay = require("../components/containers/GridOverlay");
32
32
  var _jsxRuntime = require("react/jsx-runtime");
33
- const _excluded = ["slotProps", "variant", "color", "sx"],
33
+ const _excluded = ["slotProps", "variant", "color", "sx", "anchorOrigin"],
34
34
  _excluded2 = ["touchRippleRef", "inputProps", "onChange", "color", "size", "checked", "sx", "value", "inputRef"],
35
35
  _excluded3 = ["onChange", "label", "placeholder", "value", "inputRef", "type", "size", "variant"],
36
36
  _excluded4 = ["startIcon", "color", "endIcon", "size", "sx", "variant"],
@@ -72,10 +72,15 @@ function convertVariant(variant, defaultVariant = 'plain') {
72
72
  const Badge = /*#__PURE__*/React.forwardRef((_ref, ref) => {
73
73
  let {
74
74
  color,
75
- sx
75
+ sx,
76
+ anchorOrigin
76
77
  } = _ref,
77
78
  props = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
78
79
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Badge.default, (0, _extends2.default)({}, props, {
80
+ anchorOrigin: anchorOrigin?.horizontal && anchorOrigin?.vertical ? anchorOrigin : {
81
+ vertical: 'top',
82
+ horizontal: 'right'
83
+ },
79
84
  color: convertColor(color),
80
85
  variant: "plain",
81
86
  sx: sx,
@@ -40,6 +40,7 @@ const arSDGrid = {
40
40
  // columnsManagementNoColumns: 'No columns',
41
41
  // columnsManagementShowHideAllText: 'Show/Hide All',
42
42
  // columnsManagementReset: 'Reset',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
43
44
 
44
45
  // Filter panel text
45
46
  filterPanelAddFilter: 'إضافة مرشِح',
@@ -54,6 +54,7 @@ const beBYGrid = {
54
54
  // columnsManagementNoColumns: 'No columns',
55
55
  // columnsManagementShowHideAllText: 'Show/Hide All',
56
56
  // columnsManagementReset: 'Reset',
57
+ // columnsManagementDeleteIconLabel: 'Clear',
57
58
 
58
59
  // Filter panel text
59
60
  filterPanelAddFilter: 'Дадаць фільтр',
@@ -40,6 +40,8 @@ const bgBGGrid = {
40
40
  columnsManagementNoColumns: 'Няма колони',
41
41
  columnsManagementShowHideAllText: 'Покажи/Скрий Всичко',
42
42
  columnsManagementReset: 'Нулирай',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Добави Филтър',
45
47
  filterPanelRemoveAll: 'Премахни всички',
@@ -48,6 +48,8 @@ const csCZGrid = {
48
48
  columnsManagementNoColumns: 'Žádné sloupce',
49
49
  columnsManagementShowHideAllText: 'Zobrazit/skrýt vše',
50
50
  columnsManagementReset: 'Resetovat',
51
+ // columnsManagementDeleteIconLabel: 'Clear',
52
+
51
53
  // Filter panel text
52
54
  filterPanelAddFilter: 'Přidat filtr',
53
55
  filterPanelRemoveAll: 'Odstranit vše',
@@ -40,6 +40,8 @@ const daDKGrid = {
40
40
  columnsManagementNoColumns: 'Ingen søjler',
41
41
  columnsManagementShowHideAllText: 'Vis/Skjul Alle',
42
42
  columnsManagementReset: 'Nulstil',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Tilføj filter',
45
47
  filterPanelRemoveAll: 'Fjern alle',
@@ -40,6 +40,8 @@ const deDEGrid = {
40
40
  columnsManagementNoColumns: 'Keine Spalten',
41
41
  columnsManagementShowHideAllText: 'Alle anzeigen/verbergen',
42
42
  columnsManagementReset: 'Zurücksetzen',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Filter hinzufügen',
45
47
  filterPanelRemoveAll: 'Alle entfernen',
@@ -40,6 +40,7 @@ const elGRGrid = {
40
40
  // columnsManagementNoColumns: 'No columns',
41
41
  // columnsManagementShowHideAllText: 'Show/Hide All',
42
42
  // columnsManagementReset: 'Reset',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
43
44
 
44
45
  // Filter panel text
45
46
  filterPanelAddFilter: 'Προσθήκη φίλτρου',
@@ -40,6 +40,7 @@ const esESGrid = {
40
40
  columnsManagementNoColumns: 'Sin columnas',
41
41
  columnsManagementShowHideAllText: 'Mostrar/Ocultar todas',
42
42
  columnsManagementReset: 'Restablecer',
43
+ columnsManagementDeleteIconLabel: 'Limpiar',
43
44
  // Filter panel text
44
45
  filterPanelAddFilter: 'Agregar filtro',
45
46
  filterPanelRemoveAll: 'Remover todos',
@@ -53,9 +54,9 @@ const esESGrid = {
53
54
  filterPanelInputPlaceholder: 'Valor de filtro',
54
55
  // Filter operators text
55
56
  filterOperatorContains: 'contiene',
56
- // filterOperatorDoesNotContain: 'does not contain',
57
+ filterOperatorDoesNotContain: 'no contiene',
57
58
  filterOperatorEquals: 'es igual',
58
- // filterOperatorDoesNotEqual: 'does not equal',
59
+ filterOperatorDoesNotEqual: 'es diferente a',
59
60
  filterOperatorStartsWith: 'comienza con',
60
61
  filterOperatorEndsWith: 'termina con',
61
62
  filterOperatorIs: 'es',
@@ -75,9 +76,9 @@ const esESGrid = {
75
76
  'filterOperator<=': '<=',
76
77
  // Header filter operators text
77
78
  headerFilterOperatorContains: 'Contiene',
78
- // headerFilterOperatorDoesNotContain: 'Does not contain',
79
+ headerFilterOperatorDoesNotContain: 'No contiene',
79
80
  headerFilterOperatorEquals: 'Es igual a',
80
- // headerFilterOperatorDoesNotEqual: 'Does not equal',
81
+ headerFilterOperatorDoesNotEqual: 'Es diferente a',
81
82
  headerFilterOperatorStartsWith: 'Comienza con',
82
83
  headerFilterOperatorEndsWith: 'Termina con',
83
84
  headerFilterOperatorIs: 'Es',
@@ -40,6 +40,8 @@ const faIRGrid = {
40
40
  columnsManagementNoColumns: 'بدون سطر',
41
41
  columnsManagementShowHideAllText: 'نمایش/مخفی کردن همه',
42
42
  columnsManagementReset: 'بازنشانی',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'افزودن فیلتر',
45
47
  filterPanelRemoveAll: 'حذف همه',
@@ -40,6 +40,8 @@ const fiFIGrid = {
40
40
  columnsManagementNoColumns: 'Ei sarakkeita näytettäväksi',
41
41
  columnsManagementShowHideAllText: 'Näytä/Piilota kaikki',
42
42
  columnsManagementReset: 'Palauta',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Lisää suodatin',
45
47
  filterPanelRemoveAll: 'Poista kaikki',
@@ -40,6 +40,8 @@ const frFRGrid = {
40
40
  columnsManagementNoColumns: 'Pas de colonnes',
41
41
  columnsManagementShowHideAllText: 'Afficher/masquer toutes',
42
42
  columnsManagementReset: 'Réinitialiser',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Ajouter un filtre',
45
47
  filterPanelRemoveAll: 'Tout supprimer',
@@ -40,6 +40,8 @@ const heILGrid = {
40
40
  columnsManagementNoColumns: 'אין עמודות',
41
41
  columnsManagementShowHideAllText: 'הצג/הסתר הכל',
42
42
  columnsManagementReset: 'אתחול',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'הוסף מסנן',
45
47
  filterPanelRemoveAll: 'מחק הכל',
@@ -48,6 +48,8 @@ const hrHRGrid = {
48
48
  columnsManagementNoColumns: 'Nema stupaca',
49
49
  columnsManagementShowHideAllText: 'Prikaži/Sakrij sve',
50
50
  columnsManagementReset: 'Ponovno namjesti',
51
+ // columnsManagementDeleteIconLabel: 'Clear',
52
+
51
53
  // Filter panel text
52
54
  filterPanelAddFilter: 'Dodaj filter',
53
55
  filterPanelRemoveAll: 'Ukloni sve',
@@ -40,6 +40,8 @@ const huHUGrid = {
40
40
  columnsManagementNoColumns: 'Nincsenek oszlopok',
41
41
  columnsManagementShowHideAllText: 'Összes',
42
42
  columnsManagementReset: 'Visszavon',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Szűrő hozzáadása',
45
47
  filterPanelRemoveAll: 'Összes törlése',
@@ -40,6 +40,7 @@ const isISGrid = {
40
40
  // columnsManagementNoColumns: 'No columns',
41
41
  // columnsManagementShowHideAllText: 'Show/Hide All',
42
42
  // columnsManagementReset: 'Reset',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
43
44
 
44
45
  // Filter panel text
45
46
  filterPanelAddFilter: 'Bæta síu',
@@ -40,6 +40,8 @@ const itITGrid = {
40
40
  columnsManagementNoColumns: 'Nessuna colonna',
41
41
  columnsManagementShowHideAllText: 'Mostra/Nascondi Tutto',
42
42
  columnsManagementReset: 'Resetta',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Aggiungi un filtro',
45
47
  filterPanelRemoveAll: 'Rimuovi filtri',
@@ -40,6 +40,8 @@ const jaJPGrid = {
40
40
  columnsManagementNoColumns: 'カラムなし',
41
41
  columnsManagementShowHideAllText: 'すべて表示/非表示',
42
42
  columnsManagementReset: 'リセット',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'フィルター追加',
45
47
  filterPanelRemoveAll: 'すべて削除',
@@ -40,6 +40,7 @@ const koKRGrid = {
40
40
  // columnsManagementNoColumns: 'No columns',
41
41
  // columnsManagementShowHideAllText: 'Show/Hide All',
42
42
  // columnsManagementReset: 'Reset',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
43
44
 
44
45
  // Filter panel text
45
46
  filterPanelAddFilter: '필터 추가',
@@ -40,6 +40,8 @@ const nbNOGrid = {
40
40
  columnsManagementNoColumns: 'Ingen kolonner',
41
41
  columnsManagementShowHideAllText: 'Vis/skjul alle',
42
42
  columnsManagementReset: 'Nullstill',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Legg til filter',
45
47
  filterPanelRemoveAll: 'Fjern alle',
@@ -40,6 +40,8 @@ const nlNLGrid = {
40
40
  columnsManagementNoColumns: 'Geen kolommen',
41
41
  columnsManagementShowHideAllText: 'Toon/Verberg Alle',
42
42
  columnsManagementReset: 'Reset',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Filter toevoegen',
45
47
  filterPanelRemoveAll: 'Alles verwijderen',
@@ -40,6 +40,8 @@ const nnNOGrid = {
40
40
  columnsManagementNoColumns: 'Ingen kolonner',
41
41
  columnsManagementShowHideAllText: 'Vis/skjul alle',
42
42
  columnsManagementReset: 'Nullstill',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Legg til filter',
45
47
  filterPanelRemoveAll: 'Fjern alle',
@@ -40,6 +40,7 @@ const plPLGrid = {
40
40
  // columnsManagementNoColumns: 'No columns',
41
41
  // columnsManagementShowHideAllText: 'Show/Hide All',
42
42
  // columnsManagementReset: 'Reset',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
43
44
 
44
45
  // Filter panel text
45
46
  filterPanelAddFilter: 'Dodaj filtr',
@@ -40,6 +40,7 @@ const ptBRGrid = {
40
40
  columnsManagementNoColumns: 'Nenhuma coluna',
41
41
  columnsManagementShowHideAllText: 'Mostrar/Ocultar Todas',
42
42
  columnsManagementReset: 'Redefinir',
43
+ columnsManagementDeleteIconLabel: 'Limpar',
43
44
  // Filter panel text
44
45
  filterPanelAddFilter: 'Adicionar filtro',
45
46
  filterPanelRemoveAll: 'Remover todos',
@@ -40,6 +40,7 @@ const ptPTGrid = {
40
40
  columnsManagementNoColumns: 'Sem colunas',
41
41
  columnsManagementShowHideAllText: 'Mostrar/Ocultar Todas',
42
42
  columnsManagementReset: 'Repor',
43
+ columnsManagementDeleteIconLabel: 'Limpar',
43
44
  // Filter panel text
44
45
  filterPanelAddFilter: 'Adicionar filtro',
45
46
  filterPanelRemoveAll: 'Excluir todos',
@@ -40,6 +40,7 @@ const roROGrid = {
40
40
  // columnsManagementNoColumns: 'No columns',
41
41
  // columnsManagementShowHideAllText: 'Show/Hide All',
42
42
  // columnsManagementReset: 'Reset',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
43
44
 
44
45
  // Filter panel text
45
46
  filterPanelAddFilter: 'Adăugare filtru',
@@ -55,6 +55,8 @@ const ruRUGrid = {
55
55
  columnsManagementNoColumns: 'Нет столбцов',
56
56
  columnsManagementShowHideAllText: 'Показать/Скрыть Всё',
57
57
  columnsManagementReset: 'Сбросить',
58
+ // columnsManagementDeleteIconLabel: 'Clear',
59
+
58
60
  // Filter panel text
59
61
  filterPanelAddFilter: 'Добавить фильтр',
60
62
  filterPanelRemoveAll: 'Очистить фильтр',
@@ -48,6 +48,7 @@ const skSKGrid = {
48
48
  columnsManagementNoColumns: 'Žiadne stĺpce',
49
49
  columnsManagementShowHideAllText: 'Zobraziť/Skryť všetko',
50
50
  // columnsManagementReset: 'Reset',
51
+ // columnsManagementDeleteIconLabel: 'Clear',
51
52
 
52
53
  // Filter panel text
53
54
  filterPanelAddFilter: 'Pridať filter',
@@ -39,7 +39,8 @@ const svSEGrid = {
39
39
  columnsManagementSearchTitle: 'Sök',
40
40
  columnsManagementNoColumns: 'Inga kolumner',
41
41
  columnsManagementShowHideAllText: 'Visa/Dölj alla',
42
- // columnsManagementReset: 'Reset',
42
+ columnsManagementReset: 'Återställ',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
43
44
 
44
45
  // Filter panel text
45
46
  filterPanelAddFilter: 'Lägg till filter',
@@ -54,9 +55,9 @@ const svSEGrid = {
54
55
  filterPanelInputPlaceholder: 'Filtervärde',
55
56
  // Filter operators text
56
57
  filterOperatorContains: 'innehåller',
57
- // filterOperatorDoesNotContain: 'does not contain',
58
+ filterOperatorDoesNotContain: 'innehåller inte',
58
59
  filterOperatorEquals: 'lika med',
59
- // filterOperatorDoesNotEqual: 'does not equal',
60
+ filterOperatorDoesNotEqual: 'inte lika med',
60
61
  filterOperatorStartsWith: 'börjar med',
61
62
  filterOperatorEndsWith: 'slutar med',
62
63
  filterOperatorIs: 'är',
@@ -76,9 +77,9 @@ const svSEGrid = {
76
77
  'filterOperator<=': '<=',
77
78
  // Header filter operators text
78
79
  headerFilterOperatorContains: 'Innehåller',
79
- // headerFilterOperatorDoesNotContain: 'Does not contain',
80
+ headerFilterOperatorDoesNotContain: 'Innehåller inte',
80
81
  headerFilterOperatorEquals: 'Lika med',
81
- // headerFilterOperatorDoesNotEqual: 'Does not equal',
82
+ headerFilterOperatorDoesNotEqual: 'Inte lika med',
82
83
  headerFilterOperatorStartsWith: 'Börjar med',
83
84
  headerFilterOperatorEndsWith: 'Slutar med',
84
85
  headerFilterOperatorIs: 'Är',
@@ -40,6 +40,8 @@ const trTRGrid = {
40
40
  columnsManagementNoColumns: 'Kolon yok',
41
41
  columnsManagementShowHideAllText: 'Hepsini Göster/Gizle',
42
42
  columnsManagementReset: 'Sıfırla',
43
+ // columnsManagementDeleteIconLabel: 'Clear',
44
+
43
45
  // Filter panel text
44
46
  filterPanelAddFilter: 'Filtre Ekle',
45
47
  filterPanelRemoveAll: 'Hepsini kaldır',
@@ -75,9 +77,9 @@ const trTRGrid = {
75
77
  'filterOperator<=': '<=',
76
78
  // Header filter operators text
77
79
  headerFilterOperatorContains: 'Şunu içerir',
78
- // headerFilterOperatorDoesNotContain: 'Does not contain',
80
+ headerFilterOperatorDoesNotContain: 'İçermez',
79
81
  headerFilterOperatorEquals: 'Şuna eşittir',
80
- // headerFilterOperatorDoesNotEqual: 'Does not equal',
82
+ headerFilterOperatorDoesNotEqual: 'Eşit değildir',
81
83
  headerFilterOperatorStartsWith: 'Şununla başlar',
82
84
  headerFilterOperatorEndsWith: 'Şununla biter',
83
85
  headerFilterOperatorIs: 'Eşittir',