From d141ce7aba196c56486b196885f665dd86465fe9 Mon Sep 17 00:00:00 2001 From: Attila Cseh Date: Fri, 11 Jul 2025 15:54:02 +0200 Subject: [PATCH] code review changes --- .../asset-profile-dialog.component.ts | 61 ++++--------------- .../asset-profile-dialog.html | 1 + .../interfaces/interfaces.ts | 2 +- libs/common/src/lib/config.ts | 17 +++++- 4 files changed, 31 insertions(+), 50 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 474e7cbdf..148101a69 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 @@ -6,6 +6,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; import { + ASSET_CLASS_MAPPING, ghostfolioScraperApiSymbolPrefix, PROPERTY_IS_DATA_GATHERING_ENABLED } from '@ghostfolio/common/config'; @@ -58,7 +59,7 @@ import { catchError, takeUntil } from 'rxjs/operators'; import { AssetProfileDialogParams, - SelectOptionValue + SelectOption } from './interfaces/interfaces'; @Component({ @@ -82,19 +83,9 @@ export class AssetProfileDialog implements OnDestroy, OnInit { public assetProfileSubClass: string; public assetClasses = Object.keys(AssetClass).map((id) => { - return { id, label: translate(id) }; + return { id, label: translate(id) } as SelectOption; }); - public allAssetSubClasses = Object.keys(AssetSubClass).reduce( - (acc, id) => { - acc[id] = { - id, - label: translate(id) - }; - return acc; - }, - {} as Record - ); - public assetSubClasses: SelectOptionValue[] = []; + public assetSubClasses: SelectOption[] = []; public assetProfile: AdminMarketDataDetails['assetProfile']; @@ -233,42 +224,16 @@ export class AssetProfileDialog implements OnDestroy, OnInit { this.assetClassControl.valueChanges .pipe(takeUntil(this.unsubscribeSubject)) .subscribe((assetClass) => { - switch (assetClass) { - case AssetClass.ALTERNATIVE_INVESTMENT: - this.assetSubClasses = [ - this.allAssetSubClasses[AssetSubClass.COLLECTIBLE] - ]; - break; - case AssetClass.COMMODITY: - this.assetSubClasses = [ - this.allAssetSubClasses[AssetSubClass.COMMODITY], - this.allAssetSubClasses[AssetSubClass.PRECIOUS_METAL] - ]; - break; - case AssetClass.EQUITY: - this.assetSubClasses = [ - this.allAssetSubClasses[AssetSubClass.ETF], - this.allAssetSubClasses[AssetSubClass.PRIVATE_EQUITY], - this.allAssetSubClasses[AssetSubClass.STOCK] - ]; - break; - case AssetClass.FIXED_INCOME: - this.assetSubClasses = [ - this.allAssetSubClasses[AssetSubClass.BOND], - this.allAssetSubClasses[AssetSubClass.MUTUALFUND] - ]; - break; - case AssetClass.LIQUIDITY: - this.assetSubClasses = [ - this.allAssetSubClasses[AssetSubClass.CRYPTOCURRENCY] - ]; - break; - default: - this.assetSubClasses = []; - break; - } + const assetSubClasses = ASSET_CLASS_MAPPING.get(assetClass) ?? []; + + this.assetSubClasses = assetSubClasses.map((assetSubClass) => { + return { + id: assetSubClass, + label: translate(assetSubClass) + }; + }); - this.assetSubClassControl.setValue(this.assetSubClasses[0]?.id); + this.assetSubClassControl.setValue(null); this.changeDetectorRef.markForCheck(); }); 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 d264efe45..0657d9fa5 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 @@ -316,6 +316,7 @@ Asset Sub Class + @for (assetSubClass of assetSubClasses; track assetSubClass) { {{ assetSubClass.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 746ac4a02..f20e99cc6 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 @@ -10,7 +10,7 @@ export interface AssetProfileDialogParams { symbol: string; } -export interface SelectOptionValue { +export interface SelectOption { id: AssetSubClass; label: string; } diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 4f3bbd77c..10d8095ce 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -1,4 +1,4 @@ -import { DataSource } from '@prisma/client'; +import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; import { JobOptions, JobStatus } from 'bull'; import ms from 'ms'; @@ -34,6 +34,21 @@ export const warnColorRgb = { b: 69 }; +export const ASSET_CLASS_MAPPING = new Map([ + [AssetClass.ALTERNATIVE_INVESTMENT, [AssetSubClass.COLLECTIBLE]], + [ + AssetClass.COMMODITY, + [AssetSubClass.COMMODITY, AssetSubClass.PRECIOUS_METAL] + ], + [ + AssetClass.EQUITY, + [AssetSubClass.ETF, AssetSubClass.PRIVATE_EQUITY, AssetSubClass.STOCK] + ], + [AssetClass.FIXED_INCOME, [AssetSubClass.BOND, AssetSubClass.MUTUALFUND]], + [AssetClass.LIQUIDITY, [AssetSubClass.BOND, AssetSubClass.CRYPTOCURRENCY]], + [AssetClass.REAL_ESTATE, []] +]); + export const CACHE_TTL_NO_CACHE = 1; export const CACHE_TTL_INFINITE = 0;