Browse Source

Resolve review comments

pull/4031/head
Amandee Ellawala 10 months ago
committed by Thomas Kaul
parent
commit
ba05534308
  1. 48
      apps/api/src/app/portfolio/portfolio.controller.ts
  2. 10
      apps/api/src/app/user/update-user-setting.dto.ts
  3. 16
      apps/client/src/app/components/header/header.component.ts
  4. 4
      apps/client/src/app/services/user/user.service.ts
  5. 4
      libs/common/src/lib/interfaces/user-settings.interface.ts
  6. 41
      libs/ui/src/lib/assistant/assistant.component.ts
  7. 2
      libs/ui/src/lib/assistant/assistant.html

48
apps/api/src/app/portfolio/portfolio.controller.ts

@ -79,10 +79,10 @@ export class PortfolioController {
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string,
@Query('accounts') filterByAccounts?: string,
@Query('assetClasses') filterByAssetClasses?: string,
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string,
@Query('dataSource') filterByDataSource?: string,
@Query('range') dateRange: DateRange = 'max',
@Query('symbol') filterBySymbol?: string,
@Query('tags') filterByTags?: string,
@Query('withMarkets') withMarketsParam = 'false'
): Promise<PortfolioDetails & { hasError: boolean }> {
const withMarkets = withMarketsParam === 'true';
@ -97,9 +97,9 @@ export class PortfolioController {
const filters = this.apiService.buildFiltersFromQueryParams({
filterByAccounts,
filterByAssetClasses,
filterByTags,
filterByDataSource,
filterBySymbol
filterBySymbol,
filterByTags
});
const {
@ -297,18 +297,18 @@ export class PortfolioController {
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string,
@Query('accounts') filterByAccounts?: string,
@Query('assetClasses') filterByAssetClasses?: string,
@Query('dataSource') filterByDataSource?: string,
@Query('groupBy') groupBy?: GroupBy,
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string,
@Query('dataSource') filterByDataSource?: string,
@Query('symbol') filterBySymbol?: string
@Query('symbol') filterBySymbol?: string,
@Query('tags') filterByTags?: string
): Promise<PortfolioDividends> {
const filters = this.apiService.buildFiltersFromQueryParams({
filterByAccounts,
filterByAssetClasses,
filterByTags,
filterByDataSource,
filterBySymbol
filterBySymbol,
filterByTags
});
const impersonationUserId =
@ -369,21 +369,21 @@ export class PortfolioController {
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string,
@Query('accounts') filterByAccounts?: string,
@Query('assetClasses') filterByAssetClasses?: string,
@Query('dataSource') filterByDataSource?: string,
@Query('holdingType') filterByHoldingType?: string,
@Query('query') filterBySearchQuery?: string,
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string,
@Query('dataSource') filterByDataSource?: string,
@Query('symbol') filterBySymbol?: string
@Query('symbol') filterBySymbol?: string,
@Query('tags') filterByTags?: string
): Promise<PortfolioHoldingsResponse> {
const filters = this.apiService.buildFiltersFromQueryParams({
filterByAccounts,
filterByAssetClasses,
filterByDataSource,
filterByHoldingType,
filterBySearchQuery,
filterByTags,
filterByDataSource,
filterBySymbol
filterBySymbol,
filterByTags
});
const { holdings } = await this.portfolioService.getDetails({
@ -402,18 +402,18 @@ export class PortfolioController {
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string,
@Query('accounts') filterByAccounts?: string,
@Query('assetClasses') filterByAssetClasses?: string,
@Query('dataSource') filterByDataSource?: string,
@Query('groupBy') groupBy?: GroupBy,
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string,
@Query('dataSource') filterByDataSource?: string,
@Query('symbol') filterBySymbol?: string
@Query('symbol') filterBySymbol?: string,
@Query('tags') filterByTags?: string
): Promise<PortfolioInvestments> {
const filters = this.apiService.buildFiltersFromQueryParams({
filterByAccounts,
filterByAssetClasses,
filterByTags,
filterByDataSource,
filterBySymbol
filterBySymbol,
filterByTags
});
let { investments, streaks } = await this.portfolioService.getInvestments({
@ -473,10 +473,10 @@ export class PortfolioController {
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string,
@Query('accounts') filterByAccounts?: string,
@Query('assetClasses') filterByAssetClasses?: string,
@Query('range') dateRange: DateRange = 'max',
@Query('tags') filterByTags?: string,
@Query('dataSource') filterByDataSource?: string,
@Query('range') dateRange: DateRange = 'max',
@Query('symbol') filterBySymbol?: string,
@Query('tags') filterByTags?: string,
@Query('withExcludedAccounts') withExcludedAccountsParam = 'false'
): Promise<PortfolioPerformanceResponse> {
const withExcludedAccounts = withExcludedAccountsParam === 'true';
@ -484,9 +484,9 @@ export class PortfolioController {
const filters = this.apiService.buildFiltersFromQueryParams({
filterByAccounts,
filterByAssetClasses,
filterByTags,
filterByDataSource,
filterBySymbol
filterBySymbol,
filterByTags
});
const performanceInformation = await this.portfolioService.getPerformance({

10
apps/api/src/app/user/update-user-setting.dto.ts

@ -64,17 +64,17 @@ export class UpdateUserSettingDto {
@IsOptional()
'filters.assetClasses'?: string[];
@IsArray()
@IsString()
@IsOptional()
'filters.tags'?: string[];
'filters.dataSource'?: string;
@IsArray()
@IsString()
@IsOptional()
'filters.dataSource'?: string[];
'filters.symbol'?: string;
@IsArray()
@IsOptional()
'filters.symbol'?: string[];
'filters.tags'?: string[];
@IsIn(['CHART', 'TABLE'] as HoldingsViewMode[])
@IsOptional()

16
apps/client/src/app/components/header/header.component.ts

@ -175,21 +175,17 @@ export class HeaderComponent implements OnChanges {
const userSetting: UpdateUserSettingDto = {};
for (const filter of filters) {
let filtersType: string;
if (filter.type === 'ACCOUNT') {
filtersType = 'accounts';
userSetting[`filters.accounts`] = filter.id ? [filter.id] : null;
} else if (filter.type === 'ASSET_CLASS') {
filtersType = 'assetClasses';
} else if (filter.type === 'TAG') {
filtersType = 'tags';
userSetting[`filters.assetClasses`] = filter.id ? [filter.id] : null;
} else if (filter.type === 'DATA_SOURCE') {
filtersType = 'dataSource';
userSetting[`filters.dataSource`] = filter.id ? filter.id : null;
} else if (filter.type === 'SYMBOL') {
filtersType = 'symbol';
userSetting[`filters.symbol`] = filter.id ? filter.id : null;
} else if (filter.type === 'TAG') {
userSetting[`filters.tags`] = filter.id ? [filter.id] : null;
}
userSetting[`filters.${filtersType}`] = filter.id ? [filter.id] : null;
}
this.dataService

4
apps/client/src/app/services/user/user.service.ts

@ -74,14 +74,14 @@ export class UserService extends ObservableStore<UserStoreState> {
if (user?.settings['filters.dataSource']) {
filters.push({
id: user.settings['filters.dataSource'][0],
id: user.settings['filters.dataSource'],
type: 'DATA_SOURCE'
});
}
if (user?.settings['filters.symbol']) {
filters.push({
id: user.settings['filters.symbol'][0],
id: user.settings['filters.symbol'],
type: 'SYMBOL'
});
}

4
libs/common/src/lib/interfaces/user-settings.interface.ts

@ -15,8 +15,8 @@ export interface UserSettings {
emergencyFund?: number;
'filters.accounts'?: string[];
'filters.tags'?: string[];
'filters.dataSource'?: string[];
'filters.symbol'?: string[];
'filters.dataSource'?: string;
'filters.symbol'?: string;
holdingsViewMode?: HoldingsViewMode;
isExperimentalFeatures?: boolean;
isRestrictedView?: boolean;

41
libs/ui/src/lib/assistant/assistant.component.ts

@ -63,13 +63,13 @@ import {
FormsModule,
GfAssetProfileIconComponent,
GfAssistantListItemComponent,
GfSymbolModule,
MatButtonModule,
MatFormFieldModule,
MatSelectModule,
NgxSkeletonLoaderModule,
ReactiveFormsModule,
RouterModule,
GfSymbolModule
RouterModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-assistant',
@ -135,8 +135,8 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
public filterForm = this.formBuilder.group({
account: new FormControl<string>(undefined),
assetClass: new FormControl<string>(undefined),
tag: new FormControl<string>(undefined),
holdings: new FormControl<PortfolioPosition>(undefined)
holdings: new FormControl<PortfolioPosition>(undefined),
tag: new FormControl<string>(undefined)
});
public isLoading = false;
public isOpen = false;
@ -147,14 +147,14 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
holdings: []
};
public tags: Filter[] = [];
public allPortfolioHoldings: PortfolioPosition[] = [];
public holdings: PortfolioPosition[] = [];
private filterTypes: Filter['type'][] = [
'ACCOUNT',
'ASSET_CLASS',
'TAG',
'DATA_SOURCE',
'SYMBOL'
'SYMBOL',
'TAG'
];
private keyManager: FocusKeyManager<GfAssistantListItemComponent>;
private unsubscribeSubject = new Subject<void>();
@ -335,10 +335,6 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
id: this.filterForm.get('assetClass').value,
type: 'ASSET_CLASS'
},
{
id: this.filterForm.get('tag').value,
type: 'TAG'
},
{
id: this.filterForm.get('holdings').value?.dataSource,
type: 'DATA_SOURCE'
@ -346,6 +342,10 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
{
id: this.filterForm.get('holdings').value?.symbol,
type: 'SYMBOL'
},
{
id: this.filterForm.get('tag').value,
type: 'TAG'
}
]);
@ -499,7 +499,7 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
})
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(({ holdings }) => {
this.allPortfolioHoldings = sortBy(holdings, ({ name }) => {
this.holdings = sortBy(holdings, ({ name }) => {
return name.toLowerCase();
});
this.setFormValues();
@ -507,21 +507,20 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
}
private setFormValues() {
const dataSource = this.user?.settings?.['filters.dataSource']?.[0] ?? null;
const symbol = this.user?.settings?.['filters.symbol']?.[0] ?? null;
const selectedHolding = this.allPortfolioHoldings.filter(
(h) =>
(h.dataSource ?? null) === dataSource && (h.symbol ?? null) === symbol
const dataSource = this.user?.settings?.['filters.dataSource'] ?? null;
const symbol = this.user?.settings?.['filters.symbol'] ?? null;
const selectedHolding = this.holdings.find(
(holding) =>
(holding.dataSource ?? null) === dataSource &&
(holding.symbol ?? null) === symbol
);
const holding = selectedHolding[0] ?? null;
this.filterForm.setValue(
{
account: this.user?.settings?.['filters.accounts']?.[0] ?? null,
assetClass: this.user?.settings?.['filters.assetClasses']?.[0] ?? null,
tag: this.user?.settings?.['filters.tags']?.[0] ?? null,
holdings: holding
holdings: selectedHolding ?? null,
tag: this.user?.settings?.['filters.tags']?.[0] ?? null
},
{
emitEvent: false

2
libs/ui/src/lib/assistant/assistant.html

@ -133,7 +133,7 @@
filterForm.get('holdings')?.value?.name
}}</mat-select-trigger>
<mat-option [value]="null" />
@for (holding of allPortfolioHoldings; track holding.name) {
@for (holding of holdings; track holding.name) {
<mat-option class="line-height-1" [value]="holding">
<span
><b>{{ holding.name }}</b></span

Loading…
Cancel
Save