Browse Source

Task/improve type safety in create or update activity dialog component (#7294)

* fix(client): resolve type errors

* feat(client): enforce encapsulation

* feat(client): replace constructor based DI with inject functions

* feat(client): enforce immutability

* fix(client): resolve type error in import activities dialog
pull/7298/merge
Kenrick Tandrian 2 days ago
committed by GitHub
parent
commit
00d908c7e2
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 88
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
  2. 2
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts

88
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts

@ -20,7 +20,7 @@ import {
ChangeDetectorRef, ChangeDetectorRef,
Component, Component,
DestroyRef, DestroyRef,
Inject inject
} from '@angular/core'; } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { import {
@ -75,42 +75,46 @@ import { ActivityType } from './types/activity-type.type';
templateUrl: 'create-or-update-activity-dialog.html' templateUrl: 'create-or-update-activity-dialog.html'
}) })
export class GfCreateOrUpdateActivityDialogComponent { export class GfCreateOrUpdateActivityDialogComponent {
public activityForm: FormGroup; protected activityForm: FormGroup;
public assetClassOptions: AssetClassSelectorOption[] = Object.keys(AssetClass)
.map((id) => {
return { id, label: translate(id) } as AssetClassSelectorOption;
})
.sort((a, b) => {
return a.label.localeCompare(b.label);
});
public assetSubClassOptions: AssetClassSelectorOption[] = []; protected readonly assetClassOptions: AssetClassSelectorOption[] =
public currencies: string[] = []; Object.keys(AssetClass)
public currencyOfAssetProfile: string | undefined; .map((id) => {
public currentMarketPrice: number | null = null; return { id, label: translate(id) } as AssetClassSelectorOption;
public defaultDateFormat: string; })
public defaultLookupItems: LookupItem[] = []; .sort((a, b) => {
public hasPermissionToCreateOwnTag: boolean | undefined; return a.label.localeCompare(b.label);
public isLoading = false; });
public isToday = isToday;
public mode: 'create' | 'update'; protected assetSubClassOptions: AssetClassSelectorOption[] = [];
public tagsAvailable: Tag[] = []; protected currencies: string[] = [];
public total = 0; protected currencyOfAssetProfile: string | undefined;
public typesTranslationMap = new Map<Type, string>(); protected currentMarketPrice: number | null = null;
public Validators = Validators; protected defaultDateFormat: string;
protected defaultLookupItems: LookupItem[] = [];
public constructor( protected hasPermissionToCreateOwnTag: boolean | undefined;
private changeDetectorRef: ChangeDetectorRef, protected isLoading = false;
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateActivityDialogParams, protected readonly isToday = isToday;
private dataService: DataService, protected mode: 'create' | 'update';
private dateAdapter: DateAdapter<Date, string>, protected tagsAvailable: Tag[] = [];
private destroyRef: DestroyRef, protected total = 0;
public dialogRef: MatDialogRef<GfCreateOrUpdateActivityDialogComponent>, protected readonly typesTranslationMap = new Map<Type, string>();
private formBuilder: FormBuilder, protected readonly Validators = Validators;
@Inject(MAT_DATE_LOCALE) private locale: string,
private userService: UserService protected readonly data =
) { inject<CreateOrUpdateActivityDialogParams>(MAT_DIALOG_DATA);
private readonly changeDetectorRef = inject(ChangeDetectorRef);
private readonly dataService = inject(DataService);
private readonly dateAdapter = inject<DateAdapter<Date, string>>(DateAdapter);
private readonly destroyRef = inject(DestroyRef);
private readonly dialogRef =
inject<MatDialogRef<GfCreateOrUpdateActivityDialogComponent>>(MatDialogRef);
private readonly formBuilder = inject(FormBuilder);
private locale = inject<string>(MAT_DATE_LOCALE);
private readonly userService = inject(UserService);
public constructor() {
addIcons({ calendarClearOutline, refreshOutline }); addIcons({ calendarClearOutline, refreshOutline });
} }
@ -138,7 +142,9 @@ export class GfCreateOrUpdateActivityDialogComponent {
return !['CASH'].includes(assetProfile.assetSubClass); return !['CASH'].includes(assetProfile.assetSubClass);
}) })
.sort((a, b) => { .sort((a, b) => {
return a.assetProfile.name?.localeCompare(b.assetProfile.name); return (a.assetProfile.name ?? '').localeCompare(
b.assetProfile.name ?? ''
);
}) })
.map(({ assetProfile }) => { .map(({ assetProfile }) => {
return { return {
@ -463,14 +469,14 @@ export class GfCreateOrUpdateActivityDialogComponent {
} }
} }
public applyCurrentMarketPrice() { protected applyCurrentMarketPrice() {
this.activityForm.patchValue({ this.activityForm.patchValue({
currencyOfUnitPrice: this.activityForm.get('currency')?.value, currencyOfUnitPrice: this.activityForm.get('currency')?.value,
unitPrice: this.currentMarketPrice unitPrice: this.currentMarketPrice
}); });
} }
public dateFilter(aDate: Date) { protected dateFilter(aDate: Date) {
if (!aDate) { if (!aDate) {
return true; return true;
} }
@ -478,11 +484,11 @@ export class GfCreateOrUpdateActivityDialogComponent {
return isAfter(aDate, new Date(0)); return isAfter(aDate, new Date(0));
} }
public onCancel() { protected onCancel() {
this.dialogRef.close(); this.dialogRef.close();
} }
public async onSubmit() { protected async onSubmit() {
const activity: CreateOrderDto | UpdateOrderDto = { const activity: CreateOrderDto | UpdateOrderDto = {
accountId: this.activityForm.get('accountId')?.value, accountId: this.activityForm.get('accountId')?.value,
assetClass: this.activityForm.get('assetClass')?.value, assetClass: this.activityForm.get('assetClass')?.value,

2
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts

@ -151,7 +151,7 @@ export class GfImportActivitiesDialogComponent {
.pipe(takeUntilDestroyed(this.destroyRef)) .pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ holdings }) => { .subscribe(({ holdings }) => {
this.holdings = sortBy(holdings, ({ assetProfile }) => { this.holdings = sortBy(holdings, ({ assetProfile }) => {
return assetProfile.name.toLowerCase(); return assetProfile.name?.toLowerCase();
}); });
this.assetProfileForm.controls.assetProfileIdentifier.enable(); this.assetProfileForm.controls.assetProfileIdentifier.enable();

Loading…
Cancel
Save