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