@mui/x-data-grid 7.18.0 → 7.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +110 -0
- package/DataGrid/DataGrid.js +5 -0
- package/components/cell/GridCell.js +7 -8
- package/components/columnHeaders/GridBaseColumnHeaders.js +1 -1
- package/components/columnSelection/GridCellCheckboxRenderer.js +12 -4
- package/components/columnSelection/GridHeaderCheckbox.d.ts +1 -1
- package/components/containers/GridRoot.js +1 -1
- package/components/containers/GridRootStyles.js +32 -23
- package/components/containers/GridToolbarContainer.js +1 -1
- package/components/menu/GridMenu.js +1 -1
- package/components/panel/GridPanel.d.ts +1 -1
- package/components/panel/GridPanel.js +1 -1
- package/components/panel/GridPanelContent.js +1 -1
- package/components/panel/GridPanelFooter.js +1 -1
- package/components/panel/GridPanelHeader.js +1 -1
- package/components/panel/GridPanelWrapper.js +1 -1
- package/components/panel/filterPanel/filterPanelUtils.d.ts +1 -1
- package/components/toolbar/GridToolbarQuickFilter.js +1 -1
- package/components/virtualization/GridBottomContainer.d.ts +1 -1
- package/components/virtualization/GridBottomContainer.js +18 -1
- package/components/virtualization/GridMainContainer.js +3 -1
- package/components/virtualization/GridTopContainer.d.ts +1 -1
- package/components/virtualization/GridTopContainer.js +1 -1
- package/components/virtualization/GridVirtualScrollbar.js +1 -7
- package/components/virtualization/GridVirtualScroller.js +1 -0
- package/components/virtualization/GridVirtualScrollerFiller.js +3 -4
- package/hooks/features/columnGrouping/gridColumnGroupsSelector.d.ts +4 -4
- package/hooks/features/columnHeaders/useGridColumnHeaders.d.ts +1 -1
- package/hooks/features/columnResize/columnResizeSelector.d.ts +1 -1
- package/hooks/features/columns/gridColumnsSelector.d.ts +12 -12
- package/hooks/features/columns/gridColumnsUtils.js +3 -2
- package/hooks/features/density/densitySelector.d.ts +1 -1
- package/hooks/features/editing/useGridCellEditing.js +1 -1
- package/hooks/features/editing/useGridRowEditing.js +1 -1
- package/hooks/features/filter/gridFilterSelector.d.ts +17 -17
- package/hooks/features/focus/gridFocusStateSelector.d.ts +8 -8
- package/hooks/features/headerFiltering/gridHeaderFilteringSelectors.d.ts +3 -3
- package/hooks/features/keyboardNavigation/utils.d.ts +1 -1
- package/hooks/features/pagination/gridPaginationSelector.d.ts +9 -9
- package/hooks/features/rowSelection/gridRowSelectionSelector.d.ts +3 -3
- package/hooks/features/rowSelection/useGridRowSelection.d.ts +1 -1
- package/hooks/features/rowSelection/useGridRowSelection.js +105 -29
- package/hooks/features/rowSelection/utils.d.ts +10 -0
- package/hooks/features/rowSelection/utils.js +156 -1
- package/hooks/features/rows/gridRowSpanningSelectors.d.ts +3 -3
- package/hooks/features/rows/gridRowsSelector.d.ts +14 -14
- package/hooks/features/rows/useGridRows.d.ts +1 -1
- package/hooks/features/rows/useGridRows.js +7 -1
- package/hooks/features/scroll/useGridScroll.js +19 -19
- package/hooks/features/sorting/gridSortingSelector.d.ts +4 -4
- package/hooks/features/virtualization/gridVirtualizationSelectors.d.ts +5 -5
- package/hooks/utils/useGridVisibleRows.d.ts +2 -2
- package/index.js +1 -1
- package/internals/index.d.ts +1 -0
- package/internals/index.js +1 -0
- package/locales/bgBG.js +8 -9
- package/locales/deDE.js +4 -4
- package/locales/frFR.js +4 -4
- package/locales/hrHR.d.ts +1 -1
- package/locales/hrHR.js +69 -46
- package/locales/jaJP.js +1 -2
- package/locales/ptPT.d.ts +1 -1
- package/locales/ptPT.js +4 -4
- package/locales/viVN.js +20 -20
- package/locales/zhHK.d.ts +1 -1
- package/models/gridRowSelectionModel.d.ts +4 -0
- package/models/props/DataGridProps.d.ts +20 -1
- package/modern/DataGrid/DataGrid.js +5 -0
- package/modern/components/cell/GridCell.js +7 -8
- package/modern/components/columnHeaders/GridBaseColumnHeaders.js +1 -1
- package/modern/components/columnSelection/GridCellCheckboxRenderer.js +12 -4
- package/modern/components/containers/GridRoot.js +1 -1
- package/modern/components/containers/GridRootStyles.js +32 -23
- package/modern/components/containers/GridToolbarContainer.js +1 -1
- package/modern/components/menu/GridMenu.js +1 -1
- package/modern/components/panel/GridPanel.js +1 -1
- package/modern/components/panel/GridPanelContent.js +1 -1
- package/modern/components/panel/GridPanelFooter.js +1 -1
- package/modern/components/panel/GridPanelHeader.js +1 -1
- package/modern/components/panel/GridPanelWrapper.js +1 -1
- package/modern/components/toolbar/GridToolbarQuickFilter.js +1 -1
- package/modern/components/virtualization/GridBottomContainer.js +18 -1
- package/modern/components/virtualization/GridMainContainer.js +3 -1
- package/modern/components/virtualization/GridTopContainer.js +1 -1
- package/modern/components/virtualization/GridVirtualScrollbar.js +1 -7
- package/modern/components/virtualization/GridVirtualScroller.js +1 -0
- package/modern/components/virtualization/GridVirtualScrollerFiller.js +3 -4
- package/modern/hooks/features/columns/gridColumnsUtils.js +3 -2
- package/modern/hooks/features/editing/useGridCellEditing.js +1 -1
- package/modern/hooks/features/editing/useGridRowEditing.js +1 -1
- package/modern/hooks/features/rowSelection/useGridRowSelection.js +105 -29
- package/modern/hooks/features/rowSelection/utils.js +156 -1
- package/modern/hooks/features/rows/useGridRows.js +7 -1
- package/modern/hooks/features/scroll/useGridScroll.js +19 -19
- package/modern/index.js +1 -1
- package/modern/internals/index.js +1 -0
- package/modern/locales/bgBG.js +8 -9
- package/modern/locales/deDE.js +4 -4
- package/modern/locales/frFR.js +4 -4
- package/modern/locales/hrHR.js +69 -46
- package/modern/locales/jaJP.js +1 -2
- package/modern/locales/ptPT.js +4 -4
- package/modern/locales/viVN.js +20 -20
- package/modern/utils/createSelector.js +6 -0
- package/node/DataGrid/DataGrid.js +5 -0
- package/node/components/cell/GridCell.js +7 -8
- package/node/components/columnHeaders/GridBaseColumnHeaders.js +1 -1
- package/node/components/columnSelection/GridCellCheckboxRenderer.js +12 -4
- package/node/components/containers/GridRoot.js +1 -1
- package/node/components/containers/GridRootStyles.js +32 -23
- package/node/components/containers/GridToolbarContainer.js +1 -1
- package/node/components/menu/GridMenu.js +1 -1
- package/node/components/panel/GridPanel.js +1 -1
- package/node/components/panel/GridPanelContent.js +1 -1
- package/node/components/panel/GridPanelFooter.js +1 -1
- package/node/components/panel/GridPanelHeader.js +1 -1
- package/node/components/panel/GridPanelWrapper.js +1 -1
- package/node/components/toolbar/GridToolbarQuickFilter.js +1 -1
- package/node/components/virtualization/GridBottomContainer.js +18 -1
- package/node/components/virtualization/GridMainContainer.js +3 -1
- package/node/components/virtualization/GridTopContainer.js +1 -1
- package/node/components/virtualization/GridVirtualScrollbar.js +1 -7
- package/node/components/virtualization/GridVirtualScroller.js +1 -0
- package/node/components/virtualization/GridVirtualScrollerFiller.js +3 -4
- package/node/hooks/features/columns/gridColumnsUtils.js +3 -2
- package/node/hooks/features/editing/useGridCellEditing.js +1 -1
- package/node/hooks/features/editing/useGridRowEditing.js +1 -1
- package/node/hooks/features/rowSelection/useGridRowSelection.js +102 -26
- package/node/hooks/features/rowSelection/utils.js +160 -1
- package/node/hooks/features/rows/useGridRows.js +7 -1
- package/node/hooks/features/scroll/useGridScroll.js +19 -19
- package/node/index.js +1 -1
- package/node/internals/index.js +23 -15
- package/node/locales/bgBG.js +8 -9
- package/node/locales/deDE.js +4 -4
- package/node/locales/frFR.js +4 -4
- package/node/locales/hrHR.js +69 -46
- package/node/locales/jaJP.js +1 -2
- package/node/locales/ptPT.js +4 -4
- package/node/locales/viVN.js +20 -20
- package/node/utils/createSelector.js +6 -0
- package/package.json +1 -1
- package/utils/createSelector.js +6 -0
|
@@ -93,7 +93,7 @@ function GridMenu(props) {
|
|
|
93
93
|
};
|
|
94
94
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridMenuRoot, (0, _extends2.default)({
|
|
95
95
|
as: rootProps.slots.basePopper,
|
|
96
|
-
className: (0, _clsx.default)(
|
|
96
|
+
className: (0, _clsx.default)(classes.root, className),
|
|
97
97
|
ownerState: rootProps,
|
|
98
98
|
open: open,
|
|
99
99
|
anchorEl: target,
|
|
@@ -92,7 +92,7 @@ const GridPanel = exports.GridPanel = /*#__PURE__*/React.forwardRef((props, ref)
|
|
|
92
92
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridPanelRoot, (0, _extends2.default)({
|
|
93
93
|
ref: ref,
|
|
94
94
|
placement: "bottom-start",
|
|
95
|
-
className: (0, _clsx.default)(
|
|
95
|
+
className: (0, _clsx.default)(classes.panel, className),
|
|
96
96
|
ownerState: rootProps,
|
|
97
97
|
anchorEl: anchorEl,
|
|
98
98
|
modifiers: modifiers
|
|
@@ -45,7 +45,7 @@ function GridPanelContent(props) {
|
|
|
45
45
|
const rootProps = (0, _useGridRootProps.useGridRootProps)();
|
|
46
46
|
const classes = useUtilityClasses(rootProps);
|
|
47
47
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridPanelContentRoot, (0, _extends2.default)({
|
|
48
|
-
className: (0, _clsx.default)(
|
|
48
|
+
className: (0, _clsx.default)(classes.root, className),
|
|
49
49
|
ownerState: rootProps
|
|
50
50
|
}, other));
|
|
51
51
|
}
|
|
@@ -45,7 +45,7 @@ function GridPanelFooter(props) {
|
|
|
45
45
|
const rootProps = (0, _useGridRootProps.useGridRootProps)();
|
|
46
46
|
const classes = useUtilityClasses(rootProps);
|
|
47
47
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridPanelFooterRoot, (0, _extends2.default)({
|
|
48
|
-
className: (0, _clsx.default)(
|
|
48
|
+
className: (0, _clsx.default)(classes.root, className),
|
|
49
49
|
ownerState: rootProps
|
|
50
50
|
}, other));
|
|
51
51
|
}
|
|
@@ -43,7 +43,7 @@ function GridPanelHeader(props) {
|
|
|
43
43
|
const rootProps = (0, _useGridRootProps.useGridRootProps)();
|
|
44
44
|
const classes = useUtilityClasses(rootProps);
|
|
45
45
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(GridPanelHeaderRoot, (0, _extends2.default)({
|
|
46
|
-
className: (0, _clsx.default)(
|
|
46
|
+
className: (0, _clsx.default)(classes.root, className),
|
|
47
47
|
ownerState: rootProps
|
|
48
48
|
}, other));
|
|
49
49
|
}
|
|
@@ -56,7 +56,7 @@ const GridPanelWrapper = exports.GridPanelWrapper = /*#__PURE__*/React.forwardRe
|
|
|
56
56
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(GridPanelWrapperRoot, (0, _extends2.default)({
|
|
57
57
|
ref: ref,
|
|
58
58
|
tabIndex: -1,
|
|
59
|
-
className: (0, _clsx.default)(
|
|
59
|
+
className: (0, _clsx.default)(classes.root, className),
|
|
60
60
|
ownerState: rootProps
|
|
61
61
|
}, other))
|
|
62
62
|
}));
|
|
@@ -101,7 +101,7 @@ function GridToolbarQuickFilter(props) {
|
|
|
101
101
|
variant: "standard",
|
|
102
102
|
value: searchValue,
|
|
103
103
|
onChange: handleSearchValueChange,
|
|
104
|
-
className: (0, _clsx.default)(
|
|
104
|
+
className: (0, _clsx.default)(classes.root, className),
|
|
105
105
|
placeholder: apiRef.current.getLocaleText('toolbarQuickFilterPlaceholder'),
|
|
106
106
|
"aria-label": apiRef.current.getLocaleText('toolbarQuickFilterLabel'),
|
|
107
107
|
type: "search"
|
|
@@ -12,6 +12,9 @@ var _clsx = _interopRequireDefault(require("clsx"));
|
|
|
12
12
|
var _system = require("@mui/system");
|
|
13
13
|
var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
|
|
14
14
|
var _gridClasses = require("../../constants/gridClasses");
|
|
15
|
+
var _gridDimensionsSelectors = require("../../hooks/features/dimensions/gridDimensionsSelectors");
|
|
16
|
+
var _useGridApiContext = require("../../hooks/utils/useGridApiContext");
|
|
17
|
+
var _useGridSelector = require("../../hooks/utils/useGridSelector");
|
|
15
18
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
16
19
|
const useUtilityClasses = () => {
|
|
17
20
|
const slots = {
|
|
@@ -26,8 +29,22 @@ const Element = (0, _system.styled)('div')({
|
|
|
26
29
|
});
|
|
27
30
|
function GridBottomContainer(props) {
|
|
28
31
|
const classes = useUtilityClasses();
|
|
32
|
+
const apiRef = (0, _useGridApiContext.useGridApiContext)();
|
|
33
|
+
const {
|
|
34
|
+
viewportOuterSize,
|
|
35
|
+
minimumSize,
|
|
36
|
+
hasScrollX,
|
|
37
|
+
scrollbarSize
|
|
38
|
+
} = (0, _useGridSelector.useGridSelector)(apiRef, _gridDimensionsSelectors.gridDimensionsSelector);
|
|
39
|
+
const scrollHeight = hasScrollX ? scrollbarSize : 0;
|
|
40
|
+
const offset = Math.max(viewportOuterSize.height - minimumSize.height -
|
|
41
|
+
// Subtract scroll height twice to account for GridVirtualScrollerFiller and horizontal scrollbar
|
|
42
|
+
2 * scrollHeight, 0);
|
|
29
43
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(Element, (0, _extends2.default)({}, props, {
|
|
30
|
-
className: (0, _clsx.default)(classes.root,
|
|
44
|
+
className: (0, _clsx.default)(classes.root, _gridClasses.gridClasses['container--bottom']),
|
|
45
|
+
style: {
|
|
46
|
+
transform: `translateY(${offset}px)`
|
|
47
|
+
},
|
|
31
48
|
role: "presentation"
|
|
32
49
|
}));
|
|
33
50
|
}
|
|
@@ -24,7 +24,9 @@ const Element = (0, _system.styled)('div', {
|
|
|
24
24
|
})({
|
|
25
25
|
flexGrow: 1,
|
|
26
26
|
position: 'relative',
|
|
27
|
-
overflow: 'hidden'
|
|
27
|
+
overflow: 'hidden',
|
|
28
|
+
display: 'flex',
|
|
29
|
+
flexDirection: 'column'
|
|
28
30
|
});
|
|
29
31
|
const GridMainContainer = exports.GridMainContainer = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
30
32
|
const rootProps = (0, _useGridRootProps.useGridRootProps)();
|
|
@@ -27,7 +27,7 @@ const Element = (0, _system.styled)('div')({
|
|
|
27
27
|
function GridTopContainer(props) {
|
|
28
28
|
const classes = useUtilityClasses();
|
|
29
29
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(Element, (0, _extends2.default)({}, props, {
|
|
30
|
-
className: (0, _clsx.default)(classes.root,
|
|
30
|
+
className: (0, _clsx.default)(classes.root, _gridClasses.gridClasses['container--top']),
|
|
31
31
|
role: "presentation"
|
|
32
32
|
}));
|
|
33
33
|
}
|
|
@@ -28,9 +28,6 @@ const Scrollbar = (0, _system.styled)('div')({
|
|
|
28
28
|
position: 'absolute',
|
|
29
29
|
display: 'inline-block',
|
|
30
30
|
zIndex: 6,
|
|
31
|
-
'& > div': {
|
|
32
|
-
display: 'inline-block'
|
|
33
|
-
},
|
|
34
31
|
// In macOS Safari and Gnome Web, scrollbars are overlaid and don't affect the layout. So we consider
|
|
35
32
|
// their size to be 0px throughout all the calculations, but the floating scrollbar container does need
|
|
36
33
|
// to appear and have a real size. We set it to 14px because it seems like an acceptable value and we
|
|
@@ -62,9 +59,6 @@ const ScrollbarHorizontal = (0, _system.styled)(Scrollbar)({
|
|
|
62
59
|
},
|
|
63
60
|
bottom: '0px'
|
|
64
61
|
});
|
|
65
|
-
const Content = (0, _system.styled)('div')({
|
|
66
|
-
display: 'inline-block'
|
|
67
|
-
});
|
|
68
62
|
const GridVirtualScrollbar = exports.GridVirtualScrollbar = /*#__PURE__*/React.forwardRef(function GridVirtualScrollbar(props, ref) {
|
|
69
63
|
const apiRef = (0, _useGridPrivateApiContext.useGridPrivateApiContext)();
|
|
70
64
|
const rootProps = (0, _useGridRootProps.useGridRootProps)();
|
|
@@ -134,7 +128,7 @@ const GridVirtualScrollbar = exports.GridVirtualScrollbar = /*#__PURE__*/React.f
|
|
|
134
128
|
className: classes.root,
|
|
135
129
|
tabIndex: -1,
|
|
136
130
|
"aria-hidden": "true",
|
|
137
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
131
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
138
132
|
ref: contentRef,
|
|
139
133
|
className: classes.content
|
|
140
134
|
})
|
|
@@ -51,10 +51,9 @@ function GridVirtualScrollerFiller({
|
|
|
51
51
|
leftPinnedWidth,
|
|
52
52
|
rightPinnedWidth
|
|
53
53
|
} = (0, _useGridSelector.useGridSelector)(apiRef, _dimensions.gridDimensionsSelector);
|
|
54
|
-
const
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
if (height === 0) {
|
|
54
|
+
const height = hasScrollX ? scrollbarSize : 0;
|
|
55
|
+
const needsLastRowBorder = viewportOuterSize.height - minimumSize.height > 0;
|
|
56
|
+
if (height === 0 && !needsLastRowBorder) {
|
|
58
57
|
return null;
|
|
59
58
|
}
|
|
60
59
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Filler, {
|
|
@@ -11,6 +11,7 @@ exports.getFirstNonSpannedColumnToRender = getFirstNonSpannedColumnToRender;
|
|
|
11
11
|
exports.getTotalHeaderHeight = getTotalHeaderHeight;
|
|
12
12
|
exports.hydrateColumnsWidth = void 0;
|
|
13
13
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
14
|
+
var _resolveProps = _interopRequireDefault(require("@mui/utils/resolveProps"));
|
|
14
15
|
var _colDef = require("../../../colDef");
|
|
15
16
|
var _gridColumnsSelector = require("./gridColumnsSelector");
|
|
16
17
|
var _utils = require("../../../utils/utils");
|
|
@@ -289,9 +290,9 @@ const createColumnsState = ({
|
|
|
289
290
|
}
|
|
290
291
|
}
|
|
291
292
|
});
|
|
292
|
-
columnsState.lookup[field] = (0, _extends2.default)({},
|
|
293
|
+
columnsState.lookup[field] = (0, _resolveProps.default)(existingState, (0, _extends2.default)({}, newColumn, {
|
|
293
294
|
hasBeenResized
|
|
294
|
-
});
|
|
295
|
+
}));
|
|
295
296
|
});
|
|
296
297
|
if (keepOnlyColumnsToUpsert && !isInsideStateInitializer) {
|
|
297
298
|
Object.keys(columnsState.lookup).forEach(field => {
|
|
@@ -76,7 +76,7 @@ const useGridCellEditing = (apiRef, props) => {
|
|
|
76
76
|
const handleCellKeyDown = React.useCallback((params, event) => {
|
|
77
77
|
if (params.cellMode === _gridEditRowModel.GridCellModes.Edit) {
|
|
78
78
|
// Wait until IME is settled for Asian languages like Japanese and Chinese
|
|
79
|
-
// TODO:
|
|
79
|
+
// TODO: to replace at one point. See https://github.com/mui/material-ui/pull/39713#discussion_r1381678957.
|
|
80
80
|
if (event.which === 229) {
|
|
81
81
|
return;
|
|
82
82
|
}
|
|
@@ -118,7 +118,7 @@ const useGridRowEditing = (apiRef, props) => {
|
|
|
118
118
|
const handleCellKeyDown = React.useCallback((params, event) => {
|
|
119
119
|
if (params.cellMode === _gridEditRowModel.GridRowModes.Edit) {
|
|
120
120
|
// Wait until IME is settled for Asian languages like Japanese and Chinese
|
|
121
|
-
// TODO:
|
|
121
|
+
// TODO: to replace at one point. See https://github.com/mui/material-ui/pull/39713#discussion_r1381678957.
|
|
122
122
|
if (event.which === 229) {
|
|
123
123
|
return;
|
|
124
124
|
}
|
|
@@ -11,6 +11,7 @@ var React = _interopRequireWildcard(require("react"));
|
|
|
11
11
|
var _useGridApiEventHandler = require("../../utils/useGridApiEventHandler");
|
|
12
12
|
var _useGridApiMethod = require("../../utils/useGridApiMethod");
|
|
13
13
|
var _useGridLogger = require("../../utils/useGridLogger");
|
|
14
|
+
var _useGridSelector = require("../../utils/useGridSelector");
|
|
14
15
|
var _gridRowsSelector = require("../rows/gridRowsSelector");
|
|
15
16
|
var _gridRowSelectionSelector = require("./gridRowSelectionSelector");
|
|
16
17
|
var _pagination = require("../pagination");
|
|
@@ -49,11 +50,12 @@ const rowSelectionStateInitializer = (state, props) => (0, _extends2.default)({}
|
|
|
49
50
|
exports.rowSelectionStateInitializer = rowSelectionStateInitializer;
|
|
50
51
|
const useGridRowSelection = (apiRef, props) => {
|
|
51
52
|
const logger = (0, _useGridLogger.useGridLogger)(apiRef, 'useGridSelection');
|
|
52
|
-
const runIfRowSelectionIsEnabled = callback => (...args) => {
|
|
53
|
+
const runIfRowSelectionIsEnabled = React.useCallback(callback => (...args) => {
|
|
53
54
|
if (props.rowSelection) {
|
|
54
55
|
callback(...args);
|
|
55
56
|
}
|
|
56
|
-
};
|
|
57
|
+
}, [props.rowSelection]);
|
|
58
|
+
const applyAutoSelection = props.signature !== _useGridApiEventHandler.GridSignature.DataGrid && (props.rowSelectionPropagation?.parents || props.rowSelectionPropagation?.descendants);
|
|
57
59
|
const propRowSelectionModel = React.useMemo(() => {
|
|
58
60
|
return getSelectionModelPropValue(props.rowSelectionModel, (0, _gridRowSelectionSelector.gridRowSelectionStateSelector)(apiRef.current.state));
|
|
59
61
|
}, [apiRef, props.rowSelectionModel]);
|
|
@@ -72,6 +74,8 @@ const useGridRowSelection = (apiRef, props) => {
|
|
|
72
74
|
} = props;
|
|
73
75
|
const canHaveMultipleSelection = (0, _utils.isMultipleRowSelectionEnabled)(props);
|
|
74
76
|
const visibleRows = (0, _useGridVisibleRows.useGridVisibleRows)(apiRef, props);
|
|
77
|
+
const tree = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridRowTreeSelector);
|
|
78
|
+
const isNestedData = (0, _useGridSelector.useGridSelector)(apiRef, _gridRowsSelector.gridRowMaximumTreeDepthSelector) > 1;
|
|
75
79
|
const expandMouseRowRangeSelection = React.useCallback(id => {
|
|
76
80
|
let endId = id;
|
|
77
81
|
const startId = lastRowToggled.current ?? id;
|
|
@@ -96,7 +100,7 @@ const useGridRowSelection = (apiRef, props) => {
|
|
|
96
100
|
}, !isSelected);
|
|
97
101
|
}, [apiRef]);
|
|
98
102
|
|
|
99
|
-
|
|
103
|
+
/*
|
|
100
104
|
* API METHODS
|
|
101
105
|
*/
|
|
102
106
|
const setRowSelectionModel = React.useCallback(model => {
|
|
@@ -134,34 +138,80 @@ const useGridRowSelection = (apiRef, props) => {
|
|
|
134
138
|
lastRowToggled.current = id;
|
|
135
139
|
if (resetSelection) {
|
|
136
140
|
logger.debug(`Setting selection for row ${id}`);
|
|
137
|
-
|
|
141
|
+
const newSelection = [];
|
|
142
|
+
const addRow = rowId => {
|
|
143
|
+
newSelection.push(rowId);
|
|
144
|
+
};
|
|
145
|
+
if (isSelected) {
|
|
146
|
+
addRow(id);
|
|
147
|
+
if (applyAutoSelection) {
|
|
148
|
+
(0, _utils.findRowsToSelect)(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, addRow);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
apiRef.current.setRowSelectionModel(newSelection);
|
|
138
152
|
} else {
|
|
139
153
|
logger.debug(`Toggling selection for row ${id}`);
|
|
140
154
|
const selection = (0, _gridRowSelectionSelector.gridRowSelectionStateSelector)(apiRef.current.state);
|
|
141
|
-
const newSelection = selection
|
|
155
|
+
const newSelection = new Set(selection);
|
|
156
|
+
newSelection.delete(id);
|
|
157
|
+
const addRow = rowId => {
|
|
158
|
+
newSelection.add(rowId);
|
|
159
|
+
};
|
|
160
|
+
const removeRow = rowId => {
|
|
161
|
+
newSelection.delete(rowId);
|
|
162
|
+
};
|
|
142
163
|
if (isSelected) {
|
|
143
|
-
|
|
164
|
+
addRow(id);
|
|
165
|
+
if (applyAutoSelection) {
|
|
166
|
+
(0, _utils.findRowsToSelect)(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, addRow);
|
|
167
|
+
}
|
|
168
|
+
} else if (applyAutoSelection) {
|
|
169
|
+
(0, _utils.findRowsToDeselect)(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, removeRow);
|
|
144
170
|
}
|
|
145
|
-
const isSelectionValid = newSelection.
|
|
171
|
+
const isSelectionValid = newSelection.size < 2 || canHaveMultipleSelection;
|
|
146
172
|
if (isSelectionValid) {
|
|
147
|
-
apiRef.current.setRowSelectionModel(newSelection);
|
|
173
|
+
apiRef.current.setRowSelectionModel(Array.from(newSelection));
|
|
148
174
|
}
|
|
149
175
|
}
|
|
150
|
-
}, [apiRef, logger, canHaveMultipleSelection]);
|
|
176
|
+
}, [apiRef, logger, applyAutoSelection, tree, props.rowSelectionPropagation?.descendants, props.rowSelectionPropagation?.parents, canHaveMultipleSelection]);
|
|
151
177
|
const selectRows = React.useCallback((ids, isSelected = true, resetSelection = false) => {
|
|
152
178
|
logger.debug(`Setting selection for several rows`);
|
|
153
179
|
const selectableIds = ids.filter(id => apiRef.current.isRowSelectable(id));
|
|
154
180
|
let newSelection;
|
|
155
181
|
if (resetSelection) {
|
|
156
|
-
|
|
182
|
+
if (isSelected) {
|
|
183
|
+
newSelection = selectableIds;
|
|
184
|
+
if (applyAutoSelection) {
|
|
185
|
+
const addRow = rowId => {
|
|
186
|
+
newSelection.push(rowId);
|
|
187
|
+
};
|
|
188
|
+
selectableIds.forEach(id => {
|
|
189
|
+
(0, _utils.findRowsToSelect)(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, addRow);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
} else {
|
|
193
|
+
newSelection = [];
|
|
194
|
+
}
|
|
157
195
|
} else {
|
|
158
196
|
// We clone the existing object to avoid mutating the same object returned by the selector to others part of the project
|
|
159
197
|
const selectionLookup = (0, _extends2.default)({}, (0, _gridRowSelectionSelector.selectedIdsLookupSelector)(apiRef));
|
|
198
|
+
const addRow = rowId => {
|
|
199
|
+
selectionLookup[rowId] = rowId;
|
|
200
|
+
};
|
|
201
|
+
const removeRow = rowId => {
|
|
202
|
+
delete selectionLookup[rowId];
|
|
203
|
+
};
|
|
160
204
|
selectableIds.forEach(id => {
|
|
161
205
|
if (isSelected) {
|
|
162
206
|
selectionLookup[id] = id;
|
|
207
|
+
if (applyAutoSelection) {
|
|
208
|
+
(0, _utils.findRowsToSelect)(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, addRow);
|
|
209
|
+
}
|
|
163
210
|
} else {
|
|
164
|
-
|
|
211
|
+
removeRow(id);
|
|
212
|
+
if (applyAutoSelection) {
|
|
213
|
+
(0, _utils.findRowsToDeselect)(apiRef, tree, id, props.rowSelectionPropagation?.descendants ?? false, props.rowSelectionPropagation?.parents ?? false, removeRow);
|
|
214
|
+
}
|
|
165
215
|
}
|
|
166
216
|
});
|
|
167
217
|
newSelection = Object.values(selectionLookup);
|
|
@@ -170,7 +220,7 @@ const useGridRowSelection = (apiRef, props) => {
|
|
|
170
220
|
if (isSelectionValid) {
|
|
171
221
|
apiRef.current.setRowSelectionModel(newSelection);
|
|
172
222
|
}
|
|
173
|
-
}, [apiRef,
|
|
223
|
+
}, [logger, applyAutoSelection, canHaveMultipleSelection, apiRef, tree, props.rowSelectionPropagation?.descendants, props.rowSelectionPropagation?.parents]);
|
|
174
224
|
const selectRowRange = React.useCallback(({
|
|
175
225
|
startId,
|
|
176
226
|
endId
|
|
@@ -202,29 +252,52 @@ const useGridRowSelection = (apiRef, props) => {
|
|
|
202
252
|
(0, _useGridApiMethod.useGridApiMethod)(apiRef, selectionPublicApi, 'public');
|
|
203
253
|
(0, _useGridApiMethod.useGridApiMethod)(apiRef, selectionPrivateApi, props.signature === _useGridApiEventHandler.GridSignature.DataGrid ? 'private' : 'public');
|
|
204
254
|
|
|
205
|
-
|
|
255
|
+
/*
|
|
206
256
|
* EVENTS
|
|
207
257
|
*/
|
|
208
|
-
const removeOutdatedSelection = React.useCallback(() => {
|
|
209
|
-
if (props.keepNonExistentRowsSelected) {
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
258
|
+
const removeOutdatedSelection = React.useCallback((sortModelUpdated = false) => {
|
|
212
259
|
const currentSelection = (0, _gridRowSelectionSelector.gridRowSelectionStateSelector)(apiRef.current.state);
|
|
213
|
-
const
|
|
260
|
+
const filteredRowsLookup = (0, _gridFilterSelector.gridFilteredRowsLookupSelector)(apiRef);
|
|
214
261
|
|
|
215
262
|
// We clone the existing object to avoid mutating the same object returned by the selector to others part of the project
|
|
216
263
|
const selectionLookup = (0, _extends2.default)({}, (0, _gridRowSelectionSelector.selectedIdsLookupSelector)(apiRef));
|
|
217
264
|
let hasChanged = false;
|
|
218
265
|
currentSelection.forEach(id => {
|
|
219
|
-
if (
|
|
266
|
+
if (filteredRowsLookup[id] === false) {
|
|
267
|
+
if (props.keepNonExistentRowsSelected) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
220
270
|
delete selectionLookup[id];
|
|
221
271
|
hasChanged = true;
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (!props.rowSelectionPropagation?.parents) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const node = tree[id];
|
|
278
|
+
if (node.type === 'group') {
|
|
279
|
+
const isAutoGenerated = node.isAutoGenerated;
|
|
280
|
+
if (isAutoGenerated) {
|
|
281
|
+
delete selectionLookup[id];
|
|
282
|
+
hasChanged = true;
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
// Keep previously selected tree data parents selected if all their children are filtered out
|
|
286
|
+
if (!node.children.every(childId => filteredRowsLookup[childId] === false)) {
|
|
287
|
+
delete selectionLookup[id];
|
|
288
|
+
hasChanged = true;
|
|
289
|
+
}
|
|
222
290
|
}
|
|
223
291
|
});
|
|
224
|
-
if (hasChanged) {
|
|
225
|
-
|
|
292
|
+
if (hasChanged || isNestedData && !sortModelUpdated) {
|
|
293
|
+
const newSelection = Object.values(selectionLookup);
|
|
294
|
+
if (isNestedData) {
|
|
295
|
+
apiRef.current.selectRows(newSelection, true, true);
|
|
296
|
+
} else {
|
|
297
|
+
apiRef.current.setRowSelectionModel(newSelection);
|
|
298
|
+
}
|
|
226
299
|
}
|
|
227
|
-
}, [apiRef, props.keepNonExistentRowsSelected]);
|
|
300
|
+
}, [apiRef, isNestedData, props.rowSelectionPropagation?.parents, props.keepNonExistentRowsSelected, tree]);
|
|
228
301
|
const handleSingleRowSelection = React.useCallback((id, event) => {
|
|
229
302
|
const hasCtrlKey = event.metaKey || event.ctrlKey;
|
|
230
303
|
|
|
@@ -285,8 +358,7 @@ const useGridRowSelection = (apiRef, props) => {
|
|
|
285
358
|
}, [apiRef, expandMouseRowRangeSelection, canHaveMultipleSelection]);
|
|
286
359
|
const handleHeaderSelectionCheckboxChange = React.useCallback(params => {
|
|
287
360
|
const rowsToBeSelected = props.pagination && props.checkboxSelectionVisibleOnly && props.paginationMode === 'client' ? (0, _pagination.gridPaginatedVisibleSortedGridRowIdsSelector)(apiRef) : (0, _gridFilterSelector.gridExpandedSortedRowIdsSelector)(apiRef);
|
|
288
|
-
|
|
289
|
-
apiRef.current.selectRows(rowsToBeSelected, params.value, filterModel?.items.length > 0);
|
|
361
|
+
apiRef.current.selectRows(rowsToBeSelected, params.value);
|
|
290
362
|
}, [apiRef, props.checkboxSelectionVisibleOnly, props.pagination, props.paginationMode]);
|
|
291
363
|
const handleCellKeyDown = React.useCallback((params, event) => {
|
|
292
364
|
// Get the most recent cell mode because it may have been changed by another listener
|
|
@@ -350,14 +422,15 @@ const useGridRowSelection = (apiRef, props) => {
|
|
|
350
422
|
selectRows(apiRef.current.getAllRowIds(), true);
|
|
351
423
|
}
|
|
352
424
|
}, [apiRef, handleSingleRowSelection, selectRows, visibleRows.rows, canHaveMultipleSelection]);
|
|
353
|
-
(0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'sortedRowsSet', runIfRowSelectionIsEnabled(removeOutdatedSelection));
|
|
425
|
+
(0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'sortedRowsSet', runIfRowSelectionIsEnabled(() => removeOutdatedSelection(true)));
|
|
426
|
+
(0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'filteredRowsSet', runIfRowSelectionIsEnabled(removeOutdatedSelection));
|
|
354
427
|
(0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'rowClick', runIfRowSelectionIsEnabled(handleRowClick));
|
|
355
428
|
(0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'rowSelectionCheckboxChange', runIfRowSelectionIsEnabled(handleRowSelectionCheckboxChange));
|
|
356
429
|
(0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'headerSelectionCheckboxChange', handleHeaderSelectionCheckboxChange);
|
|
357
430
|
(0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'cellMouseDown', runIfRowSelectionIsEnabled(preventSelectionOnShift));
|
|
358
431
|
(0, _useGridApiEventHandler.useGridApiEventHandler)(apiRef, 'cellKeyDown', runIfRowSelectionIsEnabled(handleCellKeyDown));
|
|
359
432
|
|
|
360
|
-
|
|
433
|
+
/*
|
|
361
434
|
* EFFECTS
|
|
362
435
|
*/
|
|
363
436
|
React.useEffect(() => {
|
|
@@ -395,5 +468,8 @@ const useGridRowSelection = (apiRef, props) => {
|
|
|
395
468
|
apiRef.current.setRowSelectionModel([]);
|
|
396
469
|
}
|
|
397
470
|
}, [apiRef, canHaveMultipleSelection, checkboxSelection, isStateControlled, props.rowSelection]);
|
|
471
|
+
React.useEffect(() => {
|
|
472
|
+
runIfRowSelectionIsEnabled(removeOutdatedSelection);
|
|
473
|
+
}, [removeOutdatedSelection, runIfRowSelectionIsEnabled]);
|
|
398
474
|
};
|
|
399
475
|
exports.useGridRowSelection = useGridRowSelection;
|
|
@@ -3,12 +3,171 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.findRowsToSelect = exports.findRowsToDeselect = exports.ROW_SELECTION_PROPAGATION_DEFAULT = void 0;
|
|
7
|
+
exports.getCheckboxPropsSelector = getCheckboxPropsSelector;
|
|
6
8
|
exports.isMultipleRowSelectionEnabled = isMultipleRowSelectionEnabled;
|
|
7
9
|
var _useGridApiEventHandler = require("../../utils/useGridApiEventHandler");
|
|
10
|
+
var _gridRowsUtils = require("../rows/gridRowsUtils");
|
|
11
|
+
var _gridFilterSelector = require("../filter/gridFilterSelector");
|
|
12
|
+
var _gridSortingSelector = require("../sorting/gridSortingSelector");
|
|
13
|
+
var _gridRowSelectionSelector = require("./gridRowSelectionSelector");
|
|
14
|
+
var _gridRowsSelector = require("../rows/gridRowsSelector");
|
|
15
|
+
var _createSelector = require("../../../utils/createSelector");
|
|
16
|
+
const ROW_SELECTION_PROPAGATION_DEFAULT = exports.ROW_SELECTION_PROPAGATION_DEFAULT = {
|
|
17
|
+
parents: false,
|
|
18
|
+
descendants: false
|
|
19
|
+
};
|
|
20
|
+
function getGridRowGroupSelectableDescendants(apiRef, groupId) {
|
|
21
|
+
const rowTree = (0, _gridRowsSelector.gridRowTreeSelector)(apiRef);
|
|
22
|
+
const sortedRowIds = (0, _gridSortingSelector.gridSortedRowIdsSelector)(apiRef);
|
|
23
|
+
const filteredRowsLookup = (0, _gridFilterSelector.gridFilteredRowsLookupSelector)(apiRef);
|
|
24
|
+
const groupNode = rowTree[groupId];
|
|
25
|
+
if (!groupNode || groupNode.type !== 'group') {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
const descendants = [];
|
|
29
|
+
const startIndex = sortedRowIds.findIndex(id => id === groupId) + 1;
|
|
30
|
+
for (let index = startIndex; index < sortedRowIds.length && rowTree[sortedRowIds[index]]?.depth > groupNode.depth; index += 1) {
|
|
31
|
+
const id = sortedRowIds[index];
|
|
32
|
+
if (filteredRowsLookup[id] !== false && apiRef.current.isRowSelectable(id)) {
|
|
33
|
+
descendants.push(id);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return descendants;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// TODO v8: Use `createSelectorV8`
|
|
40
|
+
function getCheckboxPropsSelector(groupId, autoSelectParents) {
|
|
41
|
+
return (0, _createSelector.createSelector)(_gridRowsSelector.gridRowTreeSelector, _gridSortingSelector.gridSortedRowIdsSelector, _gridFilterSelector.gridFilteredRowsLookupSelector, _gridRowSelectionSelector.selectedIdsLookupSelector, (rowTree, sortedRowIds, filteredRowsLookup, rowSelectionLookup) => {
|
|
42
|
+
const groupNode = rowTree[groupId];
|
|
43
|
+
if (!groupNode || groupNode.type !== 'group') {
|
|
44
|
+
return {
|
|
45
|
+
isIndeterminate: false,
|
|
46
|
+
isChecked: rowSelectionLookup[groupId] === groupId
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (rowSelectionLookup[groupId] === groupId) {
|
|
50
|
+
return {
|
|
51
|
+
isIndeterminate: false,
|
|
52
|
+
isChecked: true
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
let selectableDescendentsCount = 0;
|
|
56
|
+
let selectedDescendentsCount = 0;
|
|
57
|
+
const startIndex = sortedRowIds.findIndex(id => id === groupId) + 1;
|
|
58
|
+
for (let index = startIndex; index < sortedRowIds.length && rowTree[sortedRowIds[index]]?.depth > groupNode.depth; index += 1) {
|
|
59
|
+
const id = sortedRowIds[index];
|
|
60
|
+
if (filteredRowsLookup[id] !== false) {
|
|
61
|
+
selectableDescendentsCount += 1;
|
|
62
|
+
if (rowSelectionLookup[id] !== undefined) {
|
|
63
|
+
selectedDescendentsCount += 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
isIndeterminate: selectedDescendentsCount > 0 && selectedDescendentsCount < selectableDescendentsCount || selectedDescendentsCount === selectableDescendentsCount && rowSelectionLookup[groupId] === undefined,
|
|
69
|
+
isChecked: autoSelectParents ? selectedDescendentsCount > 0 : rowSelectionLookup[groupId] === groupId
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
8
73
|
function isMultipleRowSelectionEnabled(props) {
|
|
9
74
|
if (props.signature === _useGridApiEventHandler.GridSignature.DataGrid) {
|
|
10
75
|
// DataGrid Community has multiple row selection enabled only if checkbox selection is enabled.
|
|
11
76
|
return props.checkboxSelection && props.disableMultipleRowSelection !== true;
|
|
12
77
|
}
|
|
13
78
|
return !props.disableMultipleRowSelection;
|
|
14
|
-
}
|
|
79
|
+
}
|
|
80
|
+
const getRowNodeParents = (tree, id) => {
|
|
81
|
+
const parents = [];
|
|
82
|
+
let parent = id;
|
|
83
|
+
while (parent != null && parent !== _gridRowsUtils.GRID_ROOT_GROUP_ID) {
|
|
84
|
+
const node = tree[parent];
|
|
85
|
+
if (!node) {
|
|
86
|
+
return parents;
|
|
87
|
+
}
|
|
88
|
+
parents.push(parent);
|
|
89
|
+
parent = node.parent;
|
|
90
|
+
}
|
|
91
|
+
return parents;
|
|
92
|
+
};
|
|
93
|
+
const getFilteredRowNodeSiblings = (tree, filteredRows, id) => {
|
|
94
|
+
const node = tree[id];
|
|
95
|
+
if (!node) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
const parent = node.parent;
|
|
99
|
+
if (parent == null) {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
const parentNode = tree[parent];
|
|
103
|
+
return parentNode.children.filter(childId => childId !== id && filteredRows[childId]);
|
|
104
|
+
};
|
|
105
|
+
const findRowsToSelect = (apiRef, tree, selectedRow, autoSelectDescendants, autoSelectParents, addRow) => {
|
|
106
|
+
const filteredRows = (0, _gridFilterSelector.gridFilteredRowsLookupSelector)(apiRef);
|
|
107
|
+
const selectedIdsLookup = (0, _gridRowSelectionSelector.selectedIdsLookupSelector)(apiRef);
|
|
108
|
+
const selectedDescendants = new Set([]);
|
|
109
|
+
if (!autoSelectDescendants && !autoSelectParents) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (autoSelectDescendants) {
|
|
113
|
+
const rowNode = tree[selectedRow];
|
|
114
|
+
if (rowNode?.type === 'group') {
|
|
115
|
+
const descendants = getGridRowGroupSelectableDescendants(apiRef, selectedRow);
|
|
116
|
+
descendants.forEach(rowId => {
|
|
117
|
+
addRow(rowId);
|
|
118
|
+
selectedDescendants.add(rowId);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (autoSelectParents) {
|
|
123
|
+
const checkAllDescendantsSelected = rowId => {
|
|
124
|
+
if (selectedIdsLookup[rowId] !== rowId && !selectedDescendants.has(rowId)) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
const node = tree[rowId];
|
|
128
|
+
if (node?.type !== 'group') {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
return node.children.every(checkAllDescendantsSelected);
|
|
132
|
+
};
|
|
133
|
+
const traverseParents = rowId => {
|
|
134
|
+
const siblings = getFilteredRowNodeSiblings(tree, filteredRows, rowId);
|
|
135
|
+
if (siblings.length === 0 || siblings.every(checkAllDescendantsSelected)) {
|
|
136
|
+
const rowNode = tree[rowId];
|
|
137
|
+
const parent = rowNode.parent;
|
|
138
|
+
if (parent != null && parent !== _gridRowsUtils.GRID_ROOT_GROUP_ID && apiRef.current.isRowSelectable(parent)) {
|
|
139
|
+
addRow(parent);
|
|
140
|
+
selectedDescendants.add(parent);
|
|
141
|
+
traverseParents(parent);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
traverseParents(selectedRow);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
exports.findRowsToSelect = findRowsToSelect;
|
|
149
|
+
const findRowsToDeselect = (apiRef, tree, deselectedRow, autoSelectDescendants, autoSelectParents, removeRow) => {
|
|
150
|
+
const selectedIdsLookup = (0, _gridRowSelectionSelector.selectedIdsLookupSelector)(apiRef);
|
|
151
|
+
if (!autoSelectParents && !autoSelectDescendants) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (autoSelectParents) {
|
|
155
|
+
const allParents = getRowNodeParents(tree, deselectedRow);
|
|
156
|
+
allParents.forEach(parent => {
|
|
157
|
+
const isSelected = selectedIdsLookup[parent] === parent;
|
|
158
|
+
if (isSelected) {
|
|
159
|
+
removeRow(parent);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (autoSelectDescendants) {
|
|
164
|
+
const rowNode = tree[deselectedRow];
|
|
165
|
+
if (rowNode?.type === 'group') {
|
|
166
|
+
const descendants = getGridRowGroupSelectableDescendants(apiRef, deselectedRow);
|
|
167
|
+
descendants.forEach(descendant => {
|
|
168
|
+
removeRow(descendant);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
exports.findRowsToDeselect = findRowsToDeselect;
|
|
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.useGridRows = exports.rowsStateInitializer = void 0;
|
|
9
9
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
10
|
var React = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _useLazyRef = _interopRequireDefault(require("@mui/utils/useLazyRef"));
|
|
11
12
|
var _useGridApiMethod = require("../../utils/useGridApiMethod");
|
|
12
13
|
var _useGridLogger = require("../../utils/useGridLogger");
|
|
13
14
|
var _gridRowsSelector = require("./gridRowsSelector");
|
|
@@ -376,11 +377,16 @@ const useGridRows = (apiRef, props) => {
|
|
|
376
377
|
throttle: false
|
|
377
378
|
});
|
|
378
379
|
}, [logger, apiRef, props.rows, props.getRowId, props.loading, props.rowCount, throttledRowsChange]);
|
|
380
|
+
const previousDataSource = (0, _useLazyRef.default)(() => props.unstable_dataSource);
|
|
379
381
|
const handleStrategyProcessorChange = React.useCallback(methodName => {
|
|
382
|
+
if (props.unstable_dataSource && props.unstable_dataSource !== previousDataSource.current) {
|
|
383
|
+
previousDataSource.current = props.unstable_dataSource;
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
380
386
|
if (methodName === 'rowTreeCreation') {
|
|
381
387
|
groupRows();
|
|
382
388
|
}
|
|
383
|
-
}, [groupRows]);
|
|
389
|
+
}, [groupRows, previousDataSource, props.unstable_dataSource]);
|
|
384
390
|
const handleStrategyActivityChange = React.useCallback(() => {
|
|
385
391
|
// `rowTreeCreation` is the only processor ran when `strategyAvailabilityChange` is fired.
|
|
386
392
|
// All the other processors listen to `rowsSet` which will be published by the `groupRows` method below.
|