UNPKG

@tusharghoshbd/ngx-charts

Version:

Ngx charts is an angular library for presenting data in chart.

139 lines 16.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ViewChild, ElementRef, Output, EventEmitter } from "@angular/core"; import { trimLabel } from '../../utils/trim-label.helper'; export class YAxisComponent { constructor() { this.categories = []; this.series = []; this.yAxisWidthChange = new EventEmitter(); this.ticks = []; this.rightTicks = []; this.trimLabel = trimLabel; } /** * @return {?} */ ngOnInit() { //console.log(this.yScale) } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { // console.log(changes) // console.log("-------------------") // console.log( JSON.stringify(this.yScale('Africa'))) //console.log(this.yScale(-200)) this.update(); } /** * @return {?} */ ngAfterViewInit() { setTimeout((/** * @return {?} */ () => { /** @type {?} */ const yAxisWidth = parseInt(this.yAxisWidthEl.nativeElement.getBoundingClientRect().width, 10) + 30; /** @type {?} */ const yAxisHeight = parseInt(this.yAxisWidthEl.nativeElement.getBoundingClientRect().height, 10) + 300; /** @type {?} */ const yAxisRightWidth = parseInt(this.yAxisRightWidthEl.nativeElement.getBoundingClientRect().width, 10) + 30; if (yAxisHeight !== this.options.yAxis.height || yAxisWidth !== this.options.yAxis.width) { this.yAxisWidthChange.emit({ yAxisWidth, yAxisHeight, yAxisRightWidth }); } //setTimeout(() => this.updateDims()); }), 0); } /** * @return {?} */ update() { if (this.options.barType == "vertical") { if (this.yScale) this.ticks = this.yScale.nice().ticks(); if (this.yRightScale) this.rightTicks = this.yRightScale.nice().ticks(); } else { //this.ticks=this.xScale.nice().ticks(); } this.ngAfterViewInit(); } /** * @param {?} x * @return {?} */ transform(x) { return "rotate(270, " + x + ", " + this.options.height / 2 + ")"; } /** * @param {?} tick * @return {?} */ pathDirection(tick) { //console.log(tick, this.yScale(tick)) return 'M ' + (this.options.yAxis.width) + ' ' + (this.yScale(tick) + this.options.header.height) + ' L ' + (this.options.plotBackground.width + this.options.yAxis.width) + ' ' + (this.yScale(tick) + this.options.header.height); } /** * @param {?} item * @return {?} */ calculateYTextPosition(item) { if (this.yScale(item)) return parseInt(this.yScale(item) + (this.yScale.bandwidth() / 2) + this.options.header.height); return this.options.header.height; } } YAxisComponent.decorators = [ { type: Component, args: [{ selector: "g[y-axis]", template: "<svg>\n <g #yAxisWidthEl>\n <g class=\"highcharts-axis highcharts-yaxis\" data-z-index=\"2\" aria-hidden=\"true\">\n <text x=\"10\" [attr.y]=\"options.height/2\" text-anchor=\"middle\" dominant-baseline=\"central\" \n style=\"color:#666666;cursor:default;font-size:11px;fill:#666666;\" \n class=\"highcharts-axis-title\"\n [attr.transform]=\"transform(10)\">\n {{options.yAxis ? options.yAxis.title : \"\"}}\n </text>\n </g>\n <g class=\"highcharts-axis-labels highcharts-yaxis-labels\" data-z-index=\"7\" aria-hidden=\"true\"\n *ngIf=\"options.barType == 'vertical'\">\n <text\n style=\"color:#666666;cursor:default;font-size:11px;fill:#666666;\" \n text-anchor=\"start\"\n *ngFor=\"let tick of ticks\" \n [attr.x]=\"30\"\n [attr.y]=\"yScale(tick)+this.options.header.height\" \n opacity=\"1\">{{ options.yAxis.labelEllipsis ? trimLabel(tick, options.yAxis.labelEllipsisSize) :tick}} </text>\n </g>\n <g class=\"highcharts-axis-labels highcharts-xaxis-labels\" data-z-index=\"7\" aria-hidden=\"true\"\n *ngIf=\"options.barType == 'horizontal'\">\n <text \n *ngFor=\"let item of categories; let i = index;\"\n [attr.x] = \"30\"\n [attr.y] = \"calculateYTextPosition(item)\"\n style=\"color:#666666;cursor:default;font-size:11px;fill:#666666;\" text-anchor=\"right\" \n opacity=\"1\">{{ options.yAxis.labelEllipsis ? trimLabel(item, options.yAxis.labelEllipsisSize) :item}}</text>\n </g> \n </g>\n\n <g #yAxisRightWidthEl>\n <g *ngIf= \"yRightScale\" class=\"highcharts-axis highcharts-yaxis\" data-z-index=\"2\" aria-hidden=\"true\" >\n <text \n [attr.x]=\"options.width - 10\" \n [attr.y]=\"options.height/2\" text-anchor=\"middle\" dominant-baseline=\"central\" \n style=\"color:#666666;cursor:default;font-size:11px;fill:#666666;\" \n class=\"highcharts-axis-title\"\n [attr.transform]=\"transform(options.width - 10)\">\n {{options.yAxis ? options.yAxis.rightTitle : \"\"}}\n </text>\n </g>\n <g class=\"highcharts-axis-labels highcharts-yaxis-labels\" data-z-index=\"7\" aria-hidden=\"true\"\n *ngIf=\"options.barType == 'vertical' && yRightScale\">\n <text\n style=\"color:#666666;cursor:default;font-size:11px;fill:#666666;\" \n text-anchor=\"end\"\n *ngFor=\"let tick of rightTicks\" \n [attr.x]=\"options.width - 30\"\n [attr.y]=\"yRightScale(tick)+this.options.header.height\" \n opacity=\"1\">{{ options.yAxis.labelEllipsis ? trimLabel(tick, options.yAxis.labelEllipsisSize) :tick}} </text>\n </g>\n </g>\n \n <g *ngIf=\"options.barType == 'vertical'\" class=\"highcharts-grid highcharts-yaxis-grid\" data-z-index=\"1\" aria-hidden=\"true\">\n <path fill=\"none\" stroke=\"#e6e6e6\" stroke-width=\"1\" data-z-index=\"1\" class=\"highcharts-grid-line\"\n *ngFor=\"let tick of ticks\" [attr.d]=\"pathDirection(tick)\" opacity=\"1\">\n </path>\n </g>\n\n</svg>", styles: [""] }] } ]; /** @nocollapse */ YAxisComponent.ctorParameters = () => []; YAxisComponent.propDecorators = { xScale: [{ type: Input }], yScale: [{ type: Input }], yRightScale: [{ type: Input }], options: [{ type: Input }], categories: [{ type: Input }], series: [{ type: Input }], yAxisWidthEl: [{ type: ViewChild, args: ['yAxisWidthEl', { static: true },] }], yAxisRightWidthEl: [{ type: ViewChild, args: ['yAxisRightWidthEl', { static: true },] }], yAxisWidthChange: [{ type: Output }] }; if (false) { /** @type {?} */ YAxisComponent.prototype.xScale; /** @type {?} */ YAxisComponent.prototype.yScale; /** @type {?} */ YAxisComponent.prototype.yRightScale; /** @type {?} */ YAxisComponent.prototype.options; /** @type {?} */ YAxisComponent.prototype.categories; /** @type {?} */ YAxisComponent.prototype.series; /** @type {?} */ YAxisComponent.prototype.yAxisWidthEl; /** @type {?} */ YAxisComponent.prototype.yAxisRightWidthEl; /** @type {?} */ YAxisComponent.prototype.yAxisWidthChange; /** @type {?} */ YAxisComponent.prototype.ticks; /** @type {?} */ YAxisComponent.prototype.rightTicks; /** @type {?} */ YAxisComponent.prototype.trimLabel; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieS1heGlzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0dXNoYXJnaG9zaGJkL25neC1jaGFydHMvIiwic291cmNlcyI6WyJsaWIvYXhlcy95LWF4aXMveS1heGlzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBVSxLQUFLLEVBQ1QsU0FBUyxFQUFFLFVBQVUsRUFDcEMsTUFBTSxFQUFDLFlBQVksRUFDdEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBTTFELE1BQU0sT0FBTyxjQUFjO0lBaUJ2QjtRQVhTLGVBQVUsR0FBTSxFQUFFLENBQUM7UUFDbkIsV0FBTSxHQUFNLEVBQUUsQ0FBQztRQUlkLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFaEQsVUFBSyxHQUFRLEVBQUUsQ0FBQztRQUNoQixlQUFVLEdBQVEsRUFBRSxDQUFDO1FBSWpCLElBQUksQ0FBQyxTQUFTLEdBQUMsU0FBUyxDQUFDO0lBQzdCLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ0osMEJBQTBCO0lBQzlCLENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQzlCLHVCQUF1QjtRQUN2QixxQ0FBcUM7UUFDckMsc0RBQXNEO1FBQ3RELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQzs7OztJQUNELGVBQWU7UUFFWCxVQUFVOzs7UUFBQyxHQUFHLEVBQUU7O2tCQUNOLFVBQVUsR0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUMsRUFBRTs7a0JBQ3pGLFdBQVcsR0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLEVBQUUs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SUFDckIsZ0NBQXFCOztJQUNyQixxQ0FBMEI7O0lBQzFCLGlDQUFzQjs7SUFFdEIsb0NBQTRCOztJQUM1QixnQ0FBd0I7O0lBRXhCLHNDQUFzRTs7SUFDdEUsMkNBQTZFOztJQUM3RSwwQ0FBZ0Q7O0lBRWhELCtCQUFnQjs7SUFDaEIsb0NBQXFCOztJQUVyQixtQ0FBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uQ2hhbmdlcyxcclxuICAgIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgRWxlbWVudFJlZixcclxuICAgIE91dHB1dCxFdmVudEVtaXR0ZXJcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDbGFzc0dldHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyL3NyYy9vdXRwdXQvb3V0cHV0X2FzdCc7XHJcbmltcG9ydCB7IHRyaW1MYWJlbCB9IGZyb20gJy4uLy4uL3V0aWxzL3RyaW0tbGFiZWwuaGVscGVyJztcclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJnW3ktYXhpc11cIixcclxuICAgIHRlbXBsYXRlVXJsOiBcIi4veS1heGlzLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgICBzdHlsZVVybHM6IFtcIi4veS1heGlzLmNvbXBvbmVudC5jc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBZQXhpc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAgIEBJbnB1dCgpIHhTY2FsZTogYW55O1xyXG4gICAgQElucHV0KCkgeVNjYWxlOiBhbnk7XHJcbiAgICBASW5wdXQoKSB5UmlnaHRTY2FsZTogYW55O1xyXG4gICAgQElucHV0KCkgb3B0aW9uczogYW55O1xyXG5cclxuICAgIEBJbnB1dCgpIGNhdGVnb3JpZXM6IGFueT1bXTtcclxuICAgIEBJbnB1dCgpIHNlcmllczogYW55PVtdO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3lBeGlzV2lkdGhFbCcsIHsgc3RhdGljOiB0cnVlIH0pIHlBeGlzV2lkdGhFbDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ3lBeGlzUmlnaHRXaWR0aEVsJywge3N0YXRpYzp0cnVlfSkgeUF4aXNSaWdodFdpZHRoRWw6IEVsZW1lbnRSZWY7XHJcbiAgICBAT3V0cHV0KCkgeUF4aXNXaWR0aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICB0aWNrczogYW55W109W107XHJcbiAgICByaWdodFRpY2tzOiBhbnlbXT1bXTtcclxuICAgIFxyXG4gICAgdHJpbUxhYmVsOiBhbnk7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnRyaW1MYWJlbD10cmltTGFiZWw7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnlTY2FsZSlcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coY2hhbmdlcylcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS1cIilcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyggSlNPTi5zdHJpbmdpZnkodGhpcy55U2NhbGUoJ0FmcmljYScpKSlcclxuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMueVNjYWxlKC0yMDApKVxyXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICB9XHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHlBeGlzV2lkdGg9cGFyc2VJbnQodGhpcy55QXhpc1dpZHRoRWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCwgMTApKzMwO1xyXG4gICAgICAgICAgICBjb25zdCB5QXhpc0hlaWdodD1wYXJzZUludCh0aGlzLnlBeGlzV2lkdGhFbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCwgMTApKzMwMDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHlBeGlzUmlnaHRXaWR0aD1wYXJzZUludCh0aGlzLnlBeGlzUmlnaHRXaWR0aEVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsIDEwKSszMDtcclxuXHJcbiAgICAgICAgICAgIGlmICh5QXhpc0hlaWdodCE9PXRoaXMub3B0aW9ucy55QXhpcy5oZWlnaHR8fHlBeGlzV2lkdGghPT10aGlzLm9wdGlvbnMueUF4aXMud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMueUF4aXNXaWR0aENoYW5nZS5lbWl0KHsgeUF4aXNXaWR0aCwgeUF4aXNIZWlnaHQsIHlBeGlzUmlnaHRXaWR0aCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvL3NldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVEaW1zKCkpO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJhclR5cGU9PVwidmVydGljYWxcIikge1xyXG4gICAgICAgICAgICBpZih0aGlzLnlTY2FsZSlcclxuICAgICAgICAgICAgdGhpcy50aWNrcz10aGlzLnlTY2FsZS5uaWNlKCkudGlja3MoKTtcclxuICAgICAgICAgICAgaWYodGhpcy55UmlnaHRTY2FsZSlcclxuICAgICAgICAgICAgICAgIHRoaXMucmlnaHRUaWNrcz10aGlzLnlSaWdodFNjYWxlLm5pY2UoKS50aWNrcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy90aGlzLnRpY2tzPXRoaXMueFNjYWxlLm5pY2UoKS50aWNrcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyYW5zZm9ybSh4KSB7XHJcbiAgICAgICAgcmV0dXJuIFwicm90YXRlKDI3MCwgXCIreCtcIiwgXCIrdGhpcy5vcHRpb25zLmhlaWdodC8yK1wiKVwiO1xyXG4gICAgfVxyXG4gICAgcGF0aERpcmVjdGlvbih0aWNrKSB7IFxyXG4gICAgICAgIC8vY29uc29sZS5sb2codGljaywgdGhpcy55U2NhbGUodGljaykpXHJcbiAgICAgICAgcmV0dXJuICdNICcrKHRoaXMub3B0aW9ucy55QXhpcy53aWR0aCkrJyAnKyh0aGlzLnlTY2FsZSh0aWNrKSt0aGlzLm9wdGlvbnMuaGVhZGVyLmhlaWdodCkrJyBMICcrKHRoaXMub3B0aW9ucy5wbG90QmFja2dyb3VuZC53aWR0aCArIHRoaXMub3B0aW9ucy55QXhpcy53aWR0aCkrJyAnKyh0aGlzLnlTY2FsZSh0aWNrKSt0aGlzLm9wdGlvbnMuaGVhZGVyLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgICBjYWxjdWxhdGVZVGV4dFBvc2l0aW9uKGl0ZW0pIHsgXHJcbiAgICAgICAgaWYgKHRoaXMueVNjYWxlKGl0ZW0pKVxyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy55U2NhbGUoaXRlbSkrKHRoaXMueVNjYWxlLmJhbmR3aWR0aCgpLzIpK3RoaXMub3B0aW9ucy5oZWFkZXIuaGVpZ2h0KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmhlYWRlci5oZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG5cclxufVxyXG4iXX0=