diff --git a/CHANGELOG.md b/CHANGELOG.md index 932bbc80..e5a68680 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added more details to the public page (currencies, sectors, continents and regions) - Added a `Dockerfile` and documentation to build a _Docker_ image ## 1.66.0 - 30.10.2021 diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 777093f3..1c540b96 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -266,18 +266,27 @@ export class PortfolioController { @Res() res: Response ): Promise { const access = await this.accessService.access({ id: accessId }); + const user = await this.userService.user({ + id: access.userId + }); if (!access) { res.status(StatusCodes.NOT_FOUND); return res.json({ accounts: {}, holdings: {} }); } + let hasDetails = true; + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + hasDetails = user.subscription.type === 'Premium'; + } + const { holdings } = await this.portfolioService.getDetails( access.userId, access.userId ); const portfolioPublicDetails: PortfolioPublicDetails = { + hasDetails, holdings: {} }; @@ -298,9 +307,10 @@ export class PortfolioController { if (portfolioPosition.assetClass === 'EQUITY') { portfolioPublicDetails.holdings[symbol] = { allocationCurrent: portfolioPosition.allocationCurrent, - countries: [], + countries: hasDetails ? portfolioPosition.countries : [], + currency: portfolioPosition.currency, name: portfolioPosition.name, - sectors: [], + sectors: hasDetails ? portfolioPosition.sectors : [], value: portfolioPosition.value / totalValue }; } 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 eb8a4a71..b5207257 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html @@ -159,9 +159,9 @@ ; + [symbol: string]: Pick; }; public sectors: { [name: string]: { name: string; value: number }; @@ -117,6 +117,7 @@ export class PublicPageComponent implements OnInit { this.positions[symbol] = { value, + currency: position.currency, name: position.name }; diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html index 7cbca7a8..49edef61 100644 --- a/apps/client/src/app/pages/public/public-page.html +++ b/apps/client/src/app/pages/public/public-page.html @@ -9,6 +9,9 @@
+ + Symbols +
+
+ + + Currencies + + + + + +
+
+ + + Sectors + + + + + +
+
+ + + Continents + + + + + +
+
+
+
+ + + Regions + + + + + +
diff --git a/apps/client/src/app/pages/public/public-page.module.ts b/apps/client/src/app/pages/public/public-page.module.ts index 27b5eb6c..e7818ede 100644 --- a/apps/client/src/app/pages/public/public-page.module.ts +++ b/apps/client/src/app/pages/public/public-page.module.ts @@ -2,6 +2,7 @@ import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; +import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module'; import { GfPortfolioProportionChartModule } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.module'; import { PublicPageRoutingModule } from './public-page-routing.module'; @@ -13,6 +14,7 @@ import { PublicPageComponent } from './public-page.component'; imports: [ CommonModule, GfPortfolioProportionChartModule, + GfWorldMapChartModule, MatButtonModule, MatCardModule, PublicPageRoutingModule diff --git a/apps/client/src/app/pages/public/public-page.scss b/apps/client/src/app/pages/public/public-page.scss index 5a02cb0d..fc9b8db8 100644 --- a/apps/client/src/app/pages/public/public-page.scss +++ b/apps/client/src/app/pages/public/public-page.scss @@ -2,8 +2,18 @@ color: rgb(var(--dark-primary-text)); display: block; - gf-portfolio-proportion-chart { - max-width: 80vh; + .allocations-by-symbol { + gf-portfolio-proportion-chart { + max-width: 80vh; + } + } + + .world-map-chart { + .mat-card { + .mat-card-content { + aspect-ratio: 16 / 9; + } + } } } diff --git a/apps/client/src/assets/cover.png b/apps/client/src/assets/cover.png index f5e8d826..66fbcd57 100644 Binary files a/apps/client/src/assets/cover.png and b/apps/client/src/assets/cover.png differ diff --git a/libs/common/src/lib/interfaces/portfolio-public-details.interface.ts b/libs/common/src/lib/interfaces/portfolio-public-details.interface.ts index 7f09e2ac..b24df034 100644 --- a/libs/common/src/lib/interfaces/portfolio-public-details.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-public-details.interface.ts @@ -1,10 +1,16 @@ import { PortfolioPosition } from '@ghostfolio/common/interfaces'; export interface PortfolioPublicDetails { + hasDetails: boolean; holdings: { [symbol: string]: Pick< PortfolioPosition, - 'allocationCurrent' | 'countries' | 'name' | 'sectors' | 'value' + | 'allocationCurrent' + | 'countries' + | 'currency' + | 'name' + | 'sectors' + | 'value' >; }; } diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index 9f8a4e4d..90ec078f 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -318,9 +318,9 @@ export class PortfolioProportionChartComponent type: 'doughnut' }); } - - this.isLoading = false; } + + this.isLoading = false; } /**