@mui/x-data-grid-premium
Version:
The Premium plan edition of the MUI X Data Grid Components.
314 lines (302 loc) • 15.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createGroupingColDefForOneGroupingCriteria = exports.createGroupingColDefForAllGroupingCriteria = void 0;
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _xDataGridPro = require("@mui/x-data-grid-pro");
var _internals = require("@mui/x-data-grid-pro/internals");
var _GridGroupingColumnFooterCell = require("../../../components/GridGroupingColumnFooterCell");
var _GridGroupingCriteriaCell = require("../../../components/GridGroupingCriteriaCell");
var _GridDataSourceGroupingCriteriaCell = require("../../../components/GridDataSourceGroupingCriteriaCell");
var _GridGroupingColumnLeafCell = require("../../../components/GridGroupingColumnLeafCell");
var _gridRowGroupingUtils = require("./gridRowGroupingUtils");
var _gridRowGroupingSelector = require("./gridRowGroupingSelector");
var _jsxRuntime = require("react/jsx-runtime");
const _excluded = ["leafField", "mainGroupingCriteria", "hideDescendantCount"],
_excluded2 = ["leafField", "mainGroupingCriteria", "hideDescendantCount"];
const GROUPING_COL_DEF_DEFAULT_PROPERTIES = (0, _extends2.default)({}, _xDataGridPro.GRID_STRING_COL_DEF, {
type: 'custom',
disableReorder: true,
chartable: false,
aggregable: false
});
const GROUPING_COL_DEF_FORCED_PROPERTIES_DEFAULT = {
editable: false,
groupable: false
};
const GROUPING_COL_DEF_FORCED_PROPERTIES_DATA_SOURCE = (0, _extends2.default)({}, GROUPING_COL_DEF_FORCED_PROPERTIES_DEFAULT, {
// TODO: Support these features on the grouping column(s)
filterable: false,
sortable: false
});
/**
* When sorting two cells with different grouping criteria, we consider that the cell with the grouping criteria coming first in the model should be displayed below.
* This can occur when some rows don't have all the fields. In which case we want the rows with the missing field to be displayed above.
* TODO: Make this index comparator depth invariant, the logic should not be inverted when sorting in the "desc" direction (but the current return format of `sortComparator` does not support this behavior).
*/
const groupingFieldIndexComparator = (v1, v2, cellParams1, cellParams2) => {
const model = (0, _gridRowGroupingSelector.gridRowGroupingSanitizedModelSelector)({
current: cellParams1.api
});
const groupingField1 = cellParams1.rowNode.groupingField ?? null;
const groupingField2 = cellParams2.rowNode.groupingField ?? null;
if (groupingField1 === groupingField2) {
return 0;
}
if (groupingField1 == null) {
return -1;
}
if (groupingField2 == null) {
return 1;
}
if (model.indexOf(groupingField1) < model.indexOf(groupingField2)) {
return -1;
}
return 1;
};
const getLeafProperties = leafColDef => ({
headerName: leafColDef.headerName ?? leafColDef.field,
sortable: leafColDef.sortable,
filterable: leafColDef.filterable,
valueOptions: (0, _internals.isSingleSelectColDef)(leafColDef) ? leafColDef.valueOptions : undefined,
filterOperators: leafColDef.filterOperators,
sortComparator: (v1, v2, cellParams1, cellParams2) => {
// We only want to sort the leaves
if (cellParams1.rowNode.type === 'leaf' && cellParams2.rowNode.type === 'leaf') {
return leafColDef.sortComparator(v1, v2, cellParams1, cellParams2);
}
return groupingFieldIndexComparator(v1, v2, cellParams1, cellParams2);
}
});
const groupedByColValueFormatter = groupedByColDef => (value, row, _, apiRef) => {
const rowId = (0, _xDataGridPro.gridRowIdSelector)(apiRef, row);
const rowNode = (0, _xDataGridPro.gridRowNodeSelector)(apiRef, rowId);
if (rowNode.type === 'group' && rowNode.groupingField === groupedByColDef.field) {
return groupedByColDef.valueFormatter(value, row, groupedByColDef, apiRef);
}
return value;
};
function getGroupingCriteriaProperties(groupedByColDef, rowGroupingColumnMode, rowGroupingModel = [], columnsLookup = {}) {
let valueFormatter;
if (rowGroupingColumnMode === 'single' && rowGroupingModel.length > 1) {
// In single column grouping mode, the `valueFormatter` of the grouping column uses
// value formatters from original columns for each of the grouping criteria
valueFormatter = (value, row, column, apiRef) => {
const rowId = (0, _xDataGridPro.gridRowIdSelector)(apiRef, row);
const rowNode = (0, _xDataGridPro.gridRowNodeSelector)(apiRef, rowId);
if (rowNode?.type === 'group') {
const originalColDef = rowNode.groupingField ? columnsLookup[rowNode.groupingField] : null;
if (originalColDef?.type === 'singleSelect') {
// the default valueFormatter of a singleSelect colDef won't work with the grouping column values
return value;
}
const columnValueFormatter = originalColDef?.valueFormatter;
if (typeof columnValueFormatter === 'function') {
return columnValueFormatter(value, row, column, apiRef);
}
}
return value;
};
} else {
valueFormatter = groupedByColDef.valueFormatter ? groupedByColValueFormatter(groupedByColDef) : undefined;
}
const properties = {
sortable: groupedByColDef.sortable,
filterable: groupedByColDef.filterable,
valueFormatter,
valueOptions: (0, _internals.isSingleSelectColDef)(groupedByColDef) ? groupedByColDef.valueOptions : undefined,
sortComparator: (v1, v2, cellParams1, cellParams2) => {
// We only want to sort the groups of the current grouping criteria
if (cellParams1.rowNode.type === 'group' && cellParams2.rowNode.type === 'group' && cellParams1.rowNode.groupingField === cellParams2.rowNode.groupingField) {
const colDef = cellParams1.api.getColumn(cellParams1.rowNode.groupingField);
return colDef.sortComparator(v1, v2, cellParams1, cellParams2);
}
return groupingFieldIndexComparator(v1, v2, cellParams1, cellParams2);
},
filterOperators: groupedByColDef.filterOperators
};
const applyHeaderName = !(rowGroupingColumnMode === 'single' && rowGroupingModel.length > 1);
if (applyHeaderName) {
properties.headerName = groupedByColDef.headerName ?? groupedByColDef.field;
}
return properties;
}
/**
* Creates the `GridColDef` for a grouping column that only takes care of a single grouping criteria
*/
const createGroupingColDefForOneGroupingCriteria = ({
columnsLookup,
groupedByColDef,
groupingCriteria,
colDefOverride,
strategy = _internals.RowGroupingStrategy.Default
}) => {
const _ref = colDefOverride ?? {},
{
leafField,
mainGroupingCriteria,
hideDescendantCount
} = _ref,
colDefOverrideProperties = (0, _objectWithoutPropertiesLoose2.default)(_ref, _excluded);
const leafColDef = leafField ? columnsLookup[leafField] : null;
const CriteriaCell = strategy === _internals.RowGroupingStrategy.Default ? _GridGroupingCriteriaCell.GridGroupingCriteriaCell : _GridDataSourceGroupingCriteriaCell.GridDataSourceGroupingCriteriaCell;
// The properties that do not depend on the presence of a `leafColDef` and that can be overridden by `colDefOverride`
const commonProperties = {
width: Math.max((groupedByColDef.width ?? _xDataGridPro.GRID_STRING_COL_DEF.width) + 40, leafColDef?.width ?? 0),
renderCell: params => {
// Render footer
if (params.rowNode.type === 'footer' || params.rowNode.type === 'pinnedRow') {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridGroupingColumnFooterCell.GridGroupingColumnFooterCell, (0, _extends2.default)({}, params));
}
// Render leaves
if (params.rowNode.type === 'leaf') {
if (leafColDef) {
const leafParams = (0, _extends2.default)({}, params.api.getCellParams(params.id, leafField), {
api: params.api,
hasFocus: params.hasFocus
});
if (leafColDef.renderCell) {
return leafColDef.renderCell(leafParams);
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridGroupingColumnLeafCell.GridGroupingColumnLeafCell, (0, _extends2.default)({}, leafParams));
}
return '';
}
// Render current grouping criteria groups
if (params.rowNode.groupingField === groupingCriteria) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(CriteriaCell, (0, _extends2.default)({}, params, {
hideDescendantCount: hideDescendantCount
}));
}
return '';
},
valueGetter: (value, row, column, apiRef) => {
const rowId = (0, _xDataGridPro.gridRowIdSelector)(apiRef, row);
const rowNode = (0, _xDataGridPro.gridRowNodeSelector)(apiRef, rowId);
if (!rowNode || rowNode.type === 'footer' || rowNode.type === 'pinnedRow') {
return undefined;
}
if (rowNode.type === 'leaf') {
if (leafColDef) {
return apiRef.current.getCellValue(rowId, leafField);
}
return undefined;
}
if (rowNode.groupingField === groupingCriteria) {
return rowNode.groupingKey;
}
return undefined;
}
};
// If we have a `mainGroupingCriteria` defined and matching the `groupingCriteria`
// Then we apply the sorting / filtering on the groups of this column's grouping criteria based on the properties of `groupedByColDef`.
// It can be useful to define a `leafField` for leaves rendering but still use the grouping criteria for the sorting / filtering
//
// If we have a `leafField` defined and matching an existing column
// Then we apply the sorting / filtering on the leaves based on the properties of `leavesColDef`
//
// By default, we apply the sorting / filtering on the groups of this column's grouping criteria based on the properties of `groupedColDef`.
let sourceProperties;
if (mainGroupingCriteria && mainGroupingCriteria === groupingCriteria) {
sourceProperties = getGroupingCriteriaProperties(groupedByColDef, 'multiple');
} else if (leafColDef) {
sourceProperties = getLeafProperties(leafColDef);
} else {
sourceProperties = getGroupingCriteriaProperties(groupedByColDef, 'multiple');
}
// The properties that can't be overridden with `colDefOverride`
const forcedProperties = (0, _extends2.default)({
field: (0, _gridRowGroupingUtils.getRowGroupingFieldFromGroupingCriteria)(groupingCriteria)
}, GROUPING_COL_DEF_FORCED_PROPERTIES_DEFAULT);
return (0, _extends2.default)({}, GROUPING_COL_DEF_DEFAULT_PROPERTIES, commonProperties, sourceProperties, colDefOverrideProperties, forcedProperties);
};
exports.createGroupingColDefForOneGroupingCriteria = createGroupingColDefForOneGroupingCriteria;
/**
* Creates the `GridColDef` for a grouping column that takes care of all the grouping criteria
*/
const createGroupingColDefForAllGroupingCriteria = ({
apiRef,
columnsLookup,
rowGroupingModel,
colDefOverride,
strategy = _internals.RowGroupingStrategy.Default
}) => {
const _ref2 = colDefOverride ?? {},
{
leafField,
mainGroupingCriteria,
hideDescendantCount
} = _ref2,
colDefOverrideProperties = (0, _objectWithoutPropertiesLoose2.default)(_ref2, _excluded2);
const leafColDef = leafField ? columnsLookup[leafField] : null;
const CriteriaCell = strategy === _internals.RowGroupingStrategy.Default ? _GridGroupingCriteriaCell.GridGroupingCriteriaCell : _GridDataSourceGroupingCriteriaCell.GridDataSourceGroupingCriteriaCell;
// The properties that do not depend on the presence of a `leafColDef` and that can be overridden by `colDefOverride`
const commonProperties = {
headerName: apiRef.current.getLocaleText('groupingColumnHeaderName'),
width: Math.max(...rowGroupingModel.map(field => (columnsLookup[field].width ?? _xDataGridPro.GRID_STRING_COL_DEF.width) + 40), leafColDef?.width ?? 0),
renderCell: params => {
// Render footer
if (params.rowNode.type === 'footer' || params.rowNode.type === 'pinnedRow') {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridGroupingColumnFooterCell.GridGroupingColumnFooterCell, (0, _extends2.default)({}, params));
}
// Render the leaves
if (params.rowNode.type === 'leaf') {
if (leafColDef) {
const leafParams = (0, _extends2.default)({}, params.api.getCellParams(params.id, leafField), {
api: params.api,
hasFocus: params.hasFocus
});
if (leafColDef.renderCell) {
return leafColDef.renderCell(leafParams);
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridGroupingColumnLeafCell.GridGroupingColumnLeafCell, (0, _extends2.default)({}, leafParams));
}
return '';
}
// Render the groups
return /*#__PURE__*/(0, _jsxRuntime.jsx)(CriteriaCell, (0, _extends2.default)({}, params, {
hideDescendantCount: hideDescendantCount
}));
},
valueGetter: (value, row) => {
const rowId = (0, _xDataGridPro.gridRowIdSelector)(apiRef, row);
const rowNode = (0, _xDataGridPro.gridRowNodeSelector)(apiRef, rowId);
if (!rowNode || rowNode.type === 'footer' || rowNode.type === 'pinnedRow') {
return undefined;
}
if (rowNode.type === 'leaf') {
if (leafColDef) {
return apiRef.current.getCellValue(rowId, leafField);
}
return undefined;
}
return rowNode.groupingKey;
}
};
// If we have a `mainGroupingCriteria` defined and matching one of the `orderedGroupedByFields`
// Then we apply the sorting / filtering on the groups of this column's grouping criteria based on the properties of `columnsLookup[mainGroupingCriteria]`.
// It can be useful to use another grouping criteria than the top level one for the sorting / filtering
//
// If we have a `leafField` defined and matching an existing column
// Then we apply the sorting / filtering on the leaves based on the properties of `leavesColDef`
//
// By default, we apply the sorting / filtering on the groups of the top level grouping criteria based on the properties of `columnsLookup[orderedGroupedByFields[0]]`.
if (process.env.NODE_ENV !== "production") commonProperties.renderCell.displayName = "commonProperties.renderCell";
let sourceProperties;
if (mainGroupingCriteria && rowGroupingModel.includes(mainGroupingCriteria)) {
sourceProperties = getGroupingCriteriaProperties(columnsLookup[mainGroupingCriteria], 'single', rowGroupingModel, columnsLookup);
} else if (leafColDef) {
sourceProperties = getLeafProperties(leafColDef);
} else {
sourceProperties = getGroupingCriteriaProperties(columnsLookup[rowGroupingModel[0]], 'single', rowGroupingModel, columnsLookup);
}
// The properties that can't be overridden with `colDefOverride`
const forcedProperties = (0, _extends2.default)({
field: _gridRowGroupingUtils.GRID_ROW_GROUPING_SINGLE_GROUPING_FIELD
}, strategy === _internals.RowGroupingStrategy.Default ? GROUPING_COL_DEF_FORCED_PROPERTIES_DEFAULT : GROUPING_COL_DEF_FORCED_PROPERTIES_DATA_SOURCE);
return (0, _extends2.default)({}, GROUPING_COL_DEF_DEFAULT_PROPERTIES, commonProperties, sourceProperties, colDefOverrideProperties, forcedProperties);
};
exports.createGroupingColDefForAllGroupingCriteria = createGroupingColDefForAllGroupingCriteria;