Browse Source

Asset sub class options filtered based on selected asset class

pull/5148/head
Attila Cseh 1 month ago
parent
commit
af364655c4
  1. 75
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  2. 1
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
  3. 7
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/interfaces/interfaces.ts

75
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 { EMPTY, Subject } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators'; import { catchError, takeUntil } from 'rxjs/operators';
import { AssetProfileDialogParams } from './interfaces/interfaces'; import {
AssetProfileDialogParams,
SelectOptionValue
} from './interfaces/interfaces';
@Component({ @Component({
host: { class: 'd-flex flex-column h-100' }, host: { class: 'd-flex flex-column h-100' },
@ -76,20 +79,30 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
assetProfileFormElement: ElementRef<HTMLFormElement>; assetProfileFormElement: ElementRef<HTMLFormElement>;
public assetProfileClass: string; public assetProfileClass: string;
public assetProfileSubClass: string;
public assetClasses = Object.keys(AssetClass).map((assetClass) => { public assetClasses = Object.keys(AssetClass).map((id) => {
return { id: assetClass, label: translate(assetClass) }; return { id, label: translate(id) };
});
public assetSubClasses = Object.keys(AssetSubClass).map((assetSubClass) => {
return { id: assetSubClass, label: translate(assetSubClass) };
}); });
public allAssetSubClasses = Object.keys(AssetSubClass).reduce(
(acc, id) => {
acc[id] = {
id,
label: translate(id)
};
return acc;
},
{} as Record<AssetSubClass, SelectOptionValue>
);
public assetSubClasses: SelectOptionValue[] = [];
public assetProfile: AdminMarketDataDetails['assetProfile']; public assetProfile: AdminMarketDataDetails['assetProfile'];
public assetClassControl = new FormControl<AssetClass>(undefined);
public assetSubClassControl = new FormControl<AssetSubClass>(undefined);
public assetProfileForm = this.formBuilder.group({ public assetProfileForm = this.formBuilder.group({
assetClass: new FormControl<AssetClass>(undefined), assetClass: this.assetClassControl,
assetSubClass: new FormControl<AssetSubClass>(undefined), assetSubClass: this.assetSubClassControl,
comment: '', comment: '',
countries: '', countries: '',
currency: '', currency: '',
@ -125,7 +138,6 @@ export class AssetProfileDialog implements OnDestroy, OnInit {
} }
); );
public assetProfileSubClass: string;
public benchmarks: Partial<SymbolProfile>[]; public benchmarks: Partial<SymbolProfile>[];
public countries: { 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 this.dataService
.fetchMarketDataBySymbol({ .fetchMarketDataBySymbol({
dataSource: this.data.dataSource, dataSource: this.data.dataSource,

1
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html

@ -316,7 +316,6 @@
<mat-form-field appearance="outline" class="w-100 without-hint"> <mat-form-field appearance="outline" class="w-100 without-hint">
<mat-label i18n>Asset Sub Class</mat-label> <mat-label i18n>Asset Sub Class</mat-label>
<mat-select formControlName="assetSubClass"> <mat-select formControlName="assetSubClass">
<mat-option [value]="null" />
@for (assetSubClass of assetSubClasses; track assetSubClass) { @for (assetSubClass of assetSubClasses; track assetSubClass) {
<mat-option [value]="assetSubClass.id">{{ <mat-option [value]="assetSubClass.id">{{
assetSubClass.label assetSubClass.label

7
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 { ColorScheme } from '@ghostfolio/common/types';
import { DataSource } from '@prisma/client'; import { AssetSubClass, DataSource } from '@prisma/client';
export interface AssetProfileDialogParams { export interface AssetProfileDialogParams {
colorScheme: ColorScheme; colorScheme: ColorScheme;
@ -9,3 +9,8 @@ export interface AssetProfileDialogParams {
locale: string; locale: string;
symbol: string; symbol: string;
} }
export interface SelectOptionValue {
id: AssetSubClass;
label: string;
}

Loading…
Cancel
Save