From 8d30dd711e15619a6786dd856e51d04f254b288c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 9 Dec 2023 14:22:44 +0100 Subject: [PATCH] Integrate total items --- .../order/interfaces/activities.interface.ts | 1 + apps/api/src/app/order/order.controller.ts | 4 +- apps/api/src/app/order/order.service.ts | 17 ++++-- .../src/app/portfolio/portfolio.service.ts | 55 ++++++++++--------- .../activities/activities-page.component.ts | 9 ++- .../portfolio/activities/activities-page.html | 1 + apps/client/src/app/services/data.service.ts | 4 +- .../activities-table-lazy.component.html | 4 +- .../activities-table-lazy.component.scss | 6 -- .../activities-table-lazy.component.ts | 2 +- 10 files changed, 52 insertions(+), 51 deletions(-) diff --git a/apps/api/src/app/order/interfaces/activities.interface.ts b/apps/api/src/app/order/interfaces/activities.interface.ts index bc2c35a50..7c612d464 100644 --- a/apps/api/src/app/order/interfaces/activities.interface.ts +++ b/apps/api/src/app/order/interfaces/activities.interface.ts @@ -2,6 +2,7 @@ import { OrderWithAccount } from '@ghostfolio/common/types'; export interface Activities { activities: Activity[]; + count: number; } export interface Activity extends OrderWithAccount { diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index 5c530e467..07a13ba42 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -105,7 +105,7 @@ export class OrderController { await this.impersonationService.validateImpersonationId(impersonationId); const userCurrency = this.request.user.Settings.settings.baseCurrency; - const activities = await this.orderService.getOrders({ + const { activities, count } = await this.orderService.getOrders({ filters, sortColumn, sortDirection, @@ -117,7 +117,7 @@ export class OrderController { withExcludedAccounts: true }); - return { activities }; + return { activities, count }; } @Post() diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 6e2b11001..574bfdcd2 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -25,7 +25,7 @@ import { endOfToday, isAfter } from 'date-fns'; import { groupBy } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import { Activity } from './interfaces/activities.interface'; +import { Activities, Activity } from './interfaces/activities.interface'; @Injectable() export class OrderService { @@ -249,7 +249,7 @@ export class OrderService { userCurrency: string; userId: string; withExcludedAccounts?: boolean; - }): Promise { + }): Promise { let orderBy: Prisma.Enumerable = [ { date: 'asc' } ]; @@ -328,8 +328,8 @@ export class OrderService { }); } - return ( - await this.orders({ + const [orders, count] = await Promise.all([ + this.orders({ orderBy, skip, take, @@ -345,8 +345,11 @@ export class OrderService { SymbolProfile: true, tags: true } - }) - ) + }), + this.prismaService.order.count({ where }) + ]); + + const activities = orders .filter((order) => { return ( withExcludedAccounts || @@ -372,6 +375,8 @@ export class OrderService { ) }; }); + + return { activities, count }; } public async updateOrder({ diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 85e914287..050559c85 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -225,7 +225,7 @@ export class PortfolioService { }): Promise { const userId = await this.getUserId(impersonationId, this.request.user.id); - const activities = await this.orderService.getOrders({ + const { activities } = await this.orderService.getOrders({ filters, userId, types: ['DIVIDEND'], @@ -679,13 +679,13 @@ export class PortfolioService { const user = await this.userService.user({ id: userId }); const userCurrency = this.getUserCurrency(user); - const orders = ( - await this.orderService.getOrders({ - userCurrency, - userId, - withExcludedAccounts: true - }) - ).filter(({ SymbolProfile }) => { + const { activities } = await this.orderService.getOrders({ + userCurrency, + userId, + withExcludedAccounts: true + }); + + const orders = activities.filter(({ SymbolProfile }) => { return ( SymbolProfile.dataSource === aDataSource && SymbolProfile.symbol === aSymbol @@ -1639,18 +1639,18 @@ export class PortfolioService { userId }); - const activities = await this.orderService.getOrders({ + const { activities } = await this.orderService.getOrders({ userCurrency, userId }); - const excludedActivities = ( - await this.orderService.getOrders({ - userCurrency, - userId, - withExcludedAccounts: true - }) - ).filter(({ Account: account }) => { + let { activities: excludedActivities } = await this.orderService.getOrders({ + userCurrency, + userId, + withExcludedAccounts: true + }); + + excludedActivities = excludedActivities.filter(({ Account: account }) => { return account?.isExcluded ?? false; }); @@ -1830,7 +1830,7 @@ export class PortfolioService { const userCurrency = this.request.user?.Settings?.settings.baseCurrency ?? DEFAULT_CURRENCY; - const orders = await this.orderService.getOrders({ + const { activities, count } = await this.orderService.getOrders({ filters, includeDrafts, userCurrency, @@ -1839,11 +1839,11 @@ export class PortfolioService { types: ['BUY', 'SELL'] }); - if (orders.length <= 0) { + if (count <= 0) { return { transactionPoints: [], orders: [], portfolioOrders: [] }; } - const portfolioOrders: PortfolioOrder[] = orders.map((order) => ({ + const portfolioOrders: PortfolioOrder[] = activities.map((order) => ({ currency: order.SymbolProfile.currency, dataSource: order.SymbolProfile.dataSource, date: format(order.date, DATE_FORMAT), @@ -1877,8 +1877,8 @@ export class PortfolioService { portfolioCalculator.computeTransactionPoints(); return { - orders, portfolioOrders, + orders: activities, transactionPoints: portfolioCalculator.getTransactionPoints() }; } @@ -1913,13 +1913,14 @@ export class PortfolioService { userId: string; withExcludedAccounts?: boolean; }) { - const ordersOfTypeItemOrLiability = await this.orderService.getOrders({ - filters, - userCurrency, - userId, - withExcludedAccounts, - types: ['ITEM', 'LIABILITY'] - }); + const { activities: ordersOfTypeItemOrLiability } = + await this.orderService.getOrders({ + filters, + userCurrency, + userId, + withExcludedAccounts, + types: ['ITEM', 'LIABILITY'] + }); const accounts: PortfolioDetails['accounts'] = {}; const platforms: PortfolioDetails['platforms'] = {}; diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts index 8a790044a..f2c426dff 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts @@ -44,6 +44,7 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { public routeQueryParams: Subscription; public sortColumn = 'date'; public sortDirection: Prisma.SortOrder = 'desc'; + public totalItems: number; public user: User; private unsubscribeSubject = new Subject(); @@ -120,13 +121,11 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { take: this.pageSize }) .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ activities }) => { + .subscribe(({ activities, count }) => { this.dataSource = new MatTableDataSource(activities); + this.totalItems = count; - if ( - this.hasPermissionToCreateActivity && - this.activities?.length <= 0 - ) { + if (this.hasPermissionToCreateActivity && count <= 0) { this.router.navigate([], { queryParams: { createDialog: true } }); } diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.html b/apps/client/src/app/pages/portfolio/activities/activities-page.html index d1a2a4a74..bab5eb066 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.html +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -13,6 +13,7 @@ [pageIndex]="pageIndex" [pageSize]="pageSize" [showActions]="!hasImpersonationId && hasPermissionToDeleteActivity && !user.settings.isRestrictedView" + [totalItems]="totalItems" (activityDeleted)="onDeleteActivity($event)" (activityToClone)="onCloneActivity($event)" (activityToUpdate)="onUpdateActivity($event)" diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 16d68639c..a433fb461 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -180,12 +180,12 @@ export class DataService { } return this.http.get('/api/v1/order', { params }).pipe( - map(({ activities }) => { + map(({ activities, count }) => { for (const activity of activities) { activity.createdAt = parseISO(activity.createdAt); activity.date = parseISO(activity.date); } - return { activities }; + return { activities, count }; }) ); } diff --git a/libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html b/libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html index ca3f10f7e..116883b18 100644 --- a/libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html +++ b/libs/ui/src/lib/activities-table-lazy/activities-table-lazy.component.html @@ -469,9 +469,9 @@ (); @Output() activityToClone = new EventEmitter();