Browse Source

Refactoring

pull/3146/head
Thomas Kaul 1 year ago
parent
commit
b50dfdb323
  1. 4
      apps/api/src/app/portfolio/portfolio.controller.ts
  2. 6
      apps/api/src/app/portfolio/portfolio.service.ts
  3. 12
      apps/api/src/services/api/api.service.ts
  4. 14
      apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts
  5. 6
      apps/client/src/app/pages/portfolio/holdings/holdings-page.html
  6. 10
      apps/client/src/app/services/data.service.ts
  7. 2
      libs/common/src/lib/interfaces/filter.interface.ts
  8. 1
      libs/common/src/lib/types/holding-mode.type.ts
  9. 1
      libs/common/src/lib/types/holding-type.type.ts
  10. 4
      libs/common/src/lib/types/index.ts

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

@ -284,14 +284,14 @@ export class PortfolioController {
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string,
@Query('accounts') filterByAccounts?: string, @Query('accounts') filterByAccounts?: string,
@Query('assetClasses') filterByAssetClasses?: string, @Query('assetClasses') filterByAssetClasses?: string,
@Query('quantity') filterByQuantity?: string, @Query('holdingType') filterByHoldingType?: string,
@Query('query') filterBySearchQuery?: string, @Query('query') filterBySearchQuery?: string,
@Query('tags') filterByTags?: string @Query('tags') filterByTags?: string
): Promise<PortfolioHoldingsResponse> { ): Promise<PortfolioHoldingsResponse> {
const filters = this.apiService.buildFiltersFromQueryParams({ const filters = this.apiService.buildFiltersFromQueryParams({
filterByAccounts, filterByAccounts,
filterByAssetClasses, filterByAssetClasses,
filterByQuantity, filterByHoldingType,
filterBySearchQuery, filterBySearchQuery,
filterByTags filterByTags
}); });

6
apps/api/src/app/portfolio/portfolio.service.ts

@ -406,9 +406,9 @@ export class PortfolioService {
return id === 'CASH' && type === 'ASSET_CLASS'; return id === 'CASH' && type === 'ASSET_CLASS';
}); });
const isFilteredByQuantityEqualsZero = const isFilteredByClosedHoldings =
filters?.some(({ id, type }) => { filters?.some(({ id, type }) => {
return id === '0' && type === 'QUANTITY'; return id === 'CLOSED' && type === 'HOLDING_TYPE';
}) ?? false; }) ?? false;
let filteredValueInBaseCurrency = isFilteredByAccount let filteredValueInBaseCurrency = isFilteredByAccount
@ -470,7 +470,7 @@ export class PortfolioService {
transactionCount, transactionCount,
valueInBaseCurrency valueInBaseCurrency
} of currentPositions.positions) { } of currentPositions.positions) {
if (isFilteredByQuantityEqualsZero === true) { if (isFilteredByClosedHoldings === true) {
if (!quantity.eq(0)) { if (!quantity.eq(0)) {
// Ignore positions with a quantity // Ignore positions with a quantity
continue; continue;

12
apps/api/src/services/api/api.service.ts

@ -10,21 +10,21 @@ export class ApiService {
filterByAccounts, filterByAccounts,
filterByAssetClasses, filterByAssetClasses,
filterByAssetSubClasses, filterByAssetSubClasses,
filterByQuantity, filterByHoldingType,
filterBySearchQuery, filterBySearchQuery,
filterByTags filterByTags
}: { }: {
filterByAccounts?: string; filterByAccounts?: string;
filterByAssetClasses?: string; filterByAssetClasses?: string;
filterByAssetSubClasses?: string; filterByAssetSubClasses?: string;
filterByQuantity?: string; filterByHoldingType?: string;
filterBySearchQuery?: string; filterBySearchQuery?: string;
filterByTags?: string; filterByTags?: string;
}): Filter[] { }): Filter[] {
const accountIds = filterByAccounts?.split(',') ?? []; const accountIds = filterByAccounts?.split(',') ?? [];
const assetClasses = filterByAssetClasses?.split(',') ?? []; const assetClasses = filterByAssetClasses?.split(',') ?? [];
const assetSubClasses = filterByAssetSubClasses?.split(',') ?? []; const assetSubClasses = filterByAssetSubClasses?.split(',') ?? [];
const quantity = filterByQuantity; const holdingType = filterByHoldingType;
const searchQuery = filterBySearchQuery?.toLowerCase(); const searchQuery = filterBySearchQuery?.toLowerCase();
const tagIds = filterByTags?.split(',') ?? []; const tagIds = filterByTags?.split(',') ?? [];
@ -55,10 +55,10 @@ export class ApiService {
}) })
]; ];
if (quantity) { if (holdingType) {
filters.push({ filters.push({
id: quantity, id: holdingType,
type: 'QUANTITY' type: 'HOLDING_TYPE'
}); });
} }

14
apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts

@ -5,7 +5,7 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/imperso
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { PortfolioPosition, User } from '@ghostfolio/common/interfaces'; import { PortfolioPosition, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { HoldingMode, ToggleOption } from '@ghostfolio/common/types'; import { HoldingType, ToggleOption } from '@ghostfolio/common/types';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
@ -25,8 +25,8 @@ export class HoldingsPageComponent implements OnDestroy, OnInit {
public hasImpersonationId: boolean; public hasImpersonationId: boolean;
public hasPermissionToCreateOrder: boolean; public hasPermissionToCreateOrder: boolean;
public holdings: PortfolioPosition[]; public holdings: PortfolioPosition[];
public mode: HoldingMode = 'ACTIVE'; public holdingType: HoldingType = 'ACTIVE';
public modeOptions: ToggleOption[] = [ public holdingTypeOptions: ToggleOption[] = [
{ label: $localize`Active`, value: 'ACTIVE' }, { label: $localize`Active`, value: 'ACTIVE' },
{ label: $localize`Closed`, value: 'CLOSED' } { label: $localize`Closed`, value: 'CLOSED' }
]; ];
@ -96,8 +96,8 @@ export class HoldingsPageComponent implements OnDestroy, OnInit {
}); });
} }
public onChangeMode(aMode: HoldingMode) { public onChangeHoldingType(aHoldingType: HoldingType) {
this.mode = aMode; this.holdingType = aHoldingType;
this.holdings = undefined; this.holdings = undefined;
@ -118,8 +118,8 @@ export class HoldingsPageComponent implements OnDestroy, OnInit {
private fetchHoldings() { private fetchHoldings() {
const filters = this.userService.getFilters(); const filters = this.userService.getFilters();
if (this.mode === 'CLOSED') { if (this.holdingType === 'CLOSED') {
filters.push({ id: '0', type: 'QUANTITY' }); filters.push({ id: 'CLOSED', type: 'HOLDING_TYPE' });
} }
return this.dataService.fetchPortfolioHoldings({ return this.dataService.fetchPortfolioHoldings({

6
apps/client/src/app/pages/portfolio/holdings/holdings-page.html

@ -9,10 +9,10 @@
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<gf-toggle <gf-toggle
class="d-none d-lg-block" class="d-none d-lg-block"
[defaultValue]="mode" [defaultValue]="holdingType"
[isLoading]="false" [isLoading]="false"
[options]="modeOptions" [options]="holdingTypeOptions"
(change)="onChangeMode($event.value)" (change)="onChangeHoldingType($event.value)"
/> />
</div> </div>
<gf-holdings-table <gf-holdings-table

10
apps/client/src/app/services/data.service.ts

@ -62,8 +62,8 @@ export class DataService {
ACCOUNT: filtersByAccount, ACCOUNT: filtersByAccount,
ASSET_CLASS: filtersByAssetClass, ASSET_CLASS: filtersByAssetClass,
ASSET_SUB_CLASS: filtersByAssetSubClass, ASSET_SUB_CLASS: filtersByAssetSubClass,
HOLDING_TYPE: filtersByHoldingType,
PRESET_ID: filtersByPresetId, PRESET_ID: filtersByPresetId,
QUANTITY: filtersBySearchQuantity,
SEARCH_QUERY: filtersBySearchQuery, SEARCH_QUERY: filtersBySearchQuery,
TAG: filtersByTag TAG: filtersByTag
} = groupBy(filters, (filter) => { } = groupBy(filters, (filter) => {
@ -103,12 +103,12 @@ export class DataService {
); );
} }
if (filtersByPresetId) { if (filtersByHoldingType) {
params = params.append('presetId', filtersByPresetId[0].id); params = params.append('holdingType', filtersByHoldingType[0].id);
} }
if (filtersBySearchQuantity) { if (filtersByPresetId) {
params = params.append('quantity', filtersBySearchQuantity[0].id); params = params.append('presetId', filtersByPresetId[0].id);
} }
if (filtersBySearchQuery) { if (filtersBySearchQuery) {

2
libs/common/src/lib/interfaces/filter.interface.ts

@ -5,8 +5,8 @@ export interface Filter {
| 'ACCOUNT' | 'ACCOUNT'
| 'ASSET_CLASS' | 'ASSET_CLASS'
| 'ASSET_SUB_CLASS' | 'ASSET_SUB_CLASS'
| 'HOLDING_TYPE'
| 'PRESET_ID' | 'PRESET_ID'
| 'QUANTITY'
| 'SEARCH_QUERY' | 'SEARCH_QUERY'
| 'SYMBOL' | 'SYMBOL'
| 'TAG'; | 'TAG';

1
libs/common/src/lib/types/holding-mode.type.ts

@ -1 +0,0 @@
export type HoldingMode = 'ACTIVE' | 'CLOSED';

1
libs/common/src/lib/types/holding-type.type.ts

@ -0,0 +1 @@
export type HoldingType = 'ACTIVE' | 'CLOSED';

4
libs/common/src/lib/types/index.ts

@ -7,7 +7,7 @@ import type { ColorScheme } from './color-scheme.type';
import type { DateRange } from './date-range.type'; import type { DateRange } from './date-range.type';
import type { Granularity } from './granularity.type'; import type { Granularity } from './granularity.type';
import type { GroupBy } from './group-by.type'; import type { GroupBy } from './group-by.type';
import type { HoldingMode } from './holding-mode.type'; import type { HoldingType } from './holding-type.type';
import type { MarketAdvanced } from './market-advanced.type'; import type { MarketAdvanced } from './market-advanced.type';
import type { MarketDataPreset } from './market-data-preset.type'; import type { MarketDataPreset } from './market-data-preset.type';
import type { MarketState } from './market-state.type'; import type { MarketState } from './market-state.type';
@ -29,7 +29,7 @@ export type {
DateRange, DateRange,
Granularity, Granularity,
GroupBy, GroupBy,
HoldingMode, HoldingType,
Market, Market,
MarketAdvanced, MarketAdvanced,
MarketDataPreset, MarketDataPreset,

Loading…
Cancel
Save