import { AfterViewInit, Component, Input, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
import { NbThemeService } from '@nebular/theme';
import { takeWhile } from 'rxjs/operators';
import { LayoutService } from '../../../../@core/utils/layout.service';
declare const echarts: any;
@Component({
selector: 'ngx-traffic-bar-chart',
template: `
`,
})
export class TrafficBarChartComponent implements AfterViewInit, OnDestroy, OnChanges {
@Input() data: number[];
@Input() labels: string[];
@Input() formatter: string;
private alive = true;
option: any = {};
echartsInstance: any;
constructor(private theme: NbThemeService,
private layoutService: LayoutService) {
this.layoutService.onChangeLayoutSize()
.pipe(
takeWhile(() => this.alive),
)
.subscribe(() => this.resizeChart());
}
onChartInit(ec) {
this.echartsInstance = ec;
}
resizeChart() {
if (this.echartsInstance) {
this.echartsInstance.resize();
}
}
ngOnChanges(changes: SimpleChanges): void {
if (!changes.data.isFirstChange() && !changes.labels.isFirstChange()) {
this.echartsInstance.setOption({
series: [{
data: this.data,
}],
xAxis: {
data: this.labels,
},
tooltip: {
formatter: this.formatter,
},
});
}
}
ngAfterViewInit() {
this.theme.getJsTheme()
.pipe(takeWhile(() => this.alive))
.subscribe(config => {
const trafficTheme: any = config.variables.trafficBarEchart;
this.option = Object.assign({}, {
grid: {
left: 0,
top: 0,
right: 0,
bottom: 0,
containLabel: true,
},
xAxis: {
type : 'category',
data : this.labels,
axisLabel: {
color: trafficTheme.axisTextColor,
fontSize: trafficTheme.axisFontSize,
},
axisLine: {
show: false,
},
axisTick: {
show: false,
},
},
yAxis: {
show: false,
axisLine: {
show: false,
},
axisLabel: {
show: false,
},
axisTick: {
show: false,
},
boundaryGap: [0, '5%'],
},
tooltip: {
axisPointer: {
type: 'shadow',
},
textStyle: {
color: trafficTheme.tooltipTextColor,
fontWeight: trafficTheme.tooltipFontWeight,
fontSize: 16,
},
position: 'top',
backgroundColor: trafficTheme.tooltipBg,
borderColor: trafficTheme.tooltipBorderColor,
borderWidth: 1,
formatter: this.formatter,
extraCssText: trafficTheme.tooltipExtraCss,
},
series: [
{
type: 'bar',
barWidth: '40%',
data: this.data,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: trafficTheme.gradientFrom,
}, {
offset: 1,
color: trafficTheme.gradientTo,
}]),
opacity: 1,
shadowColor: trafficTheme.gradientFrom,
shadowBlur: trafficTheme.shadowBlur,
},
},
},
],
});
});
}
ngOnDestroy() {
this.alive = false;
}
}