@adaptabletools/adaptable
Version:
Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements
152 lines (151 loc) • 6.11 kB
JavaScript
import { isPivotLayoutModel } from './isPivotLayoutModel';
export const GROUP_COLUMN_ID__SINGLE = 'ag-Grid-AutoColumn';
export const GROUP_COLUMN_ID__MULTI_PREFIX = 'ag-Grid-AutoColumn-';
export const DEFAULT_COL_WIDTH = 200;
export function isGroupColumn(colId) {
return colId.startsWith(GROUP_COLUMN_ID__MULTI_PREFIX) || colId === GROUP_COLUMN_ID__SINGLE;
}
export function normalizeTableLayoutModel(layout, options) {
layout = structuredClone(layout);
if (!layout.ColumnVisibility) {
layout.ColumnVisibility = {};
}
if (!layout.TableAggregationColumns) {
layout.TableAggregationColumns = [];
}
if (!layout.ColumnSorts) {
layout.ColumnSorts = [];
}
if (!layout.ColumnPinning) {
layout.ColumnPinning = {};
}
if (!layout.ColumnWidths) {
layout.ColumnWidths = {};
}
if (!layout.RowGroupedColumns) {
layout.RowGroupedColumns = [];
}
if (!Object.prototype.hasOwnProperty.call(layout, 'SuppressAggFuncInHeader')) {
// make it an own property
layout.SuppressAggFuncInHeader = undefined;
}
const ColumnOrderSet = new Set(layout.TableColumns);
if (layout.RowGroupedColumns && layout.RowGroupedColumns.length && layout.TableColumns) {
// the layout.TableColumns might not include the group columns
//
// but we want to include those columnIds in the TableColumns
// so the layout is properly specified
let displayType = layout.RowGroupDisplayType;
if (!displayType) {
layout.TableColumns.some((columnId) => {
if (columnId === GROUP_COLUMN_ID__SINGLE) {
displayType = 'single';
return true;
}
else if (columnId.startsWith(GROUP_COLUMN_ID__MULTI_PREFIX)) {
displayType = 'multi';
return true;
}
});
displayType = displayType || 'single';
layout.RowGroupDisplayType = displayType;
}
if (displayType === 'single') {
if (!ColumnOrderSet.has(GROUP_COLUMN_ID__SINGLE)) {
layout.TableColumns = [GROUP_COLUMN_ID__SINGLE, ...layout.TableColumns];
}
}
else {
const GroupedCols = new Set(layout.RowGroupedColumns);
[...layout.RowGroupedColumns].reverse().forEach((colId) => {
const groupColId = `${GROUP_COLUMN_ID__MULTI_PREFIX}${colId}`;
if (!ColumnOrderSet.has(groupColId) && !ColumnOrderSet.has(colId)) {
// add the col to the beginning of the layout.OrderedColumns
layout.TableColumns.unshift(colId);
ColumnOrderSet.add(colId);
// the .flatMap below will handle the rest
}
});
const MappedColumnOrder = layout.TableColumns.flatMap((colId) => {
if (GroupedCols.has(colId)) {
// if the column is grouped by
const groupColId = `${GROUP_COLUMN_ID__MULTI_PREFIX}${colId}`;
// but there's no column for this group in the layout
if (!ColumnOrderSet.has(groupColId)) {
// then we assume that the current column is basically the group column
// so we return both the group column and the current column
// but make the current column hidden
layout.ColumnVisibility[colId] = false;
return [groupColId, colId];
}
}
// if this is a group column
if (colId.startsWith(GROUP_COLUMN_ID__MULTI_PREFIX)) {
const simpleColId = colId.replace(GROUP_COLUMN_ID__MULTI_PREFIX, '');
// but the corresponding simple column is not in the layout
// then let's include it, with visibility set to false
if (!ColumnOrderSet.has(simpleColId)) {
layout.ColumnVisibility[simpleColId] = false;
return [colId, simpleColId];
}
}
return colId;
});
layout.TableColumns = [...MappedColumnOrder];
}
if (layout.RowGroupedColumns && layout.RowGroupedColumns.length && !layout.RowGroupValues) {
layout.RowGroupValues = {
RowGroupDisplay: 'always-collapsed',
};
}
}
if (options?.isTree && !layout.TableColumns.includes(GROUP_COLUMN_ID__SINGLE)) {
layout.TableColumns.unshift(GROUP_COLUMN_ID__SINGLE);
}
return layout;
}
export function normalizePivotLayoutModel(layout) {
layout = structuredClone(layout);
if (!layout.ColumnVisibility) {
layout.ColumnVisibility = {};
}
if (!layout.PivotAggregationColumns) {
layout.PivotAggregationColumns = [];
}
if (!layout.ColumnSorts) {
layout.ColumnSorts = [];
}
if (!layout.ColumnPinning) {
layout.ColumnPinning = {};
}
if (!layout.ColumnWidths) {
layout.ColumnWidths = {};
}
if (!layout.PivotGroupedColumns) {
layout.PivotGroupedColumns = [];
}
if (layout.PivotExpandLevel === undefined) {
layout.PivotExpandLevel = -1;
}
if (!layout.PivotColumns) {
layout.PivotColumns = [];
}
if (!layout.RowGroupValues) {
layout.RowGroupValues = {
RowGroupDisplay: 'always-collapsed',
};
}
if (!Object.prototype.hasOwnProperty.call(layout, 'SuppressAggFuncInHeader')) {
// make it an own property
layout.SuppressAggFuncInHeader = undefined;
}
return layout;
}
export function normalizeLayoutModel(layout, options) {
if (isPivotLayoutModel(layout)) {
return normalizePivotLayoutModel(layout);
}
return normalizeTableLayoutModel(layout, options);
}
//@ts-ignore
globalThis.normalizeTableLayoutModel = normalizeTableLayoutModel;