@mui/x-data-grid
Version:
The Community plan edition of the MUI X Data Grid components.
110 lines (107 loc) • 4.88 kB
JavaScript
'use client';
import _extends from "@babel/runtime/helpers/esm/extends";
import * as React from 'react';
import { gridColumnGroupsLookupSelector, gridColumnGroupsUnwrappedModelSelector } from "./gridColumnGroupsSelector.js";
import { useGridApiMethod } from "../../utils/useGridApiMethod.js";
import { createGroupLookup, getColumnGroupsHeaderStructure, unwrapGroupingColumnModel } from "./gridColumnGroupsUtils.js";
import { useGridEvent } from "../../utils/useGridEvent.js";
import { gridColumnFieldsSelector, gridVisibleColumnFieldsSelector } from "../columns/index.js";
export const columnGroupsStateInitializer = (state, props, apiRef) => {
apiRef.current.caches.columnGrouping = {
lastColumnGroupingModel: props.columnGroupingModel
};
if (!props.columnGroupingModel) {
return _extends({}, state, {
columnGrouping: undefined
});
}
const columnFields = gridColumnFieldsSelector(apiRef);
const visibleColumnFields = gridVisibleColumnFieldsSelector(apiRef);
const groupLookup = createGroupLookup(props.columnGroupingModel ?? []);
const unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel ?? []);
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel, apiRef.current.state.pinnedColumns ?? {});
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
return _extends({}, state, {
columnGrouping: {
lookup: groupLookup,
unwrappedGroupingModel,
headerStructure: columnGroupsHeaderStructure,
maxDepth
}
});
};
/**
* @requires useGridColumns (method, event)
* @requires useGridParamsApi (method)
*/
export const useGridColumnGrouping = (apiRef, props) => {
/**
* API METHODS
*/
const getColumnGroupPath = React.useCallback(field => {
const unwrappedGroupingModel = gridColumnGroupsUnwrappedModelSelector(apiRef);
return unwrappedGroupingModel[field] ?? [];
}, [apiRef]);
const getAllGroupDetails = React.useCallback(() => {
const columnGroupLookup = gridColumnGroupsLookupSelector(apiRef);
return columnGroupLookup;
}, [apiRef]);
const columnGroupingApi = {
getColumnGroupPath,
getAllGroupDetails
};
useGridApiMethod(apiRef, columnGroupingApi, 'public');
const handleColumnIndexChange = React.useCallback(() => {
const unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel ?? []);
apiRef.current.setState(state => {
const orderedFields = state.columns?.orderedFields ?? [];
const pinnedColumns = state.pinnedColumns ?? {};
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(orderedFields, unwrappedGroupingModel, pinnedColumns);
return _extends({}, state, {
columnGrouping: _extends({}, state.columnGrouping, {
headerStructure: columnGroupsHeaderStructure
})
});
});
}, [apiRef, props.columnGroupingModel]);
const updateColumnGroupingState = React.useCallback(columnGroupingModel => {
if (!columnGroupingModel && !apiRef.current.caches.columnGrouping.lastColumnGroupingModel) {
return;
}
apiRef.current.caches.columnGrouping.lastColumnGroupingModel = columnGroupingModel;
// @ts-expect-error Move this logic to `Pro` package
const pinnedColumns = apiRef.current.getPinnedColumns?.() ?? {};
const columnFields = gridColumnFieldsSelector(apiRef);
const visibleColumnFields = gridVisibleColumnFieldsSelector(apiRef);
const groupLookup = createGroupLookup(columnGroupingModel ?? []);
const unwrappedGroupingModel = unwrapGroupingColumnModel(columnGroupingModel ?? []);
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel, pinnedColumns);
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
apiRef.current.setState(state => {
return _extends({}, state, {
columnGrouping: {
lookup: groupLookup,
unwrappedGroupingModel,
headerStructure: columnGroupsHeaderStructure,
maxDepth
}
});
});
}, [apiRef]);
useGridEvent(apiRef, 'columnIndexChange', handleColumnIndexChange);
useGridEvent(apiRef, 'columnsChange', () => {
updateColumnGroupingState(props.columnGroupingModel);
});
useGridEvent(apiRef, 'columnVisibilityModelChange', () => {
updateColumnGroupingState(props.columnGroupingModel);
});
/**
* EFFECTS
*/
React.useEffect(() => {
if (props.columnGroupingModel === apiRef.current.caches.columnGrouping.lastColumnGroupingModel) {
return;
}
updateColumnGroupingState(props.columnGroupingModel);
}, [apiRef, updateColumnGroupingState, props.columnGroupingModel]);
};