UNPKG

ngx-chart

Version:

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

118 lines 15.3 kB
import { __decorate } from "tslib"; import { Component, EventEmitter, Input, Output, ViewChildren } from '@angular/core'; var PieChartComponent = /** @class */ (function () { function PieChartComponent() { this.selectedItem = new EventEmitter(); this.chartOptions = { showLegend: true, legendTitle: 'Total', }; this.view = { height: 200, width: 200, radius: 80 }; this.chartView = []; this.totalSum = 0; this.processedData = []; this.legendData = []; } PieChartComponent.prototype.ngOnInit = function () { var _this = this; this.chartView.push(this.view.height + 'px'); this.chartView.push(this.view.width + 'px'); if (this.chartData) { // Get total number of records this.totalSum = this.chartData.reduce(function (a, b) { return a + b.value; }, 0); //generate Data for piechart var prevAngle_1 = 0; this.chartData.map(function (x, index) { var legend = { name: x.name, value: x.value, color: x.color }; _this.legendData.push(legend); var percentage = _this.getPercentage(x.value, _this.totalSum); if (percentage > 0) { var circlePercentage = percentage / 10 * 36; var pieData = { color: x.color, a1: prevAngle_1, a2: prevAngle_1 + circlePercentage, name: x.name }; prevAngle_1 = prevAngle_1 + circlePercentage; _this.processedData.push(pieData); } }); } }; PieChartComponent.prototype.ngAfterViewInit = function () { var _this = this; // create svg if (this.processedData.length > 0) { this.span.map(function (item, index) { _this.processedData[index].a2 = _this.processedData[index].a2 >= 360 ? 359.9 : _this.processedData[index].a2; item.nativeElement.setAttribute('d', _this.describeArc(_this.view.height / 2, _this.view.height / 2, _this.view.radius, _this.processedData[index].a1, _this.processedData[index].a2)); item.nativeElement.setAttribute('fill', _this.processedData[index].color); }); } }; PieChartComponent.prototype.polarToCartesian = function (centerX, centerY, radius, angleInDegrees) { var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0; return { x: centerX + (radius * Math.cos(angleInRadians)), y: centerY + (radius * Math.sin(angleInRadians)) }; }; PieChartComponent.prototype.describeArc = function (x, y, radius, startAngle, endAngle) { var start = this.polarToCartesian(x, y, radius, endAngle); var end = this.polarToCartesian(x, y, radius, startAngle); var arcSweep = endAngle - startAngle <= 180 ? "0" : "1"; var d = [ "M", start.x, start.y, "A", radius, radius, 0, arcSweep, 0, end.x, end.y, "L", x, y, "L", start.x, start.y ].join(" "); return d; }; PieChartComponent.prototype.getPercentage = function (partialValue, totalValue) { return (100 * partialValue) / totalValue; }; PieChartComponent.prototype.getItemClicked = function (item) { var selected = { name: item.name, value: item.value }; this.selectedItem.emit(selected); }; __decorate([ Input() ], PieChartComponent.prototype, "chartData", void 0); __decorate([ ViewChildren('el') ], PieChartComponent.prototype, "span", void 0); __decorate([ Output() ], PieChartComponent.prototype, "selectedItem", void 0); __decorate([ Input() ], PieChartComponent.prototype, "chartOptions", void 0); __decorate([ Input() ], PieChartComponent.prototype, "view", void 0); PieChartComponent = __decorate([ Component({ selector: 'ngx-pie-chart', template: "<div class=\"chart-view ngx-pie\">\n <svg class=\"chart-wrapper\" [ngStyle]=\"{'height': chartView[0],'width': chartView[1]}\">\n <path #el class=\"pie-chart-path\" chartTooltip tooltip={{item.name}} (click)=\"getItemClicked(item)\" *ngFor=\"let item of processedData; let i=index\" />\n </svg>\n <div class=\"legend\" *ngIf=\"chartOptions.showLegend\">\n <h4>{{chartOptions.legendTitle +' : '+ totalSum}}</h4>\n <div class=\"legend-item\" *ngFor=\"let item of legendData; let i=index\">\n <div class=\"legend-item-colour\" [ngStyle]=\"{'background': item.color}\"></div><span class=\"legend-item-name\" >{{item.name}}</span><span class=\"legend-item-value\" >{{item.value}}</span>\n </div>\n </div>\n</div>", styles: ["path.pie-chart-path:hover{cursor:pointer}"] }) ], PieChartComponent); return PieChartComponent; }()); export { PieChartComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1jaGFydC8iLCJzb3VyY2VzIjpbImxpYi9fY29tcG9uZW50L3BpZS1jaGFydC9waWUtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVVwSDtJQW1CRTtRQWZVLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN4QyxpQkFBWSxHQUFnQjtZQUNuQyxVQUFVLEVBQUcsSUFBSTtZQUNqQixXQUFXLEVBQUUsT0FBTztTQUNyQixDQUFBO1FBQ1EsU0FBSSxHQUFpQjtZQUM1QixNQUFNLEVBQUUsR0FBRztZQUNYLEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFHLEVBQUU7U0FDWixDQUFBO1FBQ0QsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixrQkFBYSxHQUFHLEVBQUUsQ0FBQTtRQUNsQixlQUFVLEdBQUcsRUFBRSxDQUFBO0lBRUMsQ0FBQztJQUVqQixvQ0FBUSxHQUFSO1FBQUEsaUJBd0NDO1FBdENDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxDQUFBO1FBRXpDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQiw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLENB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QTtRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQUUsQ0FBQztJQTFHN0I7UUFBUixLQUFLLEVBQUU7d0RBQXdCO0lBQ1o7UUFBbkIsWUFBWSxDQUFDLElBQUksQ0FBQzttREFBNkI7SUFDdEM7UUFBVCxNQUFNLEVBQUU7MkRBQXdDO0lBQ3hDO1FBQVIsS0FBSyxFQUFFOzJEQUdQO0lBQ1E7UUFBUixLQUFLLEVBQUU7bURBSVA7SUFiVSxpQkFBaUI7UUFMN0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLGVBQWU7WUFDekIscXVCQUF5Qzs7U0FFMUMsQ0FBQztPQUNXLGlCQUFpQixDQThHN0I7SUFBRCx3QkFBQztDQUFBLEFBOUdELElBOEdDO1NBOUdZLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFydERhdGEsIENoYXJ0T3B0aW9uIH0gZnJvbSAnLi4vLi4vX21vZGVsL2NoYXJ0RGF0YSc7XG5pbXBvcnQgeyBQaWVDaGFydFZpZXcgfSBmcm9tICcuLi8uLi9fbW9kZWwvcGllQ2hhcnRPcHRpb25zJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtcGllLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BpZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BpZS1jaGFydC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBpZUNoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBjaGFydERhdGE6IENoYXJ0RGF0YVtdO1xuICBAVmlld0NoaWxkcmVuKCdlbCcpIHNwYW46IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQE91dHB1dCgpIHNlbGVjdGVkSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSBjaGFydE9wdGlvbnM6IENoYXJ0T3B0aW9uID0ge1xuICAgIHNob3dMZWdlbmQgOiB0cnVlLFxuICAgIGxlZ2VuZFRpdGxlOiAnVG90YWwnLFxuICB9XG4gIEBJbnB1dCgpIHZpZXc6IFBpZUNoYXJ0VmlldyA9IHtcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB3aWR0aDogMjAwLFxuICAgIHJhZGl1cyA6IDgwXG4gIH1cbiAgY2hhcnRWaWV3ID0gW107XG4gIHRvdGFsU3VtID0gMDtcbiAgcHJvY2Vzc2VkRGF0YSA9IFtdXG4gIGxlZ2VuZERhdGEgPSBbXVxuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICB0aGlzLmNoYXJ0Vmlldy5wdXNoKHRoaXMudmlldy5oZWlnaHQrJ3B4JylcbiAgICB0aGlzLmNoYXJ0Vmlldy5wdXNoKHRoaXMudmlldy53aWR0aCsncHgnKVxuXG4gICAgaWYgKHRoaXMuY2hhcnREYXRhKSB7XG4gICAgICAvLyBHZXQgdG90YWwgbnVtYmVyIG9mIHJlY29yZHNcbiAgICAgIHRoaXMudG90YWxTdW0gPSB0aGlzLmNoYXJ0RGF0YS5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEgKyBiLnZhbHVlO1xuICAgICAgfSwgMCk7XG5cblxuXG4gICAgICAvL2dlbmVyYXRlIERhdGEgZm9yIHBpZWNoYXJ0XG4gICAgICBsZXQgcHJldkFuZ2xlID0gMFxuICAgICAgdGhpcy5jaGFydERhdGEubWFwKCh4LCBpbmRleCkgPT4ge1xuXG4gICAgICAgIGxldCBsZWdlbmQgPSB7XG4gICAgICAgICAgbmFtZTogeC5uYW1lLFxuICAgICAgICAgIHZhbHVlOiB4LnZhbHVlLFxuICAgICAgICAgIGNvbG9yOiB4LmNvbG9yXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxlZ2VuZERhdGEucHVzaChsZWdlbmQpXG5cbiAgICAgICAgbGV0IHBlcmNlbnRhZ2UgPSB0aGlzLmdldFBlcmNlbnRhZ2UoeC52YWx1ZSwgdGhpcy50b3RhbFN1bSk7XG4gICAgICAgIGlmIChwZXJjZW50YWdlID4gMCkge1xuICAgICAgICAgIGxldCBjaXJjbGVQZXJjZW50YWdlID0gcGVyY2VudGFnZSAvIDEwICogMzY7XG4gICAgICAgICAgbGV0IHBpZURhdGEgPSB7XG4gICAgICAgICAgICBjb2xvcjogeC5jb2xvcixcbiAgICAgICAgICAgIGExOiBwcmV2QW5nbGUsXG4gICAgICAgICAgICBhMjogcHJldkFuZ2xlICsgY2lyY2xlUGVyY2VudGFnZSxcbiAgICAgICAgICAgIG5hbWU6IHgubmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgICBwcmV2QW5nbGUgPSBwcmV2QW5nbGUgKyBjaXJjbGVQZXJjZW50YWdlXG4gICAgICAgICAgdGhpcy5wcm9jZXNzZWREYXRhLnB1c2gocGllRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG5cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gY3JlYXRlIHN2ZyBcbiAgICBpZiAodGhpcy5wcm9jZXNzZWREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc3Bhbi5tYXAoKGl0ZW06IEVsZW1lbnRSZWYsIGluZGV4KSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkRGF0YVtpbmRleF0uYTIgPSB0aGlzLnByb2Nlc3NlZERhdGFbaW5kZXhdLmEyID49IDM2MCA/IDM1OS45IDogdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5hMjtcbiAgICAgICAgaXRlbS5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZCcsIHRoaXMuZGVzY3JpYmVBcmModGhpcy52aWV3LmhlaWdodC8yLCB0aGlzLnZpZXcuaGVpZ2h0LzIsIHRoaXMudmlldy5yYWRpdXMsIHRoaXMucHJvY2Vzc2VkRGF0YVtpbmRleF0uYTEsIHRoaXMucHJvY2Vzc2VkRGF0YVtpbmRleF0uYTIpKTtcbiAgICAgICAgaXRlbS5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMucHJvY2Vzc2VkRGF0YVtpbmRleF0uY29sb3IpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuICBwb2xhclRvQ2FydGVzaWFuKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgYW5nbGVJbkRlZ3JlZXMpIHtcbiAgICBsZXQgYW5nbGVJblJhZGlhbnMgPSAoYW5nbGVJbkRlZ3JlZXMgLSA5MCkgKiBNYXRoLlBJIC8gMTgwLjA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogY2VudGVyWCArIChyYWRpdXMgKiBNYXRoLmNvcyhhbmdsZUluUmFkaWFucykpLFxuICAgICAgeTogY2VudGVyWSArIChyYWRpdXMgKiBNYXRoLnNpbihhbmdsZUluUmFkaWFucykpXG4gICAgfTtcbiAgfVxuXG4gIGRlc2NyaWJlQXJjKHgsIHksIHJhZGl1cywgc3RhcnRBbmdsZSwgZW5kQW5nbGUpIHtcbiAgICBsZXQgc3RhcnQgPSB0aGlzLnBvbGFyVG9DYXJ0ZXNpYW4oeCwgeSwgcmFkaXVzLCBlbmRBbmdsZSk7XG4gICAgbGV0IGVuZCA9IHRoaXMucG9sYXJUb0NhcnRlc2lhbih4LCB5LCByYWRpdXMsIHN0YXJ0QW5nbGUpO1xuXG4gICAgbGV0IGFyY1N3ZWVwID0gZW5kQW5nbGUgLSBzdGFydEFuZ2xlIDw9IDE4MCA/IFwiMFwiIDogXCIxXCI7XG5cbiAgICBsZXQgZCA9IFtcbiAgICAgIFwiTVwiLCBzdGFydC54LCBzdGFydC55LFxuICAgICAgXCJBXCIsIHJhZGl1cywgcmFkaXVzLCAwLCBhcmNTd2VlcCwgMCwgZW5kLngsIGVuZC55LFxuICAgICAgXCJMXCIsIHgsIHksXG4gICAgICBcIkxcIiwgc3RhcnQueCwgc3RhcnQueVxuICAgIF0uam9pbihcIiBcIik7XG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICBnZXRQZXJjZW50YWdlKHBhcnRpYWxWYWx1ZSwgdG90YWxWYWx1ZSk6IG51bWJlciB7XG4gICAgcmV0dXJuICgxMDAgKiBwYXJ0aWFsVmFsdWUpIC8gdG90YWxWYWx1ZTtcbiAgfVxuICBnZXRJdGVtQ2xpY2tlZChpdGVtKSB7XG4gICAgbGV0IHNlbGVjdGVkID0ge1xuICAgICAgbmFtZTppdGVtLm5hbWUsXG4gICAgICB2YWx1ZTppdGVtLnZhbHVlXG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtLmVtaXQoc2VsZWN0ZWQpOyAgfVxuXG59Il19