ngx-chart
Version:
Ngx-Chart provides chart solution for Angular.Currently supports Bar, Pie and Donut chart
115 lines • 14.8 kB
JavaScript
import { __decorate } from "tslib";
import { Component, EventEmitter, Input, Output, ViewChildren } from '@angular/core';
let PieChartComponent = class PieChartComponent {
constructor() {
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 = [];
}
ngOnInit() {
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
let prevAngle = 0;
this.chartData.map((x, index) => {
let legend = {
name: x.name,
value: x.value,
color: x.color
};
this.legendData.push(legend);
let percentage = this.getPercentage(x.value, this.totalSum);
if (percentage > 0) {
let circlePercentage = percentage / 10 * 36;
let pieData = {
color: x.color,
a1: prevAngle,
a2: prevAngle + circlePercentage,
name: x.name
};
prevAngle = prevAngle + circlePercentage;
this.processedData.push(pieData);
}
});
}
}
ngAfterViewInit() {
// create svg
if (this.processedData.length > 0) {
this.span.map((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);
});
}
}
polarToCartesian(centerX, centerY, radius, angleInDegrees) {
let angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;
return {
x: centerX + (radius * Math.cos(angleInRadians)),
y: centerY + (radius * Math.sin(angleInRadians))
};
}
describeArc(x, y, radius, startAngle, endAngle) {
let start = this.polarToCartesian(x, y, radius, endAngle);
let end = this.polarToCartesian(x, y, radius, startAngle);
let arcSweep = endAngle - startAngle <= 180 ? "0" : "1";
let 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;
}
getPercentage(partialValue, totalValue) {
return (100 * partialValue) / totalValue;
}
getItemClicked(item) {
let 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);
export { PieChartComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGllLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1jaGFydC8iLCJzb3VyY2VzIjpbImxpYi9fY29tcG9uZW50L3BpZS1jaGFydC9waWUtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVVwSCxJQUFhLGlCQUFpQixHQUE5QixNQUFhLGlCQUFpQjtJQW1CNUI7UUFmVSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDeEMsaUJBQVksR0FBZ0I7WUFDbkMsVUFBVSxFQUFHLElBQUk7WUFDakIsV0FBVyxFQUFFLE9BQU87U0FDckIsQ0FBQTtRQUNRLFNBQUksR0FBaUI7WUFDNUIsTUFBTSxFQUFFLEdBQUc7WUFDWCxLQUFLLEVBQUUsR0FBRztZQUNWLE1BQU0sRUFBRyxFQUFFO1NBQ1osQ0FBQTtRQUNELGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2Isa0JBQWEsR0FBRyxFQUFFLENBQUE7UUFDbEIsZUFBVSxHQUFHLEVBQUUsQ0FBQTtJQUVDLENBQUM7SUFFakIsUUFBUTtRQUVOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxDQUFBO1FBRXpDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQiw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNsRCxPQUFPLENBQUMs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SSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFBRSxDQUFDO0NBRXZDLENBQUE7QUE1R1U7SUFBUixLQUFLLEVBQUU7b0RBQXdCO0FBQ1o7SUFBbkIsWUFBWSxDQUFDLElBQUksQ0FBQzsrQ0FBNkI7QUFDdEM7SUFBVCxNQUFNLEVBQUU7dURBQXdDO0FBQ3hDO0lBQVIsS0FBSyxFQUFFO3VEQUdQO0FBQ1E7SUFBUixLQUFLLEVBQUU7K0NBSVA7QUFiVSxpQkFBaUI7SUFMN0IsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLGVBQWU7UUFDekIscXVCQUF5Qzs7S0FFMUMsQ0FBQztHQUNXLGlCQUFpQixDQThHN0I7U0E5R1ksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENoYXJ0RGF0YSwgQ2hhcnRPcHRpb24gfSBmcm9tICcuLi8uLi9fbW9kZWwvY2hhcnREYXRhJztcbmltcG9ydCB7IFBpZUNoYXJ0VmlldyB9IGZyb20gJy4uLy4uL19tb2RlbC9waWVDaGFydE9wdGlvbnMnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1waWUtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGllLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGllLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUGllQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogQ2hhcnREYXRhW107XG4gIEBWaWV3Q2hpbGRyZW4oJ2VsJykgc3BhbjogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBJbnB1dCgpIGNoYXJ0T3B0aW9uczogQ2hhcnRPcHRpb24gPSB7XG4gICAgc2hvd0xlZ2VuZCA6IHRydWUsXG4gICAgbGVnZW5kVGl0bGU6ICdUb3RhbCcsXG4gIH1cbiAgQElucHV0KCkgdmlldzogUGllQ2hhcnRWaWV3ID0ge1xuICAgIGhlaWdodDogMjAwLFxuICAgIHdpZHRoOiAyMDAsXG4gICAgcmFkaXVzIDogODBcbiAgfVxuICBjaGFydFZpZXcgPSBbXTtcbiAgdG90YWxTdW0gPSAwO1xuICBwcm9jZXNzZWREYXRhID0gW11cbiAgbGVnZW5kRGF0YSA9IFtdXG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuY2hhcnRWaWV3LnB1c2godGhpcy52aWV3LmhlaWdodCsncHgnKVxuICAgIHRoaXMuY2hhcnRWaWV3LnB1c2godGhpcy52aWV3LndpZHRoKydweCcpXG5cbiAgICBpZiAodGhpcy5jaGFydERhdGEpIHtcbiAgICAgIC8vIEdldCB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkc1xuICAgICAgdGhpcy50b3RhbFN1bSA9IHRoaXMuY2hhcnREYXRhLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYSArIGIudmFsdWU7XG4gICAgICB9LCAwKTtcblxuXG5cbiAgICAgIC8vZ2VuZXJhdGUgRGF0YSBmb3IgcGllY2hhcnRcbiAgICAgIGxldCBwcmV2QW5nbGUgPSAwXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5tYXAoKHgsIGluZGV4KSA9PiB7XG5cbiAgICAgICAgbGV0IGxlZ2VuZCA9IHtcbiAgICAgICAgICBuYW1lOiB4Lm5hbWUsXG4gICAgICAgICAgdmFsdWU6IHgudmFsdWUsXG4gICAgICAgICAgY29sb3I6IHguY29sb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGVnZW5kRGF0YS5wdXNoKGxlZ2VuZClcblxuICAgICAgICBsZXQgcGVyY2VudGFnZSA9IHRoaXMuZ2V0UGVyY2VudGFnZSh4LnZhbHVlLCB0aGlzLnRvdGFsU3VtKTtcbiAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAwKSB7XG4gICAgICAgICAgbGV0IGNpcmNsZVBlcmNlbnRhZ2UgPSBwZXJjZW50YWdlIC8gMTAgKiAzNjtcbiAgICAgICAgICBsZXQgcGllRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbG9yOiB4LmNvbG9yLFxuICAgICAgICAgICAgYTE6IHByZXZBbmdsZSxcbiAgICAgICAgICAgIGEyOiBwcmV2QW5nbGUgKyBjaXJjbGVQZXJjZW50YWdlLFxuICAgICAgICAgICAgbmFtZTogeC5uYW1lXG4gICAgICAgICAgfVxuICAgICAgICAgIHByZXZBbmdsZSA9IHByZXZBbmdsZSArIGNpcmNsZVBlcmNlbnRhZ2VcbiAgICAgICAgICB0aGlzLnByb2Nlc3NlZERhdGEucHVzaChwaWVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBjcmVhdGUgc3ZnIFxuICAgIGlmICh0aGlzLnByb2Nlc3NlZERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zcGFuLm1hcCgoaXRlbTogRWxlbWVudFJlZiwgaW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5hMiA9IHRoaXMucHJvY2Vzc2VkRGF0YVtpbmRleF0uYTIgPj0gMzYwID8gMzU5LjkgOiB0aGlzLnByb2Nlc3NlZERhdGFbaW5kZXhdLmEyO1xuICAgICAgICBpdGVtLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdkJywgdGhpcy5kZXNjcmliZUFyYyh0aGlzLnZpZXcuaGVpZ2h0LzIsIHRoaXMudmlldy5oZWlnaHQvMiwgdGhpcy52aWV3LnJhZGl1cywgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5hMSwgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5hMikpO1xuICAgICAgICBpdGVtLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdmaWxsJywgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5jb2xvcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdsZUluRGVncmVlcykge1xuICAgIGxldCBhbmdsZUluUmFkaWFucyA9IChhbmdsZUluRGVncmVlcyAtIDkwKSAqIE1hdGguUEkgLyAxODAuMDtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiBjZW50ZXJYICsgKHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKSksXG4gICAgICB5OiBjZW50ZXJZICsgKHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKSlcbiAgICB9O1xuICB9XG5cbiAgZGVzY3JpYmVBcmMoeCwgeSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSkge1xuICAgIGxldCBzdGFydCA9IHRoaXMucG9sYXJUb0NhcnRlc2lhbih4LCB5LCByYWRpdXMsIGVuZEFuZ2xlKTtcbiAgICBsZXQgZW5kID0gdGhpcy5wb2xhclRvQ2FydGVzaWFuKHgsIHksIHJhZGl1cywgc3RhcnRBbmdsZSk7XG5cbiAgICBsZXQgYXJjU3dlZXAgPSBlbmRBbmdsZSAtIHN0YXJ0QW5nbGUgPD0gMTgwID8gXCIwXCIgOiBcIjFcIjtcblxuICAgIGxldCBkID0gW1xuICAgICAgXCJNXCIsIHN0YXJ0LngsIHN0YXJ0LnksXG4gICAgICBcIkFcIiwgcmFkaXVzLCByYWRpdXMsIDAsIGFyY1N3ZWVwLCAwLCBlbmQueCwgZW5kLnksXG4gICAgICBcIkxcIiwgeCwgeSxcbiAgICAgIFwiTFwiLCBzdGFydC54LCBzdGFydC55XG4gICAgXS5qb2luKFwiIFwiKTtcbiAgICByZXR1cm4gZDtcbiAgfVxuXG4gIGdldFBlcmNlbnRhZ2UocGFydGlhbFZhbHVlLCB0b3RhbFZhbHVlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKDEwMCAqIHBhcnRpYWxWYWx1ZSkgLyB0b3RhbFZhbHVlO1xuICB9XG4gIGdldEl0ZW1DbGlja2VkKGl0ZW0pIHtcbiAgICBsZXQgc2VsZWN0ZWQgPSB7XG4gICAgICBuYW1lOml0ZW0ubmFtZSxcbiAgICAgIHZhbHVlOml0ZW0udmFsdWVcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0uZW1pdChzZWxlY3RlZCk7ICB9XG5cbn0iXX0=