UNPKG

@adaptabletools/adaptable

Version:

Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements

165 lines (164 loc) 8.31 kB
import { ApiBase } from '../Implementation/ApiBase'; import { CreateEmptyCalculatedColumn, CreateInternalAlertDefinitionForMessages, } from '../../Utilities/ObjectFactory'; import ArrayExtensions from '../../Utilities/Extensions/ArrayExtensions'; import StringExtensions from '../../Utilities/Extensions/StringExtensions'; import { CALCULATED_COLUMN_TYPE } from '../../AdaptableState/Common/AdaptableColumn'; export class CalculatedColumnInternalApi extends ApiBase { /** * Returns all the references in the AdaptableState of the given CalculatedColumn * @param calculatedColumn CalculatedColumn to be checked */ getCalculatedColumnModuleReferences(calculatedColumn) { const references = []; this.getAdaptableInternalApi() .getModules() .forEach((module) => { if (module .getModuleCalculatedColumnReferences() .some((moduleReference) => moduleReference.Uuid === calculatedColumn.Uuid)) { references.push(module.moduleInfo.FriendlyName); } }); return references; } /** * Returns all Calculated Columns whose Expression contains the ColumnId * @param columnId ColumnId to check */ getCalculatedColumnsReferencingColumnId(columnId) { const calcColumns = []; this.getCalculatedColumnApi() .getCalculatedColumns() .forEach((calculatedColumn) => { if (this.getExpressionApi().internalApi.isColumnReferencedInExpression(columnId, this.getExpressionApi().getAdaptableQueryExpression(calculatedColumn.Query))) { calcColumns.push(calculatedColumn); } }); return calcColumns; } /** * Gets any ColumnIds referenced in a Calculated Column * @param calculatedColumn Calculated Column to check */ getReferencedColumnIdsForCalculatedColumn(calculatedColumn) { const columnIds = this.getExpressionApi().getColumnsFromExpression(this.getExpressionApi().getAdaptableQueryExpression(calculatedColumn.Query)); return columnIds; } /** * Gets any ColumnIds referenced in a Calculated Column * @param calculatedColumnId CalculatedColumnId to check */ getReferencedColumnIdsForCalculatedColumnId(calculatedColumnId) { const calculatedColumn = this.getCalculatedColumnApi() .getCalculatedColumns() .find((cc) => cc.ColumnId == calculatedColumnId); if (calculatedColumn) { return this.getReferencedColumnIdsForCalculatedColumn(calculatedColumn); } } getCalculatedColumnsDependentOnColumn(column) { const calculatedColumns = this.getCalculatedColumnApi().getCalculatedColumns(); return calculatedColumns .filter((calculatedColumn) => { const dependentColumns = this.getReferencedColumnIdsForCalculatedColumnId(calculatedColumn.ColumnId); return dependentColumns.includes(column.columnId); }) .map((calculatedColumn) => calculatedColumn.ColumnId); } isCumulativeAggregatedExpression(input) { return !!this.getAdaptableApi() .internalApi.getQueryLanguageService() .getNodesFromExpression(input, 'CUMUL')?.length; } isQuantileAggregatedExpression(input) { return !!this.getAdaptableApi() .internalApi.getQueryLanguageService() .getNodesFromExpression(input, 'QUANT')?.length; } getExpressionFromCalculatedColumn(calculatedColumn) { return (calculatedColumn.Query.ScalarExpression ?? calculatedColumn.Query.AggregatedScalarExpression); } getColDefsForCalculatedColumns() { const defaultSpecialColumnSettings = this.getGridApi().internalApi.deriveSpecialColumnSettingsFromAgGridDefaultColDef(); const defaultCalculatedColumnSettings = CreateEmptyCalculatedColumn(defaultSpecialColumnSettings).CalculatedColumnSettings; return this.getCalculatedColumnApi() .getCalculatedColumns() .map((calculatedColumn) => { const calculatedColumnSettings = { ...defaultCalculatedColumnSettings, ...calculatedColumn.CalculatedColumnSettings, }; if (!calculatedColumnSettings.DataType) { calculatedColumnSettings.DataType = this.getAdaptableInternalApi() .getCalculatedColumnExpressionService() .getCalculatedColumnDataType(calculatedColumn.Query); } const columnTypes = [CALCULATED_COLUMN_TYPE]; if (ArrayExtensions.IsNotNullOrEmpty(calculatedColumnSettings.ColumnTypes)) { columnTypes.push(...calculatedColumnSettings.ColumnTypes); } const isExternalEvaluation = !this.getExpressionApi().internalApi.evaluateExpressionInAdaptableQL('CalculatedColumn', calculatedColumn, this.getExpressionApi().getAdaptableQueryExpression(calculatedColumn.Query)); const valueGetter = (params) => { if (isExternalEvaluation) { return params.data?.[calculatedColumn.ColumnId]; } // if the grid data is NOT client side, we can aggregate only simple scalar expression (which depend on row data, not on other rows) if (this.getGridApi().getAgGridRowModelType() !== 'clientSide' && StringExtensions.IsNotNullOrEmpty(calculatedColumn.Query.AggregatedScalarExpression)) { return params.data?.[calculatedColumn.ColumnId]; } return this.getAdaptableInternalApi() .getCalculatedColumnExpressionService() .evaluateCalculatedColumnQuery(calculatedColumn, params.node); }; const newColDef = { headerName: calculatedColumn.FriendlyName ? calculatedColumn.FriendlyName : calculatedColumn.ColumnId, colId: calculatedColumn.ColumnId, hide: false, editable: false, width: calculatedColumnSettings.Width, enableValue: calculatedColumnSettings.Aggregatable, filter: calculatedColumnSettings.Filterable, floatingFilter: calculatedColumnSettings.Filterable, resizable: calculatedColumnSettings.Resizable, enableRowGroup: calculatedColumnSettings.Groupable, sortable: calculatedColumnSettings.Sortable, enablePivot: calculatedColumnSettings.Pivotable, suppressHeaderMenuButton: calculatedColumnSettings.SuppressMenu, suppressMovable: calculatedColumnSettings.SuppressMovable, type: columnTypes, cellDataType: calculatedColumnSettings.DataType, valueGetter, }; if (calculatedColumnSettings.ShowToolTip != null && calculatedColumnSettings.ShowToolTip == true) { newColDef.tooltipValueGetter = () => { return this.getAdaptableInternalApi().getAdaptableQueryExpressionText(calculatedColumn.Query); }; } if (calculatedColumnSettings.HeaderToolTip) { newColDef.headerTooltip = calculatedColumnSettings.HeaderToolTip; } this.logInfo('Setting up Calculated Column: ' + calculatedColumn.ColumnId); return newColDef; }); } validateDeletedCalculatedColumn(calculatedColumn) { const calculatedColumnReferences = this.getCalculatedColumnModuleReferences(calculatedColumn); if (calculatedColumnReferences.length) { const alert = { alertType: 'generic', header: 'CalculatedColumn could not be deleted', message: `It is still referenced in the following modules: ${calculatedColumnReferences.join(', ')}`, alertDefinition: CreateInternalAlertDefinitionForMessages('Error'), }; this.getAlertApi().displayAdaptableAlertNotification(alert); return false; } else { return true; } } }