diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d60fa906..cd7d6bf46 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 ### Added - Added `NODE_ENV: production` to the `docker-compose` files (`docker-compose.yml` and `docker-compose.build.yml`) +- Visualized the percentage of the active filter on the allocations page ### Changed diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index fc443ab93..86bc8c2fa 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -168,13 +168,19 @@ export class PortfolioController { }) ]; - const { accounts, holdings, hasErrors } = - await this.portfolioService.getDetails( - impersonationId, - this.request.user.id, - range, - filters - ); + const { + accounts, + filteredValueInBaseCurrency, + filteredValueInPercentage, + hasErrors, + holdings, + totalValueInBaseCurrency + } = await this.portfolioService.getDetails( + impersonationId, + this.request.user.id, + range, + filters + ); if (hasErrors || hasNotDefinedValuesInObject(holdings)) { hasError = true; @@ -234,8 +240,11 @@ export class PortfolioController { return { accounts, + filteredValueInBaseCurrency, + filteredValueInPercentage, hasError, - holdings + holdings, + totalValueInBaseCurrency }; } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index d8aed4c17..8868245c4 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -474,12 +474,21 @@ export class PortfolioService { }); const holdings: PortfolioDetails['holdings'] = {}; - const totalInvestment = currentPositions.totalInvestment.plus( - cashDetails.balanceInBaseCurrency - ); - const totalValue = currentPositions.currentValue.plus( + const totalInvestmentInBaseCurrency = currentPositions.totalInvestment.plus( cashDetails.balanceInBaseCurrency ); + let filteredValueInBaseCurrency = currentPositions.currentValue; + + if ( + aFilters?.length === 0 || + (aFilters?.length === 1 && + aFilters[0].type === 'ASSET_CLASS' && + aFilters[0].id === 'CASH') + ) { + filteredValueInBaseCurrency = filteredValueInBaseCurrency.plus( + cashDetails.balanceInBaseCurrency + ); + } const dataGatheringItems = currentPositions.positions.map((position) => { return { @@ -540,10 +549,12 @@ export class PortfolioService { holdings[item.symbol] = { markets, - allocationCurrent: totalValue.eq(0) + allocationCurrent: filteredValueInBaseCurrency.eq(0) ? 0 - : value.div(totalValue).toNumber(), - allocationInvestment: item.investment.div(totalInvestment).toNumber(), + : value.div(filteredValueInBaseCurrency).toNumber(), + allocationInvestment: item.investment + .div(totalInvestmentInBaseCurrency) + .toNumber(), assetClass: symbolProfile.assetClass, assetSubClass: symbolProfile.assetSubClass, countries: symbolProfile.countries, @@ -577,8 +588,8 @@ export class PortfolioService { cashDetails, emergencyFund, userCurrency, - investment: totalInvestment, - value: totalValue + investment: totalInvestmentInBaseCurrency, + value: filteredValueInBaseCurrency }); for (const symbol of Object.keys(cashPositions)) { @@ -594,7 +605,18 @@ export class PortfolioService { filters: aFilters }); - return { accounts, holdings, hasErrors: currentPositions.hasErrors }; + const summary = await this.getSummary(aImpersonationId); + + return { + accounts, + holdings, + filteredValueInBaseCurrency: filteredValueInBaseCurrency.toNumber(), + filteredValueInPercentage: summary.netWorth + ? filteredValueInBaseCurrency.div(summary.netWorth).toNumber() + : 0, + hasErrors: currentPositions.hasErrors, + totalValueInBaseCurrency: summary.netWorth + }; } public async getPosition( diff --git a/apps/api/src/interceptors/redact-values-in-response.interceptor.ts b/apps/api/src/interceptors/redact-values-in-response.interceptor.ts index b5889328d..4a9c5bef2 100644 --- a/apps/api/src/interceptors/redact-values-in-response.interceptor.ts +++ b/apps/api/src/interceptors/redact-values-in-response.interceptor.ts @@ -41,6 +41,14 @@ export class RedactValuesInResponseInterceptor return activity; }); } + + if (data.filteredValueInBaseCurrency) { + data.filteredValueInBaseCurrency = null; + } + + if (data.totalValueInBaseCurrency) { + data.totalValueInBaseCurrency = null; + } } return data; diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html index 51aa49ae2..4a030c8a0 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html @@ -10,6 +10,22 @@ > +
+
+ + + Proportion of Net Worth + + + + + +
+
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts index 65594048b..172db1b25 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.module.ts @@ -1,6 +1,7 @@ import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatCardModule } from '@angular/material/card'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; import { GfToggleModule } from '@ghostfolio/client/components/toggle/toggle.module'; import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module'; import { GfActivitiesFilterModule } from '@ghostfolio/ui/activities-filter/activities-filter.module'; @@ -22,7 +23,8 @@ import { AllocationsPageComponent } from './allocations-page.component'; GfToggleModule, GfWorldMapChartModule, GfValueModule, - MatCardModule + MatCardModule, + MatProgressBarModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.scss b/apps/client/src/app/pages/portfolio/allocations/allocations-page.scss index 0a12304c1..ca8b56096 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.scss +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.scss @@ -28,4 +28,33 @@ } } } + + .mat-progress-bar { + border-radius: 0.25rem; + height: 0.5rem; + + ::ng-deep { + .mat-progress-bar-background { + fill: rgb(var(--palette-background-unselected-chip)); + } + + .mat-progress-bar-buffer { + background-color: rgb(var(--palette-background-unselected-chip)); + } + } + } +} + +:host-context(.is-dark-theme) { + .mat-progress-bar { + ::ng-deep { + .mat-progress-bar-background { + fill: rgb(var(--palette-background-unselected-chip-dark)); + } + + .mat-progress-bar-buffer { + background-color: rgb(var(--palette-background-unselected-chip-dark)); + } + } + } } diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 8f17dc3e5..9289a3a75 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1031,7 +1031,7 @@ Net Worth - Reinvermögen + Gesamtvermögen apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 179 @@ -1618,7 +1618,7 @@ Nach Konto apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 17 + 33 @@ -1626,7 +1626,7 @@ Nach Währung apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 42 + 58 @@ -1634,7 +1634,7 @@ Nach Asset Class apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 70 + 86 @@ -1642,7 +1642,7 @@ Nach Position apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 98 + 114 @@ -1650,7 +1650,7 @@ Nach Sektor apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 126 + 142 @@ -1658,7 +1658,7 @@ Nach Kontinent apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 155 + 171 @@ -1666,7 +1666,7 @@ Nach Land apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 183 + 199 @@ -1674,7 +1674,7 @@ Regionen apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 214 + 230 apps/client/src/app/pages/public/public-page.html @@ -2418,7 +2418,7 @@ Entwickelte Länder apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 240 + 256 apps/client/src/app/pages/public/public-page.html @@ -2430,7 +2430,7 @@ Schwellenländer apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 249 + 265 apps/client/src/app/pages/public/public-page.html @@ -2442,7 +2442,7 @@ Andere Länder apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 258 + 274 apps/client/src/app/pages/public/public-page.html @@ -2637,6 +2637,14 @@ 120 + + Proportion of Net Worth + Anteil am Gesamtvermögen + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 17 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index e868bb4c0..01697c2ad 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1453,56 +1453,56 @@ By Account apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 17 + 33 By Currency apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 42 + 58 By Asset Class apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 70 + 86 By Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 98 + 114 By Sector apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 126 + 142 By Continent apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 155 + 171 By Country apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 183 + 199 Regions apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 214 + 230 apps/client/src/app/pages/public/public-page.html @@ -2104,7 +2104,7 @@ Developed Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 240 + 256 apps/client/src/app/pages/public/public-page.html @@ -2144,7 +2144,7 @@ Other Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 258 + 274 apps/client/src/app/pages/public/public-page.html @@ -2155,7 +2155,7 @@ Emerging Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 249 + 265 apps/client/src/app/pages/public/public-page.html @@ -2356,6 +2356,13 @@ 14 + + Proportion of Net Worth + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 17 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 548e017d3..670583b59 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1453,56 +1453,56 @@ By Account apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 17 + 33 By Currency apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 42 + 58 By Asset Class apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 70 + 86 By Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 98 + 114 By Sector apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 126 + 142 By Continent apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 155 + 171 By Country apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 183 + 199 Regions apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 214 + 230 apps/client/src/app/pages/public/public-page.html @@ -2104,7 +2104,7 @@ Developed Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 240 + 256 apps/client/src/app/pages/public/public-page.html @@ -2144,7 +2144,7 @@ Other Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 258 + 274 apps/client/src/app/pages/public/public-page.html @@ -2155,7 +2155,7 @@ Emerging Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 249 + 265 apps/client/src/app/pages/public/public-page.html @@ -2356,6 +2356,13 @@ 14 + + Proportion of Net Worth + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 17 + + \ No newline at end of file diff --git a/libs/common/src/lib/interfaces/portfolio-details.interface.ts b/libs/common/src/lib/interfaces/portfolio-details.interface.ts index 17430438b..cffa3ac0d 100644 --- a/libs/common/src/lib/interfaces/portfolio-details.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-details.interface.ts @@ -10,5 +10,8 @@ export interface PortfolioDetails { original: number; }; }; + filteredValueInBaseCurrency?: number; + filteredValueInPercentage: number; holdings: { [symbol: string]: PortfolioPosition }; + totalValueInBaseCurrency?: number; }