From c1b34fa950a4eabd9c35564fb8696787d1324faa Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:08:34 +0200 Subject: [PATCH] Refactoring --- .../asset-profile-dialog.component.ts | 54 ++++++++++--------- .../asset-profile-dialog.html | 12 ++--- .../interfaces/interfaces.ts | 12 ++--- libs/common/src/lib/config.ts | 16 +++--- 4 files changed, 51 insertions(+), 43 deletions(-) diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index b95bc73e3..d8474d146 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -58,8 +58,8 @@ import { EMPTY, Subject } from 'rxjs'; import { catchError, takeUntil } from 'rxjs/operators'; import { - AssetProfileDialogParams, - SelectOption + AssetClassSelectOption, + AssetProfileDialogParams } from './interfaces/interfaces'; @Component({ @@ -79,21 +79,24 @@ export class AssetProfileDialog implements OnDestroy, OnInit { @ViewChild('assetProfileFormElement') assetProfileFormElement: ElementRef; - public assetProfileClass: string; - public assetProfileSubClass: string; + public assetProfile: AdminMarketDataDetails['assetProfile']; - public assetClassOptions = Object.keys(AssetClass).map((id) => { - return { id, label: translate(id) } as SelectOption; - }); - public assetSubClassOptions: SelectOption[] = []; + public assetClassLabel: string; + public assetSubClassLabel: string; - public assetProfile: AdminMarketDataDetails['assetProfile']; + public assetClassOptions: AssetClassSelectOption[] = Object.keys(AssetClass) + .map((id) => { + return { id, label: translate(id) } as AssetClassSelectOption; + }) + .sort((a, b) => { + return a.label.localeCompare(b.label); + }); + + public assetSubClassOptions: AssetClassSelectOption[] = []; - public assetClassControl = new FormControl(undefined); - public assetSubClassControl = new FormControl(undefined); public assetProfileForm = this.formBuilder.group({ - assetClass: this.assetClassControl, - assetSubClass: this.assetSubClassControl, + assetClass: new FormControl(undefined), + assetSubClass: new FormControl(undefined), comment: '', countries: '', currency: '', @@ -221,19 +224,22 @@ export class AssetProfileDialog implements OnDestroy, OnInit { } }); - this.assetClassControl.valueChanges - .pipe(takeUntil(this.unsubscribeSubject)) + this.assetProfileForm + .get('assetClass') + .valueChanges.pipe(takeUntil(this.unsubscribeSubject)) .subscribe((assetClass) => { const assetSubClasses = ASSET_CLASS_MAPPING.get(assetClass) ?? []; - this.assetSubClassOptions = assetSubClasses.map((assetSubClass) => { - return { - id: assetSubClass, - label: translate(assetSubClass) - }; - }); + this.assetSubClassOptions = assetSubClasses + .map((assetSubClass) => { + return { + id: assetSubClass, + label: translate(assetSubClass) + }; + }) + .sort((a, b) => a.label.localeCompare(b.label)); - this.assetSubClassControl.setValue(null); + this.assetProfileForm.get('assetSubClass').setValue(null); this.changeDetectorRef.markForCheck(); }); @@ -247,8 +253,8 @@ export class AssetProfileDialog implements OnDestroy, OnInit { .subscribe(({ assetProfile, marketData }) => { this.assetProfile = assetProfile; - this.assetProfileClass = translate(this.assetProfile?.assetClass); - this.assetProfileSubClass = translate(this.assetProfile?.assetSubClass); + this.assetClassLabel = translate(this.assetProfile?.assetClass); + this.assetSubClassLabel = translate(this.assetProfile?.assetSubClass); this.countries = {}; this.isBenchmark = this.benchmarks.some(({ id }) => { diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index f946c1f8f..53e87cf45 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -209,8 +209,8 @@ Asset Class @@ -218,8 +218,8 @@ Asset Sub Class @@ -306,7 +306,7 @@ @for ( assetClassOption of assetClassOptions; - track assetClassOption + track assetClassOption.id ) { {{ assetClassOption.label @@ -322,7 +322,7 @@ @for ( assetSubClassOption of assetSubClassOptions; - track assetSubClassOption + track assetSubClassOption.id ) { {{ assetSubClassOption.label diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts index f20e99cc6..613d8469f 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts @@ -1,6 +1,11 @@ import { ColorScheme } from '@ghostfolio/common/types'; -import { AssetSubClass, DataSource } from '@prisma/client'; +import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; + +export interface AssetClassSelectOption { + id: AssetClass | AssetSubClass; + label: string; +} export interface AssetProfileDialogParams { colorScheme: ColorScheme; @@ -9,8 +14,3 @@ export interface AssetProfileDialogParams { locale: string; symbol: string; } - -export interface SelectOption { - id: AssetSubClass; - label: string; -} diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 10d8095ce..5aee7e0e6 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -36,16 +36,18 @@ export const warnColorRgb = { export const ASSET_CLASS_MAPPING = new Map([ [AssetClass.ALTERNATIVE_INVESTMENT, [AssetSubClass.COLLECTIBLE]], - [ - AssetClass.COMMODITY, - [AssetSubClass.COMMODITY, AssetSubClass.PRECIOUS_METAL] - ], + [AssetClass.COMMODITY, [AssetSubClass.PRECIOUS_METAL]], [ AssetClass.EQUITY, - [AssetSubClass.ETF, AssetSubClass.PRIVATE_EQUITY, AssetSubClass.STOCK] + [ + AssetSubClass.ETF, + AssetSubClass.MUTUALFUND, + AssetSubClass.PRIVATE_EQUITY, + AssetSubClass.STOCK + ] ], - [AssetClass.FIXED_INCOME, [AssetSubClass.BOND, AssetSubClass.MUTUALFUND]], - [AssetClass.LIQUIDITY, [AssetSubClass.BOND, AssetSubClass.CRYPTOCURRENCY]], + [AssetClass.FIXED_INCOME, [AssetSubClass.BOND]], + [AssetClass.LIQUIDITY, [AssetSubClass.CRYPTOCURRENCY]], [AssetClass.REAL_ESTATE, []] ]);