From af364655c49ff67648df06d46da779a0e6e53753 Mon Sep 17 00:00:00 2001 From: Attila Cseh Date: Thu, 10 Jul 2025 13:19:15 +0200 Subject: [PATCH] Asset sub class options filtered based on selected asset class --- .../asset-profile-dialog.component.ts | 75 ++++++++++++++++--- .../asset-profile-dialog.html | 1 - .../interfaces/interfaces.ts | 7 +- 3 files changed, 71 insertions(+), 12 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 3dad22488..474e7cbdf 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 @@ -56,7 +56,10 @@ import ms from 'ms'; import { EMPTY, Subject } from 'rxjs'; import { catchError, takeUntil } from 'rxjs/operators'; -import { AssetProfileDialogParams } from './interfaces/interfaces'; +import { + AssetProfileDialogParams, + SelectOptionValue +} from './interfaces/interfaces'; @Component({ host: { class: 'd-flex flex-column h-100' }, @@ -76,20 +79,30 @@ export class AssetProfileDialog implements OnDestroy, OnInit { assetProfileFormElement: ElementRef; public assetProfileClass: string; + public assetProfileSubClass: string; - public assetClasses = Object.keys(AssetClass).map((assetClass) => { - return { id: assetClass, label: translate(assetClass) }; - }); - - public assetSubClasses = Object.keys(AssetSubClass).map((assetSubClass) => { - return { id: assetSubClass, label: translate(assetSubClass) }; + public assetClasses = Object.keys(AssetClass).map((id) => { + return { id, label: translate(id) }; }); + public allAssetSubClasses = Object.keys(AssetSubClass).reduce( + (acc, id) => { + acc[id] = { + id, + label: translate(id) + }; + return acc; + }, + {} as Record + ); + public assetSubClasses: SelectOptionValue[] = []; public assetProfile: AdminMarketDataDetails['assetProfile']; + public assetClassControl = new FormControl(undefined); + public assetSubClassControl = new FormControl(undefined); public assetProfileForm = this.formBuilder.group({ - assetClass: new FormControl(undefined), - assetSubClass: new FormControl(undefined), + assetClass: this.assetClassControl, + assetSubClass: this.assetSubClassControl, comment: '', countries: '', currency: '', @@ -125,7 +138,6 @@ export class AssetProfileDialog implements OnDestroy, OnInit { } ); - public assetProfileSubClass: string; public benchmarks: Partial[]; public countries: { @@ -218,6 +230,49 @@ 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; + } + + this.assetSubClassControl.setValue(this.assetSubClasses[0]?.id); + + this.changeDetectorRef.markForCheck(); + }); + this.dataService .fetchMarketDataBySymbol({ dataSource: this.data.dataSource, 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 0657d9fa5..d264efe45 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,7 +316,6 @@ 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 6a966b427..746ac4a02 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,6 @@ import { ColorScheme } from '@ghostfolio/common/types'; -import { DataSource } from '@prisma/client'; +import { AssetSubClass, DataSource } from '@prisma/client'; export interface AssetProfileDialogParams { colorScheme: ColorScheme; @@ -9,3 +9,8 @@ export interface AssetProfileDialogParams { locale: string; symbol: string; } + +export interface SelectOptionValue { + id: AssetSubClass; + label: string; +}