UNPKG

ngx-beautiful-charts

Version:
224 lines 20.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ElementRef } from '@angular/core'; import { colorSchemes } from '../../constants/color-schemes'; import { ClusteredBarChartService } from './clustered-bar-chart.service'; import { GlobalParametersService } from '../../global/global-parameters.service'; export class ClusteredBarChartComponent { /** * @param {?} clusteredBarChartService * @param {?} globalParametersService * @param {?} currentElement */ constructor(clusteredBarChartService, globalParametersService, currentElement) { this.clusteredBarChartService = clusteredBarChartService; this.globalParametersService = globalParametersService; this.currentElement = currentElement; this.showGridLines = false; this.colorScheme = 'colorful'; this.customColorScheme = []; this.xPadding = 60; this.yPadding = this.xPadding / 2; } // [{color: string, paths: string[]}]; /** * @return {?} */ setDimensions() { if (this.width && !this.height) this.height = this.width / 3; else if (!this.width && this.height) this.width = this.height * 3; else if (!this.width && !this.height) { /** @type {?} */ const host = this.currentElement.nativeElement; if (host.parentNode != null) { /** @type {?} */ const dims = host.parentNode.getBoundingClientRect(); this.width = dims.width; this.height = dims.width / 3; } } // console.log('---set dimensions---'); // console.log('width: ' + this.width); // console.log('height: ' + this.height); // console.log('--------------------'); } /** * @return {?} */ computeBarPaths() { this.barPaths = []; /** @type {?} */ let uniqueXAxisValues; /** @type {?} */ let noOfXAxisValues; uniqueXAxisValues = new Set(); for (const series of this.data) { /** @type {?} */ const seriesData = series.data; for (const sData of seriesData) { uniqueXAxisValues.add(sData.name); } } noOfXAxisValues = uniqueXAxisValues.size; /** @type {?} */ const noOfSeries = this.data.length; /** @type {?} */ const eachWidth = this.clusteredBarChartService.rectWidth / noOfXAxisValues; /** @type {?} */ const categoryWidth = eachWidth * .5; /** @type {?} */ const barWidth = categoryWidth / noOfSeries; /** @type {?} */ let cnt = -1; /** @type {?} */ let barPath = ''; /** @type {?} */ let cntSeries = -1; for (const bcS of this.data) { cntSeries++; cnt = -1; /** @type {?} */ let seriesPaths; seriesPaths = []; for (const bcD of bcS.data) { cnt++; /** @type {?} */ const xPos = cnt * eachWidth + .25 * eachWidth + cntSeries * barWidth + .5 * barWidth + this.xPadding; /** @type {?} */ const yPos = this.clusteredBarChartService.transformY(this.clusteredBarChartService.maxY - bcD.value) + this.yPadding; /** @type {?} */ const xStart = xPos - barWidth / 2; /** @type {?} */ const xEnd = xPos + barWidth / 2; /** @type {?} */ const yStart = this.clusteredBarChartService.rectHeight + this.yPadding; barPath = 'M '; barPath = barPath + ' ' + xStart + ' ' + yStart + ' L ' + xStart + ' ' + yPos + ' ' + xEnd + ' ' + yPos + ' ' + xEnd + ' ' + yStart + ' Z'; seriesPaths.push(barPath); } this.barPaths.push({ color: bcS.color, paths: seriesPaths }); } } /** * @return {?} */ setColors() { /** @type {?} */ let cnt = 0; for (const seriesData of this.data) { if (!seriesData.color) { if (this.customColorScheme.length > 0) { seriesData.color = this.customColorScheme[cnt % this.customColorScheme.length]; } else { seriesData.color = colorSchemes[this.colorScheme][cnt % 10]; } cnt++; } } } /** * @return {?} */ ngOnInit() { this.componentID = this.globalParametersService.addNewComponent(); console.log('init..'); this.setDimensions(); this.dataCopy = JSON.parse(JSON.stringify(this.data)); this.setColors(); this.clusteredBarChartService.setValues({ componentID: this.componentID, width: this.width, height: this.height, xPadding: this.xPadding, yPadding: this.yPadding, data: this.data }); this.computeBarPaths(); } /** * @return {?} */ ngOnChanges() { this.setColors(); this.clusteredBarChartService.setValues({ componentID: this.componentID, width: this.width, height: this.height, xPadding: this.xPadding, yPadding: this.yPadding, data: this.data }); this.computeBarPaths(); } } ClusteredBarChartComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-clustered-bar-chart', template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n\n <g ngx-cbc-chart-base\n [showGridLines]=\"showGridLines\"\n [xAxisTitle]=\"xAxisTitle\" [yAxisTitle]=\"yAxisTitle\"\n />\n\n <g *ngFor=\"let series of barPaths\">\n <g *ngFor=\"let barPath of series.paths\">\n <path class=\"chart-bar\"\n [attr.d]=\"barPath\" [attr.fill]=\"series.color\" />\n </g>\n </g>\n\n</svg>", providers: [ClusteredBarChartService], styles: [".chart-bar:hover{stroke-width:1;stroke:#444}"] }] } ]; /** @nocollapse */ ClusteredBarChartComponent.ctorParameters = () => [ { type: ClusteredBarChartService }, { type: GlobalParametersService }, { type: ElementRef } ]; ClusteredBarChartComponent.propDecorators = { data: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], xAxisTitle: [{ type: Input }], yAxisTitle: [{ type: Input }], showGridLines: [{ type: Input }], colorScheme: [{ type: Input }], customColorScheme: [{ type: Input }] }; if (false) { /** @type {?} */ ClusteredBarChartComponent.prototype.data; /** @type {?} */ ClusteredBarChartComponent.prototype.width; /** @type {?} */ ClusteredBarChartComponent.prototype.height; /** @type {?} */ ClusteredBarChartComponent.prototype.xAxisTitle; /** @type {?} */ ClusteredBarChartComponent.prototype.yAxisTitle; /** @type {?} */ ClusteredBarChartComponent.prototype.showGridLines; /** @type {?} */ ClusteredBarChartComponent.prototype.colorScheme; /** @type {?} */ ClusteredBarChartComponent.prototype.customColorScheme; /** @type {?} */ ClusteredBarChartComponent.prototype.componentID; /** @type {?} */ ClusteredBarChartComponent.prototype.xPadding; /** @type {?} */ ClusteredBarChartComponent.prototype.yPadding; /** @type {?} */ ClusteredBarChartComponent.prototype.barPaths; /** @type {?} */ ClusteredBarChartComponent.prototype.dataCopy; /** @type {?} */ ClusteredBarChartComponent.prototype.clusteredBarChartService; /** * @type {?} * @private */ ClusteredBarChartComponent.prototype.globalParametersService; /** * @type {?} * @private */ ClusteredBarChartComponent.prototype.currentElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3RlcmVkLWJhci1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9jbHVzdGVyZWQtYmFyLWNoYXJ0L2NsdXN0ZXJlZC1iYXItY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQVFqRixNQUFNLE9BQU8sMEJBQTBCOzs7Ozs7SUEyRXJDLFlBQW1CLHdCQUFrRCxFQUNqRCx1QkFBZ0QsRUFDaEQsY0FBMEI7UUFGM0IsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNqRCw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELG1CQUFjLEdBQWQsY0FBYyxDQUFZO1FBdEVyQyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixnQkFBVyxHQUFHLFVBQVUsQ0FBQztRQUN6QixzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFHMUMsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQWdFcUIsQ0FBQzs7Ozs7SUEzRG5ELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7YUFDeEQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJ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SUFDcEIsOENBQWM7O0lBQ2QsOENBQTZCOztJQUM3Qiw4Q0FBYzs7SUFDZCw4Q0FBUzs7SUE0REcsOERBQXlEOzs7OztJQUN6RCw2REFBd0Q7Ozs7O0lBQ3hELG9EQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkNoYW5nZXMsIElucHV0LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb2xvclNjaGVtZXMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvY29sb3Itc2NoZW1lcyc7XG5pbXBvcnQgeyBDbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UgfSBmcm9tICcuL2NsdXN0ZXJlZC1iYXItY2hhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBHbG9iYWxQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL2dsb2JhbC9nbG9iYWwtcGFyYW1ldGVycy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWNsdXN0ZXJlZC1iYXItY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2x1c3RlcmVkLWJhci1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NsdXN0ZXJlZC1iYXItY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbQ2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBDbHVzdGVyZWRCYXJDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkYXRhOiBbe3Nlcmllczogc3RyaW5nLCBjb2xvcjogc3RyaW5nLCBkYXRhOiBbe25hbWU6IHN0cmluZywgdmFsdWU6IG51bWJlciB9XX1dO1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSBoZWlnaHQ6IG51bWJlcjtcbiAgQElucHV0KCkgeEF4aXNUaXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSB5QXhpc1RpdGxlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dHcmlkTGluZXMgPSBmYWxzZTtcbiAgQElucHV0KCkgY29sb3JTY2hlbWUgPSAnY29sb3JmdWwnO1xuICBASW5wdXQoKSBjdXN0b21Db2xvclNjaGVtZTogc3RyaW5nW10gPSBbXTtcblxuICBjb21wb25lbnRJRDogbnVtYmVyO1xuICB4UGFkZGluZyA9IDYwO1xuICB5UGFkZGluZyA9IHRoaXMueFBhZGRpbmcgLyAyO1xuICBiYXJQYXRoczogYW55O1xuICBkYXRhQ29weTtcbiAgLy8gW3tjb2xvcjogc3RyaW5nLCBwYXRoczogc3RyaW5nW119XTtcblxuICBzZXREaW1lbnNpb25zKCkge1xuICAgIGlmICh0aGlzLndpZHRoICYmICF0aGlzLmhlaWdodCkgdGhpcy5oZWlnaHQgPSB0aGlzLndpZHRoIC8gMztcbiAgICBlbHNlIGlmICghdGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ICogMztcbiAgICBlbHNlIGlmICghdGhpcy53aWR0aCAmJiAhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmN1cnJlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoaG9zdC5wYXJlbnROb2RlICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZGltcyA9IGhvc3QucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IGRpbXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gZGltcy53aWR0aCAvIDM7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCctLS1zZXQgZGltZW5zaW9ucy0tLScpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd3aWR0aDogJyArIHRoaXMud2lkdGgpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCk7XG4gICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gIH1cblxuICBjb21wdXRlQmFyUGF0aHMoKSB7XG4gICAgdGhpcy5iYXJQYXRocyA9IFtdO1xuICAgIGxldCB1bmlxdWVYQXhpc1ZhbHVlcztcbiAgICBsZXQgbm9PZlhBeGlzVmFsdWVzO1xuICAgIHVuaXF1ZVhBeGlzVmFsdWVzID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIHRoaXMuZGF0YSkge1xuICAgICAgY29uc3Qgc2VyaWVzRGF0YSA9IHNlcmllcy5kYXRhO1xuICAgICAgZm9yIChjb25zdCBzRGF0YSBvZiBzZXJpZXNEYXRhKSB7XG4gICAgICAgIHVuaXF1ZVhBeGlzVmFsdWVzLmFkZChzRGF0YS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbm9PZlhBeGlzVmFsdWVzID0gdW5pcXVlWEF4aXNWYWx1ZXMuc2l6ZTtcbiAgICBjb25zdCBub09mU2VyaWVzID0gdGhpcy5kYXRhLmxlbmd0aDtcbiAgICBjb25zdCBlYWNoV2lkdGggPSB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5yZWN0V2lkdGggLyBub09mWEF4aXNWYWx1ZXM7XG4gICAgY29uc3QgY2F0ZWdvcnlXaWR0aCA9IGVhY2hXaWR0aCAqIC41O1xuICAgIGNvbnN0IGJhcldpZHRoID0gY2F0ZWdvcnlXaWR0aCAvIG5vT2ZTZXJpZXM7XG4gICAgbGV0IGNudCA9IC0xO1xuICAgIGxldCBiYXJQYXRoID0gJyc7XG4gICAgbGV0IGNudFNlcmllcyA9IC0xO1xuICAgIGZvciAoY29uc3QgYmNTIG9mIHRoaXMuZGF0YSkge1xuICAgICAgY250U2VyaWVzKys7XG4gICAgICBjbnQgPSAtMTtcbiAgICAgIGxldCBzZXJpZXNQYXRocztcbiAgICAgIHNlcmllc1BhdGhzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGJjRCBvZiBiY1MuZGF0YSkge1xuICAgICAgICBjbnQgKys7XG4gICAgICAgIGNvbnN0IHhQb3MgPSBjbnQgKiBlYWNoV2lkdGggKyAuMjUgKiBlYWNoV2lkdGggKyBjbnRTZXJpZXMgKiBiYXJXaWR0aCArIC41ICogYmFyV2lkdGggKyB0aGlzLnhQYWRkaW5nO1xuICAgICAgICBjb25zdCB5UG9zID0gdGhpcy5jbHVzdGVyZWRCYXJDaGFydFNlcnZpY2UudHJhbnNmb3JtWSh0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5tYXhZIC0gYmNELnZhbHVlKSArIHRoaXMueVBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHhTdGFydCA9IHhQb3MgLSBiYXJXaWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IHhFbmQgPSB4UG9zICsgYmFyV2lkdGggLyAyO1xuICAgICAgICBjb25zdCB5U3RhcnQgPSB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5yZWN0SGVpZ2h0ICsgdGhpcy55UGFkZGluZztcbiAgICAgICAgYmFyUGF0aCA9ICdNICc7XG4gICAgICAgIGJhclBhdGggPSBiYXJQYXRoICsgJyAnICsgeFN0YXJ0ICsgJyAnICsgeVN0YXJ0ICsgJyBMICcgKyB4U3RhcnRcbiAgICAgICAgKyAnICcgKyB5UG9zICsgJyAnICsgeEVuZCArICcgJyArIHlQb3MgKyAnICcgKyB4RW5kICsgJyAnICsgeVN0YXJ0ICsgJyBaJztcbiAgICAgICAgc2VyaWVzUGF0aHMucHVzaChiYXJQYXRoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmFyUGF0aHMucHVzaCh7Y29sb3I6IGJjUy5jb2xvciwgcGF0aHM6IHNlcmllc1BhdGhzfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZTogQ2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlOiBHbG9iYWxQYXJhbWV0ZXJzU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjdXJyZW50RWxlbWVudDogRWxlbWVudFJlZikgeyB9XG5cbiAgc2V0Q29sb3JzKCkge1xuICAgIGxldCBjbnQgPSAwO1xuICAgIGZvciAoY29uc3Qgc2VyaWVzRGF0YSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmICghc2VyaWVzRGF0YS5jb2xvcikge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2VyaWVzRGF0YS5jb2xvciA9IHRoaXMuY3VzdG9tQ29sb3JTY2hlbWVbY250ICUgdGhpcy5jdXN0b21Db2xvclNjaGVtZS5sZW5ndGhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlcmllc0RhdGEuY29sb3IgPSBjb2xvclNjaGVtZXNbdGhpcy5jb2xvclNjaGVtZV1bY250ICUgMTBdO1xuICAgICAgICB9XG4gICAgICAgIGNudCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSB0aGlzLmdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLmFkZE5ld0NvbXBvbmVudCgpO1xuICAgIGNvbnNvbGUubG9nKCdpbml0Li4nKTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmRhdGFDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEpKTtcbiAgICB0aGlzLnNldENvbG9ycygpO1xuICAgIHRoaXMuY2x1c3RlcmVkQmFyQ2hhcnRTZXJ2aWNlLnNldFZhbHVlcyh7XG4gICAgICBjb21wb25lbnRJRDogdGhpcy5jb21wb25lbnRJRCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmcsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9KTtcbiAgICB0aGlzLmNvbXB1dGVCYXJQYXRocygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5zZXRDb2xvcnMoKTtcbiAgICB0aGlzLmNsdXN0ZXJlZEJhckNoYXJ0U2VydmljZS5zZXRWYWx1ZXMoe1xuICAgICAgY29tcG9uZW50SUQ6IHRoaXMuY29tcG9uZW50SUQsXG4gICAgICB3aWR0aDogdGhpcy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICB4UGFkZGluZzogdGhpcy54UGFkZGluZyxcbiAgICAgIHlQYWRkaW5nOiB0aGlzLnlQYWRkaW5nLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfSk7XG4gICAgdGhpcy5jb21wdXRlQmFyUGF0aHMoKTtcbiAgfVxuXG59XG4iXX0=