ngx-chart
Version:
Ngx-Chart provides chart solution for Angular.Currently supports Bar, Pie and Donut chart
118 lines • 15.3 kB
JavaScript
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