@mui/x-data-grid 8.0.0-alpha.3 → 8.0.0-alpha.4

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 (98) hide show
  1. package/CHANGELOG.md +274 -0
  2. package/DataGrid/DataGrid.js +5 -5
  3. package/README.md +1 -1
  4. package/components/GridRow.js +1 -1
  5. package/components/cell/GridActionsCell.js +8 -1
  6. package/components/cell/GridCell.js +1 -1
  7. package/components/panel/GridColumnsPanel.js +1 -2
  8. package/components/panel/GridPanelContent.js +7 -3
  9. package/components/panel/GridPanelFooter.d.ts +1 -1
  10. package/components/panel/GridPanelFooter.js +4 -3
  11. package/components/panel/filterPanel/GridFilterForm.js +15 -15
  12. package/constants/dataGridPropsDefaultValues.js +1 -1
  13. package/hooks/core/useGridStateInitialization.js +3 -3
  14. package/hooks/features/columnGrouping/gridColumnGroupsSelector.d.ts +4 -4
  15. package/hooks/features/columnResize/columnResizeSelector.d.ts +1 -1
  16. package/hooks/features/columns/gridColumnsSelector.d.ts +12 -12
  17. package/hooks/features/density/densitySelector.d.ts +1 -1
  18. package/hooks/features/filter/gridFilterSelector.d.ts +17 -17
  19. package/hooks/features/filter/useGridFilter.js +1 -1
  20. package/hooks/features/focus/gridFocusStateSelector.d.ts +8 -8
  21. package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.d.ts +3 -3
  22. package/hooks/features/overlays/useGridOverlays.js +3 -1
  23. package/hooks/features/pagination/gridPaginationSelector.d.ts +15 -9
  24. package/hooks/features/rowSelection/gridRowSelectionSelector.d.ts +3 -3
  25. package/hooks/features/rowSelection/useGridRowSelection.js +5 -4
  26. package/hooks/features/rowSelection/utils.d.ts +1 -1
  27. package/hooks/features/rows/gridRowSpanningSelectors.d.ts +3 -3
  28. package/hooks/features/rows/gridRowsSelector.d.ts +23 -12
  29. package/hooks/features/rows/useGridRowSpanning.d.ts +1 -1
  30. package/hooks/features/rows/useGridRowSpanning.js +16 -8
  31. package/hooks/features/rows/useGridRows.js +5 -5
  32. package/hooks/features/sorting/gridSortingSelector.d.ts +10 -5
  33. package/hooks/features/sorting/gridSortingSelector.js +11 -0
  34. package/hooks/features/sorting/index.d.ts +2 -1
  35. package/hooks/features/sorting/index.js +1 -1
  36. package/hooks/features/sorting/useGridSorting.js +1 -1
  37. package/hooks/features/virtualization/gridVirtualizationSelectors.d.ts +5 -5
  38. package/hooks/features/virtualization/useGridVirtualScroller.js +11 -8
  39. package/hooks/utils/useGridSelector.d.ts +4 -6
  40. package/hooks/utils/useGridSelector.js +6 -44
  41. package/index.js +1 -1
  42. package/internals/index.d.ts +2 -2
  43. package/internals/index.js +2 -2
  44. package/locales/roRO.js +18 -20
  45. package/models/api/gridStateApi.d.ts +1 -1
  46. package/models/controlStateItem.d.ts +2 -2
  47. package/models/props/DataGridProps.d.ts +1 -1
  48. package/modern/DataGrid/DataGrid.js +5 -5
  49. package/modern/components/GridRow.js +1 -1
  50. package/modern/components/cell/GridActionsCell.js +8 -1
  51. package/modern/components/cell/GridCell.js +1 -1
  52. package/modern/components/panel/GridColumnsPanel.js +1 -2
  53. package/modern/components/panel/GridPanelContent.js +7 -3
  54. package/modern/components/panel/GridPanelFooter.js +4 -3
  55. package/modern/components/panel/filterPanel/GridFilterForm.js +15 -15
  56. package/modern/constants/dataGridPropsDefaultValues.js +1 -1
  57. package/modern/hooks/core/useGridStateInitialization.js +3 -3
  58. package/modern/hooks/features/filter/useGridFilter.js +1 -1
  59. package/modern/hooks/features/overlays/useGridOverlays.js +3 -1
  60. package/modern/hooks/features/rowSelection/useGridRowSelection.js +5 -4
  61. package/modern/hooks/features/rows/useGridRowSpanning.js +16 -8
  62. package/modern/hooks/features/rows/useGridRows.js +5 -5
  63. package/modern/hooks/features/sorting/gridSortingSelector.js +11 -0
  64. package/modern/hooks/features/sorting/index.js +1 -1
  65. package/modern/hooks/features/sorting/useGridSorting.js +1 -1
  66. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +11 -8
  67. package/modern/hooks/utils/useGridSelector.js +6 -44
  68. package/modern/index.js +1 -1
  69. package/modern/internals/index.js +2 -2
  70. package/modern/locales/roRO.js +18 -20
  71. package/modern/utils/createSelector.js +1 -120
  72. package/node/DataGrid/DataGrid.js +5 -5
  73. package/node/components/GridRow.js +1 -1
  74. package/node/components/cell/GridActionsCell.js +8 -1
  75. package/node/components/cell/GridCell.js +1 -1
  76. package/node/components/panel/GridColumnsPanel.js +1 -2
  77. package/node/components/panel/GridPanelContent.js +7 -3
  78. package/node/components/panel/GridPanelFooter.js +5 -4
  79. package/node/components/panel/filterPanel/GridFilterForm.js +15 -15
  80. package/node/constants/dataGridPropsDefaultValues.js +1 -1
  81. package/node/hooks/core/useGridStateInitialization.js +3 -3
  82. package/node/hooks/features/filter/useGridFilter.js +1 -1
  83. package/node/hooks/features/overlays/useGridOverlays.js +3 -1
  84. package/node/hooks/features/rowSelection/useGridRowSelection.js +5 -4
  85. package/node/hooks/features/rows/useGridRowSpanning.js +16 -8
  86. package/node/hooks/features/rows/useGridRows.js +5 -5
  87. package/node/hooks/features/sorting/gridSortingSelector.js +12 -1
  88. package/node/hooks/features/sorting/index.js +24 -16
  89. package/node/hooks/features/sorting/useGridSorting.js +1 -1
  90. package/node/hooks/features/virtualization/useGridVirtualScroller.js +11 -8
  91. package/node/hooks/utils/useGridSelector.js +8 -47
  92. package/node/index.js +1 -1
  93. package/node/internals/index.js +8 -22
  94. package/node/locales/roRO.js +18 -20
  95. package/node/utils/createSelector.js +4 -125
  96. package/package.json +1 -1
  97. package/utils/createSelector.d.ts +4 -16
  98. package/utils/createSelector.js +1 -120
@@ -11,7 +11,7 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
11
11
  var React = _interopRequireWildcard(require("react"));
12
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
13
  var _clsx = _interopRequireDefault(require("clsx"));
14
- var _system = require("@mui/system");
14
+ var _styles = require("@mui/material/styles");
15
15
  var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
16
16
  var _gridClasses = require("../../constants/gridClasses");
17
17
  var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
@@ -26,16 +26,17 @@ const useUtilityClasses = ownerState => {
26
26
  };
27
27
  return (0, _composeClasses.default)(slots, _gridClasses.getDataGridUtilityClass, classes);
28
28
  };
29
- const GridPanelFooterRoot = (0, _system.styled)('div', {
29
+ const GridPanelFooterRoot = (0, _styles.styled)('div', {
30
30
  name: 'MuiDataGrid',
31
31
  slot: 'PanelFooter',
32
32
  overridesResolver: (props, styles) => styles.panelFooter
33
33
  })(({
34
34
  theme
35
35
  }) => ({
36
- padding: theme.spacing(0.5),
36
+ padding: theme.spacing(1),
37
37
  display: 'flex',
38
- justifyContent: 'space-between'
38
+ justifyContent: 'space-between',
39
+ borderTop: `1px solid ${theme.palette.divider}`
39
40
  }));
40
41
  function GridPanelFooter(props) {
41
42
  const {
@@ -47,27 +47,22 @@ const GridFilterFormRoot = (0, _styles.styled)('div', {
47
47
  theme
48
48
  }) => ({
49
49
  display: 'flex',
50
- padding: theme.spacing(1)
50
+ gap: theme.spacing(1.5)
51
51
  }));
52
52
  const FilterFormDeleteIcon = (0, _styles.styled)('div', {
53
53
  name: 'MuiDataGrid',
54
54
  slot: 'FilterFormDeleteIcon',
55
55
  overridesResolver: (_, styles) => styles.filterFormDeleteIcon
56
- })(({
57
- theme
58
- }) => ({
56
+ })({
59
57
  flexShrink: 0,
60
- justifyContent: 'flex-end',
61
- marginRight: theme.spacing(0.5),
62
- marginBottom: theme.spacing(0.2)
63
- }));
58
+ justifyContent: 'center'
59
+ });
64
60
  const FilterFormLogicOperatorInput = (0, _styles.styled)('div', {
65
61
  name: 'MuiDataGrid',
66
62
  slot: 'FilterFormLogicOperatorInput',
67
63
  overridesResolver: (_, styles) => styles.filterFormLogicOperatorInput
68
64
  })({
69
- minWidth: 55,
70
- marginRight: 5,
65
+ minWidth: 75,
71
66
  justifyContent: 'end'
72
67
  });
73
68
  const FilterFormColumnInput = (0, _styles.styled)('div', {
@@ -269,7 +264,6 @@ const GridFilterForm = exports.GridFilterForm = /*#__PURE__*/React.forwardRef(fu
269
264
  ownerState: rootProps
270
265
  }, other, {
271
266
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(FilterFormDeleteIcon, (0, _extends2.default)({
272
- variant: "standard",
273
267
  as: rootProps.slots.baseFormControl
274
268
  }, baseFormControlProps, deleteIconProps, {
275
269
  className: (0, _clsx.default)(classes.deleteIcon, baseFormControlProps.className, deleteIconProps.className),
@@ -286,7 +280,8 @@ const GridFilterForm = exports.GridFilterForm = /*#__PURE__*/React.forwardRef(fu
286
280
  })
287
281
  }))
288
282
  })), /*#__PURE__*/(0, _jsxRuntime.jsx)(FilterFormLogicOperatorInput, (0, _extends2.default)({
289
- variant: "standard",
283
+ variant: "outlined",
284
+ size: "small",
290
285
  as: rootProps.slots.baseFormControl
291
286
  }, baseFormControlProps, logicOperatorInputProps, {
292
287
  sx: [hasLogicOperatorColumn ? {
@@ -316,7 +311,8 @@ const GridFilterForm = exports.GridFilterForm = /*#__PURE__*/React.forwardRef(fu
316
311
  }), apiRef.current.getLocaleText(getLogicOperatorLocaleKey(logicOperator))))
317
312
  }))
318
313
  })), /*#__PURE__*/(0, _jsxRuntime.jsxs)(FilterFormColumnInput, (0, _extends2.default)({
319
- variant: "standard",
314
+ variant: "outlined",
315
+ size: "small",
320
316
  as: rootProps.slots.baseFormControl
321
317
  }, baseFormControlProps, columnInputProps, {
322
318
  className: (0, _clsx.default)(classes.columnInput, baseFormControlProps.className, columnInputProps.className),
@@ -341,7 +337,8 @@ const GridFilterForm = exports.GridFilterForm = /*#__PURE__*/React.forwardRef(fu
341
337
  }), getColumnLabel(col)))
342
338
  }))]
343
339
  })), /*#__PURE__*/(0, _jsxRuntime.jsxs)(FilterFormOperatorInput, (0, _extends2.default)({
344
- variant: "standard",
340
+ variant: "outlined",
341
+ size: "small",
345
342
  as: rootProps.slots.baseFormControl
346
343
  }, baseFormControlProps, operatorInputProps, {
347
344
  className: (0, _clsx.default)(classes.operatorInput, baseFormControlProps.className, operatorInputProps.className),
@@ -367,12 +364,15 @@ const GridFilterForm = exports.GridFilterForm = /*#__PURE__*/React.forwardRef(fu
367
364
  }), operator.label || apiRef.current.getLocaleText(`filterOperator${(0, _utils.unstable_capitalize)(operator.value)}`)))
368
365
  }))]
369
366
  })), /*#__PURE__*/(0, _jsxRuntime.jsx)(FilterFormValueInput, (0, _extends2.default)({
370
- variant: "standard",
367
+ variant: "outlined",
368
+ size: "small",
371
369
  as: rootProps.slots.baseFormControl
372
370
  }, baseFormControlProps, valueInputPropsOther, {
373
371
  className: (0, _clsx.default)(classes.valueInput, baseFormControlProps.className, valueInputPropsOther.className),
374
372
  ownerState: rootProps,
375
373
  children: currentOperator?.InputComponent ? /*#__PURE__*/(0, _jsxRuntime.jsx)(currentOperator.InputComponent, (0, _extends2.default)({
374
+ variant: "outlined",
375
+ size: "small",
376
376
  apiRef: apiRef,
377
377
  item: item,
378
378
  applyValue: applyFilterChanges,
@@ -54,11 +54,11 @@ const DATA_GRID_PROPS_DEFAULT_VALUES = exports.DATA_GRID_PROPS_DEFAULT_VALUES =
54
54
  rows: [],
55
55
  rowSelection: true,
56
56
  rowSpacingType: 'margin',
57
+ rowSpanning: false,
57
58
  showCellVerticalBorder: false,
58
59
  showColumnVerticalBorder: false,
59
60
  sortingMode: 'client',
60
61
  sortingOrder: ['asc', 'desc', null],
61
62
  throttleRowsMs: 0,
62
- unstable_rowSpanning: false,
63
63
  virtualizeColumnsWithAutoRowHeight: false
64
64
  };
@@ -32,8 +32,8 @@ const useGridStateInitialization = apiRef => {
32
32
  const updatedControlStateIds = [];
33
33
  Object.keys(controlStateMapRef.current).forEach(stateId => {
34
34
  const controlState = controlStateMapRef.current[stateId];
35
- const oldSubState = controlState.stateSelector(apiRef.current.state, apiRef.current.instanceId);
36
- const newSubState = controlState.stateSelector(newState, apiRef.current.instanceId);
35
+ const oldSubState = controlState.stateSelector(apiRef.current.state, undefined, apiRef.current.instanceId);
36
+ const newSubState = controlState.stateSelector(newState, undefined, apiRef.current.instanceId);
37
37
  if (newSubState === oldSubState) {
38
38
  return;
39
39
  }
@@ -65,7 +65,7 @@ const useGridStateInitialization = apiRef => {
65
65
  hasPropChanged
66
66
  } = updatedControlStateIds[0];
67
67
  const controlState = controlStateMapRef.current[stateId];
68
- const model = controlState.stateSelector(newState, apiRef.current.instanceId);
68
+ const model = controlState.stateSelector(newState, undefined, apiRef.current.instanceId);
69
69
  if (controlState.propOnChange && hasPropChanged) {
70
70
  controlState.propOnChange(model, {
71
71
  reason,
@@ -68,7 +68,7 @@ const useGridFilter = (apiRef, props) => {
68
68
  });
69
69
  const updateFilteredRows = React.useCallback(() => {
70
70
  apiRef.current.setState(state => {
71
- const filterModel = (0, _gridFilterSelector.gridFilterModelSelector)(state, apiRef.current.instanceId);
71
+ const filterModel = (0, _gridFilterSelector.gridFilterModelSelector)(state, undefined, apiRef.current.instanceId);
72
72
  const filterState = apiRef.current.getFilterState(filterModel);
73
73
  const newState = (0, _extends2.default)({}, state, {
74
74
  filter: (0, _extends2.default)({}, state.filter, filterState)
@@ -13,6 +13,7 @@ var _useGridApiContext = require("../../utils/useGridApiContext");
13
13
  var _useGridRootProps = require("../../utils/useGridRootProps");
14
14
  var _filter = require("../filter");
15
15
  var _rows = require("../rows");
16
+ var _gridRowsSelector = require("../rows/gridRowsSelector");
16
17
  var _GridOverlays = require("../../../components/base/GridOverlays");
17
18
  var _jsxRuntime = require("react/jsx-runtime");
18
19
  /**
@@ -24,7 +25,8 @@ const useGridOverlays = () => {
24
25
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
25
26
  const totalRowCount = (0, _utils.useGridSelector)(apiRef, _rows.gridRowCountSelector);
26
27
  const visibleRowCount = (0, _utils.useGridSelector)(apiRef, _filter.gridExpandedRowCountSelector);
27
- const noRows = totalRowCount === 0;
28
+ const pinnedRowsCount = (0, _utils.useGridSelector)(apiRef, _gridRowsSelector.gridPinnedRowsCountSelector);
29
+ const noRows = totalRowCount === 0 && pinnedRowsCount === 0;
28
30
  const loading = (0, _utils.useGridSelector)(apiRef, _rows.gridRowsLoadingSelector);
29
31
  const showNoRowsOverlay = !loading && noRows;
30
32
  const showNoResultsOverlay = !loading && totalRowCount > 0 && visibleRowCount === 0;
@@ -322,11 +322,12 @@ const useGridRowSelection = (apiRef, props) => {
322
322
 
323
323
  const isMultipleSelectionDisabled = !checkboxSelection && !hasCtrlKey && !(0, _keyboardUtils.isKeyboardEvent)(event);
324
324
  const resetSelection = !canHaveMultipleSelection || isMultipleSelectionDisabled;
325
- const isSelected = apiRef.current.isRowSelected(id);
326
- if (resetSelection) {
327
- apiRef.current.selectRow(id, !isMultipleSelectionDisabled ? !isSelected : true, true);
325
+ const selectedRowsCount = apiRef.current.getSelectedRows().size;
326
+ if (canHaveMultipleSelection && selectedRowsCount > 1 && !hasCtrlKey) {
327
+ apiRef.current.selectRow(id, true, resetSelection);
328
328
  } else {
329
- apiRef.current.selectRow(id, !isSelected, false);
329
+ const isSelected = apiRef.current.isRowSelected(id);
330
+ apiRef.current.selectRow(id, !isSelected, resetSelection);
330
331
  }
331
332
  }, [apiRef, canHaveMultipleSelection, checkboxSelection]);
332
333
  const handleRowClick = React.useCallback((params, event) => {
@@ -14,6 +14,7 @@ var _gridColumnsSelector = require("../columns/gridColumnsSelector");
14
14
  var _useGridVisibleRows = require("../../utils/useGridVisibleRows");
15
15
  var _gridVirtualizationSelectors = require("../virtualization/gridVirtualizationSelectors");
16
16
  var _useGridSelector = require("../../utils/useGridSelector");
17
+ var _gridRowsSelector = require("./gridRowsSelector");
17
18
  var _gridRowSpanningUtils = require("./gridRowSpanningUtils");
18
19
  var _gridCheckboxSelectionColDef = require("../../../colDef/gridCheckboxSelectionColDef");
19
20
  const EMPTY_STATE = {
@@ -43,7 +44,7 @@ const computeRowSpanningState = (apiRef, colDefs, visibleRows, range, rangeToPro
43
44
  if (skippedFields.has(colDef.field)) {
44
45
  return;
45
46
  }
46
- for (let index = rangeToProcess.firstRowIndex; index <= rangeToProcess.lastRowIndex; index += 1) {
47
+ for (let index = rangeToProcess.firstRowIndex; index < rangeToProcess.lastRowIndex; index += 1) {
47
48
  const row = visibleRows[index];
48
49
  if (hiddenCells[row.id]?.[colDef.field]) {
49
50
  continue;
@@ -137,7 +138,7 @@ const computeRowSpanningState = (apiRef, colDefs, visibleRows, range, rangeToPro
137
138
  * @requires filterStateInitializer (method) - should be initialized before
138
139
  */
139
140
  const rowSpanningStateInitializer = (state, props, apiRef) => {
140
- if (props.unstable_rowSpanning) {
141
+ if (props.rowSpanning) {
141
142
  const rowIds = state.rows.dataRowIds || [];
142
143
  const orderedFields = state.columns.orderedFields || [];
143
144
  const dataRowIdToModelLookup = state.rows.dataRowIdToModelLookup;
@@ -150,7 +151,7 @@ const rowSpanningStateInitializer = (state, props, apiRef) => {
150
151
  }
151
152
  const rangeToProcess = {
152
153
  firstRowIndex: 0,
153
- lastRowIndex: Math.min(DEFAULT_ROWS_TO_PROCESS - 1, Math.max(rowIds.length - 1, 0))
154
+ lastRowIndex: Math.min(DEFAULT_ROWS_TO_PROCESS, Math.max(rowIds.length, 0))
154
155
  };
155
156
  const rows = rowIds.map(id => ({
156
157
  id,
@@ -182,10 +183,11 @@ const useGridRowSpanning = (apiRef, props) => {
182
183
  } = (0, _useGridVisibleRows.useGridVisibleRows)(apiRef, props);
183
184
  const renderContext = (0, _useGridSelector.useGridSelector)(apiRef, _gridVirtualizationSelectors.gridRenderContextSelector);
184
185
  const colDefs = (0, _useGridSelector.useGridSelector)(apiRef, _gridColumnsSelector.gridVisibleColumnDefinitionsSelector);
186
+ const tree = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridRowTreeSelector);
185
187
  const processedRange = (0, _useLazyRef.default)(() => {
186
188
  return Object.keys(apiRef.current.state.rowSpanning.spannedCells).length > 0 ? {
187
189
  firstRowIndex: 0,
188
- lastRowIndex: Math.min(DEFAULT_ROWS_TO_PROCESS - 1, Math.max(apiRef.current.state.rows.dataRowIds.length - 1, 0))
190
+ lastRowIndex: Math.min(DEFAULT_ROWS_TO_PROCESS, Math.max(apiRef.current.state.rows.dataRowIds.length, 0))
189
191
  } : EMPTY_RANGE;
190
192
  });
191
193
  const lastRange = React.useRef(EMPTY_RANGE);
@@ -197,7 +199,7 @@ const useGridRowSpanning = (apiRef, props) => {
197
199
  // - The `paginationModel` is updated
198
200
  // - The rows are updated
199
201
  (resetState = true) => {
200
- if (!props.unstable_rowSpanning) {
202
+ if (!props.rowSpanning) {
201
203
  if (apiRef.current.state.rowSpanning !== EMPTY_STATE) {
202
204
  apiRef.current.setState(state => (0, _extends2.default)({}, state, {
203
205
  rowSpanning: EMPTY_STATE
@@ -213,7 +215,7 @@ const useGridRowSpanning = (apiRef, props) => {
213
215
  }
214
216
  const rangeToProcess = (0, _gridRowSpanningUtils.getUnprocessedRange)({
215
217
  firstRowIndex: renderContext.firstRowIndex,
216
- lastRowIndex: Math.min(renderContext.lastRowIndex - 1, range.lastRowIndex)
218
+ lastRowIndex: Math.min(renderContext.lastRowIndex, range.lastRowIndex + 1)
217
219
  }, processedRange.current);
218
220
  if (rangeToProcess === null) {
219
221
  return;
@@ -242,15 +244,21 @@ const useGridRowSpanning = (apiRef, props) => {
242
244
  }
243
245
  });
244
246
  });
245
- }, [apiRef, props.unstable_rowSpanning, range, renderContext, visibleRows, colDefs, processedRange]);
247
+ }, [apiRef, props.rowSpanning, range, renderContext, visibleRows, colDefs, processedRange]);
246
248
  const prevRenderContext = React.useRef(renderContext);
247
249
  const isFirstRender = React.useRef(true);
248
250
  const shouldResetState = React.useRef(false);
251
+ const previousTree = React.useRef(tree);
249
252
  React.useEffect(() => {
250
253
  const firstRender = isFirstRender.current;
251
254
  if (isFirstRender.current) {
252
255
  isFirstRender.current = false;
253
256
  }
257
+ if (tree !== previousTree.current) {
258
+ previousTree.current = tree;
259
+ updateRowSpanningState(true);
260
+ return;
261
+ }
254
262
  if (range && lastRange.current && (0, _gridRowSpanningUtils.isRowRangeUpdated)(range, lastRange.current)) {
255
263
  lastRange.current = range;
256
264
  shouldResetState.current = true;
@@ -264,6 +272,6 @@ const useGridRowSpanning = (apiRef, props) => {
264
272
  return;
265
273
  }
266
274
  updateRowSpanningState();
267
- }, [updateRowSpanningState, renderContext, range, lastRange]);
275
+ }, [updateRowSpanningState, renderContext, range, lastRange, tree]);
268
276
  };
269
277
  exports.useGridRowSpanning = useGridRowSpanning;
@@ -248,7 +248,7 @@ const useGridRows = (apiRef, props) => {
248
248
  throw new Error(`MUI X: The row reordering do not support reordering of footer or grouping rows.`);
249
249
  }
250
250
  apiRef.current.setState(state => {
251
- const group = (0, _gridRowsSelector.gridRowTreeSelector)(state, apiRef.current.instanceId)[_gridRowsUtils.GRID_ROOT_GROUP_ID];
251
+ const group = (0, _gridRowsSelector.gridRowTreeSelector)(state, undefined, apiRef.current.instanceId)[_gridRowsUtils.GRID_ROOT_GROUP_ID];
252
252
  const allRows = group.children;
253
253
  const oldIndex = allRows.findIndex(row => row === rowId);
254
254
  if (oldIndex === -1 || oldIndex === targetIndex) {
@@ -401,10 +401,10 @@ const useGridRows = (apiRef, props) => {
401
401
  const applyHydrateRowsProcessor = React.useCallback(() => {
402
402
  apiRef.current.setState(state => {
403
403
  const response = apiRef.current.unstable_applyPipeProcessors('hydrateRows', {
404
- tree: (0, _gridRowsSelector.gridRowTreeSelector)(state, apiRef.current.instanceId),
405
- treeDepths: (0, _gridRowsSelector.gridRowTreeDepthsSelector)(state, apiRef.current.instanceId),
406
- dataRowIds: (0, _gridRowsSelector.gridDataRowIdsSelector)(state, apiRef.current.instanceId),
407
- dataRowIdToModelLookup: (0, _gridRowsSelector.gridRowsLookupSelector)(state, apiRef.current.instanceId)
404
+ tree: (0, _gridRowsSelector.gridRowTreeSelector)(state, undefined, apiRef.current.instanceId),
405
+ treeDepths: (0, _gridRowsSelector.gridRowTreeDepthsSelector)(state, undefined, apiRef.current.instanceId),
406
+ dataRowIds: (0, _gridRowsSelector.gridDataRowIdsSelector)(state, undefined, apiRef.current.instanceId),
407
+ dataRowIdToModelLookup: (0, _gridRowsSelector.gridRowsLookupSelector)(state, undefined, apiRef.current.instanceId)
408
408
  });
409
409
  return (0, _extends2.default)({}, state, {
410
410
  rows: (0, _extends2.default)({}, state.rows, response, {
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.gridSortedRowIdsSelector = exports.gridSortedRowEntriesSelector = exports.gridSortModelSelector = exports.gridSortColumnLookupSelector = void 0;
6
+ exports.gridSortedRowIndexLookupSelector = exports.gridSortedRowIdsSelector = exports.gridSortedRowEntriesSelector = exports.gridSortModelSelector = exports.gridSortColumnLookupSelector = void 0;
7
7
  var _createSelector = require("../../../utils/createSelector");
8
8
  var _gridRowsSelector = require("../rows/gridRowsSelector");
9
9
  var _gridRowsUtils = require("../rows/gridRowsUtils");
@@ -61,4 +61,15 @@ const gridSortColumnLookupSelector = exports.gridSortColumnLookupSelector = (0,
61
61
  return res;
62
62
  }, {});
63
63
  return result;
64
+ });
65
+
66
+ /**
67
+ * @category Sorting
68
+ * @ignore - do not document.
69
+ */
70
+ const gridSortedRowIndexLookupSelector = exports.gridSortedRowIndexLookupSelector = (0, _createSelector.createSelectorMemoized)(gridSortedRowIdsSelector, sortedIds => {
71
+ return sortedIds.reduce((acc, id, index) => {
72
+ acc[id] = index;
73
+ return acc;
74
+ }, Object.create(null));
64
75
  });
@@ -3,11 +3,6 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var _exportNames = {
7
- gridDateComparator: true,
8
- gridNumberComparator: true,
9
- gridStringOrNumberComparator: true
10
- };
11
6
  Object.defineProperty(exports, "gridDateComparator", {
12
7
  enumerable: true,
13
8
  get: function () {
@@ -20,6 +15,30 @@ Object.defineProperty(exports, "gridNumberComparator", {
20
15
  return _gridSortingUtils.gridNumberComparator;
21
16
  }
22
17
  });
18
+ Object.defineProperty(exports, "gridSortColumnLookupSelector", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _gridSortingSelector.gridSortColumnLookupSelector;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "gridSortModelSelector", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _gridSortingSelector.gridSortModelSelector;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "gridSortedRowEntriesSelector", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _gridSortingSelector.gridSortedRowEntriesSelector;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "gridSortedRowIdsSelector", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _gridSortingSelector.gridSortedRowIdsSelector;
40
+ }
41
+ });
23
42
  Object.defineProperty(exports, "gridStringOrNumberComparator", {
24
43
  enumerable: true,
25
44
  get: function () {
@@ -27,15 +46,4 @@ Object.defineProperty(exports, "gridStringOrNumberComparator", {
27
46
  }
28
47
  });
29
48
  var _gridSortingSelector = require("./gridSortingSelector");
30
- Object.keys(_gridSortingSelector).forEach(function (key) {
31
- if (key === "default" || key === "__esModule") return;
32
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
33
- if (key in exports && exports[key] === _gridSortingSelector[key]) return;
34
- Object.defineProperty(exports, key, {
35
- enumerable: true,
36
- get: function () {
37
- return _gridSortingSelector[key];
38
- }
39
- });
40
- });
41
49
  var _gridSortingUtils = require("./gridSortingUtils");
@@ -97,7 +97,7 @@ const useGridSorting = (apiRef, props) => {
97
97
  })
98
98
  });
99
99
  }
100
- const sortModel = (0, _gridSortingSelector.gridSortModelSelector)(state, apiRef.current.instanceId);
100
+ const sortModel = (0, _gridSortingSelector.gridSortModelSelector)(state, undefined, apiRef.current.instanceId);
101
101
  const sortRowList = (0, _gridSortingUtils.buildAggregatedSortingApplier)(sortModel, apiRef);
102
102
  const sortedRows = apiRef.current.applyStrategyProcessor('sorting', {
103
103
  sortRowList
@@ -103,10 +103,7 @@ const useGridVirtualScroller = () => {
103
103
  return undefined;
104
104
  }
105
105
  const initialRect = node.getBoundingClientRect();
106
- let lastSize = {
107
- width: initialRect.width,
108
- height: initialRect.height
109
- };
106
+ let lastSize = roundDimensions(initialRect);
110
107
  apiRef.current.publishEvent('resize', lastSize);
111
108
  if (typeof ResizeObserver === 'undefined') {
112
109
  return undefined;
@@ -116,10 +113,7 @@ const useGridVirtualScroller = () => {
116
113
  if (!entry) {
117
114
  return;
118
115
  }
119
- const newSize = {
120
- width: entry.contentRect.width,
121
- height: entry.contentRect.height
122
- };
116
+ const newSize = roundDimensions(entry.contentRect);
123
117
  if (newSize.width === lastSize.width && newSize.height === lastSize.height) {
124
118
  return;
125
119
  }
@@ -796,4 +790,13 @@ function bufferForDirection(isRtl, direction, rowBufferPx, columnBufferPx, verti
796
790
  // eslint unable to figure out enum exhaustiveness
797
791
  throw new Error('unreachable');
798
792
  }
793
+ }
794
+
795
+ // Round to avoid issues with subpixel rendering
796
+ // https://github.com/mui/mui-x/issues/15721
797
+ function roundDimensions(dimensions) {
798
+ return {
799
+ width: Math.round(dimensions.width * 10) / 10,
800
+ height: Math.round(dimensions.height * 10) / 10
801
+ };
799
802
  }
@@ -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 = exports.argsEqual = void 0;
7
+ 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");
@@ -13,20 +13,11 @@ var _useOnMount = require("./useOnMount");
13
13
  function isOutputSelector(selector) {
14
14
  return selector.acceptsApiRef;
15
15
  }
16
- // TODO v8: Remove this function
17
- function applySelector(apiRef, selector) {
18
- if (isOutputSelector(selector)) {
19
- return selector(apiRef);
20
- }
21
- return selector(apiRef.current.state);
22
- }
23
-
24
- // TODO v8: Rename this function to `applySelector`
25
- function applySelectorV8(apiRef, selector, args, instanceId) {
16
+ function applySelector(apiRef, selector, args, instanceId) {
26
17
  if (isOutputSelector(selector)) {
27
18
  return selector(apiRef, args);
28
19
  }
29
- return selector(apiRef.current.state, instanceId);
20
+ return selector(apiRef.current.state, args, instanceId);
30
21
  }
31
22
  const defaultCompare = Object.is;
32
23
  const objectShallowCompare = exports.objectShallowCompare = _fastObjectShallowCompare.fastObjectShallowCompare;
@@ -52,37 +43,7 @@ const createRefs = () => ({
52
43
  selector: null,
53
44
  args: null
54
45
  });
55
-
56
- // TODO v8: Remove this function
57
- const useGridSelector = (apiRef, selector, equals = defaultCompare) => {
58
- if (process.env.NODE_ENV !== 'production') {
59
- if (!apiRef.current.state) {
60
- (0, _warning.warnOnce)(['MUI X: `useGridSelector` has been called before the initialization of the state.', 'This hook can only be used inside the context of the grid.']);
61
- }
62
- }
63
- const refs = (0, _useLazyRef.useLazyRef)(createRefs);
64
- const didInit = refs.current.selector !== null;
65
- const [state, setState] = React.useState(
66
- // We don't use an initialization function to avoid allocations
67
- didInit ? null : applySelector(apiRef, selector));
68
- refs.current.state = state;
69
- refs.current.equals = equals;
70
- refs.current.selector = selector;
71
- (0, _useOnMount.useOnMount)(() => {
72
- return apiRef.current.store.subscribe(() => {
73
- const newState = applySelector(apiRef, refs.current.selector);
74
- if (!refs.current.equals(refs.current.state, newState)) {
75
- refs.current.state = newState;
76
- setState(newState);
77
- }
78
- });
79
- });
80
- return state;
81
- };
82
-
83
- // TODO v8: Rename this function to `useGridSelector`
84
- exports.useGridSelector = useGridSelector;
85
- const useGridSelectorV8 = (apiRef, selector, args = undefined, equals = defaultCompare) => {
46
+ const useGridSelector = (apiRef, selector, args = undefined, equals = defaultCompare) => {
86
47
  if (process.env.NODE_ENV !== 'production') {
87
48
  if (!apiRef.current.state) {
88
49
  (0, _warning.warnOnce)(['MUI X: `useGridSelector` has been called before the initialization of the state.', 'This hook can only be used inside the context of the grid.']);
@@ -92,14 +53,14 @@ const useGridSelectorV8 = (apiRef, selector, args = undefined, equals = defaultC
92
53
  const didInit = refs.current.selector !== null;
93
54
  const [state, setState] = React.useState(
94
55
  // We don't use an initialization function to avoid allocations
95
- didInit ? null : applySelectorV8(apiRef, selector, args, apiRef.current.instanceId));
56
+ didInit ? null : applySelector(apiRef, selector, args, apiRef.current.instanceId));
96
57
  refs.current.state = state;
97
58
  refs.current.equals = equals;
98
59
  refs.current.selector = selector;
99
60
  const prevArgs = refs.current.args;
100
61
  refs.current.args = args;
101
62
  if (didInit && !argsEqual(prevArgs, args)) {
102
- const newState = applySelectorV8(apiRef, refs.current.selector, refs.current.args, apiRef.current.instanceId);
63
+ const newState = applySelector(apiRef, refs.current.selector, refs.current.args, apiRef.current.instanceId);
103
64
  if (!refs.current.equals(refs.current.state, newState)) {
104
65
  refs.current.state = newState;
105
66
  setState(newState);
@@ -107,7 +68,7 @@ const useGridSelectorV8 = (apiRef, selector, args = undefined, equals = defaultC
107
68
  }
108
69
  (0, _useOnMount.useOnMount)(() => {
109
70
  return apiRef.current.store.subscribe(() => {
110
- const newState = applySelectorV8(apiRef, refs.current.selector, refs.current.args, apiRef.current.instanceId);
71
+ const newState = applySelector(apiRef, refs.current.selector, refs.current.args, apiRef.current.instanceId);
111
72
  if (!refs.current.equals(refs.current.state, newState)) {
112
73
  refs.current.state = newState;
113
74
  setState(newState);
@@ -116,4 +77,4 @@ const useGridSelectorV8 = (apiRef, selector, args = undefined, equals = defaultC
116
77
  });
117
78
  return state;
118
79
  };
119
- exports.useGridSelectorV8 = useGridSelectorV8;
80
+ exports.useGridSelector = useGridSelector;
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v8.0.0-alpha.3
2
+ * @mui/x-data-grid v8.0.0-alpha.4
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -73,6 +73,7 @@ var _exportNames = {
73
73
  useGridRowSelectionPreProcessors: true,
74
74
  useGridSorting: true,
75
75
  sortingStateInitializer: true,
76
+ gridSortedRowIndexLookupSelector: true,
76
77
  useGridScroll: true,
77
78
  useGridEvents: true,
78
79
  dimensionsStateInitializer: true,
@@ -92,10 +93,7 @@ var _exportNames = {
92
93
  getColumnsToExport: true,
93
94
  defaultGetRowsToExport: true,
94
95
  createSelector: true,
95
- createSelectorV8: true,
96
96
  createSelectorMemoized: true,
97
- createSelectorMemoizedV8: true,
98
- useGridSelectorV8: true,
99
97
  findParentElementFromClassName: true,
100
98
  getActiveElement: true,
101
99
  isEventTargetInPortal: true,
@@ -220,18 +218,6 @@ Object.defineProperty(exports, "createSelectorMemoized", {
220
218
  return _createSelector.createSelectorMemoized;
221
219
  }
222
220
  });
223
- Object.defineProperty(exports, "createSelectorMemoizedV8", {
224
- enumerable: true,
225
- get: function () {
226
- return _createSelector.createSelectorMemoizedV8;
227
- }
228
- });
229
- Object.defineProperty(exports, "createSelectorV8", {
230
- enumerable: true,
231
- get: function () {
232
- return _createSelector.createSelectorV8;
233
- }
234
- });
235
221
  Object.defineProperty(exports, "defaultGetRowsToExport", {
236
222
  enumerable: true,
237
223
  get: function () {
@@ -370,6 +356,12 @@ Object.defineProperty(exports, "gridRowGroupsToFetchSelector", {
370
356
  return _gridRowsSelector.gridRowGroupsToFetchSelector;
371
357
  }
372
358
  });
359
+ Object.defineProperty(exports, "gridSortedRowIndexLookupSelector", {
360
+ enumerable: true,
361
+ get: function () {
362
+ return _gridSortingSelector.gridSortedRowIndexLookupSelector;
363
+ }
364
+ });
373
365
  Object.defineProperty(exports, "headerFilteringStateInitializer", {
374
366
  enumerable: true,
375
367
  get: function () {
@@ -676,12 +668,6 @@ Object.defineProperty(exports, "useGridScroll", {
676
668
  return _useGridScroll.useGridScroll;
677
669
  }
678
670
  });
679
- Object.defineProperty(exports, "useGridSelectorV8", {
680
- enumerable: true,
681
- get: function () {
682
- return _useGridSelector.useGridSelectorV8;
683
- }
684
- });
685
671
  Object.defineProperty(exports, "useGridSorting", {
686
672
  enumerable: true,
687
673
  get: function () {
@@ -791,6 +777,7 @@ var _useGridHeaderFiltering = require("../hooks/features/headerFiltering/useGrid
791
777
  var _useGridRowSelection = require("../hooks/features/rowSelection/useGridRowSelection");
792
778
  var _useGridRowSelectionPreProcessors = require("../hooks/features/rowSelection/useGridRowSelectionPreProcessors");
793
779
  var _useGridSorting = require("../hooks/features/sorting/useGridSorting");
780
+ var _gridSortingSelector = require("../hooks/features/sorting/gridSortingSelector");
794
781
  var _useGridScroll = require("../hooks/features/scroll/useGridScroll");
795
782
  var _useGridEvents = require("../hooks/features/events/useGridEvents");
796
783
  var _useGridDimensions = require("../hooks/features/dimensions/useGridDimensions");
@@ -828,7 +815,6 @@ Object.keys(_createControllablePromise).forEach(function (key) {
828
815
  });
829
816
  });
830
817
  var _createSelector = require("../utils/createSelector");
831
- var _useGridSelector = require("../hooks/utils/useGridSelector");
832
818
  var _domUtils = require("../utils/domUtils");
833
819
  var _keyboardUtils = require("../utils/keyboardUtils");
834
820
  var _utils3 = require("../utils/utils");