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 @@
-