|
|
|
@ -17,7 +17,6 @@ import { ArcElement } from 'chart.js';
|
|
|
|
|
import { DoughnutController } from 'chart.js';
|
|
|
|
|
import { Chart } from 'chart.js';
|
|
|
|
|
import ChartDataLabels from 'chartjs-plugin-datalabels';
|
|
|
|
|
import { sum } from 'lodash';
|
|
|
|
|
import * as Color from 'color';
|
|
|
|
|
|
|
|
|
|
@Component({
|
|
|
|
@ -34,7 +33,7 @@ export class PortfolioProportionChartComponent
|
|
|
|
|
@Input() keys: string[];
|
|
|
|
|
@Input() locale: string;
|
|
|
|
|
@Input() maxItems?: number;
|
|
|
|
|
@Input() showLabels: boolean;
|
|
|
|
|
@Input() showLabels = false;
|
|
|
|
|
@Input() positions: {
|
|
|
|
|
[symbol: string]: Pick<PortfolioPosition, 'type'> & { value: number };
|
|
|
|
|
};
|
|
|
|
@ -51,7 +50,13 @@ export class PortfolioProportionChartComponent
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public constructor() {
|
|
|
|
|
Chart.register(ArcElement, DoughnutController, LinearScale, Tooltip, ChartDataLabels);
|
|
|
|
|
Chart.register(
|
|
|
|
|
ArcElement,
|
|
|
|
|
ChartDataLabels,
|
|
|
|
|
DoughnutController,
|
|
|
|
|
LinearScale,
|
|
|
|
|
Tooltip
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ngOnInit() {}
|
|
|
|
@ -229,8 +234,6 @@ export class PortfolioProportionChartComponent
|
|
|
|
|
labels
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const showLabels = this.showLabels || false;
|
|
|
|
|
|
|
|
|
|
if (this.chartCanvas) {
|
|
|
|
|
if (this.chart) {
|
|
|
|
|
this.chart.data = data;
|
|
|
|
@ -239,11 +242,31 @@ export class PortfolioProportionChartComponent
|
|
|
|
|
this.chart = new Chart(this.chartCanvas.nativeElement, {
|
|
|
|
|
data,
|
|
|
|
|
options: {
|
|
|
|
|
cutout: '70%',
|
|
|
|
|
layout: {
|
|
|
|
|
padding: 60,
|
|
|
|
|
padding: this.showLabels === true ? 100 : 0
|
|
|
|
|
},
|
|
|
|
|
cutout: '70%',
|
|
|
|
|
plugins: {
|
|
|
|
|
datalabels: {
|
|
|
|
|
color: (context) => {
|
|
|
|
|
return this.getColorPalette()[
|
|
|
|
|
context.dataIndex % this.getColorPalette().length
|
|
|
|
|
];
|
|
|
|
|
},
|
|
|
|
|
display: this.showLabels === true ? 'auto' : false,
|
|
|
|
|
labels: {
|
|
|
|
|
index: {
|
|
|
|
|
align: 'end',
|
|
|
|
|
anchor: 'end',
|
|
|
|
|
formatter: (value, context) => {
|
|
|
|
|
return value > 0
|
|
|
|
|
? context.chart.data.labels[context.dataIndex]
|
|
|
|
|
: '';
|
|
|
|
|
},
|
|
|
|
|
offset: 8
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
legend: { display: false },
|
|
|
|
|
tooltip: {
|
|
|
|
|
callbacks: {
|
|
|
|
@ -265,27 +288,6 @@ export class PortfolioProportionChartComponent
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
datalabels: {
|
|
|
|
|
display: function(ctx) {
|
|
|
|
|
const value = ctx.dataset.data[ctx.dataIndex];
|
|
|
|
|
return showLabels === true && ctx.datasetIndex === 0 && value > sum(ctx.dataset.data) / 10;
|
|
|
|
|
},
|
|
|
|
|
font: {
|
|
|
|
|
weight: 'bold',
|
|
|
|
|
},
|
|
|
|
|
color: this.getColorPalette()[0],
|
|
|
|
|
labels: {
|
|
|
|
|
index: {
|
|
|
|
|
align: 'end',
|
|
|
|
|
anchor: 'end',
|
|
|
|
|
font: {size: 18},
|
|
|
|
|
formatter: function(value, ctx) {
|
|
|
|
|
return ctx.chart.data.labels[ctx.dataIndex];
|
|
|
|
|
},
|
|
|
|
|
offset: 8,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|