@progress/kendo-angular-pivotgrid
Version: 
PivotGrid package for Angular
189 lines (188 loc) • 7.09 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the project root for more information
*-------------------------------------------------------------------------------------------*/
import { Directive, Input, NgZone } from '@angular/core';
import { PivotGridDataService } from './pivotgrid-data.service';
import { addKPI, buildKPIMeasures, createDataState, fetchData, fetchDiscover } from '@progress/kendo-pivotgrid-common';
import { anyChanged } from '@progress/kendo-angular-common';
import { PivotBaseBindingDirective } from './base-binding-directive';
import { clone } from '../util';
import * as i0 from "@angular/core";
import * as i1 from "./pivotgrid-data.service";
/**
 * A directive which binds the PivotGrid to data using an Online Analytical Processing (OLAP) service ([see example]({% slug directives_databinding_remote_pivotgrid %})).
 */
export class PivotOLAPBindingDirective extends PivotBaseBindingDirective {
    /**
     * The OLAP service endpoint where the data is processed and retrieved to render the pivot table.
     */
    url;
    /**
     * The cube name that is used to retrieve data for the pivot table rendering.
     */
    cube;
    /**
     * The database name that is used to retrieve the data from the specified connection string.
     */
    catalog;
    type = 'olap';
    constructor(dataService, zone) {
        super(dataService, zone);
    }
    ngOnChanges(changes) {
        if (anyChanged(['url', 'cube', 'catalog', 'columnAxes', 'rowAxes', 'measureAxes'], changes)) {
            this.loadData(this.dataService.state);
            this.loadFields();
        }
    }
    loadData(state) {
        const { columnAxes, rowAxes, measureAxes, sort, filter } = state;
        this.dataService.loading.next(true);
        const options = {
            connection: {
                catalog: this.catalog,
                cube: this.cube
            },
            columnAxes,
            rowAxes,
            measureAxes,
            sort,
            filter
        };
        fetchData({ url: this.url }, clone(options))
            .then(createDataState)
            .then(newDataState => {
            this.dataState = newDataState;
            this.updateDataServiceFields();
            this.dataService.loading.next(false);
        });
    }
    loadFields() {
        const options = {
            connection: {
                catalog: this.catalog,
                cube: this.cube
            },
            restrictions: {
                catalogName: this.catalog,
                cubeName: this.cube
            },
            command: 'schemaDimensions'
        };
        fetchDiscover({ url: this.url }, options)
            .then((newFields) => {
            addKPI(newFields);
            this.configuratorFields = newFields;
            this.updateConfiguratorFields();
        });
    }
    async updateFields(event, fields) {
        const newFields = fields.slice();
        const field = this.getField(newFields, event);
        if (field && field.uniqueName === '[KPIs]') {
            const KPIs = this.normalizeKPIs(await this.loadKPIs());
            field.children = KPIs;
        }
        else if (field && field.type === 'kpi') {
            field.children = buildKPIMeasures(field);
        }
        else if (field && !field.children) {
            const additionalFields = await this.loadAvailableFields(field);
            field.children = additionalFields;
        }
        return field?.children;
    }
    /**
     * @hidden
     */
    fetchChildren(event, fields) {
        return this.updateFields(event, fields);
    }
    normalizeKPIs(data) {
        for (let idx = 0, length = data.length; idx < length; idx++) {
            data[idx].uniqueName = data[idx].name;
            data[idx].type = 'kpi';
        }
        return data;
    }
    getField(nodes = [], target) {
        for (let i = 0; i < nodes.length; i++) {
            const node = nodes[i];
            if (node.uniqueName === target.uniqueName) {
                return node;
            }
            const result = this.getField(node.children, target);
            if (result !== null) {
                return result;
            }
        }
        return null;
    }
    async loadKPIs() {
        const options = {
            connection: {
                catalog: this.catalog,
                cube: this.cube
            },
            restrictions: {
                catalogName: this.catalog,
                cubeName: this.cube
            },
            command: 'schemaKPIs'
        };
        return fetchDiscover({ url: this.url }, options);
    }
    async loadAvailableFields(field) {
        let command;
        let dimensionUniqueName;
        let hierarchyUniqueName;
        let levelUniqueName;
        let memberUniqueName;
        let treeOp;
        if (field.type === 2) {
            command = 'schemaMeasures';
        }
        else if (field.dimensionUniqueName) {
            command = 'schemaLevels';
            hierarchyUniqueName = field.uniqueName;
        }
        else {
            command = 'schemaHierarchies';
            dimensionUniqueName = field.uniqueName;
        }
        const options = {
            connection: {
                catalog: this.catalog,
                cube: this.cube
            },
            restrictions: {
                catalogName: this.catalog,
                cubeName: this.cube,
                hierarchyUniqueName,
                dimensionUniqueName,
                levelUniqueName,
                memberUniqueName,
                treeOp
            },
            command
        };
        return fetchDiscover({ url: this.url }, options);
    }
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PivotOLAPBindingDirective, deps: [{ token: i1.PivotGridDataService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
    static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: PivotOLAPBindingDirective, isStandalone: true, selector: "[kendoPivotOLAPBinding]", inputs: { url: "url", cube: "cube", catalog: "catalog" }, exportAs: ["kendoPivotOLAPBinding"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PivotOLAPBindingDirective, decorators: [{
            type: Directive,
            args: [{
                    selector: '[kendoPivotOLAPBinding]',
                    exportAs: 'kendoPivotOLAPBinding',
                    standalone: true
                }]
        }], ctorParameters: function () { return [{ type: i1.PivotGridDataService }, { type: i0.NgZone }]; }, propDecorators: { url: [{
                type: Input
            }], cube: [{
                type: Input
            }], catalog: [{
                type: Input
            }] } });