Browse Source

Merge remote-tracking branch 'origin/main' into feature/enable-strict-null-checks-in-ui

pull/6264/head
Kenrick Tandrian 2 weeks ago
parent
commit
8ea92cc2cb
  1. 5
      libs/ui/src/lib/activities-filter/activities-filter.component.ts
  2. 26
      libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
  3. 12
      libs/ui/src/lib/services/admin.service.ts
  4. 33
      libs/ui/src/lib/services/data.service.ts

5
libs/ui/src/lib/activities-filter/activities-filter.component.ts

@ -7,6 +7,7 @@ import {
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
DestroyRef,
ElementRef, ElementRef,
Input, Input,
OnChanges, OnChanges,
@ -69,9 +70,9 @@ export class GfActivitiesFilterComponent implements OnChanges {
protected selectedFilters: Filter[] = []; protected selectedFilters: Filter[] = [];
protected readonly separatorKeysCodes: number[] = [ENTER, COMMA]; protected readonly separatorKeysCodes: number[] = [ENTER, COMMA];
public constructor() { public constructor(private destroyRef: DestroyRef) {
this.searchControl.valueChanges this.searchControl.valueChanges
.pipe(takeUntilDestroyed()) .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((filterOrSearchTerm) => { .subscribe((filterOrSearchTerm) => {
if (filterOrSearchTerm) { if (filterOrSearchTerm) {
const searchTerm = const searchTerm =

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

@ -12,6 +12,7 @@ import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
ChangeDetectorRef, ChangeDetectorRef,
Component, Component,
DestroyRef,
ElementRef, ElementRef,
Input, Input,
OnChanges, OnChanges,
@ -123,6 +124,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
public constructor( public constructor(
private changeDetectorRef: ChangeDetectorRef, private changeDetectorRef: ChangeDetectorRef,
private destroyRef: DestroyRef,
private fireCalculatorService: FireCalculatorService, private fireCalculatorService: FireCalculatorService,
private formBuilder: FormBuilder private formBuilder: FormBuilder
) { ) {
@ -135,13 +137,13 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
); );
this.calculatorForm.valueChanges this.calculatorForm.valueChanges
.pipe(takeUntilDestroyed()) .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => { .subscribe(() => {
this.initialize(); this.initialize();
}); });
this.calculatorForm.valueChanges this.calculatorForm.valueChanges
.pipe(debounceTime(500), takeUntilDestroyed()) .pipe(debounceTime(500), takeUntilDestroyed(this.destroyRef))
.subscribe(() => { .subscribe(() => {
const { projectedTotalAmount, retirementDate } = const { projectedTotalAmount, retirementDate } =
this.calculatorForm.getRawValue(); this.calculatorForm.getRawValue();
@ -156,7 +158,10 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
this.calculatorForm this.calculatorForm
.get('annualInterestRate') .get('annualInterestRate')
?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed()) ?.valueChanges.pipe(
debounceTime(500),
takeUntilDestroyed(this.destroyRef)
)
.subscribe((annualInterestRate) => { .subscribe((annualInterestRate) => {
if (annualInterestRate !== null) { if (annualInterestRate !== null) {
this.annualInterestRateChanged.emit(annualInterestRate); this.annualInterestRateChanged.emit(annualInterestRate);
@ -164,7 +169,10 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}); });
this.calculatorForm this.calculatorForm
.get('paymentPerPeriod') .get('paymentPerPeriod')
?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed()) ?.valueChanges.pipe(
debounceTime(500),
takeUntilDestroyed(this.destroyRef)
)
.subscribe((savingsRate) => { .subscribe((savingsRate) => {
if (savingsRate !== null) { if (savingsRate !== null) {
this.savingsRateChanged.emit(savingsRate); this.savingsRateChanged.emit(savingsRate);
@ -172,7 +180,10 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}); });
this.calculatorForm this.calculatorForm
.get('projectedTotalAmount') .get('projectedTotalAmount')
?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed()) ?.valueChanges.pipe(
debounceTime(500),
takeUntilDestroyed(this.destroyRef)
)
.subscribe((projectedTotalAmount) => { .subscribe((projectedTotalAmount) => {
if (projectedTotalAmount !== null) { if (projectedTotalAmount !== null) {
this.projectedTotalAmountChanged.emit(projectedTotalAmount); this.projectedTotalAmountChanged.emit(projectedTotalAmount);
@ -180,7 +191,10 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}); });
this.calculatorForm this.calculatorForm
.get('retirementDate') .get('retirementDate')
?.valueChanges.pipe(debounceTime(500), takeUntilDestroyed()) ?.valueChanges.pipe(
debounceTime(500),
takeUntilDestroyed(this.destroyRef)
)
.subscribe((retirementDate) => { .subscribe((retirementDate) => {
if (retirementDate !== null) { if (retirementDate !== null) {
this.retirementDateChanged.emit(retirementDate); this.retirementDateChanged.emit(retirementDate);

12
libs/ui/src/lib/services/admin.service.ts

@ -21,11 +21,11 @@ import {
Filter Filter
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { DateRange } from '@ghostfolio/common/types'; import { DateRange } from '@ghostfolio/common/types';
import { GF_ENVIRONMENT, GfEnvironment } from '@ghostfolio/ui/environment'; import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment';
import { DataService } from '@ghostfolio/ui/services'; import { DataService } from '@ghostfolio/ui/services';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { Inject, Injectable } from '@angular/core'; import { Injectable, inject } from '@angular/core';
import { SortDirection } from '@angular/material/sort'; import { SortDirection } from '@angular/material/sort';
import { DataSource, MarketData, Platform } from '@prisma/client'; import { DataSource, MarketData, Platform } from '@prisma/client';
import { JobStatus } from 'bull'; import { JobStatus } from 'bull';
@ -35,11 +35,9 @@ import { isNumber } from 'lodash';
providedIn: 'root' providedIn: 'root'
}) })
export class AdminService { export class AdminService {
public constructor( private readonly dataService = inject(DataService);
private dataService: DataService, private readonly environment = inject(GF_ENVIRONMENT);
@Inject(GF_ENVIRONMENT) private environment: GfEnvironment, private readonly http = inject(HttpClient);
private http: HttpClient
) {}
public addAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) { public addAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) {
return this.http.post<void>( return this.http.post<void>(

33
libs/ui/src/lib/services/data.service.ts

@ -65,16 +65,19 @@ import type {
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { HttpClient, HttpParams } from '@angular/common/http'; import { HttpClient, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Injectable, inject } from '@angular/core';
import { SortDirection } from '@angular/material/sort'; import { SortDirection } from '@angular/material/sort';
import { utc } from '@date-fns/utc'; import { utc } from '@date-fns/utc';
import { import {
Access as AccessModel,
Account, Account,
AccountBalance, AccountBalance,
DataSource, DataSource,
MarketData, MarketData,
Order, Order,
Tag SymbolProfile,
Tag,
User as UserModel
} from '@prisma/client'; } from '@prisma/client';
import { format, parseISO } from 'date-fns'; import { format, parseISO } from 'date-fns';
import { cloneDeep, groupBy, isNumber } from 'lodash'; import { cloneDeep, groupBy, isNumber } from 'lodash';
@ -85,7 +88,7 @@ import { map } from 'rxjs/operators';
providedIn: 'root' providedIn: 'root'
}) })
export class DataService { export class DataService {
public constructor(private http: HttpClient) {} private readonly http = inject(HttpClient);
public buildFiltersAsQueryParams({ filters }: { filters?: Filter[] }) { public buildFiltersAsQueryParams({ filters }: { filters?: Filter[] }) {
let params = new HttpParams(); let params = new HttpParams();
@ -308,45 +311,47 @@ export class DataService {
} }
public deleteAccess(aId: string) { public deleteAccess(aId: string) {
return this.http.delete<any>(`/api/v1/access/${aId}`); return this.http.delete<AccessModel>(`/api/v1/access/${aId}`);
} }
public deleteAccount(aId: string) { public deleteAccount(aId: string) {
return this.http.delete<any>(`/api/v1/account/${aId}`); return this.http.delete<Account>(`/api/v1/account/${aId}`);
} }
public deleteAccountBalance(aId: string) { public deleteAccountBalance(aId: string) {
return this.http.delete<any>(`/api/v1/account-balance/${aId}`); return this.http.delete<AccountBalance>(`/api/v1/account-balance/${aId}`);
} }
public deleteActivities({ filters }) { public deleteActivities({ filters }: { filters?: Filter[] }) {
const params = this.buildFiltersAsQueryParams({ filters }); const params = this.buildFiltersAsQueryParams({ filters });
return this.http.delete<any>('/api/v1/activities', { params }); return this.http.delete<number>('/api/v1/activities', { params });
} }
public deleteActivity(aId: string) { public deleteActivity(aId: string) {
return this.http.delete<any>(`/api/v1/activities/${aId}`); return this.http.delete<Order>(`/api/v1/activities/${aId}`);
} }
public deleteBenchmark({ dataSource, symbol }: AssetProfileIdentifier) { public deleteBenchmark({ dataSource, symbol }: AssetProfileIdentifier) {
return this.http.delete<any>(`/api/v1/benchmarks/${dataSource}/${symbol}`); return this.http.delete<Partial<SymbolProfile>>(
`/api/v1/benchmarks/${dataSource}/${symbol}`
);
} }
public deleteOwnUser(aData: DeleteOwnUserDto) { public deleteOwnUser(aData: DeleteOwnUserDto) {
return this.http.delete<any>(`/api/v1/user`, { body: aData }); return this.http.delete<UserModel>(`/api/v1/user`, { body: aData });
} }
public deleteTag(aId: string) { public deleteTag(aId: string) {
return this.http.delete<void>(`/api/v1/tags/${aId}`); return this.http.delete<Tag>(`/api/v1/tags/${aId}`);
} }
public deleteUser(aId: string) { public deleteUser(aId: string) {
return this.http.delete<any>(`/api/v1/user/${aId}`); return this.http.delete<UserModel>(`/api/v1/user/${aId}`);
} }
public deleteWatchlistItem({ dataSource, symbol }: AssetProfileIdentifier) { public deleteWatchlistItem({ dataSource, symbol }: AssetProfileIdentifier) {
return this.http.delete<any>(`/api/v1/watchlist/${dataSource}/${symbol}`); return this.http.delete<void>(`/api/v1/watchlist/${dataSource}/${symbol}`);
} }
public fetchAccesses() { public fetchAccesses() {

Loading…
Cancel
Save