UNPKG

@mui/x-data-grid

Version:

The Community plan edition of the MUI X Data Grid components.

110 lines (107 loc) 4.88 kB
'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]); };