angular-advance-chart
Version:
Angular Advance Chart provides chart solution for Angular.Currently supports Bar, Pie and Donut chart
144 lines • 18.3 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\">\n <div class=\"chart-wrapper\" [ngStyle]=\"{'height': chartView[0],'width': chartView[1]}\">\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))\">\n <g>\n <line *ngFor=\"let line of lines\" stroke-width=\"10\" class=\"line\" [attr.x1]=\"line.x1\" [attr.y1]=\"line.y1 \"\n [attr.x2]=\"line.x2\" [attr.y2]=\"line.y2\" [attr.stroke]=\"line.color\" \u00A0\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0 [attr.stroke-linecap]=\"barLineType\"\n [attr.title]=\"line.name\" (click)=\"getItemClicked(line)\" chartTooltip tooltip={{line.name}} />\n </g>\n </svg>\n </div>\n <div class=\"legend\" *ngIf=\"chartOptions.showLegend\">\n <h4>{{chartOptions.legendTitle +' : '+ totalSum}}</h4>\n <div class=\"legend-item\" *ngFor=\"let item of chartData; let i=index\">\n <div class=\"legend-item-colour\" [ngStyle]=\"{'background': item.color}\"></div><span\n class=\"legend-item-name\">{{item.name}}</span><span class=\"legend-item-value\">{{item.value}}</span>\n </div>\n </div>\n\n</div>",
styles: [".line{cursor:pointer}"]
})
], BarChartComponent);
return BarChartComponent;
}());
export { BarChartComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYWR2YW5jZS1jaGFydC8iLCJzb3VyY2VzIjpbImxpYi9fY29tcG9uZW50L2Jhci1jaGFydC9iYXItY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ1UsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxHQUMxRSxNQUFNLGVBQWUsQ0FBQztBQVV2QjtJQW1CRTtRQWxCVSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDM0MsY0FBUyxHQUFnQixFQUFFLENBQUM7UUFDNUIsaUJBQVksR0FBbUI7WUFDdEMsY0FBYyxFQUFFLEtBQUs7WUFDckIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsVUFBVSxFQUFFLElBQUk7WUFDaEIsV0FBVyxFQUFFLE9BQU87U0FDckIsQ0FBQztRQUNPLFNBQUksR0FBYztZQUN6QixNQUFNLEVBQUUsR0FBRztZQUNYLEtBQUssRUFBRSxHQUFHO1NBQ1gsQ0FBQztRQUNGLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxPQUFPLENBQUE7UUFDckIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLFVBQUssR0FBRyxHQUFHLENBQUM7SUFDSSxDQUFDO0lBRWpCLG9DQUFRLEdBQVI7UUFBQSxpQkErQkM7UUE3QkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFFM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFD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LENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUF4SVM7UUFBVCxNQUFNLEVBQUU7MkRBQTJDO0lBQzNDO1FBQVIsS0FBSyxFQUFFO3dEQUE2QjtJQUM1QjtRQUFSLEtBQUssRUFBRTsyREFLTjtJQUNPO1FBQVIsS0FBSyxFQUFFO21EQUdOO0lBWlMsaUJBQWlCO1FBTDdCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxlQUFlO1lBQ3pCLGdyQ0FBeUM7O1NBRTFDLENBQUM7T0FDVyxpQkFBaUIsQ0EwSTdCO0lBQUQsd0JBQUM7Q0FBQSxBQTFJRCxJQTBJQztTQTFJWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFyQ2hhcnRPcHRpb24gfSBmcm9tICcuLi8uLi9fbW9kZWwvYmFyQ2hhcnRPcHRpb25zJztcbmltcG9ydCB7IENoYXJ0RGF0YSwgQ2hhcnRWaWV3IH0gZnJvbSAnLi4vLi4vX21vZGVsL2NoYXJ0RGF0YSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWJhci1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9iYXItY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9iYXItY2hhcnQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCYXJDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQElucHV0KCkgY2hhcnREYXRhOiBDaGFydERhdGFbXSA9IFtdO1xuICBASW5wdXQoKSBjaGFydE9wdGlvbnM6IEJhckNoYXJ0T3B0aW9uID0ge1xuICAgIHJvdW5kZWRDb3JuZXJzOiBmYWxzZSxcbiAgICBpc0hvcml6b250YWw6IGZhbHNlLFxuICAgIHNob3dMZWdlbmQ6IHRydWUsXG4gICAgbGVnZW5kVGl0bGU6ICdUb3RhbCcsXG4gIH07XG4gIEBJbnB1dCgpIHZpZXc6IENoYXJ0VmlldyA9IHtcbiAgICBoZWlnaHQ6IDIwMCxcbiAgICB3aWR0aDogMjAwXG4gIH07XG4gIGxpbmVzID0gW107XG4gIHRvdGFsU3VtID0gMDtcbiAgaXNIb3Jpem9udGFsID0gdHJ1ZTtcbiAgYmFyTGluZVR5cGUgPSAncm91bmQnXG4gIGNoYXJ0VmlldyA9IFtdO1xuICBzY2FsZSA9IDEwMDtcbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuY2hhcnRWaWV3LnB1c2godGhpcy52aWV3LmhlaWdodCArICdweCcpXG4gICAgdGhpcy5jaGFydFZpZXcucHVzaCh0aGlzLnZpZXcud2lkdGggKyAncHgnKVxuXG4gICAgdGhpcy5iYXJMaW5lVHlwZSA9IHRoaXMuY2hhcnRPcHRpb25zWydyb3VuZGVkQ29ybmVycyddID8gJ3JvdW5kJyA6ICdidXR0J1xuICAgIHRoaXMuaXNIb3Jpem9udGFsID0gdGhpcy5jaGFydE9wdGlvbnNbJ2lzSG9yaXpvbnRhbCddID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHRoaXMuc2NhbGUgPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHRoaXMudmlldy53aWR0aCA6IHRoaXMudmlldy5oZWlnaHQ7XG5cbiAgICBcblxuICAgIHRoaXMuZ2V0VG90YWxTdW0odGhpcy5jaGFydERhdGEpO1xuICAgIGxldCB2YWx1ZSA9IE1hdGgubWF4LmFwcGx5KFxuICAgICAgTWF0aCxcbiAgICAgIHRoaXMuY2hhcnREYXRhLm1hcChmdW5jdGlvbiAobykge1xuICAgICAgICByZXR1cm4gby52YWx1ZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAodmFsdWUgPiB0aGlzLnNjYWxlKSB7XG4gICAgICBsZXQgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUgLyB0aGlzLnNjYWxlO1xuICAgICAgdGhpcy5jaGFydERhdGEubWFwKCh5LCBpbmRleCkgPT4ge1xuICAgICAgICB0aGlzLmNoYXJ0RGF0YVtpbmRleF1bJ25vcm1hbGl6ZWQnXSA9IE51bWJlcih5LnZhbHVlKSAvIG5vcm1hbGl6ZWRWYWx1ZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbm9ybWFsaXplZFZhbHVlID0gdGhpcy5zY2FsZSAvIHZhbHVlO1xuICAgICAgdGhpcy5jaGFydERhdGEubWFwKCh5LCBpbmRleCkgPT4ge1xuICAgICAgICB0aGlzLmNoYXJ0RGF0YVtpbmRleF1bJ25vcm1hbGl6ZWQnXSA9IE51bWJlcih5LnZhbHVlKSAqIG5vcm1hbGl6ZWRWYWx1ZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubGluZXMgPSB0aGlzLmlzSG9yaXpvbnRhbCA/IHRoaXMuY2FsY3VsYXRlSG9yaXpvbnRhbEJhckxpbmVzKHRoaXMuY2hhcnREYXRhKSA6IHRoaXMuY2FsY3VsYXRlVmVydGljYWxCYXJMaW5lcyh0aGlzLmNoYXJ0RGF0YSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7IH1cblxuICBnZXRJdGVtQ2xpY2tlZChsaW5lKSB7XG4gICAgbGV0IHNlbGVjdGVkYmFyID0ge1xuICAgICAgbmFtZTogbGluZS5uYW1lLFxuICAgICAgdmFsdWU6IGxpbmUudmFsdWVcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0uZW1pdChKU09OLnN0cmluZ2lmeShzZWxlY3RlZGJhcikpO1xuICB9XG5cbiAgY2FsY3VsYXRlSG9yaXpvbnRhbEJhckxpbmVzKGdyYXBoRGF0YSkge1xuICAgIGxldCBiYXJMaW5lcyA9IFtdO1xuICAgIGdyYXBoRGF0YS5tYXAoKHgsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgYmFja2dyb3VuZCA9IHtcbiAgICAgICAgeDE6IDEwLFxuICAgICAgICB5MTogaW5kZXggKiAyMCArIDIwLFxuICAgICAgICB5MjogaW5kZXggKiAyMCArIDIwLFxuICAgICAgICB4MjogdGhpcy52aWV3LndpZHRoLFxuICAgICAgICBjb2xvcjogJyNFQkVCRUInLFxuICAgICAgICBuYW1lOiB4Lm5hbWUsXG4gICAgICAgIHZhbHVlOiB4LnZhbHVlXG4gICAgICB9O1xuICAgICAgYmFyTGluZXMucHVzaChiYWNrZ3JvdW5kKVxuXG4gICAgICBpZiAoeC52YWx1ZSA+IDApIHtcbiAgICAgICAgbGV0IGxpbmUgPSB7XG4gICAgICAgICAgeDE6IDEwLFxuICAgICAgICAgIHkxOiBpbmRleCAqIDIwICsgMjAsXG4gICAgICAgICAgeTI6IGluZGV4ICogMjAgKyAyMCxcbiAgICAgICAgICB4MjogeC5ub3JtYWxpemVkIDwgMTAgPyB0aGlzLmJhckxpbmVUeXBlID09ICdidXR0JyA/IDExIDogMTAgOiB4Lm5vcm1hbGl6ZWQsXG4gICAgICAgICAgY29sb3I6IHguY29sb3IsXG4gICAgICAgICAgbmFtZTogeC5uYW1lLFxuICAgICAgICAgIHZhbHVlOiB4LnZhbHVlXG4gICAgICAgIH07XG4gICAgICAgIGJhckxpbmVzLnB1c2gobGluZSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICByZXR1cm4gYmFyTGluZXM7XG4gIH1cblxuXG4gIGNhbGN1bGF0ZVZlcnRpY2FsQmFyTGluZXMoZ3JhcGhEYXRhKSB7XG4gICAgbGV0IGJhckxpbmVzID0gW107XG5cbiAgICBncmFwaERhdGEubWFwKCh4LCBpbmRleCkgPT4ge1xuICAgICAgbGV0IGJhY2tncm91bmQgPSB7XG4gICAgICAgIHgxOiBpbmRleCAqIDIwICsgMjAsXG4gICAgICAgIHkxOiAxMCxcbiAgICAgICAgeDI6IGluZGV4ICogMjAgKyAyMCxcbiAgICAgICAgeTI6IHRoaXMuc2NhbGUsXG4gICAgICAgIGNvbG9yOiAnI0VCRUJFQicsXG4gICAgICAgIG5hbWU6IHgubmFtZSxcbiAgICAgICAgdmFsdWU6IHgudmFsdWVcbiAgICAgIH07XG4gICAgICBiYXJMaW5lcy5wdXNoKGJhY2tncm91bmQpXG5cbiAgICAgIGlmICh4LnZhbHVlID4gMCkge1xuICAgICAgICBsZXQgbGluZSA9IHtcbiAgICAgICAgICB4MTogaW5kZXggKiAyMCArIDIwLFxuICAgICAgICAgIHkxOiAodGhpcy5zY2FsZSsxMCkgLSB4Lm5vcm1hbGl6ZWQgPiB0aGlzLnNjYWxlID8gdGhpcy5iYXJMaW5lVHlwZSA9PSAnYnV0dCcgPyAodGhpcy5zY2FsZS0xKSA6IHRoaXMuc2NhbGUgOiAodGhpcy5zY2FsZSsxMCkgLSB4Lm5vcm1hbGl6ZWQsXG4gICAgICAgICAgeDI6IGluZGV4ICogMjAgKyAyMCxcbiAgICAgICAgICB5MjogdGhpcy5zY2FsZSxcbiAgICAgICAgICBjb2xvcjogeC5jb2xvcixcbiAgICAgICAgICBuYW1lOiB4Lm5hbWUsXG4gICAgICAgICAgdmFsdWU6IHgudmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgYmFyTGluZXMucHVzaChsaW5lKTtcblxuICAgICAgfVxuXG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coYmFyTGluZXMpXG4gICAgcmV0dXJuIGJhckxpbmVzO1xuICB9XG5cblxuXG4gIGdldFRvdGFsU3VtKGNoYXJ0RGF0YSkge1xuICAgIC8vIEdldCB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkc1xuICAgIHRoaXMudG90YWxTdW0gPSBjaGFydERhdGEucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSArIHBhcnNlSW50KGIudmFsdWUpO1xuICAgIH0sIDApO1xuICB9XG59Il19