UNPKG

ngx-chart

Version:

Ngx-Chart provides chart solution for Angular.Currently supports Bar, Pie and Donut chart

144 lines 18.8 kB
import { __decorate } from "tslib"; import { Component, EventEmitter, Input, Output, } from '@angular/core'; var BarChartComponent = /** @class */ (function () { function BarChartComponent() { this.selectedItem = new EventEmitter(); this.chartData = []; this.chartOptions = { roundedCorners: false, isHorizontal: false, showLegend: true, legendTitle: 'Total', }; this.view = { height: 200, width: 200 }; this.lines = []; this.totalSum = 0; this.isHorizontal = true; this.barLineType = 'round'; this.chartView = []; this.scale = 100; } BarChartComponent.prototype.ngOnInit = function () { var _this = this; this.chartView.push(this.view.height + 'px'); this.chartView.push(this.view.width + 'px'); this.barLineType = this.chartOptions['roundedCorners'] ? 'round' : 'butt'; this.isHorizontal = this.chartOptions['isHorizontal'] ? true : false; this.scale = this.isHorizontal ? this.view.width : this.view.height; this.getTotalSum(this.chartData); var value = Math.max.apply(Math, this.chartData.map(function (o) { return o.value; })); if (value > this.scale) { var normalizedValue_1 = value / this.scale; this.chartData.map(function (y, index) { _this.chartData[index]['normalized'] = Number(y.value) / normalizedValue_1; }); } else { var normalizedValue_2 = this.scale / value; this.chartData.map(function (y, index) { _this.chartData[index]['normalized'] = Number(y.value) * normalizedValue_2; }); } this.lines = this.isHorizontal ? this.calculateHorizontalBarLines(this.chartData) : this.calculateVerticalBarLines(this.chartData); }; BarChartComponent.prototype.ngAfterViewInit = function () { }; BarChartComponent.prototype.getItemClicked = function (line) { var selectedbar = { name: line.name, value: line.value }; this.selectedItem.emit(JSON.stringify(selectedbar)); }; BarChartComponent.prototype.calculateHorizontalBarLines = function (graphData) { var _this = this; var barLines = []; graphData.map(function (x, index) { var background = { x1: 10, y1: index * 20 + 20, y2: index * 20 + 20, x2: _this.view.width, color: '#EBEBEB', name: x.name, value: x.value }; barLines.push(background); if (x.value > 0) { var line = { x1: 10, y1: index * 20 + 20, y2: index * 20 + 20, x2: x.normalized < 10 ? _this.barLineType == 'butt' ? 11 : 10 : x.normalized, color: x.color, name: x.name, value: x.value }; barLines.push(line); } }); return barLines; }; BarChartComponent.prototype.calculateVerticalBarLines = function (graphData) { var _this = this; var barLines = []; graphData.map(function (x, index) { var background = { x1: index * 20 + 20, y1: 10, x2: index * 20 + 20, y2: _this.scale, color: '#EBEBEB', name: x.name, value: x.value }; barLines.push(background); if (x.value > 0) { var line = { x1: index * 20 + 20, y1: (_this.scale + 10) - x.normalized > _this.scale ? _this.barLineType == 'butt' ? (_this.scale - 1) : _this.scale : (_this.scale + 10) - x.normalized, x2: index * 20 + 20, y2: _this.scale, color: x.color, name: x.name, value: x.value }; barLines.push(line); } }); console.log(barLines); return barLines; }; BarChartComponent.prototype.getTotalSum = function (chartData) { // Get total number of records this.totalSum = chartData.reduce(function (a, b) { return a + parseInt(b.value); }, 0); }; __decorate([ Output() ], BarChartComponent.prototype, "selectedItem", void 0); __decorate([ Input() ], BarChartComponent.prototype, "chartData", void 0); __decorate([ Input() ], BarChartComponent.prototype, "chartOptions", void 0); __decorate([ Input() ], BarChartComponent.prototype, "view", void 0); BarChartComponent = __decorate([ Component({ selector: 'ngx-bar-chart', template: "<div class=\"chart-view ngx-bar\">\r\n <div class=\"chart-wrapper\" [ngStyle]=\"{'height': chartView[0],'width': chartView[1]}\">\r\n <svg id=\"lines\" [attr.viewBox]=\"'0 0 '+ (isHorizontal ? scale+40 : (lines[lines.length-1].x1 + 20))+' ' + (isHorizontal ? (lines[lines.length-1].y2 + 20) : (scale+20))\">\r\n <g>\r\n <line *ngFor=\"let line of lines\" stroke-width=\"10\" class=\"line\" [attr.x1]=\"line.x1\" [attr.y1]=\"line.y1 \"\r\n [attr.x2]=\"line.x2\" [attr.y2]=\"line.y2\" [attr.stroke]=\"line.color\" \u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0 [attr.stroke-linecap]=\"barLineType\"\r\n [attr.title]=\"line.name\" (click)=\"getItemClicked(line)\" chartTooltip tooltip={{line.name}} />\r\n </g>\r\n </svg>\r\n </div>\r\n <div class=\"legend\" *ngIf=\"chartOptions.showLegend\">\r\n <h4>{{chartOptions.legendTitle +' : '+ totalSum}}</h4>\r\n <div class=\"legend-item\" *ngFor=\"let item of chartData; let i=index\">\r\n <div class=\"legend-item-colour\" [ngStyle]=\"{'background': item.color}\"></div><span\r\n class=\"legend-item-name\">{{item.name}}</span><span class=\"legend-item-value\">{{item.value}}</span>\r\n </div>\r\n </div>\r\n\r\n</div>", styles: [".line{cursor:pointer}"] }) ], BarChartComponent); return BarChartComponent; }()); export { BarChartComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1jaGFydC8iLCJzb3VyY2VzIjpbImxpYi9fY29tcG9uZW50L2Jhci1jaGFydC9iYXItY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ1UsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxHQUMxRSxNQUFNLGVBQWUsQ0FBQztBQVV2QjtJQW1CRTtRQWxCVSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDM0MsY0FBUyxHQUFnQixFQUFFLENBQUM7UUFDNUIsaUJBQVksR0FBbUI7WUFDdEMsY0FBYyxFQUFFLEtBQUs7WUFDckIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsVUFBVSxFQUFFLElBQUk7WUFDaEIsV0FBVyxFQUFFLE9BQU87U0FDckIsQ0FBQztRQUNPLFNBQUksR0FBYztZQUN6QixNQUFNLEVBQUUsR0FBRztZQUNYLEtBQUssRUFBRSxHQUFHO1NBQ1gsQ0FBQztRQUNGLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxPQUFPLENBQUE7UUFDckIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLFVBQUssR0FBRyxHQUFHLENBQUM7SUFDSSxDQUFDO0lBRWpCLG9DQUFRLEdBQVI7UUFBQSxpQkErQkM7UUE3QkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFFM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFD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QUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUF4SVM7UUFBVCxNQUFNLEVBQUU7MkRBQTJDO0lBQzNDO1FBQVIsS0FBSyxFQUFFO3dEQUE2QjtJQUM1QjtRQUFSLEtBQUssRUFBRTsyREFLTjtJQUNPO1FBQVIsS0FBSyxFQUFFO21EQUdOO0lBWlMsaUJBQWlCO1FBTDdCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxlQUFlO1lBQ3pCLG90Q0FBeUM7O1NBRTFDLENBQUM7T0FDVyxpQkFBaUIsQ0EwSTdCO0lBQUQsd0JBQUM7Q0FBQSxBQTFJRCxJQTBJQztTQTFJWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmFyQ2hhcnRPcHRpb24gfSBmcm9tICcuLi8uLi9fbW9kZWwvYmFyQ2hhcnRPcHRpb25zJztcclxuaW1wb3J0IHsgQ2hhcnREYXRhLCBDaGFydFZpZXcgfSBmcm9tICcuLi8uLi9fbW9kZWwvY2hhcnREYXRhJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC1iYXItY2hhcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXItY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Jhci1jaGFydC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXJDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogQ2hhcnREYXRhW10gPSBbXTtcclxuICBASW5wdXQoKSBjaGFydE9wdGlvbnM6IEJhckNoYXJ0T3B0aW9uID0ge1xyXG4gICAgcm91bmRlZENvcm5lcnM6IGZhbHNlLFxyXG4gICAgaXNIb3Jpem9udGFsOiBmYWxzZSxcclxuICAgIHNob3dMZWdlbmQ6IHRydWUsXHJcbiAgICBsZWdlbmRUaXRsZTogJ1RvdGFsJyxcclxuICB9O1xyXG4gIEBJbnB1dCgpIHZpZXc6IENoYXJ0VmlldyA9IHtcclxuICAgIGhlaWdodDogMjAwLFxyXG4gICAgd2lkdGg6IDIwMFxyXG4gIH07XHJcbiAgbGluZXMgPSBbXTtcclxuICB0b3RhbFN1bSA9IDA7XHJcbiAgaXNIb3Jpem9udGFsID0gdHJ1ZTtcclxuICBiYXJMaW5lVHlwZSA9ICdyb3VuZCdcclxuICBjaGFydFZpZXcgPSBbXTtcclxuICBzY2FsZSA9IDEwMDtcclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmNoYXJ0Vmlldy5wdXNoKHRoaXMudmlldy5oZWlnaHQgKyAncHgnKVxyXG4gICAgdGhpcy5jaGFydFZpZXcucHVzaCh0aGlzLnZpZXcud2lkdGggKyAncHgnKVxyXG5cclxuICAgIHRoaXMuYmFyTGluZVR5cGUgPSB0aGlzLmNoYXJ0T3B0aW9uc1sncm91bmRlZENvcm5lcnMnXSA/ICdyb3VuZCcgOiAnYnV0dCdcclxuICAgIHRoaXMuaXNIb3Jpem9udGFsID0gdGhpcy5jaGFydE9wdGlvbnNbJ2lzSG9yaXpvbnRhbCddID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgdGhpcy5zY2FsZSA9IHRoaXMuaXNIb3Jpem9udGFsID8gdGhpcy52aWV3LndpZHRoIDogdGhpcy52aWV3LmhlaWdodDtcclxuXHJcbiAgICBcclxuXHJcbiAgICB0aGlzLmdldFRvdGFsU3VtKHRoaXMuY2hhcnREYXRhKTtcclxuICAgIGxldCB2YWx1ZSA9IE1hdGgubWF4LmFwcGx5KFxyXG4gICAgICBNYXRoLFxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5tYXAoZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICByZXR1cm4gby52YWx1ZTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBpZiAodmFsdWUgPiB0aGlzLnNjYWxlKSB7XHJcbiAgICAgIGxldCBub3JtYWxpemVkVmFsdWUgPSB2YWx1ZSAvIHRoaXMuc2NhbGU7XHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLm1hcCgoeSwgaW5kZXgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYXJ0RGF0YVtpbmRleF1bJ25vcm1hbGl6ZWQnXSA9IE51bWJlcih5LnZhbHVlKSAvIG5vcm1hbGl6ZWRWYWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgbm9ybWFsaXplZFZhbHVlID0gdGhpcy5zY2FsZSAvIHZhbHVlO1xyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5tYXAoKHksIGluZGV4KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGFydERhdGFbaW5kZXhdWydub3JtYWxpemVkJ10gPSBOdW1iZXIoeS52YWx1ZSkgKiBub3JtYWxpemVkVmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGluZXMgPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHRoaXMuY2FsY3VsYXRlSG9yaXpvbnRhbEJhckxpbmVzKHRoaXMuY2hhcnREYXRhKSA6IHRoaXMuY2FsY3VsYXRlVmVydGljYWxCYXJMaW5lcyh0aGlzLmNoYXJ0RGF0YSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7IH1cclxuXHJcbiAgZ2V0SXRlbUNsaWNrZWQobGluZSkge1xyXG4gICAgbGV0IHNlbGVjdGVkYmFyID0ge1xyXG4gICAgICBuYW1lOiBsaW5lLm5hbWUsXHJcbiAgICAgIHZhbHVlOiBsaW5lLnZhbHVlXHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbS5lbWl0KEpTT04uc3RyaW5naWZ5KHNlbGVjdGVkYmFyKSk7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVIb3Jpem9udGFsQmFyTGluZXMoZ3JhcGhEYXRhKSB7XHJcbiAgICBsZXQgYmFyTGluZXMgPSBbXTtcclxuICAgIGdyYXBoRGF0YS5tYXAoKHgsIGluZGV4KSA9PiB7XHJcbiAgICAgIGxldCBiYWNrZ3JvdW5kID0ge1xyXG4gICAgICAgIHgxOiAxMCxcclxuICAgICAgICB5MTogaW5kZXggKiAyMCArIDIwLFxyXG4gICAgICAgIHkyOiBpbmRleCAqIDIwICsgMjAsXHJcbiAgICAgICAgeDI6IHRoaXMudmlldy53aWR0aCxcclxuICAgICAgICBjb2xvcjogJyNFQkVCRUInLFxyXG4gICAgICAgIG5hbWU6IHgubmFtZSxcclxuICAgICAgICB2YWx1ZTogeC52YWx1ZVxyXG4gICAgICB9O1xyXG4gICAgICBiYXJMaW5lcy5wdXNoKGJhY2tncm91bmQpXHJcblxyXG4gICAgICBpZiAoeC52YWx1ZSA+IDApIHtcclxuICAgICAgICBsZXQgbGluZSA9IHtcclxuICAgICAgICAgIHgxOiAxMCxcclxuICAgICAgICAgIHkxOiBpbmRleCAqIDIwICsgMjAsXHJcbiAgICAgICAgICB5MjogaW5kZXggKiAyMCArIDIwLFxyXG4gICAgICAgICAgeDI6IHgubm9ybWFsaXplZCA8IDEwID8gdGhpcy5iYXJMaW5lVHlwZSA9PSAnYnV0dCcgPyAxMSA6IDEwIDogeC5ub3JtYWxpemVkLFxyXG4gICAgICAgICAgY29sb3I6IHguY29sb3IsXHJcbiAgICAgICAgICBuYW1lOiB4Lm5hbWUsXHJcbiAgICAgICAgICB2YWx1ZTogeC52YWx1ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgYmFyTGluZXMucHVzaChsaW5lKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGJhckxpbmVzO1xyXG4gIH1cclxuXHJcblxyXG4gIGNhbGN1bGF0ZVZlcnRpY2FsQmFyTGluZXMoZ3JhcGhEYXRhKSB7XHJcbiAgICBsZXQgYmFyTGluZXMgPSBbXTtcclxuXHJcbiAgICBncmFwaERhdGEubWFwKCh4LCBpbmRleCkgPT4ge1xyXG4gICAgICBsZXQgYmFja2dyb3VuZCA9IHtcclxuICAgICAgICB4MTogaW5kZXggKiAyMCArIDIwLFxyXG4gICAgICAgIHkxOiAxMCxcclxuICAgICAgICB4MjogaW5kZXggKiAyMCArIDIwLFxyXG4gICAgICAgIHkyOiB0aGlzLnNjYWxlLFxyXG4gICAgICAgIGNvbG9yOiAnI0VCRUJFQicsXHJcbiAgICAgICAgbmFtZTogeC5uYW1lLFxyXG4gICAgICAgIHZhbHVlOiB4LnZhbHVlXHJcbiAgICAgIH07XHJcbiAgICAgIGJhckxpbmVzLnB1c2goYmFja2dyb3VuZClcclxuXHJcbiAgICAgIGlmICh4LnZhbHVlID4gMCkge1xyXG4gICAgICAgIGxldCBsaW5lID0ge1xyXG4gICAgICAgICAgeDE6IGluZGV4ICogMjAgKyAyMCxcclxuICAgICAgICAgIHkxOiAodGhpcy5zY2FsZSsxMCkgLSB4Lm5vcm1hbGl6ZWQgPiB0aGlzLnNjYWxlID8gdGhpcy5iYXJMaW5lVHlwZSA9PSAnYnV0dCcgPyAodGhpcy5zY2FsZS0xKSA6IHRoaXMuc2NhbGUgOiAodGhpcy5zY2FsZSsxMCkgLSB4Lm5vcm1hbGl6ZWQsXHJcbiAgICAgICAgICB4MjogaW5kZXggKiAyMCArIDIwLFxyXG4gICAgICAgICAgeTI6IHRoaXMuc2NhbGUsXHJcbiAgICAgICAgICBjb2xvcjogeC5jb2xvcixcclxuICAgICAgICAgIG5hbWU6IHgubmFtZSxcclxuICAgICAgICAgIHZhbHVlOiB4LnZhbHVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBiYXJMaW5lcy5wdXNoKGxpbmUpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gICAgY29uc29sZS5sb2coYmFyTGluZXMpXHJcbiAgICByZXR1cm4gYmFyTGluZXM7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGdldFRvdGFsU3VtKGNoYXJ0RGF0YSkge1xyXG4gICAgLy8gR2V0IHRvdGFsIG51bWJlciBvZiByZWNvcmRzXHJcbiAgICB0aGlzLnRvdGFsU3VtID0gY2hhcnREYXRhLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICByZXR1cm4gYSArIHBhcnNlSW50KGIudmFsdWUpO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG59Il19