@mui/x-data-grid
Version:
The community edition of the data grid component (MUI X).
151 lines (128 loc) • 5.93 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
var _excluded = ["groupId", "children"];
import * as React from 'react';
import { isLeaf } from '../../../models/gridColumnGrouping';
import { gridColumnGroupsLookupSelector } from './gridColumnGroupsSelector';
import { gridColumnLookupSelector } from '../columns/gridColumnsSelector';
import { useGridApiMethod } from '../../utils/useGridApiMethod';
export function hasGroupPath(lookupElement) {
return lookupElement.groupPath !== undefined;
}
// This is the recurrence function that help writing `unwrapGroupingColumnModel()`
var recurrentUnwrapGroupingColumnModel = function recurrentUnwrapGroupingColumnModel(columnGroupNode, parents, unwrappedGroupingModelToComplet) {
if (isLeaf(columnGroupNode)) {
if (unwrappedGroupingModelToComplet[columnGroupNode.field] !== undefined) {
throw new Error(["MUI: columnGroupingModel contains duplicated field", "column field ".concat(columnGroupNode.field, " occurrs two times in the grouping model:"), "- ".concat(unwrappedGroupingModelToComplet[columnGroupNode.field].join(' > ')), "- ".concat(parents.join(' > '))].join('\n'));
}
unwrappedGroupingModelToComplet[columnGroupNode.field] = parents;
return;
}
var groupId = columnGroupNode.groupId,
children = columnGroupNode.children;
children.forEach(function (child) {
recurrentUnwrapGroupingColumnModel(child, [].concat(_toConsumableArray(parents), [groupId]), unwrappedGroupingModelToComplet);
});
};
/**
* This is a function that provide for each column the array of its parents.
* Parents are ordered from the root to the leaf.
* @param columnGroupingModel The model such as provided in DataGrid props
* @returns An object `{[field]: groupIds}` where `groupIds` is the parents of the column `field`
*/
export var unwrapGroupingColumnModel = function unwrapGroupingColumnModel(columnGroupingModel) {
if (!columnGroupingModel) {
return {};
}
var unwrappedSubTree = {};
columnGroupingModel.forEach(function (columnGroupNode) {
recurrentUnwrapGroupingColumnModel(columnGroupNode, [], unwrappedSubTree);
});
return unwrappedSubTree;
};
var createGroupLookup = function createGroupLookup(columnGroupingModel) {
var groupLookup = {};
columnGroupingModel.forEach(function (node) {
if (isLeaf(node)) {
return;
}
var groupId = node.groupId,
children = node.children,
other = _objectWithoutProperties(node, _excluded);
if (!groupId) {
throw new Error('MUI: An element of the columnGroupingModel does not have either `field` or `groupId`.');
}
if (!children) {
console.warn("MUI: group groupId=".concat(groupId, " has no children."));
}
var groupParam = _extends({}, other, {
groupId: groupId
});
var subTreeLookup = createGroupLookup(children);
if (subTreeLookup[groupId] !== undefined || groupLookup[groupId] !== undefined) {
throw new Error("MUI: The groupId ".concat(groupId, " is used multiple times in the columnGroupingModel."));
}
groupLookup = _extends({}, groupLookup, subTreeLookup, _defineProperty({}, groupId, groupParam));
});
return _extends({}, groupLookup);
};
export var columnGroupsStateInitializer = function columnGroupsStateInitializer(state, props) {
var _props$columnGrouping;
var groupLookup = createGroupLookup((_props$columnGrouping = props.columnGroupingModel) != null ? _props$columnGrouping : []);
return _extends({}, state, {
columnGrouping: {
lookup: groupLookup,
groupCollapsedModel: {}
}
});
};
/**
* @requires useGridColumns (method, event)
* @requires useGridParamsApi (method)
*/
export var useGridColumnGrouping = function useGridColumnGrouping(apiRef, props) {
var _props$experimentalFe2;
/**
* API METHODS
*/
var getColumnGroupPath = React.useCallback(function (field) {
var _columnLookup$field$g, _columnLookup$field;
var columnLookup = gridColumnLookupSelector(apiRef);
return (_columnLookup$field$g = (_columnLookup$field = columnLookup[field]) == null ? void 0 : _columnLookup$field.groupPath) != null ? _columnLookup$field$g : [];
}, [apiRef]);
var getAllGroupDetails = React.useCallback(function () {
var columnGroupLookup = gridColumnGroupsLookupSelector(apiRef);
return columnGroupLookup;
}, [apiRef]);
var columnGroupingApi = {
unstable_getColumnGroupPath: getColumnGroupPath,
unstable_getAllGroupDetails: getAllGroupDetails
};
useGridApiMethod(apiRef, columnGroupingApi, 'GridColumnGroupingApi');
/**
* EFFECTS
*/
// The effect does not track any value defined synchronously during the 1st render by hooks called after `useGridColumns`
// As a consequence, the state generated by the 1st run of this useEffect will always be equal to the initialization one
var isFirstRender = React.useRef(true);
React.useEffect(function () {
var _props$experimentalFe, _props$columnGrouping2;
if (isFirstRender.current) {
isFirstRender.current = false;
return;
}
if (!((_props$experimentalFe = props.experimentalFeatures) != null && _props$experimentalFe.columnGrouping)) {
return;
}
var groupLookup = createGroupLookup((_props$columnGrouping2 = props.columnGroupingModel) != null ? _props$columnGrouping2 : []);
apiRef.current.setState(function (state) {
return _extends({}, state, {
columnGrouping: _extends({}, state.columnGrouping, {
lookup: groupLookup
})
});
});
}, [apiRef, props.columnGroupingModel, (_props$experimentalFe2 = props.experimentalFeatures) == null ? void 0 : _props$experimentalFe2.columnGrouping]);
};