|
|
@ -10,6 +10,7 @@ import { |
|
|
|
ViewChild |
|
|
|
} from '@angular/core'; |
|
|
|
import { primaryColorRgb } from '@ghostfolio/common/config'; |
|
|
|
import { parseDate } from '@ghostfolio/common/helper'; |
|
|
|
import { InvestmentItem } from '@ghostfolio/common/interfaces/investment-item.interface'; |
|
|
|
import { |
|
|
|
Chart, |
|
|
@ -19,7 +20,7 @@ import { |
|
|
|
PointElement, |
|
|
|
TimeScale |
|
|
|
} from 'chart.js'; |
|
|
|
import { addMonths, isAfter, parseISO, subMonths } from 'date-fns'; |
|
|
|
import { addDays, isAfter, parseISO, subDays } from 'date-fns'; |
|
|
|
|
|
|
|
@Component({ |
|
|
|
selector: 'gf-investment-chart', |
|
|
@ -27,8 +28,10 @@ import { addMonths, isAfter, parseISO, subMonths } from 'date-fns'; |
|
|
|
templateUrl: './investment-chart.component.html', |
|
|
|
styleUrls: ['./investment-chart.component.scss'] |
|
|
|
}) |
|
|
|
export class InvestmentChartComponent implements OnChanges, OnDestroy, OnInit { |
|
|
|
export class InvestmentChartComponent implements OnChanges, OnDestroy { |
|
|
|
@Input() daysInMarket: number; |
|
|
|
@Input() investments: InvestmentItem[]; |
|
|
|
@Input() isInPercent = false; |
|
|
|
|
|
|
|
@ViewChild('chartCanvas') chartCanvas; |
|
|
|
|
|
|
@ -45,8 +48,6 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy, OnInit { |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
public ngOnInit() {} |
|
|
|
|
|
|
|
public ngOnChanges() { |
|
|
|
if (this.investments) { |
|
|
|
this.initialize(); |
|
|
@ -61,19 +62,25 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy, OnInit { |
|
|
|
this.isLoading = true; |
|
|
|
|
|
|
|
if (this.investments?.length > 0) { |
|
|
|
// Extend chart by three months (before)
|
|
|
|
// Extend chart by 5% of days in market (before)
|
|
|
|
const firstItem = this.investments[0]; |
|
|
|
this.investments.unshift({ |
|
|
|
...firstItem, |
|
|
|
date: subMonths(parseISO(firstItem.date), 3).toISOString(), |
|
|
|
date: subDays( |
|
|
|
parseISO(firstItem.date), |
|
|
|
this.daysInMarket * 0.05 || 90 |
|
|
|
).toISOString(), |
|
|
|
investment: 0 |
|
|
|
}); |
|
|
|
|
|
|
|
// Extend chart by three months (after)
|
|
|
|
// Extend chart by 5% of days in market (after)
|
|
|
|
const lastItem = this.investments[this.investments.length - 1]; |
|
|
|
this.investments.push({ |
|
|
|
...lastItem, |
|
|
|
date: addMonths(new Date(), 3).toISOString() |
|
|
|
date: addDays( |
|
|
|
parseDate(lastItem.date), |
|
|
|
this.daysInMarket * 0.05 || 90 |
|
|
|
).toISOString() |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
@ -136,12 +143,26 @@ export class InvestmentChartComponent implements OnChanges, OnDestroy, OnInit { |
|
|
|
} |
|
|
|
}, |
|
|
|
y: { |
|
|
|
display: false, |
|
|
|
display: !this.isInPercent, |
|
|
|
grid: { |
|
|
|
display: false |
|
|
|
}, |
|
|
|
ticks: { |
|
|
|
display: false |
|
|
|
display: true, |
|
|
|
callback: (tickValue, index, ticks) => { |
|
|
|
if (index === 0 || index === ticks.length - 1) { |
|
|
|
// Only print last and first legend entry
|
|
|
|
if (typeof tickValue === 'number') { |
|
|
|
return tickValue.toFixed(2); |
|
|
|
} |
|
|
|
|
|
|
|
return tickValue; |
|
|
|
} |
|
|
|
|
|
|
|
return ''; |
|
|
|
}, |
|
|
|
mirror: true, |
|
|
|
z: 1 |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|