Browse Source

Bugfix/projected total amount in FIRE calculator (#6490)

* Fix projected total amount

* Update changelog
pull/6493/head
Kenrick Tandrian 2 days ago
committed by GitHub
parent
commit
249cf0cdd9
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      CHANGELOG.md
  2. 23
      libs/ui/src/lib/fire-calculator/fire-calculator.component.ts

4
CHANGELOG.md

@ -19,6 +19,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Reused the value component in the tag management of the admin control panel - Reused the value component in the tag management of the admin control panel
- Upgraded `jsonpath` from version `1.1.1` to `1.2.1` - Upgraded `jsonpath` from version `1.1.1` to `1.2.1`
### Fixed
- Fixed an issue in the _FIRE_ calculator to correctly calculate the projected total amount
## 2.247.0 - 2026-03-04 ## 2.247.0 - 2026-03-04
### Changed ### Changed

23
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts

@ -16,8 +16,8 @@ import {
Input, Input,
OnChanges, OnChanges,
OnDestroy, OnDestroy,
ViewChild, output,
output viewChild
} from '@angular/core'; } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { import {
@ -55,7 +55,7 @@ import {
startOfMonth, startOfMonth,
sub sub
} from 'date-fns'; } from 'date-fns';
import { isNil, isNumber } from 'lodash'; import { isNumber } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { debounceTime } from 'rxjs'; import { debounceTime } from 'rxjs';
@ -90,8 +90,6 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
@Input() retirementDate: Date; @Input() retirementDate: Date;
@Input() savingsRate = 0; @Input() savingsRate = 0;
@ViewChild('chartCanvas') chartCanvas: ElementRef<HTMLCanvasElement>;
public calculatorForm = this.formBuilder.group({ public calculatorForm = this.formBuilder.group({
annualInterestRate: new FormControl<number | null>(null), annualInterestRate: new FormControl<number | null>(null),
paymentPerPeriod: new FormControl<number | null>(null), paymentPerPeriod: new FormControl<number | null>(null),
@ -99,23 +97,30 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
projectedTotalAmount: new FormControl<number | null>(null), projectedTotalAmount: new FormControl<number | null>(null),
retirementDate: new FormControl<Date | null>(null) retirementDate: new FormControl<Date | null>(null)
}); });
public chart: Chart<'bar'>; public chart: Chart<'bar'>;
public isLoading = true; public isLoading = true;
public minDate = addDays(new Date(), 1); public minDate = addDays(new Date(), 1);
public periodsToRetire = 0; public periodsToRetire = 0;
protected readonly annualInterestRateChanged = output<number>(); protected readonly annualInterestRateChanged = output<number>();
protected readonly calculationCompleted = protected readonly calculationCompleted =
output<FireCalculationCompleteEvent>(); output<FireCalculationCompleteEvent>();
protected readonly projectedTotalAmountChanged = output<number>(); protected readonly projectedTotalAmountChanged = output<number>();
protected readonly retirementDateChanged = output<Date>(); protected readonly retirementDateChanged = output<Date>();
protected readonly savingsRateChanged = output<number>(); protected readonly savingsRateChanged = output<number>();
private readonly CONTRIBUTION_PERIOD = 12; private readonly CONTRIBUTION_PERIOD = 12;
private readonly DEFAULT_RETIREMENT_DATE = startOfMonth( private readonly DEFAULT_RETIREMENT_DATE = startOfMonth(
addYears(new Date(), 10) addYears(new Date(), 10)
); );
private readonly chartCanvas =
viewChild.required<ElementRef<HTMLCanvasElement>>('chartCanvas');
public constructor( public constructor(
private changeDetectorRef: ChangeDetectorRef, private changeDetectorRef: ChangeDetectorRef,
private fireCalculatorService: FireCalculatorService, private fireCalculatorService: FireCalculatorService,
@ -272,7 +277,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
const chartData = this.getChartData(); const chartData = this.getChartData();
if (this.chartCanvas) { if (this.chartCanvas()) {
if (this.chart) { if (this.chart) {
this.chart.data.labels = chartData.labels; this.chart.data.labels = chartData.labels;
@ -282,7 +287,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
this.chart.update(); this.chart.update();
} else { } else {
this.chart = new Chart<'bar'>(this.chartCanvas.nativeElement, { this.chart = new Chart<'bar'>(this.chartCanvas().nativeElement, {
data: chartData, data: chartData,
options: { options: {
plugins: { plugins: {
@ -303,7 +308,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}).format(totalAmount)}`; }).format(totalAmount)}`;
}, },
label: (context) => { label: (context) => {
let label = context.dataset.label || ''; let label = context.dataset.label ?? '';
if (label) { if (label) {
label += ': '; label += ': ';
@ -473,7 +478,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
'projectedTotalAmount' 'projectedTotalAmount'
)?.value; )?.value;
if (!isNil(projectedTotalAmount)) { if (projectedTotalAmount) {
return projectedTotalAmount; return projectedTotalAmount;
} }

Loading…
Cancel
Save