diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a8920872..ca42f8691 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the usability of various action menus by introducing horizontal lines to separate the delete action +- Aligned the holdings and regions of the public page with the allocations page - Considered the user’s language in the link of the access table to share the portfolio - Improved the language localization for German (`de`) diff --git a/apps/api/src/app/endpoints/public/public.controller.ts b/apps/api/src/app/endpoints/public/public.controller.ts index 4e931372f..b0f7bb2c3 100644 --- a/apps/api/src/app/endpoints/public/public.controller.ts +++ b/apps/api/src/app/endpoints/public/public.controller.ts @@ -63,7 +63,6 @@ export class PublicController { { performance: performanceYtd } ] = await Promise.all([ this.portfolioService.getDetails({ - filters: [{ id: 'EQUITY', type: 'ASSET_CLASS' }], impersonationId: access.userId, userId: user.id, withMarkets: true @@ -114,6 +113,7 @@ export class PublicController { publicPortfolioResponse.holdings[symbol] = { allocationInPercentage: portfolioPosition.valueInBaseCurrency / totalValue, + assetClass: hasDetails ? portfolioPosition.assetClass : undefined, countries: hasDetails ? portfolioPosition.countries : [], currency: hasDetails ? portfolioPosition.currency : undefined, dataSource: portfolioPosition.dataSource, diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index 5e901c3f5..56d6ebdb7 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -9,6 +9,7 @@ import { Market } from '@ghostfolio/common/types'; import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; +import { AssetClass } from '@prisma/client'; import { StatusCodes } from 'http-status-codes'; import { isNumber } from 'lodash'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -145,69 +146,77 @@ export class PublicPageComponent implements OnInit { value: position.allocationInPercentage }; - if (position.countries.length > 0) { - this.markets.developedMarkets.value += - position.markets.developedMarkets * position.valueInBaseCurrency; - this.markets.emergingMarkets.value += - position.markets.emergingMarkets * position.valueInBaseCurrency; - this.markets.otherMarkets.value += - position.markets.otherMarkets * position.valueInBaseCurrency; - - for (const country of position.countries) { - const { code, continent, name, weight } = country; - - if (this.continents[continent]?.value) { - this.continents[continent].value += - weight * position.valueInBaseCurrency; - } else { - this.continents[continent] = { - name: continent, - value: - weight * - this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency - }; + if (position.assetClass !== AssetClass.LIQUIDITY) { + // Prepare analysis data by continents, countries, holdings and sectors except for liquidity + + if (position.countries.length > 0) { + this.markets.developedMarkets.value += + position.markets.developedMarkets * position.valueInBaseCurrency; + this.markets.emergingMarkets.value += + position.markets.emergingMarkets * position.valueInBaseCurrency; + this.markets.otherMarkets.value += + position.markets.otherMarkets * position.valueInBaseCurrency; + + for (const country of position.countries) { + const { code, continent, name, weight } = country; + + if (this.continents[continent]?.value) { + this.continents[continent].value += + weight * position.valueInBaseCurrency; + } else { + this.continents[continent] = { + name: continent, + value: + weight * + this.publicPortfolioDetails.holdings[symbol] + .valueInBaseCurrency + }; + } + + if (this.countries[code]?.value) { + this.countries[code].value += + weight * position.valueInBaseCurrency; + } else { + this.countries[code] = { + name, + value: + weight * + this.publicPortfolioDetails.holdings[symbol] + .valueInBaseCurrency + }; + } } + } else { + this.continents[UNKNOWN_KEY].value += + this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency; - if (this.countries[code]?.value) { - this.countries[code].value += weight * position.valueInBaseCurrency; - } else { - this.countries[code] = { - name, - value: - weight * - this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency - }; - } - } - } else { - this.continents[UNKNOWN_KEY].value += - this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency; - - this.countries[UNKNOWN_KEY].value += - this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency; + this.countries[UNKNOWN_KEY].value += + this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency; - this.markets[UNKNOWN_KEY].value += - this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency; - } + this.markets[UNKNOWN_KEY].value += + this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency; + } - if (position.sectors.length > 0) { - for (const sector of position.sectors) { - const { name, weight } = sector; - - if (this.sectors[name]?.value) { - this.sectors[name].value += weight * position.valueInBaseCurrency; - } else { - this.sectors[name] = { - name, - value: - weight * - this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency - }; + if (position.sectors.length > 0) { + for (const sector of position.sectors) { + const { name, weight } = sector; + + if (this.sectors[name]?.value) { + this.sectors[name].value += weight * position.valueInBaseCurrency; + } else { + this.sectors[name] = { + name, + value: + weight * + this.publicPortfolioDetails.holdings[symbol] + .valueInBaseCurrency + }; + } } + } else { + this.sectors[UNKNOWN_KEY].value += + this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency; } - } else { - this.sectors[UNKNOWN_KEY].value += - this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency; } this.symbols[prettifySymbol(symbol)] = { diff --git a/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts b/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts index f7ce78479..ce623a058 100644 --- a/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts @@ -7,6 +7,7 @@ export interface PublicPortfolioResponse extends PublicPortfolioResponseV1 { [symbol: string]: Pick< PortfolioPosition, | 'allocationInPercentage' + | 'assetClass' | 'countries' | 'currency' | 'dataSource'