@mui/x-data-grid-premium
Version:
The Premium plan edition of the MUI X Data Grid Components.
74 lines • 3.84 kB
JavaScript
import * as React from 'react';
import { gridRowTreeSelector, gridColumnLookupSelector } from '@mui/x-data-grid-pro';
import { useGridRegisterStrategyProcessor, createRowTree, updateRowTree, getVisibleRowsLookup, skipSorting, skipFiltering, getParentPath, RowGroupingStrategy, gridPivotActiveSelector } from '@mui/x-data-grid-pro/internals';
import { getGroupingRules } from "./gridRowGroupingUtils.js";
import { gridRowGroupingSanitizedModelSelector } from "./gridRowGroupingSelector.js";
export const useGridDataSourceRowGroupingPreProcessors = (apiRef, props) => {
const createRowTreeForRowGrouping = React.useCallback(params => {
const getGroupKey = props.dataSource?.getGroupKey;
if (!getGroupKey) {
throw new Error('MUI X: No `getGroupKey` method provided with the dataSource.');
}
const getChildrenCount = props.dataSource?.getChildrenCount;
if (!getChildrenCount) {
throw new Error('MUI X: No `getChildrenCount` method provided with the dataSource.');
}
const pivotingActive = gridPivotActiveSelector(apiRef);
const sanitizedRowGroupingModel = gridRowGroupingSanitizedModelSelector(apiRef);
const maxDepth = pivotingActive ? sanitizedRowGroupingModel.length - 1 : undefined;
const columnsLookup = gridColumnLookupSelector(apiRef);
const groupingRules = getGroupingRules({
sanitizedRowGroupingModel,
columnsLookup
});
apiRef.current.caches.rowGrouping.rulesOnLastRowTreeCreation = groupingRules;
const getRowTreeBuilderNode = rowId => {
const parentPath = params.updates.groupKeys ?? getParentPath(rowId, params);
const leafKey = getGroupKey(params.dataRowIdToModelLookup[rowId]);
return {
id: rowId,
path: [...parentPath, leafKey ?? rowId.toString()].map((key, i) => ({
key,
field: groupingRules[i]?.field ?? null
})),
serverChildrenCount: getChildrenCount(params.dataRowIdToModelLookup[rowId]) ?? 0
};
};
if (params.updates.type === 'full') {
return createRowTree({
previousTree: params.previousTree,
nodes: params.updates.rows.map(getRowTreeBuilderNode),
defaultGroupingExpansionDepth: props.defaultGroupingExpansionDepth,
isGroupExpandedByDefault: props.isGroupExpandedByDefault,
groupingName: RowGroupingStrategy.DataSource,
maxDepth
});
}
return updateRowTree({
nodes: {
inserted: params.updates.actions.insert.map(getRowTreeBuilderNode),
modified: params.updates.actions.modify.map(getRowTreeBuilderNode),
removed: params.updates.actions.remove
},
previousTree: params.previousTree,
previousGroupsToFetch: params.previousGroupsToFetch,
previousTreeDepth: params.previousTreeDepths,
defaultGroupingExpansionDepth: props.defaultGroupingExpansionDepth,
isGroupExpandedByDefault: props.isGroupExpandedByDefault,
groupingName: RowGroupingStrategy.DataSource,
maxDepth
});
}, [apiRef, props.dataSource, props.defaultGroupingExpansionDepth, props.isGroupExpandedByDefault]);
const filterRows = React.useCallback(() => {
const rowTree = gridRowTreeSelector(apiRef);
return skipFiltering(rowTree);
}, [apiRef]);
const sortRows = React.useCallback(() => {
const rowTree = gridRowTreeSelector(apiRef);
return skipSorting(rowTree);
}, [apiRef]);
useGridRegisterStrategyProcessor(apiRef, RowGroupingStrategy.DataSource, 'rowTreeCreation', createRowTreeForRowGrouping);
useGridRegisterStrategyProcessor(apiRef, RowGroupingStrategy.DataSource, 'filtering', filterRows);
useGridRegisterStrategyProcessor(apiRef, RowGroupingStrategy.DataSource, 'sorting', sortRows);
useGridRegisterStrategyProcessor(apiRef, RowGroupingStrategy.DataSource, 'visibleRowsLookupCreation', getVisibleRowsLookup);
};