ngx-chart
Version:
Ngx-Chart provides chart solution for Angular.Currently supports Bar, Pie and Donut chart
119 lines • 15.5 kB
JavaScript
import { __decorate } from "tslib";
import { Component, EventEmitter, Input, Output, ViewChildren } from '@angular/core';
var DonutChartComponent = /** @class */ (function () {
function DonutChartComponent() {
this.selectedItem = new EventEmitter();
this.chartOptions = {
showLegend: true,
legendTitle: 'Total',
};
this.view = {
height: 200,
width: 200,
radius: 80,
donutSize: 20
};
this.totalSum = 0;
this.processedData = [];
this.legendData = [];
this.chartView = [];
}
DonutChartComponent.prototype.ngOnInit = function () {
var _this = this;
if (this.chartData) {
this.view['donutSize'] = this.view['donutSize'] ? this.view['donutSize'] : 20;
this.chartView.push(this.view.height + 'px');
this.chartView.push(this.view.width + 'px');
// Get total number of records
this.totalSum = this.chartData.reduce(function (a, b) {
return a + b.value;
}, 0);
//generate Data for list
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);
}
});
}
};
DonutChartComponent.prototype.getPercentage = function (partialValue, totalValue) {
return (100 * partialValue) / totalValue;
};
DonutChartComponent.prototype.ngAfterViewInit = function () {
var _this = this;
//create svg
if (this.processedData.length > 0) {
this.span.map(function (item, index) {
item.nativeElement.setAttribute('d', _this.describeArc(_this.view.height / 2, _this.view.width / 2, _this.view.radius, _this.processedData[index].a1, _this.processedData[index].a2 == 360 ? 359.99 : _this.processedData[index].a2));
item.nativeElement.setAttribute('stroke', _this.processedData[index].color);
});
}
};
DonutChartComponent.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))
};
};
DonutChartComponent.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 largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1";
var d = [
"M", start.x, start.y,
"A", radius, radius, 0, largeArcFlag, 0, end.x, end.y
].join(" ");
return d;
};
DonutChartComponent.prototype.getItemClicked = function (item) {
var selected = {
name: item.name,
value: item.value
};
this.selectedItem.emit(selected);
};
DonutChartComponent.prototype.show = function (status) {
};
__decorate([
Input()
], DonutChartComponent.prototype, "chartData", void 0);
__decorate([
Output()
], DonutChartComponent.prototype, "selectedItem", void 0);
__decorate([
ViewChildren('el')
], DonutChartComponent.prototype, "span", void 0);
__decorate([
Input()
], DonutChartComponent.prototype, "chartOptions", void 0);
__decorate([
Input()
], DonutChartComponent.prototype, "view", void 0);
DonutChartComponent = __decorate([
Component({
selector: 'ngx-donut-chart',
template: "<div class=\"chart-view ngx-donut\">\n <svg class=\"chart-wrapper\" [ngStyle]=\"{'height': chartView[0],'width': chartView[1]}\">\n <path width=\"100%\" height=\"100%\" #el fill=\"none\" [attr.stroke-width]=\"this.view.donutSize\" *ngFor=\"let item of processedData; let i=index\"\n (click)=\"getItemClicked(item)\" chartTooltip tooltip={{item.name}}/>\n\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:hover{cursor:pointer}"]
})
], DonutChartComponent);
return DonutChartComponent;
}());
export { DonutChartComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9udXQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWNoYXJ0LyIsInNvdXJjZXMiOlsibGliL19jb21wb25lbnQvZG9udXQtY2hhcnQvZG9udXQtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVVwSDtJQW1CRTtRQWhCVSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFeEMsaUJBQVksR0FBZ0I7WUFDbkMsVUFBVSxFQUFFLElBQUk7WUFDaEIsV0FBVyxFQUFFLE9BQU87U0FDckIsQ0FBQTtRQUNRLFNBQUksR0FBbUI7WUFDOUIsTUFBTSxFQUFFLEdBQUc7WUFDWCxLQUFLLEVBQUUsR0FBRztZQUNWLE1BQU0sRUFBRSxFQUFFO1lBQ1YsU0FBUyxFQUFFLEVBQUU7U0FDZCxDQUFBO1FBQ0QsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsY0FBUyxHQUFHLEVBQUUsQ0FBQztJQUNDLENBQUM7SUFFakIsc0NBQVEsR0FBUjtRQUFBLGlCQW1DQztRQWxDQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUE7WUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJ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QUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxrQ0FBSSxHQUFKLFVBQUssTUFBTTtJQUNYLENBQUM7SUF6R1E7UUFBUixLQUFLLEVBQUU7MERBQXdCO0lBQ3RCO1FBQVQsTUFBTSxFQUFFOzZEQUF3QztJQUM3QjtRQUFuQixZQUFZLENBQUMsSUFBSSxDQUFDO3FEQUE2QjtJQUN2QztRQUFSLEtBQUssRUFBRTs2REFHUDtJQUNRO1FBQVIsS0FBSyxFQUFFO3FEQUtQO0lBZFUsbUJBQW1CO1FBTC9CLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsZ3pCQUEyQzs7U0FFNUMsQ0FBQztPQUNXLG1CQUFtQixDQTRHL0I7SUFBRCwwQkFBQztDQUFBLEFBNUdELElBNEdDO1NBNUdZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFydERhdGEsIENoYXJ0T3B0aW9uIH0gZnJvbSAnLi4vLi4vX21vZGVsL2NoYXJ0RGF0YSc7XG5pbXBvcnQgeyBEb251dENoYXJ0VmlldyB9IGZyb20gJy4uLy4uL19tb2RlbC9kb251dENoYXJ0T3B0aW9ucyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWRvbnV0LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RvbnV0LWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZG9udXQtY2hhcnQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEb251dENoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBjaGFydERhdGE6IENoYXJ0RGF0YVtdO1xuICBAT3V0cHV0KCkgc2VsZWN0ZWRJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBWaWV3Q2hpbGRyZW4oJ2VsJykgc3BhbjogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBASW5wdXQoKSBjaGFydE9wdGlvbnM6IENoYXJ0T3B0aW9uID0ge1xuICAgIHNob3dMZWdlbmQ6IHRydWUsXG4gICAgbGVnZW5kVGl0bGU6ICdUb3RhbCcsXG4gIH1cbiAgQElucHV0KCkgdmlldzogRG9udXRDaGFydFZpZXcgPSB7XG4gICAgaGVpZ2h0OiAyMDAsXG4gICAgd2lkdGg6IDIwMCxcbiAgICByYWRpdXM6IDgwLFxuICAgIGRvbnV0U2l6ZTogMjBcbiAgfVxuICB0b3RhbFN1bSA9IDA7XG4gIHByb2Nlc3NlZERhdGEgPSBbXTtcbiAgbGVnZW5kRGF0YSA9IFtdO1xuICBjaGFydFZpZXcgPSBbXTtcbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFydERhdGEpIHtcbiAgICAgIHRoaXMudmlld1snZG9udXRTaXplJ10gPSB0aGlzLnZpZXdbJ2RvbnV0U2l6ZSddID8gdGhpcy52aWV3Wydkb251dFNpemUnXSA6IDIwO1xuICAgICAgdGhpcy5jaGFydFZpZXcucHVzaCh0aGlzLnZpZXcuaGVpZ2h0ICsgJ3B4JylcbiAgICAgIHRoaXMuY2hhcnRWaWV3LnB1c2godGhpcy52aWV3LndpZHRoICsgJ3B4JylcblxuICAgICAgLy8gR2V0IHRvdGFsIG51bWJlciBvZiByZWNvcmRzXG4gICAgICB0aGlzLnRvdGFsU3VtID0gdGhpcy5jaGFydERhdGEucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhICsgYi52YWx1ZTtcbiAgICAgIH0sIDApO1xuXG4gICAgICAvL2dlbmVyYXRlIERhdGEgZm9yIGxpc3RcbiAgICAgIGxldCBwcmV2QW5nbGUgPSAwXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5tYXAoKHgsIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCBsZWdlbmQgPSB7XG4gICAgICAgICAgbmFtZTogeC5uYW1lLFxuICAgICAgICAgIHZhbHVlOiB4LnZhbHVlLFxuICAgICAgICAgIGNvbG9yOiB4LmNvbG9yXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxlZ2VuZERhdGEucHVzaChsZWdlbmQpXG4gICAgICAgIGxldCBwZXJjZW50YWdlID0gdGhpcy5nZXRQZXJjZW50YWdlKHgudmFsdWUsIHRoaXMudG90YWxTdW0pO1xuICAgICAgICBpZiAocGVyY2VudGFnZSA+IDApIHtcbiAgICAgICAgICBsZXQgY2lyY2xlUGVyY2VudGFnZSA9IHBlcmNlbnRhZ2UgLyAxMCAqIDM2O1xuICAgICAgICAgIGxldCBwaWVEYXRhID0ge1xuICAgICAgICAgICAgY29sb3I6IHguY29sb3IsXG4gICAgICAgICAgICBhMTogcHJldkFuZ2xlLFxuICAgICAgICAgICAgYTI6IHByZXZBbmdsZSArIGNpcmNsZVBlcmNlbnRhZ2UsXG4gICAgICAgICAgICBuYW1lOiB4Lm5hbWVcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJldkFuZ2xlID0gcHJldkFuZ2xlICsgY2lyY2xlUGVyY2VudGFnZVxuICAgICAgICAgIHRoaXMucHJvY2Vzc2VkRGF0YS5wdXNoKHBpZURhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIGdldFBlcmNlbnRhZ2UocGFydGlhbFZhbHVlLCB0b3RhbFZhbHVlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKDEwMCAqIHBhcnRpYWxWYWx1ZSkgLyB0b3RhbFZhbHVlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXG4gICAgLy9jcmVhdGUgc3ZnXG4gICAgaWYgKHRoaXMucHJvY2Vzc2VkRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNwYW4ubWFwKChpdGVtOiBFbGVtZW50UmVmLCBpbmRleCkgPT4ge1xuICAgICAgICBpdGVtLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdkJywgdGhpcy5kZXNjcmliZUFyYyh0aGlzLnZpZXcuaGVpZ2h0IC8gMiwgdGhpcy52aWV3LndpZHRoIC8gMiwgdGhpcy52aWV3LnJhZGl1cywgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5hMSwgdGhpcy5wcm9jZXNzZWREYXRhW2luZGV4XS5hMiA9PSAzNjAgPyAzNTkuOTkgOiB0aGlzLnByb2Nlc3NlZERhdGFbaW5kZXhdLmEyKSk7XG4gICAgICAgIGl0ZW0ubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHRoaXMucHJvY2Vzc2VkRGF0YVtpbmRleF0uY29sb3IpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuXG4gIHBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdsZUluRGVncmVlcykge1xuICAgIGxldCBhbmdsZUluUmFkaWFucyA9IChhbmdsZUluRGVncmVlcyAtIDkwKSAqIE1hdGguUEkgLyAxODAuMDtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiBjZW50ZXJYICsgKHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlSW5SYWRpYW5zKSksXG4gICAgICB5OiBjZW50ZXJZICsgKHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlSW5SYWRpYW5zKSlcbiAgICB9O1xuICB9XG5cbiAgZGVzY3JpYmVBcmMoeCwgeSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSkge1xuICAgIGxldCBzdGFydCA9IHRoaXMucG9sYXJUb0NhcnRlc2lhbih4LCB5LCByYWRpdXMsIGVuZEFuZ2xlKTtcbiAgICBsZXQgZW5kID0gdGhpcy5wb2xhclRvQ2FydGVzaWFuKHgsIHksIHJhZGl1cywgc3RhcnRBbmdsZSk7XG4gICAgbGV0IGxhcmdlQXJjRmxhZyA9IGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSA8PSAxODAgPyBcIjBcIiA6IFwiMVwiO1xuXG4gICAgbGV0IGQgPSBbXG4gICAgICBcIk1cIiwgc3RhcnQueCwgc3RhcnQueSxcbiAgICAgIFwiQVwiLCByYWRpdXMsIHJhZGl1cywgMCwgbGFyZ2VBcmNGbGFnLCAwLCBlbmQueCwgZW5kLnlcbiAgICBdLmpvaW4oXCIgXCIpO1xuXG4gICAgcmV0dXJuIGQ7XG4gIH1cblxuICBnZXRJdGVtQ2xpY2tlZChpdGVtKSB7XG4gICAgbGV0IHNlbGVjdGVkID0ge1xuICAgICAgbmFtZTogaXRlbS5uYW1lLFxuICAgICAgdmFsdWU6IGl0ZW0udmFsdWVcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0uZW1pdChzZWxlY3RlZCk7XG4gIH1cblxuICBzaG93KHN0YXR1cykge1xuICB9XG59XG4iXX0=