UNPKG

@mui/x-data-grid-premium

Version:

The Premium plan edition of the MUI X Data Grid Components.

303 lines (302 loc) 12 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.getPivotForcedProps = exports.getInitialColumns = exports.defaultGetPivotDerivedColumns = exports.createPivotPropsFromRows = void 0; 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 _columnGroups = require("../../../constants/columnGroups"); var _rowGrouping = require("../rowGrouping"); var _gridAggregationUtils = require("../aggregation/gridAggregationUtils"); const defaultGetPivotDerivedColumns = (column, getLocaleText) => { if (column.type === 'date') { const field = column.field; return [{ // String column type to avoid formatting the value as 2,025 instead of 2025 field: `${field}-year`, headerName: `${column.headerName} ${getLocaleText('pivotYearColumnHeaderName')}`, valueGetter: (value, row) => new Date(row[field]).getFullYear() }, { field: `${field}-quarter`, headerName: `${column.headerName} ${getLocaleText('pivotQuarterColumnHeaderName')}`, valueGetter: (value, row) => `Q${Math.floor(new Date(row[field]).getMonth() / 3) + 1}` }]; } return undefined; }; exports.defaultGetPivotDerivedColumns = defaultGetPivotDerivedColumns; const getInitialColumns = (originalColumns, getPivotDerivedColumns, getLocaleText) => { const initialColumns = new Map(); for (let i = 0; i < originalColumns.length; i += 1) { const originalColumn = originalColumns[i]; const column = (0, _extends2.default)({}, (0, _internals.getDefaultColTypeDef)(originalColumn.type), originalColumn); const field = column.field; if (!(0, _rowGrouping.isGroupingColumn)(field)) { initialColumns.set(field, column); const derivedColumns = getPivotDerivedColumns?.(column, getLocaleText); if (derivedColumns) { derivedColumns.forEach(col => initialColumns.set(col.field, col)); } } } return initialColumns; }; exports.getInitialColumns = getInitialColumns; const sortColumnGroups = (columnGroups, pivotModelColumns, depth = 0) => { if (depth > pivotModelColumns.length - 1) { return; } const sort = pivotModelColumns[depth].sort; if (columnGroups.length < 2) { if (columnGroups[0]?.children) { sortColumnGroups(columnGroups[0].children, pivotModelColumns, depth + 1); } return; } columnGroups.sort((a, b) => { if ((0, _xDataGridPro.isLeaf)(a) || (0, _xDataGridPro.isLeaf)(b)) { return 0; } if (a.children) { sortColumnGroups(a.children, pivotModelColumns, depth + 1); } if (b.children) { sortColumnGroups(b.children, pivotModelColumns, depth + 1); } if (sort === undefined) { return 0; } return (sort === 'asc' ? 1 : -1) * (0, _xDataGridPro.gridStringOrNumberComparator)(a.rawHeaderName, b.rawHeaderName, {}, {}); }); }; const getPivotForcedProps = (pivotModel, columns, groupingColDef) => { const visibleRows = pivotModel.rows.filter(row => !row.hidden); const visibleColumns = pivotModel.columns.filter(column => !column.hidden); const visibleValues = pivotModel.values.filter(value => !value.hidden); const columnVisibilityModel = {}; for (const column of columns.values()) { columnVisibilityModel[column.field] = false; } if (visibleColumns.length === 0) { visibleValues.forEach(value => { delete columnVisibilityModel[value.field]; }); } const groupingColDefOverrides = params => (0, _extends2.default)({}, typeof groupingColDef === 'function' ? groupingColDef(params) : groupingColDef || {}, { filterable: false, aggregable: false, hideable: false }); return { columnVisibilityModel, rowGroupingModel: visibleRows.map(row => row.field), getAggregationPosition: _gridAggregationUtils.defaultGetAggregationPosition, groupingColDef: groupingColDefOverrides, headerFilters: false, disableAggregation: false, disableRowGrouping: false }; }; exports.getPivotForcedProps = getPivotForcedProps; const createPivotPropsFromRows = ({ rows, columns, pivotModel, pivotingColDef, apiRef }) => { const visibleColumns = pivotModel.columns.filter(column => !column.hidden); const visibleRows = pivotModel.rows.filter(row => !row.hidden); const visibleValues = pivotModel.values.filter(value => !value.hidden); let pivotColumns = []; const pivotColumnsIncludedInPivotValues = []; const initialColumns = new Map(); for (const column of columns.values()) { if (!(0, _rowGrouping.isGroupingColumn)(column.field)) { initialColumns.set(column.field, column); const pivotValueIndex = visibleValues.findIndex(({ field }) => field === column.field); const isVisiblePivotValueField = pivotValueIndex !== -1; const columnToAdd = (0, _extends2.default)({}, column, { aggregable: false, groupable: false, hideable: false, editable: false, disableReorder: true }); if (isVisiblePivotValueField) { // Store columns that are used as pivot values in a temporary array to keep them in the same order as in pivotModel.values, not in the order of the initial columns. // `pivotColumnsIncludedInPivotValues` is concatenated to pivotColumns later. pivotColumnsIncludedInPivotValues[pivotValueIndex] = columnToAdd; } else { pivotColumns.push(columnToAdd); } } } pivotColumns = pivotColumns.concat(pivotColumnsIncludedInPivotValues); const getAttributesFromInitialColumn = field => { const initialColumn = initialColumns.get(field); if (!initialColumn) { return undefined; } const attributes = { width: initialColumn.width, minWidth: initialColumn.minWidth, maxWidth: initialColumn.maxWidth, valueFormatter: initialColumn.valueFormatter, headerName: initialColumn.headerName, renderCell: initialColumn.renderCell, display: initialColumn.display }; return attributes; }; const aggregationModel = {}; const columnGroupingModel = []; const columnGroupingModelLookup = new Map(); let newRows = []; if (visibleColumns.length === 0) { newRows = rows; visibleValues.forEach(pivotValue => { aggregationModel[pivotValue.field] = pivotValue.aggFunc; }); } else { for (let i = 0; i < rows.length; i += 1) { const row = rows[i]; const newRow = (0, _extends2.default)({}, row); const columnGroupPath = []; for (let j = 0; j < visibleColumns.length; j += 1) { const { field: colGroupField } = visibleColumns[j]; const depth = j; const column = initialColumns.get(colGroupField); if (!column) { continue; } const noValueString = '(No value)'; let colValue = apiRef.current.getRowValue(row, column) ?? noValueString; // Handle empty strings to prevent issues with column grouping model // https://github.com/mui/mui-x/issues/20552 if (colValue === '') { colValue = noValueString; } if (column.type === 'singleSelect') { const singleSelectColumn = column; if (singleSelectColumn.getOptionLabel) { colValue = singleSelectColumn.getOptionLabel(colValue); } } if (column.type !== 'number') { colValue = String(colValue); } const formattedHeaderName = apiRef.current.getRowFormattedValue(row, column) || colValue; columnGroupPath.push(colValue); const groupId = columnGroupPath.join(_columnGroups.COLUMN_GROUP_ID_SEPARATOR); if (!columnGroupingModelLookup.has(groupId)) { const columnGroup = { groupId, headerName: formattedHeaderName, rawHeaderName: colValue, children: [] }; columnGroupingModelLookup.set(groupId, columnGroup); if (depth === 0) { columnGroupingModel.push(columnGroup); } else { const parentGroupId = columnGroupPath.slice(0, -1).join(_columnGroups.COLUMN_GROUP_ID_SEPARATOR); const parentGroup = columnGroupingModelLookup.get(parentGroupId); if (parentGroup) { parentGroup.children.push(columnGroup); } } } const isLastColumnGroupLevel = depth === visibleColumns.length - 1; if (isLastColumnGroupLevel) { visibleValues.forEach(pivotValue => { const valueField = pivotValue.field; const originalColumn = initialColumns.get(valueField); if (!originalColumn) { return; } const valueKey = `${columnGroupPath.join(_columnGroups.COLUMN_GROUP_ID_SEPARATOR)}${_columnGroups.COLUMN_GROUP_ID_SEPARATOR}${valueField}`; newRow[valueKey] = apiRef.current.getRowValue(row, originalColumn); }); } } newRows.push(newRow); } sortColumnGroups(columnGroupingModel, visibleColumns); } function createColumns(columnGroups, depth = 0) { for (let i = 0; i < columnGroups.length; i += 1) { const columnGroup = columnGroups[i]; if ((0, _xDataGridPro.isLeaf)(columnGroup)) { continue; } const isLastColumnGroupLevel = depth === visibleColumns.length - 1; if (isLastColumnGroupLevel) { if (visibleValues.length === 0) { // If there are no visible values, there are no actual columns added to the data grid, which leads to column groups not being visible. // Adding an empty column to each column group ensures that the column groups are visible. const emptyColumnField = `${columnGroup.groupId}${_columnGroups.COLUMN_GROUP_ID_SEPARATOR}empty`; const emptyColumn = { field: emptyColumnField, headerName: '', sortable: false, filterable: false, groupable: false, aggregable: false, hideable: false, disableColumnMenu: true }; pivotColumns.push(emptyColumn); if (columnGroup) { columnGroup.children.push({ field: emptyColumnField }); } } else { visibleValues.forEach(pivotValue => { const valueField = pivotValue.field; const mapValueKey = `${columnGroup.groupId}${_columnGroups.COLUMN_GROUP_ID_SEPARATOR}${valueField}`; const overrides = typeof pivotingColDef === 'function' ? pivotingColDef(valueField, columnGroup.groupId.split(_columnGroups.COLUMN_GROUP_ID_SEPARATOR)) : pivotingColDef; const column = (0, _extends2.default)({ headerName: String(valueField) }, getAttributesFromInitialColumn(pivotValue.field), overrides, { // pivoting values are always numbers type: 'number', field: mapValueKey, aggregable: false, groupable: false, filterable: false, hideable: false, editable: false, disableReorder: true, availableAggregationFunctions: [pivotValue.aggFunc] }); pivotColumns.push(column); aggregationModel[mapValueKey] = pivotValue.aggFunc; if (columnGroup) { columnGroup.children.push({ field: mapValueKey }); } }); } } else { createColumns(columnGroup.children, depth + 1); } } } createColumns(columnGroupingModel); return { rows: visibleRows.length > 0 ? newRows : [], columns: pivotColumns, columnGroupingModel, aggregationModel }; }; exports.createPivotPropsFromRows = createPivotPropsFromRows;