import { AfterViewInit, Component, EventEmitter, Input, OnDestroy, Output } from '@angular/core';
import { NbThemeService } from '@nebular/theme';
import { delay, takeWhile } from 'rxjs/operators';
@Component({
selector: 'ngx-earning-pie-chart',
styleUrls: ['./earning-card-back.component.scss'],
template: `
`,
})
export class EarningPieChartComponent implements AfterViewInit, OnDestroy {
@Output() selectPie = new EventEmitter<{value: number; name: string; color: string}>();
@Input() values: {value: number; name: string; }[];
@Input() defaultSelectedCurrency: string;
private alive = true;
options: any = {};
echartsInstance;
constructor(private theme: NbThemeService) {
}
onChartInit(ec) {
this.echartsInstance = ec;
}
onChartClick(event) {
const pieData = {
value: event.value,
name: event.name,
color: event.color.colorStops[0].color,
};
this.emitSelectPie(pieData);
}
emitSelectPie(pieData: {value: number; name: string; color: any}) {
this.selectPie.emit(pieData);
}
ngAfterViewInit() {
this.theme.getJsTheme()
.pipe(
takeWhile(() => this.alive),
delay(1),
)
.subscribe(config => {
const variables = config.variables;
this.options = this.getOptions(variables);
const defaultSelectedData =
this.options.series[0].data.find((item) => item.name === this.defaultSelectedCurrency);
const color = defaultSelectedData.itemStyle.normal.color.colorStops[0].color;
const pieData = {
value: defaultSelectedData.value,
name: defaultSelectedData.name,
color,
};
this.emitSelectPie(pieData);
});
}
getOptions(variables) {
const earningPie: any = variables.earningPie;
return {
tooltip: {
trigger: 'item',
formatter: '',
},
series: [
{
name: ' ',
clockWise: true,
hoverAnimation: false,
type: 'pie',
center: earningPie.center,
radius: earningPie.radius,
data: [
{
value: this.values[0].value,
name: this.values[0].name,
label: {
normal: {
position: 'center',
formatter: '',
textStyle: {
fontSize: '22',
fontFamily: variables.fontSecondary,
fontWeight: '600',
color: variables.fgHeading,
},
},
},
tooltip: {
show: false,
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: earningPie.firstPieGradientLeft,
},
{
offset: 1,
color: earningPie.firstPieGradientRight,
},
]),
shadowColor: earningPie.firstPieShadowColor,
shadowBlur: 0,
shadowOffsetX: 0,
shadowOffsetY: 3,
},
},
},
{
value: this.values[1].value,
name: this.values[1].name,
label: {
normal: {
position: 'center',
formatter: '',
textStyle: {
fontSize: '22',
fontFamily: variables.fontSecondary,
fontWeight: '600',
color: variables.fgHeading,
},
},
},
tooltip: {
show: false,
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: earningPie.secondPieGradientLeft,
},
{
offset: 1,
color: earningPie.secondPieGradientRight,
},
]),
shadowColor: earningPie.secondPieShadowColor,
shadowBlur: 0,
shadowOffsetX: 0,
shadowOffsetY: 3,
},
},
},
{
value: this.values[2].value,
name: this.values[2].name,
label: {
normal: {
position: 'center',
formatter: '',
textStyle: {
fontSize: '22',
fontFamily: variables.fontSecondary,
fontWeight: '600',
color: variables.fgHeading,
},
},
},
tooltip: {
show: false,
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: earningPie.thirdPieGradientLeft,
},
{
offset: 1,
color: earningPie.thirdPieGradientRight,
},
]),
shadowColor: earningPie.thirdPieShadowColor,
shadowBlur: 0,
shadowOffsetX: 0,
shadowOffsetY: 3,
},
},
},
],
},
],
};
}
ngOnDestroy() {
this.alive = false;
}
}