@mui/x-data-grid 6.0.0-beta.2 → 6.0.0-beta.3

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 (82) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/components/GridRow.js +2 -6
  3. package/components/cell/GridActionsCell.js +24 -13
  4. package/components/cell/GridActionsCellItem.js +6 -3
  5. package/components/columnHeaders/ColumnHeaderMenuIcon.js +5 -4
  6. package/components/columnHeaders/GridColumnHeaderFilterIconButton.js +6 -6
  7. package/components/columnHeaders/GridColumnHeaderSortIcon.js +5 -4
  8. package/components/panel/filterPanel/GridFilterForm.js +8 -8
  9. package/components/toolbar/GridToolbarFilterButton.js +10 -7
  10. package/components/toolbar/GridToolbarQuickFilter.js +6 -6
  11. package/constants/defaultGridSlotsComponents.js +2 -0
  12. package/hooks/features/columnHeaders/useGridColumnHeaders.js +5 -3
  13. package/hooks/features/editing/useGridCellEditing.js +4 -1
  14. package/hooks/features/editing/useGridEditing.js +1 -1
  15. package/hooks/features/editing/useGridRowEditing.js +3 -0
  16. package/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +71 -10
  17. package/hooks/features/scroll/useGridScroll.js +7 -3
  18. package/hooks/features/virtualization/useGridVirtualScroller.js +20 -7
  19. package/index.js +1 -1
  20. package/legacy/components/GridRow.js +2 -6
  21. package/legacy/components/cell/GridActionsCell.js +28 -17
  22. package/legacy/components/cell/GridActionsCellItem.js +6 -3
  23. package/legacy/components/columnHeaders/ColumnHeaderMenuIcon.js +5 -4
  24. package/legacy/components/columnHeaders/GridColumnHeaderFilterIconButton.js +6 -6
  25. package/legacy/components/columnHeaders/GridColumnHeaderSortIcon.js +5 -4
  26. package/legacy/components/panel/filterPanel/GridFilterForm.js +8 -8
  27. package/legacy/components/toolbar/GridToolbarFilterButton.js +8 -2
  28. package/legacy/components/toolbar/GridToolbarQuickFilter.js +6 -6
  29. package/legacy/constants/defaultGridSlotsComponents.js +2 -0
  30. package/legacy/hooks/features/columnHeaders/useGridColumnHeaders.js +5 -3
  31. package/legacy/hooks/features/editing/useGridCellEditing.js +4 -1
  32. package/legacy/hooks/features/editing/useGridEditing.js +1 -1
  33. package/legacy/hooks/features/editing/useGridRowEditing.js +3 -0
  34. package/legacy/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +69 -10
  35. package/legacy/hooks/features/scroll/useGridScroll.js +7 -3
  36. package/legacy/hooks/features/virtualization/useGridVirtualScroller.js +20 -7
  37. package/legacy/index.js +1 -1
  38. package/legacy/utils/domUtils.js +8 -6
  39. package/models/api/gridEditingApi.d.ts +2 -2
  40. package/models/gridFilterOperator.d.ts +6 -0
  41. package/models/gridSlotsComponent.d.ts +5 -0
  42. package/models/gridSlotsComponentsProps.d.ts +1 -0
  43. package/modern/components/GridRow.js +2 -6
  44. package/modern/components/cell/GridActionsCell.js +23 -13
  45. package/modern/components/cell/GridActionsCellItem.js +5 -3
  46. package/modern/components/columnHeaders/ColumnHeaderMenuIcon.js +4 -4
  47. package/modern/components/columnHeaders/GridColumnHeaderFilterIconButton.js +4 -4
  48. package/modern/components/columnHeaders/GridColumnHeaderSortIcon.js +4 -4
  49. package/modern/components/panel/filterPanel/GridFilterForm.js +4 -4
  50. package/modern/components/toolbar/GridToolbarFilterButton.js +7 -1
  51. package/modern/components/toolbar/GridToolbarQuickFilter.js +4 -4
  52. package/modern/constants/defaultGridSlotsComponents.js +2 -0
  53. package/modern/hooks/features/columnHeaders/useGridColumnHeaders.js +5 -3
  54. package/modern/hooks/features/editing/useGridCellEditing.js +4 -1
  55. package/modern/hooks/features/editing/useGridEditing.js +1 -1
  56. package/modern/hooks/features/editing/useGridRowEditing.js +3 -0
  57. package/modern/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +71 -10
  58. package/modern/hooks/features/scroll/useGridScroll.js +7 -3
  59. package/modern/hooks/features/virtualization/useGridVirtualScroller.js +20 -7
  60. package/modern/index.js +1 -1
  61. package/modern/utils/domUtils.js +8 -6
  62. package/node/components/GridRow.js +2 -6
  63. package/node/components/cell/GridActionsCell.js +23 -13
  64. package/node/components/cell/GridActionsCellItem.js +5 -3
  65. package/node/components/columnHeaders/ColumnHeaderMenuIcon.js +4 -4
  66. package/node/components/columnHeaders/GridColumnHeaderFilterIconButton.js +4 -4
  67. package/node/components/columnHeaders/GridColumnHeaderSortIcon.js +4 -4
  68. package/node/components/panel/filterPanel/GridFilterForm.js +4 -4
  69. package/node/components/toolbar/GridToolbarFilterButton.js +7 -1
  70. package/node/components/toolbar/GridToolbarQuickFilter.js +4 -4
  71. package/node/constants/defaultGridSlotsComponents.js +2 -0
  72. package/node/hooks/features/columnHeaders/useGridColumnHeaders.js +4 -2
  73. package/node/hooks/features/editing/useGridCellEditing.js +4 -1
  74. package/node/hooks/features/editing/useGridEditing.js +1 -1
  75. package/node/hooks/features/editing/useGridRowEditing.js +3 -0
  76. package/node/hooks/features/keyboardNavigation/useGridKeyboardNavigation.js +71 -10
  77. package/node/hooks/features/scroll/useGridScroll.js +7 -3
  78. package/node/hooks/features/virtualization/useGridVirtualScroller.js +20 -7
  79. package/node/index.js +1 -1
  80. package/node/utils/domUtils.js +8 -6
  81. package/package.json +3 -3
  82. package/utils/domUtils.js +8 -6
@@ -10,8 +10,8 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
11
11
  var React = _interopRequireWildcard(require("react"));
12
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
- var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
14
13
  var _MenuList = _interopRequireDefault(require("@mui/material/MenuList"));
14
+ var _styles = require("@mui/material/styles");
15
15
  var _utils = require("@mui/utils");
16
16
  var _gridClasses = require("../../constants/gridClasses");
17
17
  var _GridMenu = require("../menu/GridMenu");
@@ -39,9 +39,17 @@ function GridActionsCell(props) {
39
39
  const buttonRef = React.useRef(null);
40
40
  const ignoreCallToFocus = React.useRef(false);
41
41
  const touchRippleRefs = React.useRef({});
42
+ const theme = (0, _styles.useTheme)();
42
43
  const menuId = (0, _utils.unstable_useId)();
43
44
  const buttonId = (0, _utils.unstable_useId)();
44
45
  const rootProps = (0, _useGridRootProps.useGridRootProps)();
46
+ if (!hasActions(colDef)) {
47
+ throw new Error('MUI: Missing the `getActions` property in the `GridColDef`.');
48
+ }
49
+ const options = colDef.getActions(apiRef.current.getRowParams(id));
50
+ const iconButtons = options.filter(option => !option.props.showInMenu);
51
+ const menuButtons = options.filter(option => option.props.showInMenu);
52
+ const numberOfButtons = iconButtons.length + (menuButtons.length ? 1 : 0);
45
53
  React.useLayoutEffect(() => {
46
54
  if (!hasFocus) {
47
55
  Object.entries(touchRippleRefs.current).forEach(([index, ref]) => {
@@ -77,13 +85,6 @@ function GridActionsCell(props) {
77
85
  }
78
86
  }
79
87
  }), []);
80
- if (!hasActions(colDef)) {
81
- throw new Error('MUI: Missing the `getActions` property in the `GridColDef`.');
82
- }
83
- const options = colDef.getActions(apiRef.current.getRowParams(id));
84
- const iconButtons = options.filter(option => !option.props.showInMenu);
85
- const menuButtons = options.filter(option => option.props.showInMenu);
86
- const numberOfButtons = iconButtons.length + (menuButtons.length ? 1 : 0);
87
88
  React.useEffect(() => {
88
89
  if (focusedButtonIndex >= numberOfButtons) {
89
90
  setFocusedButtonIndex(numberOfButtons - 1);
@@ -113,9 +114,17 @@ function GridActionsCell(props) {
113
114
  }
114
115
  let newIndex = focusedButtonIndex;
115
116
  if (event.key === 'ArrowRight') {
116
- newIndex += 1;
117
+ if (theme.direction === 'rtl') {
118
+ newIndex -= 1;
119
+ } else {
120
+ newIndex += 1;
121
+ }
117
122
  } else if (event.key === 'ArrowLeft') {
118
- newIndex -= 1;
123
+ if (theme.direction === 'rtl') {
124
+ newIndex += 1;
125
+ } else {
126
+ newIndex -= 1;
127
+ }
119
128
  }
120
129
  if (newIndex < 0 || newIndex >= numberOfButtons) {
121
130
  return; // We're already in the first or last item = do nothing and let the grid listen the event
@@ -147,7 +156,7 @@ function GridActionsCell(props) {
147
156
  touchRippleRef: handleTouchRippleRef(index),
148
157
  onClick: handleButtonClick(index, button.props.onClick),
149
158
  tabIndex: focusedButtonIndex === index ? tabIndex : -1
150
- })), menuButtons.length > 0 && buttonId && /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
159
+ })), menuButtons.length > 0 && buttonId && /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.BaseIconButton, (0, _extends2.default)({
151
160
  ref: buttonRef,
152
161
  id: buttonId,
153
162
  "aria-label": apiRef.current.getLocaleText('actionsCellMore'),
@@ -158,11 +167,12 @@ function GridActionsCell(props) {
158
167
  size: "small",
159
168
  onClick: showMenu,
160
169
  touchRippleRef: handleTouchRippleRef(buttonId),
161
- tabIndex: focusedButtonIndex === iconButtons.length ? tabIndex : -1,
170
+ tabIndex: focusedButtonIndex === iconButtons.length ? tabIndex : -1
171
+ }, rootProps.componentsProps?.baseIconButton, {
162
172
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.MoreActionsIcon, {
163
173
  fontSize: "small"
164
174
  })
165
- }), menuButtons.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridMenu.GridMenu, {
175
+ })), menuButtons.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridMenu.GridMenu, {
166
176
  onClickAway: hideMenu,
167
177
  onClick: hideMenu,
168
178
  open: open,
@@ -9,9 +9,9 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
9
9
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
- var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
13
12
  var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
14
13
  var _ListItemIcon = _interopRequireDefault(require("@mui/material/ListItemIcon"));
14
+ var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
15
15
  var _jsxRuntime = require("react/jsx-runtime");
16
16
  const _excluded = ["label", "icon", "showInMenu", "onClick"];
17
17
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -24,19 +24,21 @@ const GridActionsCellItem = /*#__PURE__*/React.forwardRef((props, ref) => {
24
24
  onClick
25
25
  } = props,
26
26
  other = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
27
+ const rootProps = (0, _useGridRootProps.useGridRootProps)();
27
28
  const handleClick = event => {
28
29
  if (onClick) {
29
30
  onClick(event);
30
31
  }
31
32
  };
32
33
  if (!showInMenu) {
33
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, (0, _extends2.default)({
34
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.BaseIconButton, (0, _extends2.default)({
34
35
  ref: ref,
35
36
  size: "small",
36
37
  role: "menuitem",
37
38
  "aria-label": label
38
39
  }, other, {
39
- onClick: handleClick,
40
+ onClick: handleClick
41
+ }, rootProps.componentsProps?.baseIconButton, {
40
42
  children: /*#__PURE__*/React.cloneElement(icon, {
41
43
  fontSize: 'small'
42
44
  })
@@ -8,7 +8,6 @@ exports.ColumnHeaderMenuIcon = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _utils = require("@mui/utils");
11
- var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
12
11
  var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
13
12
  var _gridClasses = require("../../constants/gridClasses");
14
13
  var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
@@ -47,7 +46,7 @@ const ColumnHeaderMenuIcon = /*#__PURE__*/React.memo(props => {
47
46
  }, [apiRef, colDef.field]);
48
47
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
49
48
  className: classes.root,
50
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
49
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.BaseIconButton, (0, _extends2.default)({
51
50
  ref: iconButtonRef,
52
51
  tabIndex: -1,
53
52
  className: classes.button,
@@ -58,11 +57,12 @@ const ColumnHeaderMenuIcon = /*#__PURE__*/React.memo(props => {
58
57
  "aria-expanded": open ? 'true' : undefined,
59
58
  "aria-haspopup": "true",
60
59
  "aria-controls": columnMenuId,
61
- id: columnMenuButtonId,
60
+ id: columnMenuButtonId
61
+ }, rootProps.componentsProps?.baseIconButton, {
62
62
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.ColumnMenuIcon, {
63
63
  fontSize: "small"
64
64
  })
65
- })
65
+ }))
66
66
  });
67
67
  });
68
68
  exports.ColumnHeaderMenuIcon = ColumnHeaderMenuIcon;
@@ -9,7 +9,6 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
9
9
  var React = _interopRequireWildcard(require("react"));
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _utils = require("@mui/utils");
12
- var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
13
12
  var _Badge = _interopRequireDefault(require("@mui/material/Badge"));
14
13
  var _gridPreferencePanelSelector = require("../../hooks/features/preferencesPanel/gridPreferencePanelSelector");
15
14
  var _gridPreferencePanelsValue = require("../../hooks/features/preferencesPanel/gridPreferencePanelsValue");
@@ -60,17 +59,18 @@ function GridColumnHeaderFilterIconButton(props) {
60
59
  if (!counter) {
61
60
  return null;
62
61
  }
63
- const iconButton = /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
62
+ const iconButton = /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.BaseIconButton, (0, _extends2.default)({
64
63
  onClick: toggleFilter,
65
64
  color: "default",
66
65
  "aria-label": apiRef.current.getLocaleText('columnHeaderFiltersLabel'),
67
66
  size: "small",
68
- tabIndex: -1,
67
+ tabIndex: -1
68
+ }, rootProps.componentsProps?.baseIconButton, {
69
69
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.ColumnFilteredIcon, {
70
70
  className: classes.icon,
71
71
  fontSize: "small"
72
72
  })
73
- });
73
+ }));
74
74
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.BaseTooltip, (0, _extends2.default)({
75
75
  title: apiRef.current.getLocaleText('columnHeaderFiltersTooltipActive')(counter),
76
76
  enterDelay: 1000
@@ -10,7 +10,6 @@ var React = _interopRequireWildcard(require("react"));
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _utils = require("@mui/utils");
12
12
  var _Badge = _interopRequireDefault(require("@mui/material/Badge"));
13
- var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
14
13
  var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
15
14
  var _gridClasses = require("../../constants/gridClasses");
16
15
  var _useGridRootProps = require("../../hooks/utils/useGridRootProps");
@@ -59,13 +58,14 @@ function GridColumnHeaderSortIconRaw(props) {
59
58
  if (!iconElement) {
60
59
  return null;
61
60
  }
62
- const iconButton = /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
61
+ const iconButton = /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.BaseIconButton, (0, _extends2.default)({
63
62
  tabIndex: -1,
64
63
  "aria-label": apiRef.current.getLocaleText('columnHeaderSortIconLabel'),
65
64
  title: apiRef.current.getLocaleText('columnHeaderSortIconLabel'),
66
- size: "small",
65
+ size: "small"
66
+ }, rootProps.componentsProps?.baseIconButton, {
67
67
  children: iconElement
68
- });
68
+ }));
69
69
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_GridIconButtonContainer.GridIconButtonContainer, {
70
70
  children: [index != null && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Badge.default, {
71
71
  badgeContent: index,
@@ -10,7 +10,6 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _utils = require("@mui/utils");
13
- var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
14
13
  var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
15
14
  var _InputLabel = _interopRequireDefault(require("@mui/material/InputLabel"));
16
15
  var _FormControl = _interopRequireDefault(require("@mui/material/FormControl"));
@@ -243,15 +242,16 @@ const GridFilterForm = /*#__PURE__*/React.forwardRef(function GridFilterForm(pro
243
242
  as: rootProps.components.BaseFormControl
244
243
  }, baseFormControlProps, deleteIconProps, {
245
244
  className: (0, _clsx.default)(classes.deleteIcon, baseFormControlProps.className, deleteIconProps.className),
246
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
245
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.BaseIconButton, (0, _extends2.default)({
247
246
  "aria-label": apiRef.current.getLocaleText('filterPanelDeleteIconLabel'),
248
247
  title: apiRef.current.getLocaleText('filterPanelDeleteIconLabel'),
249
248
  onClick: handleDeleteFilter,
250
- size: "small",
249
+ size: "small"
250
+ }, rootProps.componentsProps?.baseIconButton, {
251
251
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.FilterPanelDeleteIcon, {
252
252
  fontSize: "small"
253
253
  })
254
- })
254
+ }))
255
255
  })), /*#__PURE__*/(0, _jsxRuntime.jsx)(FilterFormLogicOperatorInput, (0, _extends2.default)({
256
256
  variant: "standard",
257
257
  as: rootProps.components.BaseFormControl
@@ -66,13 +66,19 @@ const GridToolbarFilterButton = /*#__PURE__*/React.forwardRef(function GridToolb
66
66
  return apiRef.current.getLocaleText('toolbarFiltersTooltipShow');
67
67
  }
68
68
  const getOperatorLabel = item => lookup[item.field].filterOperators.find(operator => operator.value === item.operator).label || apiRef.current.getLocaleText(`filterOperator${(0, _utils.unstable_capitalize)(item.operator)}`).toString();
69
+ const getFilterItemValue = item => {
70
+ const {
71
+ getValueAsString
72
+ } = lookup[item.field].filterOperators.find(operator => operator.value === item.operator);
73
+ return getValueAsString ? getValueAsString(item.value) : item.value;
74
+ };
69
75
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
70
76
  children: [apiRef.current.getLocaleText('toolbarFiltersTooltipActive')(activeFilters.length), /*#__PURE__*/(0, _jsxRuntime.jsx)(GridToolbarFilterListRoot, {
71
77
  className: classes.root,
72
78
  children: activeFilters.map((item, index) => (0, _extends2.default)({}, lookup[item.field] && /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
73
79
  children: `${lookup[item.field].headerName || item.field}
74
80
  ${getOperatorLabel(item)}
75
- ${item.value ?? ''}`
81
+ ${item.value ? getFilterItemValue(item) : ''}`
76
82
  }, index)))
77
83
  })]
78
84
  });
@@ -10,7 +10,6 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
10
10
  var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _TextField = _interopRequireDefault(require("@mui/material/TextField"));
13
- var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
14
13
  var _styles = require("@mui/material/styles");
15
14
  var _utils = require("@mui/utils");
16
15
  var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
@@ -100,17 +99,18 @@ function GridToolbarQuickFilter(props) {
100
99
  startAdornment: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.QuickFilterIcon, {
101
100
  fontSize: "small"
102
101
  }),
103
- endAdornment: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
102
+ endAdornment: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.BaseIconButton, (0, _extends2.default)({
104
103
  "aria-label": apiRef.current.getLocaleText('toolbarQuickFilterDeleteIconLabel'),
105
104
  size: "small",
106
105
  sx: {
107
106
  visibility: searchValue ? 'visible' : 'hidden'
108
107
  },
109
- onClick: handleSearchReset,
108
+ onClick: handleSearchReset
109
+ }, rootProps.componentsProps?.baseIconButton, {
110
110
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(rootProps.components.QuickFilterClearIcon, {
111
111
  fontSize: "small"
112
112
  })
113
- })
113
+ }))
114
114
  }
115
115
  }, other, rootProps.componentsProps?.baseTextField));
116
116
  }
@@ -12,6 +12,7 @@ var _FormControl = _interopRequireDefault(require("@mui/material/FormControl"));
12
12
  var _Select = _interopRequireDefault(require("@mui/material/Select"));
13
13
  var _Switch = _interopRequireDefault(require("@mui/material/Switch"));
14
14
  var _Button = _interopRequireDefault(require("@mui/material/Button"));
15
+ var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
15
16
  var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
16
17
  var _Popper = _interopRequireDefault(require("@mui/material/Popper"));
17
18
  var _components = require("../components");
@@ -58,6 +59,7 @@ const DATA_GRID_DEFAULT_SLOTS_COMPONENTS = (0, _extends2.default)({}, DEFAULT_GR
58
59
  BaseSelect: _Select.default,
59
60
  BaseSwitch: _Switch.default,
60
61
  BaseButton: _Button.default,
62
+ BaseIconButton: _IconButton.default,
61
63
  BaseTooltip: _Tooltip.default,
62
64
  BasePopper: _Popper.default,
63
65
  Cell: _components.GridCell,
@@ -45,6 +45,7 @@ const useGridColumnHeaders = props => {
45
45
  innerRef: innerRefProp,
46
46
  minColumnIndex = 0
47
47
  } = props;
48
+ const theme = (0, _styles.useTheme)();
48
49
  const [dragCol, setDragCol] = React.useState('');
49
50
  const [resizeCol, setResizeCol] = React.useState('');
50
51
  const apiRef = (0, _useGridPrivateApiContext.useGridPrivateApiContext)();
@@ -96,9 +97,10 @@ const useGridColumnHeaders = props => {
96
97
  apiRef,
97
98
  visibleRows: currentPage.rows
98
99
  });
99
- const offset = firstColumnToRender > 0 ? prevScrollLeft.current - columnPositions[firstColumnToRender] : prevScrollLeft.current;
100
+ const direction = theme.direction === 'ltr' ? 1 : -1;
101
+ const offset = firstColumnToRender > 0 ? prevScrollLeft.current - direction * columnPositions[firstColumnToRender] : prevScrollLeft.current;
100
102
  innerRef.current.style.transform = `translate3d(${-offset}px, 0px, 0px)`;
101
- }, [columnPositions, minColumnIndex, rootProps.columnBuffer, apiRef, currentPage.rows, rootProps.rowBuffer]);
103
+ }, [columnPositions, minColumnIndex, rootProps.columnBuffer, apiRef, currentPage.rows, rootProps.rowBuffer, theme.direction]);
102
104
  React.useLayoutEffect(() => {
103
105
  if (renderContext) {
104
106
  updateInnerPosition(renderContext);
@@ -391,10 +391,13 @@ const useGridCellEditing = (apiRef, props) => {
391
391
  const getRowWithUpdatedValuesFromCellEditing = React.useCallback((id, field) => {
392
392
  const column = apiRef.current.getColumn(field);
393
393
  const editingState = (0, _gridEditingSelectors.gridEditRowsStateSelector)(apiRef.current.state);
394
+ const row = apiRef.current.getRow(id);
395
+ if (!editingState[id] || !editingState[id][field]) {
396
+ return apiRef.current.getRow(id);
397
+ }
394
398
  const {
395
399
  value
396
400
  } = editingState[id][field];
397
- const row = apiRef.current.getRow(id);
398
401
  return column.valueSetter ? column.valueSetter({
399
402
  value,
400
403
  row
@@ -127,7 +127,7 @@ const useGridEditing = (apiRef, props) => {
127
127
  const editingSharedApi = {
128
128
  isCellEditable,
129
129
  setEditCellValue,
130
- unstable_getRowWithUpdatedValues: getRowWithUpdatedValues,
130
+ getRowWithUpdatedValues,
131
131
  unstable_getEditCellMeta: getEditCellMeta
132
132
  };
133
133
  const editingSharedPrivateApi = {
@@ -512,6 +512,9 @@ const useGridRowEditing = (apiRef, props) => {
512
512
  const getRowWithUpdatedValuesFromRowEditing = React.useCallback(id => {
513
513
  const editingState = (0, _gridEditingSelectors.gridEditRowsStateSelector)(apiRef.current.state);
514
514
  const row = apiRef.current.getRow(id);
515
+ if (!editingState[id]) {
516
+ return apiRef.current.getRow(id);
517
+ }
515
518
  let rowUpdate = (0, _extends2.default)({}, row);
516
519
  Object.entries(editingState[id]).forEach(([field, fieldProps]) => {
517
520
  const column = apiRef.current.getColumn(field);
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useGridKeyboardNavigation = void 0;
7
7
  var React = _interopRequireWildcard(require("react"));
8
+ var _styles = require("@mui/material/styles");
8
9
  var _gridColumnsSelector = require("../columns/gridColumnsSelector");
9
10
  var _useGridLogger = require("../../utils/useGridLogger");
10
11
  var _useGridApiEventHandler = require("../../utils/useGridApiEventHandler");
@@ -25,6 +26,40 @@ function enrichPageRowsWithPinnedRows(apiRef, rows) {
25
26
  const pinnedRows = (0, _gridRowsSelector.gridPinnedRowsSelector)(apiRef) || {};
26
27
  return [...(pinnedRows.top || []), ...rows, ...(pinnedRows.bottom || [])];
27
28
  }
29
+ const getLeftColumnIndex = ({
30
+ currentColIndex,
31
+ firstColIndex,
32
+ lastColIndex,
33
+ direction
34
+ }) => {
35
+ if (direction === 'rtl') {
36
+ if (currentColIndex < lastColIndex) {
37
+ return currentColIndex + 1;
38
+ }
39
+ } else if (direction === 'ltr') {
40
+ if (currentColIndex > firstColIndex) {
41
+ return currentColIndex - 1;
42
+ }
43
+ }
44
+ return null;
45
+ };
46
+ const getRightColumnIndex = ({
47
+ currentColIndex,
48
+ firstColIndex,
49
+ lastColIndex,
50
+ direction
51
+ }) => {
52
+ if (direction === 'rtl') {
53
+ if (currentColIndex > firstColIndex) {
54
+ return currentColIndex - 1;
55
+ }
56
+ } else if (direction === 'ltr') {
57
+ if (currentColIndex < lastColIndex) {
58
+ return currentColIndex + 1;
59
+ }
60
+ }
61
+ return null;
62
+ };
28
63
 
29
64
  /**
30
65
  * @requires useGridSorting (method) - can be after
@@ -38,6 +73,7 @@ function enrichPageRowsWithPinnedRows(apiRef, rows) {
38
73
  const useGridKeyboardNavigation = (apiRef, props) => {
39
74
  const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useGridKeyboardNavigation');
40
75
  const initialCurrentPageRows = (0, _useGridVisibleRows.useGridVisibleRows)(apiRef, props).rows;
76
+ const theme = (0, _styles.useTheme)();
41
77
  const currentPageRows = React.useMemo(() => enrichPageRowsWithPinnedRows(apiRef, initialCurrentPageRows), [apiRef, initialCurrentPageRows]);
42
78
 
43
79
  /**
@@ -118,15 +154,27 @@ const useGridKeyboardNavigation = (apiRef, props) => {
118
154
  }
119
155
  case 'ArrowRight':
120
156
  {
121
- if (colIndexBefore < lastColIndex) {
122
- goToHeader(colIndexBefore + 1, event);
157
+ const rightColIndex = getRightColumnIndex({
158
+ currentColIndex: colIndexBefore,
159
+ firstColIndex,
160
+ lastColIndex,
161
+ direction: theme.direction
162
+ });
163
+ if (rightColIndex !== null) {
164
+ goToHeader(rightColIndex, event);
123
165
  }
124
166
  break;
125
167
  }
126
168
  case 'ArrowLeft':
127
169
  {
128
- if (colIndexBefore > firstColIndex) {
129
- goToHeader(colIndexBefore - 1, event);
170
+ const leftColIndex = getLeftColumnIndex({
171
+ currentColIndex: colIndexBefore,
172
+ firstColIndex,
173
+ lastColIndex,
174
+ direction: theme.direction
175
+ });
176
+ if (leftColIndex !== null) {
177
+ goToHeader(leftColIndex, event);
130
178
  }
131
179
  break;
132
180
  }
@@ -174,7 +222,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
174
222
  if (shouldPreventDefault) {
175
223
  event.preventDefault();
176
224
  }
177
- }, [apiRef, currentPageRows.length, goToCell, getRowIdFromIndex, goToHeader, goToGroupHeader]);
225
+ }, [apiRef, currentPageRows.length, theme.direction, goToCell, getRowIdFromIndex, goToHeader, goToGroupHeader]);
178
226
  const focusedColumnGroup = (0, _useGridSelector.useGridSelector)(apiRef, _focus.unstable_gridFocusColumnGroupHeaderSelector);
179
227
  const handleColumnGroupHeaderKeyDown = React.useCallback((params, event) => {
180
228
  const dimensions = apiRef.current.getRootDimensions();
@@ -287,6 +335,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
287
335
  if (currentPageRows.length === 0 || !dimensions) {
288
336
  return;
289
337
  }
338
+ const direction = theme.direction;
290
339
  const viewportPageSize = apiRef.current.getViewportPageSize();
291
340
  const colIndexBefore = params.field ? apiRef.current.getColumnIndex(params.field) : 0;
292
341
  const rowIndexBefore = currentPageRows.findIndex(row => row.id === params.id);
@@ -315,15 +364,27 @@ const useGridKeyboardNavigation = (apiRef, props) => {
315
364
  }
316
365
  case 'ArrowRight':
317
366
  {
318
- if (colIndexBefore < lastColIndex) {
319
- goToCell(colIndexBefore + 1, getRowIdFromIndex(rowIndexBefore), 'right');
367
+ const rightColIndex = getRightColumnIndex({
368
+ currentColIndex: colIndexBefore,
369
+ firstColIndex,
370
+ lastColIndex,
371
+ direction
372
+ });
373
+ if (rightColIndex !== null) {
374
+ goToCell(rightColIndex, getRowIdFromIndex(rowIndexBefore), direction === 'rtl' ? 'left' : 'right');
320
375
  }
321
376
  break;
322
377
  }
323
378
  case 'ArrowLeft':
324
379
  {
325
- if (colIndexBefore > firstColIndex) {
326
- goToCell(colIndexBefore - 1, getRowIdFromIndex(rowIndexBefore));
380
+ const leftColIndex = getLeftColumnIndex({
381
+ currentColIndex: colIndexBefore,
382
+ firstColIndex,
383
+ lastColIndex,
384
+ direction
385
+ });
386
+ if (leftColIndex !== null) {
387
+ goToCell(leftColIndex, getRowIdFromIndex(rowIndexBefore), direction === 'rtl' ? 'right' : 'left');
327
388
  }
328
389
  break;
329
390
  }
@@ -396,7 +457,7 @@ const useGridKeyboardNavigation = (apiRef, props) => {
396
457
  if (shouldPreventDefault) {
397
458
  event.preventDefault();
398
459
  }
399
- }, [apiRef, currentPageRows, getRowIdFromIndex, goToCell, goToHeader]);
460
+ }, [apiRef, currentPageRows, theme.direction, getRowIdFromIndex, goToCell, goToHeader]);
400
461
  (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'columnHeaderKeyDown', handleColumnHeaderKeyDown);
401
462
  (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'columnGroupHeaderKeyDown', handleColumnGroupHeaderKeyDown);
402
463
  (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'cellKeyDown', handleCellKeyDown);
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.useGridScroll = void 0;
7
7
  var React = _interopRequireWildcard(require("react"));
8
+ var _styles = require("@mui/material/styles");
8
9
  var _useGridLogger = require("../../utils/useGridLogger");
9
10
  var _gridColumnsSelector = require("../columns/gridColumnsSelector");
10
11
  var _useGridSelector = require("../../utils/useGridSelector");
@@ -49,6 +50,7 @@ function scrollIntoView(dimensions) {
49
50
  * @requires useGridColumnSpanning (method)
50
51
  */
51
52
  const useGridScroll = (apiRef, props) => {
53
+ const theme = (0, _styles.useTheme)();
52
54
  const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useGridScroll');
53
55
  const colRef = apiRef.current.columnHeadersElementRef;
54
56
  const virtualScrollerRef = apiRef.current.virtualScrollerRef;
@@ -75,9 +77,10 @@ const useGridScroll = (apiRef, props) => {
75
77
  if (typeof cellWidth === 'undefined') {
76
78
  cellWidth = visibleColumns[params.colIndex].computedWidth;
77
79
  }
80
+ // When using RTL, `scrollLeft` becomes negative, so we must ensure that we only compare values.
78
81
  scrollCoordinates.left = scrollIntoView({
79
82
  clientHeight: virtualScrollerRef.current.clientWidth,
80
- scrollTop: virtualScrollerRef.current.scrollLeft,
83
+ scrollTop: Math.abs(virtualScrollerRef.current.scrollLeft),
81
84
  offsetHeight: cellWidth,
82
85
  offsetTop: columnPositions[params.colIndex]
83
86
  });
@@ -106,8 +109,9 @@ const useGridScroll = (apiRef, props) => {
106
109
  }, [logger, apiRef, virtualScrollerRef, props.pagination, visibleSortedRows]);
107
110
  const scroll = React.useCallback(params => {
108
111
  if (virtualScrollerRef.current && params.left != null && colRef.current) {
112
+ const direction = theme.direction === 'rtl' ? -1 : 1;
109
113
  colRef.current.scrollLeft = params.left;
110
- virtualScrollerRef.current.scrollLeft = params.left;
114
+ virtualScrollerRef.current.scrollLeft = direction * params.left;
111
115
  logger.debug(`Scrolling left: ${params.left}`);
112
116
  }
113
117
  if (virtualScrollerRef.current && params.top != null) {
@@ -115,7 +119,7 @@ const useGridScroll = (apiRef, props) => {
115
119
  logger.debug(`Scrolling top: ${params.top}`);
116
120
  }
117
121
  logger.debug(`Scrolling, updating container, and viewport`);
118
- }, [virtualScrollerRef, colRef, logger]);
122
+ }, [virtualScrollerRef, theme.direction, colRef, logger]);
119
123
  const getScrollPosition = React.useCallback(() => {
120
124
  if (!virtualScrollerRef?.current) {
121
125
  return {
@@ -11,6 +11,7 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
11
11
  var React = _interopRequireWildcard(require("react"));
12
12
  var ReactDOM = _interopRequireWildcard(require("react-dom"));
13
13
  var _utils = require("@mui/utils");
14
+ var _styles = require("@mui/material/styles");
14
15
  var _useGridPrivateApiContext = require("../../utils/useGridPrivateApiContext");
15
16
  var _useGridRootProps = require("../../utils/useGridRootProps");
16
17
  var _useGridSelector = require("../../utils/useGridSelector");
@@ -44,7 +45,7 @@ function binarySearch(offset, positions, sliceStart = 0, sliceEnd = positions.le
44
45
  }
45
46
  function exponentialSearch(offset, positions, index) {
46
47
  let interval = 1;
47
- while (index < positions.length && positions[index] < offset) {
48
+ while (index < positions.length && Math.abs(positions[index]) < offset) {
48
49
  index += interval;
49
50
  interval *= 2;
50
51
  }
@@ -72,6 +73,7 @@ const useGridVirtualScroller = props => {
72
73
  renderZoneMaxColumnIndex = visibleColumns.length,
73
74
  getRowProps
74
75
  } = props;
76
+ const theme = (0, _styles.useTheme)();
75
77
  const columnPositions = (0, _useGridSelector.useGridSelector)(apiRef, _gridColumnsSelector.gridColumnPositionsSelector);
76
78
  const columnsTotalWidth = (0, _useGridSelector.useGridSelector)(apiRef, _gridColumnsSelector.gridColumnsTotalWidthSelector);
77
79
  const cellFocus = (0, _useGridSelector.useGridSelector)(apiRef, _gridFocusStateSelector.gridFocusCellSelector);
@@ -147,8 +149,8 @@ const useGridVirtualScroller = props => {
147
149
  hasRowWithAutoHeight = apiRef.current.rowHasAutoHeight(row.id);
148
150
  }
149
151
  if (!hasRowWithAutoHeight) {
150
- firstColumnIndex = binarySearch(left, columnPositions);
151
- lastColumnIndex = binarySearch(left + containerDimensions.width, columnPositions);
152
+ firstColumnIndex = binarySearch(Math.abs(left), columnPositions);
153
+ lastColumnIndex = binarySearch(Math.abs(left) + containerDimensions.width, columnPositions);
152
154
  }
153
155
  return {
154
156
  firstRowIndex,
@@ -178,7 +180,7 @@ const useGridVirtualScroller = props => {
178
180
  height: params.height
179
181
  });
180
182
  }, []);
181
- (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'resize', handleResize);
183
+ (0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'debouncedResize', handleResize);
182
184
  const updateRenderZonePosition = React.useCallback(nextRenderContext => {
183
185
  const [firstRowToRender, lastRowToRender] = getRenderableIndexes({
184
186
  firstIndex: nextRenderContext.firstRowIndex,
@@ -201,8 +203,9 @@ const useGridVirtualScroller = props => {
201
203
  lastRowToRender,
202
204
  visibleRows: currentPage.rows
203
205
  });
206
+ const direction = theme.direction === 'ltr' ? 1 : -1;
204
207
  const top = (0, _gridRowsMetaSelector.gridRowsMetaSelector)(apiRef.current.state).positions[firstRowToRender];
205
- const left = (0, _gridColumnsSelector.gridColumnPositionsSelector)(apiRef)[firstColumnToRender]; // Call directly the selector because it might be outdated when this method is called
208
+ const left = direction * (0, _gridColumnsSelector.gridColumnPositionsSelector)(apiRef)[firstColumnToRender]; // Call directly the selector because it might be outdated when this method is called
206
209
  renderZoneRef.current.style.transform = `translate3d(${left}px, ${top}px, 0px)`;
207
210
  if (typeof onRenderZonePositioning === 'function') {
208
211
  onRenderZonePositioning({
@@ -210,7 +213,7 @@ const useGridVirtualScroller = props => {
210
213
  left
211
214
  });
212
215
  }
213
- }, [apiRef, currentPage.rows, onRenderZonePositioning, renderZoneMinColumnIndex, renderZoneMaxColumnIndex, rootProps.columnBuffer, rootProps.rowBuffer]);
216
+ }, [apiRef, currentPage.rows, onRenderZonePositioning, renderZoneMinColumnIndex, renderZoneMaxColumnIndex, rootProps.columnBuffer, rootProps.rowBuffer, theme.direction]);
214
217
  const updateRenderContext = React.useCallback(nextRenderContext => {
215
218
  setRenderContext(nextRenderContext);
216
219
  updateRenderZonePosition(nextRenderContext);
@@ -253,9 +256,19 @@ const useGridVirtualScroller = props => {
253
256
  scrollPosition.current.left = scrollLeft;
254
257
 
255
258
  // On iOS and macOS, negative offsets are possible when swiping past the start
256
- if (scrollLeft < 0 || scrollTop < 0 || !prevRenderContext.current) {
259
+ if (!prevRenderContext.current || scrollTop < 0) {
257
260
  return;
258
261
  }
262
+ if (theme.direction === 'ltr') {
263
+ if (scrollLeft < 0) {
264
+ return;
265
+ }
266
+ }
267
+ if (theme.direction === 'rtl') {
268
+ if (scrollLeft > 0) {
269
+ return;
270
+ }
271
+ }
259
272
 
260
273
  // When virtualization is disabled, the context never changes during scroll
261
274
  const nextRenderContext = disableVirtualization ? prevRenderContext.current : computeRenderContext();
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-data-grid v6.0.0-beta.2
2
+ * @mui/x-data-grid v6.0.0-beta.3
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the