@mui/x-data-grid 7.0.0-beta.4 → 7.0.0-beta.6

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 (116) hide show
  1. package/CHANGELOG.md +271 -61
  2. package/DataGrid/DataGrid.js +2 -0
  3. package/colDef/gridBooleanOperators.js +1 -1
  4. package/components/GridPinnedRows.d.ts +1 -2
  5. package/components/GridRow.d.ts +7 -9
  6. package/components/GridRow.js +41 -54
  7. package/components/cell/GridCell.d.ts +2 -3
  8. package/components/cell/GridCell.js +10 -10
  9. package/components/cell/GridSkeletonCell.d.ts +3 -2
  10. package/components/cell/GridSkeletonCell.js +14 -6
  11. package/components/columnSelection/GridCellCheckboxRenderer.js +6 -4
  12. package/components/columnsManagement/GridColumnsManagement.js +1 -1
  13. package/components/containers/GridRootStyles.js +9 -4
  14. package/components/virtualization/GridBottomContainer.js +1 -1
  15. package/components/virtualization/GridTopContainer.js +1 -1
  16. package/components/virtualization/GridVirtualScroller.js +7 -5
  17. package/components/virtualization/GridVirtualScrollerRenderZone.js +9 -3
  18. package/hooks/core/pipeProcessing/useGridPipeProcessing.js +22 -20
  19. package/hooks/features/columnHeaders/useGridColumnHeaders.js +11 -8
  20. package/hooks/features/columns/gridColumnsSelector.d.ts +6 -0
  21. package/hooks/features/columns/gridColumnsSelector.js +8 -1
  22. package/hooks/features/columns/useGridColumns.js +4 -0
  23. package/hooks/features/dimensions/useGridDimensions.js +1 -0
  24. package/hooks/features/editing/useGridRowEditing.js +1 -2
  25. package/hooks/features/filter/useGridFilter.js +2 -2
  26. package/hooks/features/rows/useGridParamsApi.js +6 -10
  27. package/hooks/features/rows/useGridRows.js +8 -4
  28. package/hooks/features/rows/useGridRowsMeta.js +5 -13
  29. package/hooks/features/sorting/gridSortingUtils.js +9 -1
  30. package/hooks/features/sorting/useGridSorting.js +2 -2
  31. package/hooks/features/virtualization/gridVirtualizationSelectors.d.ts +0 -9
  32. package/hooks/features/virtualization/gridVirtualizationSelectors.js +0 -7
  33. package/hooks/features/virtualization/useGridVirtualScroller.d.ts +3 -0
  34. package/hooks/features/virtualization/useGridVirtualScroller.js +88 -138
  35. package/hooks/features/virtualization/useGridVirtualization.d.ts +0 -8
  36. package/hooks/features/virtualization/useGridVirtualization.js +1 -6
  37. package/hooks/utils/useTimeout.d.ts +5 -3
  38. package/hooks/utils/useTimeout.js +13 -5
  39. package/index.js +1 -1
  40. package/internals/index.d.ts +1 -1
  41. package/internals/index.js +1 -1
  42. package/models/api/gridApiCommon.d.ts +2 -1
  43. package/models/api/gridInfiniteLoaderApi.d.ts +6 -0
  44. package/models/api/gridInfiniteLoaderApi.js +1 -0
  45. package/models/colDef/gridColDef.d.ts +7 -0
  46. package/modern/DataGrid/DataGrid.js +2 -0
  47. package/modern/colDef/gridBooleanOperators.js +1 -1
  48. package/modern/components/GridRow.js +40 -53
  49. package/modern/components/cell/GridCell.js +10 -10
  50. package/modern/components/cell/GridSkeletonCell.js +14 -6
  51. package/modern/components/columnSelection/GridCellCheckboxRenderer.js +6 -4
  52. package/modern/components/columnsManagement/GridColumnsManagement.js +1 -1
  53. package/modern/components/containers/GridRootStyles.js +9 -4
  54. package/modern/components/virtualization/GridBottomContainer.js +1 -1
  55. package/modern/components/virtualization/GridTopContainer.js +1 -1
  56. package/modern/components/virtualization/GridVirtualScroller.js +7 -5
  57. package/modern/components/virtualization/GridVirtualScrollerRenderZone.js +8 -3
  58. package/modern/hooks/core/pipeProcessing/useGridPipeProcessing.js +22 -20
  59. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +11 -8
  60. package/modern/hooks/features/columns/gridColumnsSelector.js +8 -1
  61. package/modern/hooks/features/columns/useGridColumns.js +2 -0
  62. package/modern/hooks/features/dimensions/useGridDimensions.js +1 -0
  63. package/modern/hooks/features/editing/useGridRowEditing.js +1 -2
  64. package/modern/hooks/features/filter/useGridFilter.js +2 -2
  65. package/modern/hooks/features/rows/useGridParamsApi.js +6 -10
  66. package/modern/hooks/features/rows/useGridRows.js +8 -4
  67. package/modern/hooks/features/rows/useGridRowsMeta.js +5 -13
  68. package/modern/hooks/features/sorting/gridSortingUtils.js +9 -1
  69. package/modern/hooks/features/sorting/useGridSorting.js +2 -2
  70. package/modern/hooks/features/virtualization/gridVirtualizationSelectors.js +0 -7
  71. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +85 -136
  72. package/modern/hooks/features/virtualization/useGridVirtualization.js +1 -6
  73. package/modern/hooks/utils/useTimeout.js +13 -5
  74. package/modern/index.js +1 -1
  75. package/modern/internals/index.js +1 -1
  76. package/modern/models/api/gridInfiniteLoaderApi.js +1 -0
  77. package/modern/utils/createSelector.js +12 -20
  78. package/modern/utils/utils.js +9 -0
  79. package/node/DataGrid/DataGrid.js +1 -0
  80. package/node/colDef/gridBooleanOperators.js +1 -1
  81. package/node/components/GridRow.js +40 -53
  82. package/node/components/cell/GridCell.js +10 -10
  83. package/node/components/cell/GridSkeletonCell.js +15 -7
  84. package/node/components/columnSelection/GridCellCheckboxRenderer.js +6 -4
  85. package/node/components/columnsManagement/GridColumnsManagement.js +1 -1
  86. package/node/components/containers/GridRootStyles.js +9 -4
  87. package/node/components/virtualization/GridBottomContainer.js +1 -1
  88. package/node/components/virtualization/GridTopContainer.js +1 -1
  89. package/node/components/virtualization/GridVirtualScroller.js +7 -5
  90. package/node/components/virtualization/GridVirtualScrollerRenderZone.js +7 -2
  91. package/node/hooks/core/pipeProcessing/useGridPipeProcessing.js +22 -20
  92. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +8 -5
  93. package/node/hooks/features/columns/gridColumnsSelector.js +9 -2
  94. package/node/hooks/features/columns/useGridColumns.js +2 -0
  95. package/node/hooks/features/dimensions/useGridDimensions.js +1 -0
  96. package/node/hooks/features/editing/useGridRowEditing.js +1 -2
  97. package/node/hooks/features/filter/useGridFilter.js +2 -2
  98. package/node/hooks/features/rows/useGridParamsApi.js +6 -10
  99. package/node/hooks/features/rows/useGridRows.js +8 -4
  100. package/node/hooks/features/rows/useGridRowsMeta.js +5 -13
  101. package/node/hooks/features/sorting/gridSortingUtils.js +9 -1
  102. package/node/hooks/features/sorting/useGridSorting.js +2 -2
  103. package/node/hooks/features/virtualization/gridVirtualizationSelectors.js +1 -8
  104. package/node/hooks/features/virtualization/useGridVirtualScroller.js +86 -136
  105. package/node/hooks/features/virtualization/useGridVirtualization.js +2 -7
  106. package/node/hooks/utils/useTimeout.js +13 -4
  107. package/node/index.js +1 -1
  108. package/node/internals/index.js +0 -7
  109. package/node/models/api/gridInfiniteLoaderApi.js +5 -0
  110. package/node/utils/createSelector.js +14 -23
  111. package/node/utils/utils.js +12 -1
  112. package/package.json +2 -2
  113. package/utils/createSelector.d.ts +0 -1
  114. package/utils/createSelector.js +12 -22
  115. package/utils/utils.d.ts +4 -0
  116. package/utils/utils.js +9 -0
@@ -67,8 +67,10 @@ function GridVirtualScroller(props) {
67
67
  getContentProps,
68
68
  getRenderZoneProps,
69
69
  getScrollbarVerticalProps,
70
- getScrollbarHorizontalProps
70
+ getScrollbarHorizontalProps,
71
+ getRows
71
72
  } = virtualScroller;
73
+ const rows = getRows();
72
74
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridMainContainer.GridMainContainer, (0, _extends2.default)({
73
75
  className: classes.root
74
76
  }, getContainerProps(), {
@@ -83,19 +85,19 @@ function GridVirtualScroller(props) {
83
85
  })]
84
86
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridOverlays.GridOverlays, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollerContent.GridVirtualScrollerContent, (0, _extends2.default)({}, getContentProps(), {
85
87
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridVirtualScrollerRenderZone.GridVirtualScrollerRenderZone, (0, _extends2.default)({}, getRenderZoneProps(), {
86
- children: [virtualScroller.getRows(), /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.detailPanels, {
88
+ children: [rows, /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.detailPanels, {
87
89
  virtualScroller: virtualScroller
88
90
  })]
89
91
  }))
90
- })), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollerFiller.GridVirtualScrollerFiller, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridBottomContainer.GridBottomContainer, {
92
+ })), rows.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollerFiller.GridVirtualScrollerFiller, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridBottomContainer.GridBottomContainer, {
91
93
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.slots.pinnedRows, {
92
94
  position: "bottom",
93
95
  virtualScroller: virtualScroller
94
96
  })
95
97
  })]
96
- })), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollbar.GridVirtualScrollbar, (0, _extends2.default)({
98
+ })), dimensions.hasScrollY && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollbar.GridVirtualScrollbar, (0, _extends2.default)({
97
99
  position: "vertical"
98
- }, getScrollbarVerticalProps())), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollbar.GridVirtualScrollbar, (0, _extends2.default)({
100
+ }, getScrollbarVerticalProps())), dimensions.hasScrollX && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridVirtualScrollbar.GridVirtualScrollbar, (0, _extends2.default)({
99
101
  position: "horizontal"
100
102
  }, getScrollbarHorizontalProps())), props.children]
101
103
  }));
@@ -13,6 +13,7 @@ var _system = require("@mui/system");
13
13
  var _utils = require("@mui/utils");
14
14
  var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
15
15
  var _useGridSelector = require("../../hooks/utils/useGridSelector");
16
+ var _rows = require("../../hooks/features/rows");
16
17
  var _virtualization = require("../../hooks/features/virtualization");
17
18
  var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
18
19
  var _gridClasses = require("../../constants/gridClasses");
@@ -47,13 +48,17 @@ const GridVirtualScrollerRenderZone = exports.GridVirtualScrollerRenderZone = /*
47
48
  const apiRef = (0, _useGridApiContext.useGridApiContext)();
48
49
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
49
50
  const classes = useUtilityClasses(rootProps);
50
- const offsets = (0, _useGridSelector.useGridSelector)(apiRef, _virtualization.gridOffsetsSelector);
51
+ const offsetTop = (0, _useGridSelector.useGridSelector)(apiRef, () => {
52
+ const renderContext = (0, _virtualization.gridRenderContextSelector)(apiRef);
53
+ const rowsMeta = (0, _rows.gridRowsMetaSelector)(apiRef.current.state);
54
+ return rowsMeta.positions[renderContext.firstRowIndex] ?? 0;
55
+ });
51
56
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(VirtualScrollerRenderZoneRoot, (0, _extends2.default)({
52
57
  ref: ref,
53
58
  className: (0, _clsx.default)(classes.root, className),
54
59
  ownerState: rootProps,
55
60
  style: {
56
- transform: `translate3d(0, ${offsets.top}px, 0)`
61
+ transform: `translate3d(0, ${offsetTop}px, 0)`
57
62
  }
58
63
  }, other));
59
64
  });
@@ -41,7 +41,7 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
41
41
  * * `apiRef.current.requestPipeProcessorsApplication` is called for the given group.
42
42
  */
43
43
  const useGridPipeProcessing = apiRef => {
44
- const processorsCache = React.useRef({});
44
+ const cache = React.useRef({});
45
45
  const isRunning = React.useRef(false);
46
46
  const runAppliers = React.useCallback(groupCache => {
47
47
  if (isRunning.current || !groupCache) {
@@ -54,52 +54,54 @@ const useGridPipeProcessing = apiRef => {
54
54
  isRunning.current = false;
55
55
  }, []);
56
56
  const registerPipeProcessor = React.useCallback((group, id, processor) => {
57
- if (!processorsCache.current[group]) {
58
- processorsCache.current[group] = {
57
+ if (!cache.current[group]) {
58
+ cache.current[group] = {
59
59
  processors: new Map(),
60
+ processorsAsArray: [],
60
61
  appliers: {}
61
62
  };
62
63
  }
63
- const groupCache = processorsCache.current[group];
64
+ const groupCache = cache.current[group];
64
65
  const oldProcessor = groupCache.processors.get(id);
65
66
  if (oldProcessor !== processor) {
66
67
  groupCache.processors.set(id, processor);
68
+ groupCache.processorsAsArray = Array.from(cache.current[group].processors.values());
67
69
  runAppliers(groupCache);
68
70
  }
69
71
  return () => {
70
- processorsCache.current[group].processors.set(id, null);
72
+ cache.current[group].processors.delete(id);
73
+ cache.current[group].processorsAsArray = Array.from(cache.current[group].processors.values());
71
74
  };
72
75
  }, [runAppliers]);
73
76
  const registerPipeApplier = React.useCallback((group, id, applier) => {
74
- if (!processorsCache.current[group]) {
75
- processorsCache.current[group] = {
77
+ if (!cache.current[group]) {
78
+ cache.current[group] = {
76
79
  processors: new Map(),
80
+ processorsAsArray: [],
77
81
  appliers: {}
78
82
  };
79
83
  }
80
- processorsCache.current[group].appliers[id] = applier;
84
+ cache.current[group].appliers[id] = applier;
81
85
  return () => {
82
- const _appliers = processorsCache.current[group].appliers,
86
+ const _appliers = cache.current[group].appliers,
83
87
  otherAppliers = (0, _objectWithoutPropertiesLoose2.default)(_appliers, [id].map(_toPropertyKey2.default));
84
- processorsCache.current[group].appliers = otherAppliers;
88
+ cache.current[group].appliers = otherAppliers;
85
89
  };
86
90
  }, []);
87
91
  const requestPipeProcessorsApplication = React.useCallback(group => {
88
- const groupCache = processorsCache.current[group];
89
- runAppliers(groupCache);
92
+ runAppliers(cache.current[group]);
90
93
  }, [runAppliers]);
91
94
  const applyPipeProcessors = React.useCallback((...args) => {
92
95
  const [group, value, context] = args;
93
- if (!processorsCache.current[group]) {
96
+ if (!cache.current[group]) {
94
97
  return value;
95
98
  }
96
- const preProcessors = Array.from(processorsCache.current[group].processors.values());
97
- return preProcessors.reduce((acc, preProcessor) => {
98
- if (!preProcessor) {
99
- return acc;
100
- }
101
- return preProcessor(acc, context);
102
- }, value);
99
+ const processors = cache.current[group].processorsAsArray;
100
+ let result = value;
101
+ for (let i = 0; i < processors.length; i += 1) {
102
+ result = processors[i](result, context);
103
+ }
104
+ return result;
103
105
  }, []);
104
106
  const preProcessingPrivateApi = {
105
107
  registerPipeProcessor,
@@ -16,6 +16,7 @@ var _useGridApiEventHandler = require("../../utils/useGridApiEventHandler");
16
16
  var _GridColumnHeaderItem = require("../../../components/columnHeaders/GridColumnHeaderItem");
17
17
  var _dimensions = require("../dimensions");
18
18
  var _virtualization = require("../virtualization");
19
+ var _useGridVirtualScroller = require("../virtualization/useGridVirtualScroller");
19
20
  var _GridColumnGroupHeader = require("../../../components/columnHeaders/GridColumnGroupHeader");
20
21
  var _columns = require("../columns");
21
22
  var _GridScrollbarFillerCell = require("../../../components/GridScrollbarFillerCell");
@@ -25,7 +26,7 @@ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return
25
26
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
26
27
  const SpaceFiller = (0, _styles.styled)('div')({
27
28
  /* GridRootStyles conflict */
28
- '&&': {
29
+ '&&&': {
29
30
  padding: 0,
30
31
  width: 'calc(var(--DataGrid-width) - var(--DataGrid-columnsTotalWidth))'
31
32
  }
@@ -57,14 +58,16 @@ const useGridColumnHeaders = props => {
57
58
  const [dragCol, setDragCol] = React.useState('');
58
59
  const [resizeCol, setResizeCol] = React.useState('');
59
60
  const apiRef = (0, _useGridPrivateApiContext.useGridPrivateApiContext)();
61
+ const theme = (0, _styles.useTheme)();
60
62
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
61
63
  const hasVirtualization = (0, _utils2.useGridSelector)(apiRef, _virtualization.gridVirtualizationColumnEnabledSelector);
62
64
  const innerRef = React.useRef(null);
63
65
  const handleInnerRef = (0, _utils.unstable_useForkRef)(innerRefProp, innerRef);
64
66
  const dimensions = (0, _utils2.useGridSelector)(apiRef, _dimensions.gridDimensionsSelector);
65
- const offsets = (0, _utils2.useGridSelector)(apiRef, _virtualization.gridOffsetsSelector);
67
+ const columnPositions = (0, _utils2.useGridSelector)(apiRef, _columns.gridColumnPositionsSelector);
66
68
  const renderContext = (0, _utils2.useGridSelector)(apiRef, _virtualization.gridRenderContextColumnsSelector);
67
- const visiblePinnedColumns = (0, _utils2.useGridSelector)(apiRef, _columns.gridVisiblePinnedColumnDefinitionsSelector);
69
+ const pinnedColumns = (0, _utils2.useGridSelector)(apiRef, _columns.gridVisiblePinnedColumnDefinitionsSelector);
70
+ const offsetLeft = (0, _useGridVirtualScroller.computeOffsetLeft)(columnPositions, renderContext, theme.direction, pinnedColumns.left.length);
68
71
  React.useEffect(() => {
69
72
  apiRef.current.columnHeadersContainerElementRef.current.scrollLeft = 0;
70
73
  }, [apiRef]);
@@ -96,8 +99,8 @@ const useGridColumnHeaders = props => {
96
99
  const getFillers = (params, children, leftOverflow, borderTop = false) => {
97
100
  const isPinnedRight = params?.position === _columns.GridPinnedColumnPosition.RIGHT;
98
101
  const isNotPinned = params?.position === undefined;
99
- const hasScrollbarFiller = visiblePinnedColumns.right.length > 0 && isPinnedRight || visiblePinnedColumns.right.length === 0 && isNotPinned;
100
- const leftOffsetWidth = offsets.left - leftOverflow;
102
+ const hasScrollbarFiller = pinnedColumns.right.length > 0 && isPinnedRight || pinnedColumns.right.length === 0 && isNotPinned;
103
+ const leftOffsetWidth = offsetLeft - leftOverflow;
101
104
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(React.Fragment, {
102
105
  children: [isNotPinned && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
103
106
  role: "presentation",
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.gridVisiblePinnedColumnDefinitionsSelector = exports.gridVisibleColumnFieldsSelector = exports.gridVisibleColumnDefinitionsSelector = exports.gridPinnedColumnsSelector = exports.gridFilterableColumnLookupSelector = exports.gridFilterableColumnDefinitionsSelector = exports.gridColumnsTotalWidthSelector = exports.gridColumnsStateSelector = exports.gridColumnVisibilityModelSelector = exports.gridColumnPositionsSelector = exports.gridColumnLookupSelector = exports.gridColumnFieldsSelector = exports.gridColumnDefinitionsSelector = void 0;
6
+ exports.gridVisiblePinnedColumnDefinitionsSelector = exports.gridVisibleColumnFieldsSelector = exports.gridVisibleColumnDefinitionsSelector = exports.gridPinnedColumnsSelector = exports.gridHasColSpanSelector = exports.gridFilterableColumnLookupSelector = exports.gridFilterableColumnDefinitionsSelector = exports.gridColumnsTotalWidthSelector = exports.gridColumnsStateSelector = exports.gridColumnVisibilityModelSelector = exports.gridColumnPositionsSelector = exports.gridColumnLookupSelector = exports.gridColumnFieldsSelector = exports.gridColumnDefinitionsSelector = void 0;
7
7
  var _createSelector = require("../../../utils/createSelector");
8
8
  var _gridColumnsInterfaces = require("./gridColumnsInterfaces");
9
9
  var _gridCoreSelector = require("../../core/gridCoreSelector");
@@ -141,4 +141,11 @@ const gridFilterableColumnLookupSelector = exports.gridFilterableColumnLookupSel
141
141
  acc[col.field] = col;
142
142
  }
143
143
  return acc;
144
- }, {}));
144
+ }, {}));
145
+
146
+ /**
147
+ * Checks if some column has a colSpan field.
148
+ * @category Columns
149
+ * @ignore - Do not document
150
+ */
151
+ const gridHasColSpanSelector = exports.gridHasColSpanSelector = (0, _createSelector.createSelectorMemoized)(gridColumnDefinitionsSelector, columns => columns.some(column => column.colSpan !== undefined));
@@ -55,6 +55,7 @@ function useGridColumns(apiRef, props) {
55
55
  logger.debug('Updating columns state.');
56
56
  apiRef.current.setState(mergeColumnsState(columnsState));
57
57
  apiRef.current.publishEvent('columnsChange', columnsState.orderedFields);
58
+ apiRef.current.updateRenderContext?.();
58
59
  apiRef.current.forceUpdate();
59
60
  }, [logger, apiRef]);
60
61
 
@@ -84,6 +85,7 @@ function useGridColumns(apiRef, props) {
84
85
  keepOnlyColumnsToUpsert: false
85
86
  })
86
87
  }));
88
+ apiRef.current.updateRenderContext?.();
87
89
  apiRef.current.forceUpdate();
88
90
  }
89
91
  }, [apiRef]);
@@ -238,6 +238,7 @@ function useGridDimensions(apiRef, props) {
238
238
  set('--DataGrid-headersTotalHeight', `${dimensions.headersTotalHeight}px`);
239
239
  set('--DataGrid-topContainerHeight', `${dimensions.topContainerHeight}px`);
240
240
  set('--DataGrid-bottomContainerHeight', `${dimensions.bottomContainerHeight}px`);
241
+ set('--height', `${dimensions.rowHeight}px`);
241
242
  }, [root, dimensions]);
242
243
  const isFirstSizing = React.useRef(true);
243
244
  const handleResize = React.useCallback(size => {
@@ -30,7 +30,7 @@ const useGridRowEditing = (apiRef, props) => {
30
30
  const [rowModesModel, setRowModesModel] = React.useState({});
31
31
  const rowModesModelRef = React.useRef(rowModesModel);
32
32
  const prevRowModesModel = React.useRef({});
33
- const focusTimeout = React.useRef(null);
33
+ const focusTimeout = React.useRef();
34
34
  const nextFocusedCell = React.useRef(null);
35
35
  const {
36
36
  processRowUpdate,
@@ -85,7 +85,6 @@ const useGridRowEditing = (apiRef, props) => {
85
85
  // focus we check if the next cell that received focus is from a different row.
86
86
  nextFocusedCell.current = null;
87
87
  focusTimeout.current = setTimeout(() => {
88
- focusTimeout.current = null;
89
88
  if (nextFocusedCell.current?.id !== params.id) {
90
89
  // The row might have been deleted during the click
91
90
  if (!apiRef.current.getRow(params.id)) {
@@ -115,7 +115,7 @@ const useGridFilter = (apiRef, props) => {
115
115
  const filterModel = (0, _gridFilterSelector.gridFilterModelSelector)(apiRef);
116
116
  const existingItems = [...filterModel.items];
117
117
  items.forEach(item => {
118
- const itemIndex = items.findIndex(filterItem => filterItem.id === item.id);
118
+ const itemIndex = existingItems.findIndex(filterItem => filterItem.id === item.id);
119
119
  if (itemIndex === -1) {
120
120
  existingItems.push(item);
121
121
  } else {
@@ -123,7 +123,7 @@ const useGridFilter = (apiRef, props) => {
123
123
  }
124
124
  });
125
125
  apiRef.current.setFilterModel((0, _extends2.default)({}, filterModel, {
126
- items
126
+ items: existingItems
127
127
  }), 'upsertFilterItems');
128
128
  }, [apiRef]);
129
129
  const deleteFilterItem = React.useCallback(itemToDelete => {
@@ -41,12 +41,13 @@ function useGridParamsApi(apiRef) {
41
41
  }, [apiRef]);
42
42
  const getCellParams = React.useCallback((id, field) => {
43
43
  const colDef = apiRef.current.getColumn(field);
44
- const value = apiRef.current.getCellValue(id, field);
45
44
  const row = apiRef.current.getRow(id);
46
45
  const rowNode = apiRef.current.getRowNode(id);
47
46
  if (!row || !rowNode) {
48
47
  throw new MissingRowIdError(`No row with id #${id} found`);
49
48
  }
49
+ const rawValue = row[field];
50
+ const value = colDef?.valueGetter ? colDef.valueGetter(rawValue, row, colDef, apiRef) : rawValue;
50
51
  const cellFocus = (0, _gridFocusStateSelector.gridFocusCellSelector)(apiRef);
51
52
  const cellTabIndex = (0, _gridFocusStateSelector.gridTabIndexCellSelector)(apiRef);
52
53
  const params = {
@@ -70,19 +71,14 @@ function useGridParamsApi(apiRef) {
70
71
  }, [apiRef]);
71
72
  const getCellValue = React.useCallback((id, field) => {
72
73
  const colDef = apiRef.current.getColumn(field);
73
- if (!colDef || !colDef.valueGetter) {
74
- const rowModel = apiRef.current.getRow(id);
75
- if (!rowModel) {
76
- throw new MissingRowIdError(`No row with id #${id} found`);
77
- }
78
- return rowModel[field];
79
- }
80
74
  const row = apiRef.current.getRow(id);
81
75
  if (!row) {
82
76
  throw new MissingRowIdError(`No row with id #${id} found`);
83
77
  }
84
- const value = row[colDef.field];
85
- return colDef.valueGetter(value, row, colDef, apiRef);
78
+ if (!colDef || !colDef.valueGetter) {
79
+ return row[field];
80
+ }
81
+ return colDef.valueGetter(row[colDef.field], row, colDef, apiRef);
86
82
  }, [apiRef]);
87
83
  const getRowValue = React.useCallback((row, colDef) => {
88
84
  const field = colDef.field;
@@ -270,13 +270,16 @@ const useGridRows = (apiRef, props) => {
270
270
  const dataRowIdToIdLookup = (0, _extends2.default)({}, (0, _gridRowsSelector.gridRowsDataRowIdToIdLookupSelector)(apiRef));
271
271
  const rootGroup = tree[_gridRowsUtils.GRID_ROOT_GROUP_ID];
272
272
  const rootGroupChildren = [...rootGroup.children];
273
+ const seenIds = new Set();
273
274
  for (let i = 0; i < newRows.length; i += 1) {
274
275
  const rowModel = newRows[i];
275
276
  const rowId = (0, _gridRowsUtils.getRowIdFromRowModel)(rowModel, props.getRowId, 'A row was provided without id when calling replaceRows().');
276
- const [replacedRowId] = rootGroupChildren.splice(firstRowToRender + i, 1, rowId);
277
- delete dataRowIdToModelLookup[replacedRowId];
278
- delete dataRowIdToIdLookup[replacedRowId];
279
- delete tree[replacedRowId];
277
+ const [removedRowId] = rootGroupChildren.splice(firstRowToRender + i, 1, rowId);
278
+ if (!seenIds.has(removedRowId)) {
279
+ delete dataRowIdToModelLookup[removedRowId];
280
+ delete dataRowIdToIdLookup[removedRowId];
281
+ delete tree[removedRowId];
282
+ }
280
283
  const rowTreeNodeConfig = {
281
284
  id: rowId,
282
285
  depth: 0,
@@ -287,6 +290,7 @@ const useGridRows = (apiRef, props) => {
287
290
  dataRowIdToModelLookup[rowId] = rowModel;
288
291
  dataRowIdToIdLookup[rowId] = rowId;
289
292
  tree[rowId] = rowTreeNodeConfig;
293
+ seenIds.add(rowId);
290
294
  }
291
295
  tree[_gridRowsUtils.GRID_ROOT_GROUP_ID] = (0, _extends2.default)({}, rootGroup, {
292
296
  children: rootGroupChildren
@@ -115,14 +115,9 @@ const useGridRowsMeta = (apiRef, props) => {
115
115
  } else {
116
116
  rowsHeightLookup.current[row.id].needsFirstMeasurement = false;
117
117
  }
118
- const initialHeights = {};
119
- /* eslint-disable-next-line no-restricted-syntax */
120
- for (const key in sizes) {
121
- if (/^base[A-Z]/.test(key)) {
122
- initialHeights[key] = sizes[key];
123
- }
124
- }
125
- initialHeights.baseCenter = baseRowHeight;
118
+ const initialHeights = {
119
+ baseCenter: baseRowHeight
120
+ };
126
121
  if (getRowSpacing) {
127
122
  const indexRelativeToCurrentPage = apiRef.current.getRowIndexRelativeToVisibleRows(row.id);
128
123
  const spacing = getRowSpacing((0, _extends2.default)({}, row, {
@@ -140,19 +135,16 @@ const useGridRowsMeta = (apiRef, props) => {
140
135
  const positions = [];
141
136
  const currentPageTotalHeight = currentPage.rows.reduce((acc, row) => {
142
137
  positions.push(acc);
143
- let maximumBaseSize = 0;
144
138
  let otherSizes = 0;
145
139
  const processedSizes = calculateRowProcessedSizes(row);
146
140
  /* eslint-disable-next-line no-restricted-syntax, guard-for-in */
147
141
  for (const key in processedSizes) {
148
142
  const value = processedSizes[key];
149
- if (/^base[A-Z]/.test(key)) {
150
- maximumBaseSize = value > maximumBaseSize ? value : maximumBaseSize;
151
- } else {
143
+ if (key !== 'baseCenter') {
152
144
  otherSizes += value;
153
145
  }
154
146
  }
155
- return acc + maximumBaseSize + otherSizes;
147
+ return acc + processedSizes.baseCenter + otherSizes;
156
148
  }, 0);
157
149
  pinnedRows?.top?.forEach(row => {
158
150
  calculateRowProcessedSizes(row);
@@ -37,7 +37,15 @@ const parseSortItem = (sortItem, apiRef) => {
37
37
  if (!column || sortItem.sort === null) {
38
38
  return null;
39
39
  }
40
- const comparator = isDesc(sortItem.sort) ? (...args) => -1 * column.sortComparator(...args) : column.sortComparator;
40
+ let comparator;
41
+ if (column.getSortComparator) {
42
+ comparator = column.getSortComparator(sortItem.sort);
43
+ } else {
44
+ comparator = isDesc(sortItem.sort) ? (...args) => -1 * column.sortComparator(...args) : column.sortComparator;
45
+ }
46
+ if (!comparator) {
47
+ return null;
48
+ }
41
49
  const getSortCellParams = id => ({
42
50
  id,
43
51
  field: column.field,
@@ -50,7 +50,7 @@ const useGridSorting = (apiRef, props) => {
50
50
  const existingIdx = sortModel.findIndex(c => c.field === field);
51
51
  let newSortModel = [...sortModel];
52
52
  if (existingIdx > -1) {
53
- if (!sortItem) {
53
+ if (sortItem?.sort == null) {
54
54
  newSortModel.splice(existingIdx, 1);
55
55
  } else {
56
56
  newSortModel.splice(existingIdx, 1, sortItem);
@@ -126,7 +126,7 @@ const useGridSorting = (apiRef, props) => {
126
126
  const sortItem = createSortItem(column, direction);
127
127
  let sortModel;
128
128
  if (!allowMultipleSorting || props.disableMultipleColumnsSorting) {
129
- sortModel = !sortItem ? [] : [sortItem];
129
+ sortModel = sortItem?.sort == null ? [] : [sortItem];
130
130
  } else {
131
131
  sortModel = upsertSortModel(column.field, sortItem);
132
132
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.gridVirtualizationSelector = exports.gridVirtualizationEnabledSelector = exports.gridVirtualizationColumnEnabledSelector = exports.gridRenderContextSelector = exports.gridRenderContextColumnsSelector = exports.gridOffsetsSelector = void 0;
6
+ exports.gridVirtualizationSelector = exports.gridVirtualizationEnabledSelector = exports.gridVirtualizationColumnEnabledSelector = exports.gridRenderContextSelector = exports.gridRenderContextColumnsSelector = void 0;
7
7
  var _createSelector = require("../../../utils/createSelector");
8
8
  /**
9
9
  * Get the columns state
@@ -31,13 +31,6 @@ const gridVirtualizationColumnEnabledSelector = exports.gridVirtualizationColumn
31
31
  */
32
32
  const gridRenderContextSelector = exports.gridRenderContextSelector = (0, _createSelector.createSelector)(gridVirtualizationSelector, state => state.renderContext);
33
33
 
34
- /**
35
- * Get the offsets
36
- * @category Virtualization
37
- * @ignore - do not document.
38
- */
39
- const gridOffsetsSelector = exports.gridOffsetsSelector = (0, _createSelector.createSelector)(gridVirtualizationSelector, state => state.offsets);
40
-
41
34
  /**
42
35
  * Get the render context, with only columns filled in.
43
36
  * This is cached, so it can be used to only re-render when the column interval changes.