Feature/align holdings and regions of public page with allocations page (#3815)
* Align holdings and regions of public page with allocations page * Update changelog
This commit is contained in:
parent
e301dc5612
commit
4a97e2bb54
@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Improved the usability of various action menus by introducing horizontal lines to separate the delete action
|
- 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
|
- Considered the user’s language in the link of the access table to share the portfolio
|
||||||
- Improved the language localization for German (`de`)
|
- Improved the language localization for German (`de`)
|
||||||
|
|
||||||
|
@ -63,7 +63,6 @@ export class PublicController {
|
|||||||
{ performance: performanceYtd }
|
{ performance: performanceYtd }
|
||||||
] = await Promise.all([
|
] = await Promise.all([
|
||||||
this.portfolioService.getDetails({
|
this.portfolioService.getDetails({
|
||||||
filters: [{ id: 'EQUITY', type: 'ASSET_CLASS' }],
|
|
||||||
impersonationId: access.userId,
|
impersonationId: access.userId,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
withMarkets: true
|
withMarkets: true
|
||||||
@ -114,6 +113,7 @@ export class PublicController {
|
|||||||
publicPortfolioResponse.holdings[symbol] = {
|
publicPortfolioResponse.holdings[symbol] = {
|
||||||
allocationInPercentage:
|
allocationInPercentage:
|
||||||
portfolioPosition.valueInBaseCurrency / totalValue,
|
portfolioPosition.valueInBaseCurrency / totalValue,
|
||||||
|
assetClass: hasDetails ? portfolioPosition.assetClass : undefined,
|
||||||
countries: hasDetails ? portfolioPosition.countries : [],
|
countries: hasDetails ? portfolioPosition.countries : [],
|
||||||
currency: hasDetails ? portfolioPosition.currency : undefined,
|
currency: hasDetails ? portfolioPosition.currency : undefined,
|
||||||
dataSource: portfolioPosition.dataSource,
|
dataSource: portfolioPosition.dataSource,
|
||||||
|
@ -9,6 +9,7 @@ import { Market } from '@ghostfolio/common/types';
|
|||||||
|
|
||||||
import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
|
import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
|
import { AssetClass } from '@prisma/client';
|
||||||
import { StatusCodes } from 'http-status-codes';
|
import { StatusCodes } from 'http-status-codes';
|
||||||
import { isNumber } from 'lodash';
|
import { isNumber } from 'lodash';
|
||||||
import { DeviceDetectorService } from 'ngx-device-detector';
|
import { DeviceDetectorService } from 'ngx-device-detector';
|
||||||
@ -145,69 +146,77 @@ export class PublicPageComponent implements OnInit {
|
|||||||
value: position.allocationInPercentage
|
value: position.allocationInPercentage
|
||||||
};
|
};
|
||||||
|
|
||||||
if (position.countries.length > 0) {
|
if (position.assetClass !== AssetClass.LIQUIDITY) {
|
||||||
this.markets.developedMarkets.value +=
|
// Prepare analysis data by continents, countries, holdings and sectors except for liquidity
|
||||||
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) {
|
if (position.countries.length > 0) {
|
||||||
const { code, continent, name, weight } = country;
|
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;
|
||||||
|
|
||||||
if (this.continents[continent]?.value) {
|
for (const country of position.countries) {
|
||||||
this.continents[continent].value +=
|
const { code, continent, name, weight } = country;
|
||||||
weight * position.valueInBaseCurrency;
|
|
||||||
} else {
|
if (this.continents[continent]?.value) {
|
||||||
this.continents[continent] = {
|
this.continents[continent].value +=
|
||||||
name: continent,
|
weight * position.valueInBaseCurrency;
|
||||||
value:
|
} else {
|
||||||
weight *
|
this.continents[continent] = {
|
||||||
this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency
|
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[UNKNOWN_KEY].value +=
|
||||||
this.countries[code].value += weight * position.valueInBaseCurrency;
|
this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency;
|
||||||
} else {
|
|
||||||
this.countries[code] = {
|
this.markets[UNKNOWN_KEY].value +=
|
||||||
name,
|
this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency;
|
||||||
value:
|
|
||||||
weight *
|
|
||||||
this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
this.continents[UNKNOWN_KEY].value +=
|
|
||||||
this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency;
|
|
||||||
|
|
||||||
this.countries[UNKNOWN_KEY].value +=
|
if (position.sectors.length > 0) {
|
||||||
this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency;
|
for (const sector of position.sectors) {
|
||||||
|
const { name, weight } = sector;
|
||||||
|
|
||||||
this.markets[UNKNOWN_KEY].value +=
|
if (this.sectors[name]?.value) {
|
||||||
this.publicPortfolioDetails.holdings[symbol].valueInBaseCurrency;
|
this.sectors[name].value += weight * position.valueInBaseCurrency;
|
||||||
}
|
} else {
|
||||||
|
this.sectors[name] = {
|
||||||
if (position.sectors.length > 0) {
|
name,
|
||||||
for (const sector of position.sectors) {
|
value:
|
||||||
const { name, weight } = sector;
|
weight *
|
||||||
|
this.publicPortfolioDetails.holdings[symbol]
|
||||||
if (this.sectors[name]?.value) {
|
.valueInBaseCurrency
|
||||||
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)] = {
|
this.symbols[prettifySymbol(symbol)] = {
|
||||||
|
@ -7,6 +7,7 @@ export interface PublicPortfolioResponse extends PublicPortfolioResponseV1 {
|
|||||||
[symbol: string]: Pick<
|
[symbol: string]: Pick<
|
||||||
PortfolioPosition,
|
PortfolioPosition,
|
||||||
| 'allocationInPercentage'
|
| 'allocationInPercentage'
|
||||||
|
| 'assetClass'
|
||||||
| 'countries'
|
| 'countries'
|
||||||
| 'currency'
|
| 'currency'
|
||||||
| 'dataSource'
|
| 'dataSource'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user