|
|
|
@ -1,7 +1,6 @@
|
|
|
|
|
import 'chartjs-adapter-date-fns';
|
|
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
AfterViewInit,
|
|
|
|
|
ChangeDetectionStrategy,
|
|
|
|
|
ChangeDetectorRef,
|
|
|
|
|
Component,
|
|
|
|
@ -39,7 +38,7 @@ import {
|
|
|
|
|
sub
|
|
|
|
|
} from 'date-fns';
|
|
|
|
|
import { isNumber } from 'lodash';
|
|
|
|
|
import { Subject, takeUntil } from 'rxjs';
|
|
|
|
|
import { debounceTime, Subject, takeUntil } from 'rxjs';
|
|
|
|
|
|
|
|
|
|
import { FireCalculatorService } from './fire-calculator.service';
|
|
|
|
|
|
|
|
|
@ -49,9 +48,8 @@ import { FireCalculatorService } from './fire-calculator.service';
|
|
|
|
|
styleUrls: ['./fire-calculator.component.scss'],
|
|
|
|
|
templateUrl: './fire-calculator.component.html'
|
|
|
|
|
})
|
|
|
|
|
export class FireCalculatorComponent
|
|
|
|
|
implements AfterViewInit, OnChanges, OnDestroy
|
|
|
|
|
{
|
|
|
|
|
export class FireCalculatorComponent implements OnChanges, OnDestroy {
|
|
|
|
|
@Input() annualInterestRate = 5;
|
|
|
|
|
@Input() colorScheme: ColorScheme;
|
|
|
|
|
@Input() currency: string;
|
|
|
|
|
@Input() deviceType: string;
|
|
|
|
@ -62,6 +60,7 @@ export class FireCalculatorComponent
|
|
|
|
|
@Input() retirementDate: Date;
|
|
|
|
|
@Input() savingsRate = 0;
|
|
|
|
|
|
|
|
|
|
@Output() annualInterestRateChanged = new EventEmitter<number>();
|
|
|
|
|
@Output() projectedTotalAmountChanged = new EventEmitter<number>();
|
|
|
|
|
@Output() retirementDateChanged = new EventEmitter<Date>();
|
|
|
|
|
@Output() savingsRateChanged = new EventEmitter<number>();
|
|
|
|
@ -100,7 +99,7 @@ export class FireCalculatorComponent
|
|
|
|
|
|
|
|
|
|
this.calculatorForm.setValue(
|
|
|
|
|
{
|
|
|
|
|
annualInterestRate: 5,
|
|
|
|
|
annualInterestRate: this.annualInterestRate,
|
|
|
|
|
paymentPerPeriod: this.savingsRate,
|
|
|
|
|
principalInvestmentAmount: 0,
|
|
|
|
|
projectedTotalAmount: this.projectedTotalAmount,
|
|
|
|
@ -117,75 +116,45 @@ export class FireCalculatorComponent
|
|
|
|
|
this.initialize();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('annualInterestRate')
|
|
|
|
|
.valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.subscribe((annualInterestRate) => {
|
|
|
|
|
this.annualInterestRateChanged.emit(annualInterestRate);
|
|
|
|
|
});
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('paymentPerPeriod')
|
|
|
|
|
.valueChanges.pipe(takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.subscribe((savingsRate) => {
|
|
|
|
|
this.savingsRateChanged.emit(savingsRate);
|
|
|
|
|
});
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('projectedTotalAmount')
|
|
|
|
|
.valueChanges.pipe(takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.subscribe((projectedTotalAmount) => {
|
|
|
|
|
this.projectedTotalAmountChanged.emit(projectedTotalAmount);
|
|
|
|
|
});
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('retirementDate')
|
|
|
|
|
.valueChanges.pipe(takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.valueChanges.pipe(debounceTime(500), takeUntil(this.unsubscribeSubject))
|
|
|
|
|
.subscribe((retirementDate) => {
|
|
|
|
|
this.retirementDateChanged.emit(retirementDate);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ngAfterViewInit() {
|
|
|
|
|
if (isNumber(this.fireWealth) && this.fireWealth >= 0) {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
// Wait for the chartCanvas
|
|
|
|
|
this.calculatorForm.patchValue(
|
|
|
|
|
{
|
|
|
|
|
paymentPerPeriod: this.getPMT(),
|
|
|
|
|
principalInvestmentAmount: this.getP(),
|
|
|
|
|
projectedTotalAmount:
|
|
|
|
|
Number(this.getProjectedTotalAmount().toFixed(2)) ?? 0,
|
|
|
|
|
retirementDate:
|
|
|
|
|
this.getRetirementDate() ?? this.DEFAULT_RETIREMENT_DATE
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
emitEvent: false
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
this.calculatorForm.get('principalInvestmentAmount').disable();
|
|
|
|
|
|
|
|
|
|
this.changeDetectorRef.markForCheck();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.hasPermissionToUpdateUserSettings === true) {
|
|
|
|
|
this.calculatorForm.get('paymentPerPeriod').enable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('projectedTotalAmount')
|
|
|
|
|
.enable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm.get('retirementDate').enable({ emitEvent: false });
|
|
|
|
|
} else {
|
|
|
|
|
this.calculatorForm.get('paymentPerPeriod').disable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('projectedTotalAmount')
|
|
|
|
|
.disable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm.get('retirementDate').disable({ emitEvent: false });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ngOnChanges() {
|
|
|
|
|
this.periodsToRetire = this.getPeriodsToRetire();
|
|
|
|
|
|
|
|
|
|
if (isNumber(this.fireWealth) && this.fireWealth >= 0) {
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
// Wait for the chartCanvas
|
|
|
|
|
this.calculatorForm.patchValue(
|
|
|
|
|
{
|
|
|
|
|
annualInterestRate: this.annualInterestRate,
|
|
|
|
|
principalInvestmentAmount: this.fireWealth,
|
|
|
|
|
paymentPerPeriod: this.savingsRate ?? 0,
|
|
|
|
|
projectedTotalAmount:
|
|
|
|
|
Number(this.getProjectedTotalAmount().toFixed(2)) ?? 0,
|
|
|
|
|
Number(this.getProjectedTotalAmount().toFixed(0)) ?? 0,
|
|
|
|
|
retirementDate:
|
|
|
|
|
this.getRetirementDate() ?? this.DEFAULT_RETIREMENT_DATE
|
|
|
|
|
},
|
|
|
|
@ -200,18 +169,24 @@ export class FireCalculatorComponent
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.hasPermissionToUpdateUserSettings === true) {
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('annualInterestRate')
|
|
|
|
|
.enable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm.get('paymentPerPeriod').enable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('projectedTotalAmount')
|
|
|
|
|
.enable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm.get('retirementDate').enable({ emitEvent: false });
|
|
|
|
|
} else {
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('annualInterestRate')
|
|
|
|
|
.disable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm.get('paymentPerPeriod').disable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm
|
|
|
|
|
.get('projectedTotalAmount')
|
|
|
|
|
.disable({ emitEvent: false });
|
|
|
|
|
this.calculatorForm.get('retirementDate').disable({ emitEvent: false });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.calculatorForm.get('retirementDate').disable({ emitEvent: false });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public setMonthAndYear(
|
|
|
|
|