From bc0df043c53492e413300139a58ae933475b1de3 Mon Sep 17 00:00:00 2001 From: David Requeno Date: Tue, 23 Sep 2025 21:50:46 -0600 Subject: [PATCH] Feature/extend public portfolio page with latest activities --- .../src/app/endpoints/public/public.controller.ts | 14 ++++---------- .../src/app/pages/public/public-page.component.ts | 8 ++++---- apps/client/src/app/pages/public/public-page.html | 2 ++ .../public-portfolio-response.interface.ts | 4 +--- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/apps/api/src/app/endpoints/public/public.controller.ts b/apps/api/src/app/endpoints/public/public.controller.ts index eb7b5238c..0359f8570 100644 --- a/apps/api/src/app/endpoints/public/public.controller.ts +++ b/apps/api/src/app/endpoints/public/public.controller.ts @@ -12,6 +12,7 @@ import { UseInterceptors } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; +import { Type as ActivityType } from '@prisma/client'; import { Big } from 'big.js'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; @@ -81,27 +82,20 @@ export class PublicController { }) ]); - const latestActivitiesPromise = this.orderService.getOrders({ + const { activities } = await this.orderService.getOrders({ includeDrafts: false, sortColumn: 'date', sortDirection: 'desc', take: 10, userCurrency: user.settings?.settings.baseCurrency ?? DEFAULT_CURRENCY, userId: user.id, + types: [ActivityType.BUY, ActivityType.SELL], withExcludedAccountsAndActivities: false }); - - const { activities } = await latestActivitiesPromise; const latestActivities = activities.map((a) => ({ - account: a.account - ? { - currency: a.account.currency, - name: a.account.name, - platform: a.account.platform - } - : undefined, currency: a.currency, date: a.date, + fee: a.fee, quantity: a.quantity, SymbolProfile: a.SymbolProfile, type: a.type, 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 e7b24c2ab..1f4c7202e 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -1,4 +1,3 @@ -import type { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { prettifySymbol } from '@ghostfolio/common/helper'; import { @@ -59,7 +58,9 @@ export class GfPublicPageComponent implements OnInit { public defaultAlias = $localize`someone`; public deviceType: string; public holdings: PublicPortfolioResponse['holdings'][string][]; - public latestActivitiesDataSource: MatTableDataSource; + public latestActivitiesDataSource: MatTableDataSource< + PublicPortfolioResponse['latestActivities'][0] + >; public markets: { [key in Market]: { id: Market; valueInPercentage: number }; }; @@ -113,8 +114,7 @@ export class GfPublicPageComponent implements OnInit { this.publicPortfolioDetails = portfolioPublicDetails; this.latestActivitiesDataSource = new MatTableDataSource( - (this.publicPortfolioDetails.latestActivities || - []) as unknown as Activity[] + this.publicPortfolioDetails.latestActivities ); this.initializeAnalysisData(); diff --git a/apps/client/src/app/pages/public/public-page.html b/apps/client/src/app/pages/public/public-page.html index 3bf14ae59..1b20af9c1 100644 --- a/apps/client/src/app/pages/public/public-page.html +++ b/apps/client/src/app/pages/public/public-page.html @@ -220,7 +220,9 @@ [hasPermissionToExportActivities]="false" [hasPermissionToOpenDetails]="false" [pageSize]="maxSafeInteger" + [showAccountColumn]="false" [showActions]="false" + [sortDisabled]="true" /> 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 7c1014983..668f60b7f 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 @@ -2,7 +2,6 @@ import type { Order } from '@prisma/client'; import { EnhancedSymbolProfile, PortfolioDetails, PortfolioPosition } from '..'; import { Market } from '../../types'; -import type { AccountWithPlatform } from '../../types'; export interface PublicPortfolioResponse extends PublicPortfolioResponseV1 { alias?: string; @@ -28,9 +27,8 @@ export interface PublicPortfolioResponse extends PublicPortfolioResponseV1 { }; latestActivities: (Pick< Order, - 'currency' | 'date' | 'quantity' | 'type' | 'unitPrice' + 'currency' | 'date' | 'fee' | 'quantity' | 'type' | 'unitPrice' > & { - account?: Pick; SymbolProfile?: EnhancedSymbolProfile; value: number; valueInBaseCurrency: number;