@mui/x-data-grid-pro
Version:
The Pro plan edition of the MUI X Data Grid components.
149 lines (146 loc) • 6.93 kB
JavaScript
'use client';
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
const _excluded = ["hideDescendantCount"];
import * as React from 'react';
import { gridRowTreeSelector, useFirstRender } from '@mui/x-data-grid';
import { GridStrategyGroup, useGridRegisterPipeProcessor, useGridRegisterStrategyProcessor } from '@mui/x-data-grid/internals';
import { GRID_TREE_DATA_GROUPING_COL_DEF, GRID_TREE_DATA_GROUPING_COL_DEF_FORCED_PROPERTIES } from "./gridTreeDataGroupColDef.js";
import { filterRowTreeFromTreeData, TreeDataStrategy } from "./gridTreeDataUtils.js";
import { GridTreeDataGroupingCell } from "../../../components/index.js";
import { createRowTree } from "../../../utils/tree/createRowTree.js";
import { sortRowTree } from "../../../utils/tree/sortRowTree.js";
import { updateRowTree } from "../../../utils/tree/updateRowTree.js";
import { getVisibleRowsLookup } from "../../../utils/tree/utils.js";
import { jsx as _jsx } from "react/jsx-runtime";
export const useGridTreeDataPreProcessors = (privateApiRef, props) => {
const setStrategyAvailability = React.useCallback(() => {
privateApiRef.current.setStrategyAvailability(GridStrategyGroup.RowTree, TreeDataStrategy.Default, props.treeData && !props.dataSource ? () => true : () => false);
}, [privateApiRef, props.treeData, props.dataSource]);
const getGroupingColDef = React.useCallback(() => {
const groupingColDefProp = props.groupingColDef;
let colDefOverride;
if (typeof groupingColDefProp === 'function') {
const params = {
groupingName: TreeDataStrategy.Default,
fields: []
};
colDefOverride = groupingColDefProp(params);
} else {
colDefOverride = groupingColDefProp;
}
const _ref = colDefOverride ?? {},
{
hideDescendantCount
} = _ref,
colDefOverrideProperties = _objectWithoutPropertiesLoose(_ref, _excluded);
const commonProperties = _extends({}, GRID_TREE_DATA_GROUPING_COL_DEF, {
renderCell: params => /*#__PURE__*/_jsx(GridTreeDataGroupingCell, _extends({}, params, {
hideDescendantCount: hideDescendantCount
})),
headerName: privateApiRef.current.getLocaleText('treeDataGroupingHeaderName')
});
return _extends({}, commonProperties, colDefOverrideProperties, GRID_TREE_DATA_GROUPING_COL_DEF_FORCED_PROPERTIES);
}, [privateApiRef, props.groupingColDef]);
const updateGroupingColumn = React.useCallback(columnsState => {
if (props.dataSource) {
return columnsState;
}
const groupingColDefField = GRID_TREE_DATA_GROUPING_COL_DEF_FORCED_PROPERTIES.field;
const shouldHaveGroupingColumn = props.treeData;
const prevGroupingColumn = columnsState.lookup[groupingColDefField];
if (shouldHaveGroupingColumn) {
const newGroupingColumn = getGroupingColDef();
if (prevGroupingColumn) {
newGroupingColumn.width = prevGroupingColumn.width;
newGroupingColumn.flex = prevGroupingColumn.flex;
}
columnsState.lookup[groupingColDefField] = newGroupingColumn;
if (prevGroupingColumn == null) {
columnsState.orderedFields = [groupingColDefField, ...columnsState.orderedFields];
}
} else if (!shouldHaveGroupingColumn && prevGroupingColumn) {
delete columnsState.lookup[groupingColDefField];
columnsState.orderedFields = columnsState.orderedFields.filter(field => field !== groupingColDefField);
}
return columnsState;
}, [props.treeData, props.dataSource, getGroupingColDef]);
const createRowTreeForTreeData = React.useCallback(params => {
if (!props.getTreeDataPath) {
throw new Error('MUI X: No getTreeDataPath given.');
}
const getRowTreeBuilderNode = rowId => ({
id: rowId,
path: props.getTreeDataPath(params.dataRowIdToModelLookup[rowId]).map(key => ({
key,
field: null
}))
});
const onDuplicatePath = (firstId, secondId, path) => {
throw new Error(['MUI X: The path returned by `getTreeDataPath` should be unique.', `The rows with id #${firstId} and #${secondId} have the same.`, `Path: ${JSON.stringify(path.map(step => step.key))}.`].join('\n'));
};
if (params.updates.type === 'full') {
return createRowTree({
previousTree: params.previousTree,
nodes: params.updates.rows.map(getRowTreeBuilderNode),
defaultGroupingExpansionDepth: props.defaultGroupingExpansionDepth,
isGroupExpandedByDefault: props.isGroupExpandedByDefault,
groupingName: TreeDataStrategy.Default,
onDuplicatePath
});
}
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,
previousTreeDepth: params.previousTreeDepths,
defaultGroupingExpansionDepth: props.defaultGroupingExpansionDepth,
isGroupExpandedByDefault: props.isGroupExpandedByDefault,
groupingName: TreeDataStrategy.Default
});
}, [props.getTreeDataPath, props.defaultGroupingExpansionDepth, props.isGroupExpandedByDefault]);
const filterRows = React.useCallback(params => {
const rowTree = gridRowTreeSelector(privateApiRef);
return filterRowTreeFromTreeData({
rowTree,
isRowMatchingFilters: params.isRowMatchingFilters,
disableChildrenFiltering: props.disableChildrenFiltering,
filterModel: params.filterModel,
apiRef: privateApiRef
});
}, [privateApiRef, props.disableChildrenFiltering]);
const sortRows = React.useCallback(params => {
const rowTree = gridRowTreeSelector(privateApiRef);
return sortRowTree({
rowTree,
sortRowList: params.sortRowList,
disableChildrenSorting: props.disableChildrenSorting,
shouldRenderGroupBelowLeaves: false
});
}, [privateApiRef, props.disableChildrenSorting]);
useGridRegisterPipeProcessor(privateApiRef, 'hydrateColumns', updateGroupingColumn);
useGridRegisterStrategyProcessor(privateApiRef, TreeDataStrategy.Default, 'rowTreeCreation', createRowTreeForTreeData);
useGridRegisterStrategyProcessor(privateApiRef, TreeDataStrategy.Default, 'filtering', filterRows);
useGridRegisterStrategyProcessor(privateApiRef, TreeDataStrategy.Default, 'sorting', sortRows);
useGridRegisterStrategyProcessor(privateApiRef, TreeDataStrategy.Default, 'visibleRowsLookupCreation', getVisibleRowsLookup);
/**
* 1ST RENDER
*/
useFirstRender(() => {
setStrategyAvailability();
});
/**
* EFFECTS
*/
const isFirstRender = React.useRef(true);
React.useEffect(() => {
if (!isFirstRender.current) {
setStrategyAvailability();
} else {
isFirstRender.current = false;
}
}, [setStrategyAvailability]);
};