From b7bbc029ac61e14ac5a1eda5568cbe942d98fd5b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 25 Apr 2022 22:37:34 +0200 Subject: [PATCH] Feature/render tags in dialogs (#864) * Render tags * Update changelog --- CHANGELOG.md | 5 +++ apps/api/src/app/order/order.service.ts | 3 +- .../portfolio-position-detail.interface.ts | 2 + .../src/app/portfolio/portfolio.service.ts | 18 ++++++++- .../position-detail-dialog.component.ts | 5 ++- .../position-detail-dialog.html | 40 ++++++++++++------- .../position-detail-dialog.module.ts | 2 + ...-or-update-transaction-dialog.component.ts | 1 + .../create-or-update-transaction-dialog.html | 12 ++++++ ...ate-or-update-transaction-dialog.module.ts | 2 + .../src/lib/types/order-with-account.type.ts | 3 +- 11 files changed, 73 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fec9b353c..4960394cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added the tags to the create or edit transaction dialog +- Added the tags to the position detail dialog + ### Changed - Changed the date to UTC in the data gathering service diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 131b09b15..981fc4108 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -202,7 +202,8 @@ export class OrderService { } }, // eslint-disable-next-line @typescript-eslint/naming-convention - SymbolProfile: true + SymbolProfile: true, + tags: true }, orderBy: { date: 'asc' } }) diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts index 99c7c6911..5f2425d7a 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-position-detail.interface.ts @@ -1,5 +1,6 @@ import { EnhancedSymbolProfile } from '@ghostfolio/api/services/interfaces/symbol-profile.interface'; import { OrderWithAccount } from '@ghostfolio/common/types'; +import { Tag } from '@prisma/client'; export interface PortfolioPositionDetail { averagePrice: number; @@ -16,6 +17,7 @@ export interface PortfolioPositionDetail { orders: OrderWithAccount[]; quantity: number; SymbolProfile: EnhancedSymbolProfile; + tags: Tag[]; transactionCount: number; value: number; } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 86fc1398f..ecc0ea20e 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -46,7 +46,12 @@ import type { } from '@ghostfolio/common/types'; import { Inject, Injectable } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; -import { AssetClass, DataSource, Type as TypeOfOrder } from '@prisma/client'; +import { + AssetClass, + DataSource, + Tag, + Type as TypeOfOrder +} from '@prisma/client'; import Big from 'big.js'; import { differenceInDays, @@ -62,7 +67,7 @@ import { subDays, subYears } from 'date-fns'; -import { isEmpty, sortBy } from 'lodash'; +import { isEmpty, sortBy, uniqBy } from 'lodash'; import { HistoricalDataContainer, @@ -476,8 +481,11 @@ export class PortfolioService { ); }); + let tags: Tag[] = []; + if (orders.length <= 0) { return { + tags, averagePrice: undefined, firstBuyDate: undefined, grossPerformance: undefined, @@ -504,6 +512,8 @@ export class PortfolioService { const portfolioOrders: PortfolioOrder[] = orders .filter((order) => { + tags = tags.concat(order.tags); + return order.type === 'BUY' || order.type === 'SELL'; }) .map((order) => ({ @@ -518,6 +528,8 @@ export class PortfolioService { unitPrice: new Big(order.unitPrice) })); + tags = uniqBy(tags, 'id'); + const portfolioCalculator = new PortfolioCalculator({ currency: positionCurrency, currentRateService: this.currentRateService, @@ -626,6 +638,7 @@ export class PortfolioService { netPerformance, orders, SymbolProfile, + tags, transactionCount, averagePrice: averagePrice.toNumber(), grossPerformancePercent: @@ -682,6 +695,7 @@ export class PortfolioService { minPrice, orders, SymbolProfile, + tags, averagePrice: 0, firstBuyDate: undefined, grossPerformance: undefined, diff --git a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts index 55efc0249..3baa8c0e5 100644 --- a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts +++ b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts @@ -11,7 +11,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { LineChartItem } from '@ghostfolio/ui/line-chart/interfaces/line-chart.interface'; -import { SymbolProfile } from '@prisma/client'; +import { SymbolProfile, Tag } from '@prisma/client'; import { format, isSameMonth, isToday, parseISO } from 'date-fns'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -48,6 +48,7 @@ export class PositionDetailDialog implements OnDestroy, OnInit { [name: string]: { name: string; value: number }; }; public SymbolProfile: SymbolProfile; + public tags: Tag[]; public transactionCount: number; public value: number; @@ -83,6 +84,7 @@ export class PositionDetailDialog implements OnDestroy, OnInit { orders, quantity, SymbolProfile, + tags, transactionCount, value }) => { @@ -115,6 +117,7 @@ export class PositionDetailDialog implements OnDestroy, OnInit { this.quantity = quantity; this.sectors = {}; this.SymbolProfile = SymbolProfile; + this.tags = tags; this.transactionCount = transactionCount; this.value = value; diff --git a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html index c832c07b1..a5b946e04 100644 --- a/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html +++ b/apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html @@ -194,21 +194,31 @@ - +
+
Activities
+ +
+ +
+
Tags
+ + {{ tag.name }} + +
+
+ + Tags + + + {{ tag.name }} + + + +