 Thomas
					
					5 years ago
						Thomas
					
					5 years ago
					
						
							committed by
							
								 GitHub
								GitHub
							
						 
					
				 
				
			 
		 
		
			
				
					
					No known key found for this signature in database
					
						
							GPG Key ID: 4AEE18F83AFDEB23
						
					
				
			
		
		
		
	
		
			
				 31 changed files with 
53 additions and 
43 deletions
			 
			
		 
		
			
				- 
					
					
					 
					apps/api/src/app/admin/admin.controller.ts
				
- 
					
					
					 
					apps/api/src/app/experimental/experimental.controller.ts
				
- 
					
					
					 
					apps/api/src/app/order/order.controller.ts
				
- 
					
					
					 
					apps/api/src/app/portfolio/portfolio.controller.ts
				
- 
					
					
					 
					apps/api/src/app/user/user.controller.ts
				
- 
					
					
					 
					apps/api/src/app/user/user.service.ts
				
- 
					
					
					 
					apps/api/src/models/portfolio.spec.ts
				
- 
					
					
					 
					apps/api/src/models/portfolio.ts
				
- 
					
					
					 
					apps/api/src/models/rule.ts
				
- 
					
					
					 
					apps/api/src/services/data-gathering.service.ts
				
- 
					
					
					 
					apps/api/src/services/data-provider/rakuten-rapid-api/rakuten-rapid-api.service.ts
				
- 
					
					
					 
					apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts
				
- 
					
					
					 
					apps/client/src/app/adapter/date-formats.ts
				
- 
					
					
					 
					apps/client/src/app/app.component.ts
				
- 
					
					
					 
					apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.ts
				
- 
					
					
					 
					apps/client/src/app/components/header/header.component.ts
				
- 
					
					
					 
					apps/client/src/app/components/investment-chart/investment-chart.component.ts
				
- 
					
					
					 
					apps/client/src/app/components/line-chart/line-chart.component.ts
				
- 
					
					
					 
					apps/client/src/app/components/portfolio-positions-chart/portfolio-positions-chart.component.ts
				
- 
					
					
					 
					apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.component.ts
				
- 
					
					
					 
					apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.module.ts
				
- 
					
					
					 
					apps/client/src/app/components/position/position.module.ts
				
- 
					
					
					 
					apps/client/src/app/components/positions-table/positions-table.module.ts
				
- 
					
					
					 
					apps/client/src/app/components/transactions-table/transactions-table.component.ts
				
- 
					
					
					 
					apps/client/src/app/components/transactions-table/transactions-table.module.ts
				
- 
					
					
					 
					apps/client/src/app/components/value/value.component.ts
				
- 
					
					
					 
					apps/client/src/app/pages/about/about-page.component.ts
				
- 
					
					
					 
					apps/client/src/app/pages/account/account-page.component.ts
				
- 
					
					
					 
					apps/client/src/app/pages/admin/admin-page.component.ts
				
- 
					
					
					 
					apps/client/src/app/pages/home/home-page.component.ts
				
- 
					
					
					 
					apps/client/src/app/pages/transactions/transactions-page.component.ts
				
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,3 +1,4 @@ | 
			
		
	
		
			
				
					|  |  |  | import { getPermissions, hasPermission, permissions } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   Controller, | 
			
		
	
		
			
				
					|  |  |  |   Get, | 
			
		
	
	
		
			
				
					|  |  | @ -10,7 +11,6 @@ import { REQUEST } from '@nestjs/core'; | 
			
		
	
		
			
				
					|  |  |  | import { AuthGuard } from '@nestjs/passport'; | 
			
		
	
		
			
				
					|  |  |  | import { RequestWithUser } from 'apps/api/src/app/interfaces/request-with-user.type'; | 
			
		
	
		
			
				
					|  |  |  | import { StatusCodes, getReasonPhrase } from 'http-status-codes'; | 
			
		
	
		
			
				
					|  |  |  | import { getPermissions, hasPermission, permissions } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { DataGatheringService } from '../../services/data-gathering.service'; | 
			
		
	
		
			
				
					|  |  |  | import { AdminService } from './admin.service'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,3 +1,8 @@ | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   baseCurrency, | 
			
		
	
		
			
				
					|  |  |  |   benchmarks, | 
			
		
	
		
			
				
					|  |  |  |   isApiTokenAuthorized | 
			
		
	
		
			
				
					|  |  |  | } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   Body, | 
			
		
	
		
			
				
					|  |  |  |   Controller, | 
			
		
	
	
		
			
				
					|  |  | @ -12,8 +17,6 @@ import { REQUEST } from '@nestjs/core'; | 
			
		
	
		
			
				
					|  |  |  | import { RequestWithUser } from 'apps/api/src/app/interfaces/request-with-user.type'; | 
			
		
	
		
			
				
					|  |  |  | import { parse } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { StatusCodes, getReasonPhrase } from 'http-status-codes'; | 
			
		
	
		
			
				
					|  |  |  | import { baseCurrency, benchmarks } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { isApiTokenAuthorized } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { CreateOrderDto } from './create-order.dto'; | 
			
		
	
		
			
				
					|  |  |  | import { ExperimentalService } from './experimental.service'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,3 +1,4 @@ | 
			
		
	
		
			
				
					|  |  |  | import { getPermissions, hasPermission, permissions } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   Body, | 
			
		
	
		
			
				
					|  |  |  |   Controller, | 
			
		
	
	
		
			
				
					|  |  | @ -17,7 +18,6 @@ import { Order as OrderModel } from '@prisma/client'; | 
			
		
	
		
			
				
					|  |  |  | import { RequestWithUser } from 'apps/api/src/app/interfaces/request-with-user.type'; | 
			
		
	
		
			
				
					|  |  |  | import { parseISO } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { StatusCodes, getReasonPhrase } from 'http-status-codes'; | 
			
		
	
		
			
				
					|  |  |  | import { getPermissions, hasPermission, permissions } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { nullifyValuesInObjects } from '../../helper/object.helper'; | 
			
		
	
		
			
				
					|  |  |  | import { ImpersonationService } from '../../services/impersonation.service'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,3 +1,4 @@ | 
			
		
	
		
			
				
					|  |  |  | import { getPermissions, hasPermission, permissions } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   Controller, | 
			
		
	
		
			
				
					|  |  |  |   Get, | 
			
		
	
	
		
			
				
					|  |  | @ -13,7 +14,6 @@ import { REQUEST } from '@nestjs/core'; | 
			
		
	
		
			
				
					|  |  |  | import { AuthGuard } from '@nestjs/passport'; | 
			
		
	
		
			
				
					|  |  |  | import { Response } from 'express'; | 
			
		
	
		
			
				
					|  |  |  | import { StatusCodes, getReasonPhrase } from 'http-status-codes'; | 
			
		
	
		
			
				
					|  |  |  | import { getPermissions, hasPermission, permissions } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   hasNotDefinedValuesInObject, | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,3 +1,4 @@ | 
			
		
	
		
			
				
					|  |  |  | import { getPermissions, hasPermission, permissions } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   Body, | 
			
		
	
		
			
				
					|  |  |  |   Controller, | 
			
		
	
	
		
			
				
					|  |  | @ -15,7 +16,6 @@ import { AuthGuard } from '@nestjs/passport'; | 
			
		
	
		
			
				
					|  |  |  | import { Provider } from '@prisma/client'; | 
			
		
	
		
			
				
					|  |  |  | import { RequestWithUser } from 'apps/api/src/app/interfaces/request-with-user.type'; | 
			
		
	
		
			
				
					|  |  |  | import { StatusCodes, getReasonPhrase } from 'http-status-codes'; | 
			
		
	
		
			
				
					|  |  |  | import { getPermissions, hasPermission, permissions } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { UserItem } from './interfaces/user-item.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { User } from './interfaces/user.interface'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,8 +1,12 @@ | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   getPermissions, | 
			
		
	
		
			
				
					|  |  |  |   locale, | 
			
		
	
		
			
				
					|  |  |  |   permissions, | 
			
		
	
		
			
				
					|  |  |  |   resetHours | 
			
		
	
		
			
				
					|  |  |  | } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { Injectable } from '@nestjs/common'; | 
			
		
	
		
			
				
					|  |  |  | import { Currency, Prisma, Provider, User } from '@prisma/client'; | 
			
		
	
		
			
				
					|  |  |  | import { add } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { locale, permissions, resetHours } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { getPermissions } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { ConfigurationService } from '../../services/configuration.service'; | 
			
		
	
		
			
				
					|  |  |  | import { PrismaService } from '../../services/prisma.service'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,8 +1,6 @@ | 
			
		
	
		
			
				
					|  |  |  | import { baseCurrency, getUtc, getYesterday } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { Test } from '@nestjs/testing'; | 
			
		
	
		
			
				
					|  |  |  | import { Currency, Role, Type } from '@prisma/client'; | 
			
		
	
		
			
				
					|  |  |  | import { baseCurrency } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { getYesterday } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { getUtc } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { ConfigurationService } from '../services/configuration.service'; | 
			
		
	
		
			
				
					|  |  |  | import { DataProviderService } from '../services/data-provider.service'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,3 +1,4 @@ | 
			
		
	
		
			
				
					|  |  |  | import { getToday, getYesterday, resetHours } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   PortfolioItem, | 
			
		
	
		
			
				
					|  |  |  |   Position | 
			
		
	
	
		
			
				
					|  |  | @ -18,7 +19,6 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   setMonth, | 
			
		
	
		
			
				
					|  |  |  |   sub | 
			
		
	
		
			
				
					|  |  |  | } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { getToday, getYesterday, resetHours } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { cloneDeep, isEmpty } from 'lodash'; | 
			
		
	
		
			
				
					|  |  |  | import * as roundTo from 'round-to'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,5 +1,5 @@ | 
			
		
	
		
			
				
					|  |  |  | import { groupBy } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { Currency } from '@prisma/client'; | 
			
		
	
		
			
				
					|  |  |  | import { groupBy } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { PortfolioPosition } from '../app/portfolio/interfaces/portfolio-position.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { ExchangeRateDataService } from '../services/exchange-rate-data.service'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,3 +1,9 @@ | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   benchmarks, | 
			
		
	
		
			
				
					|  |  |  |   currencyPairs, | 
			
		
	
		
			
				
					|  |  |  |   getUtc, | 
			
		
	
		
			
				
					|  |  |  |   resetHours | 
			
		
	
		
			
				
					|  |  |  | } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { Injectable } from '@nestjs/common'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   differenceInHours, | 
			
		
	
	
		
			
				
					|  |  | @ -8,8 +14,6 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   isBefore, | 
			
		
	
		
			
				
					|  |  |  |   subDays | 
			
		
	
		
			
				
					|  |  |  | } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { benchmarks, currencyPairs } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { getUtc, resetHours } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { ConfigurationService } from './configuration.service'; | 
			
		
	
		
			
				
					|  |  |  | import { DataProviderService } from './data-provider.service'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,7 +1,7 @@ | 
			
		
	
		
			
				
					|  |  |  | import { getToday, getYesterday } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { Injectable } from '@nestjs/common'; | 
			
		
	
		
			
				
					|  |  |  | import * as bent from 'bent'; | 
			
		
	
		
			
				
					|  |  |  | import { format, subMonths, subWeeks, subYears } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { getToday, getYesterday } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { ConfigurationService } from '../../configuration.service'; | 
			
		
	
		
			
				
					|  |  |  | import { DataProviderInterface } from '../../interfaces/data-provider.interface'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,6 +1,6 @@ | 
			
		
	
		
			
				
					|  |  |  | import { isCrypto, isCurrency, parseCurrency } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { Injectable } from '@nestjs/common'; | 
			
		
	
		
			
				
					|  |  |  | import { format } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { isCrypto, isCurrency, parseCurrency } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import * as yahooFinance from 'yahoo-finance'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { DataProviderInterface } from '../../interfaces/data-provider.interface'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,7 +1,7 @@ | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   DEFAULT_DATE_FORMAT, | 
			
		
	
		
			
				
					|  |  |  |   DEFAULT_DATE_FORMAT_MONTH_YEAR | 
			
		
	
		
			
				
					|  |  |  | } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | export const DateFormats = { | 
			
		
	
		
			
				
					|  |  |  |   display: { | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -6,11 +6,15 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   OnInit | 
			
		
	
		
			
				
					|  |  |  | } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { NavigationEnd, Router } from '@angular/router'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   hasPermission, | 
			
		
	
		
			
				
					|  |  |  |   permissions, | 
			
		
	
		
			
				
					|  |  |  |   primaryColorHex, | 
			
		
	
		
			
				
					|  |  |  |   secondaryColorHex | 
			
		
	
		
			
				
					|  |  |  | } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { MaterialCssVarsService } from 'angular-material-css-vars'; | 
			
		
	
		
			
				
					|  |  |  | import { InfoItem } from 'apps/api/src/app/info/interfaces/info-item.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { User } from 'apps/api/src/app/user/interfaces/user.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { primaryColorHex, secondaryColorHex } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { hasPermission, permissions } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { Subject } from 'rxjs'; | 
			
		
	
		
			
				
					|  |  |  | import { filter, takeUntil } from 'rxjs/operators'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -5,7 +5,7 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   OnChanges, | 
			
		
	
		
			
				
					|  |  |  |   OnInit | 
			
		
	
		
			
				
					|  |  |  | } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { resolveFearAndGreedIndex } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { resolveFearAndGreedIndex } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | @Component({ | 
			
		
	
		
			
				
					|  |  |  |   selector: 'gf-fear-and-greed-index', | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -6,9 +6,9 @@ import { | 
			
		
	
		
			
				
					|  |  |  | } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { MatDialog } from '@angular/material/dialog'; | 
			
		
	
		
			
				
					|  |  |  | import { Router } from '@angular/router'; | 
			
		
	
		
			
				
					|  |  |  | import { hasPermission, permissions } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { InfoItem } from 'apps/api/src/app/info/interfaces/info-item.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { User } from 'apps/api/src/app/user/interfaces/user.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { hasPermission, permissions } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { EMPTY, Subject } from 'rxjs'; | 
			
		
	
		
			
				
					|  |  |  | import { catchError, takeUntil } from 'rxjs/operators'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -9,6 +9,7 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   OnInit, | 
			
		
	
		
			
				
					|  |  |  |   ViewChild | 
			
		
	
		
			
				
					|  |  |  | } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { primaryColorRgb } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { PortfolioItem } from 'apps/api/src/app/portfolio/interfaces/portfolio-item.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   LineController, | 
			
		
	
	
		
			
				
					|  |  | @ -18,7 +19,6 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   TimeScale | 
			
		
	
		
			
				
					|  |  |  | } from 'chart.js'; | 
			
		
	
		
			
				
					|  |  |  | import { Chart } from 'chart.js'; | 
			
		
	
		
			
				
					|  |  |  | import { primaryColorRgb } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | @Component({ | 
			
		
	
		
			
				
					|  |  |  |   selector: 'gf-investment-chart', | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -9,6 +9,7 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   OnInit, | 
			
		
	
		
			
				
					|  |  |  |   ViewChild | 
			
		
	
		
			
				
					|  |  |  | } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { primaryColorRgb, secondaryColorRgb } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   Chart, | 
			
		
	
		
			
				
					|  |  |  |   Filler, | 
			
		
	
	
		
			
				
					|  |  | @ -18,7 +19,6 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   PointElement, | 
			
		
	
		
			
				
					|  |  |  |   TimeScale | 
			
		
	
		
			
				
					|  |  |  | } from 'chart.js'; | 
			
		
	
		
			
				
					|  |  |  | import { primaryColorRgb, secondaryColorRgb } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { LineChartItem } from './interfaces/line-chart.interface'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -5,13 +5,10 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   Component, | 
			
		
	
		
			
				
					|  |  |  |   Input, | 
			
		
	
		
			
				
					|  |  |  |   OnChanges, | 
			
		
	
		
			
				
					|  |  |  |   OnInit, | 
			
		
	
		
			
				
					|  |  |  |   ViewChild | 
			
		
	
		
			
				
					|  |  |  |   OnInit | 
			
		
	
		
			
				
					|  |  |  | } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { PortfolioItem } from 'apps/api/src/app/portfolio/interfaces/portfolio-item.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { Chart } from 'chart.js'; | 
			
		
	
		
			
				
					|  |  |  | import { endOfDay, parseISO, startOfDay } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { primaryColorRgb } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | @Component({ | 
			
		
	
		
			
				
					|  |  |  |   selector: 'gf-portfolio-positions-chart', | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -13,7 +13,7 @@ import { PositionDetailDialogParams } from './interfaces/interfaces'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | @Component({ | 
			
		
	
		
			
				
					|  |  |  |   host: { class: 'd-flex flex-column h-100' }, | 
			
		
	
		
			
				
					|  |  |  |   selector: 'position-detail-dialog', | 
			
		
	
		
			
				
					|  |  |  |   selector: 'gf-position-detail-dialog', | 
			
		
	
		
			
				
					|  |  |  |   changeDetection: ChangeDetectionStrategy.OnPush, | 
			
		
	
		
			
				
					|  |  |  |   templateUrl: 'position-detail-dialog.html', | 
			
		
	
		
			
				
					|  |  |  |   styleUrls: ['./position-detail-dialog.component.scss'] | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -26,4 +26,4 @@ import { PositionDetailDialog } from './position-detail-dialog.component'; | 
			
		
	
		
			
				
					|  |  |  |   providers: [], | 
			
		
	
		
			
				
					|  |  |  |   schemas: [CUSTOM_ELEMENTS_SCHEMA] | 
			
		
	
		
			
				
					|  |  |  | }) | 
			
		
	
		
			
				
					|  |  |  | export class PositionDetailDialogModule {} | 
			
		
	
		
			
				
					|  |  |  | export class GfPositionDetailDialogModule {} | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -7,7 +7,7 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; | 
			
		
	
		
			
				
					|  |  |  | import { GfSymbolIconModule } from '../symbol-icon/symbol-icon.module'; | 
			
		
	
		
			
				
					|  |  |  | import { GfTrendIndicatorModule } from '../trend-indicator/trend-indicator.module'; | 
			
		
	
		
			
				
					|  |  |  | import { GfValueModule } from '../value/value.module'; | 
			
		
	
		
			
				
					|  |  |  | import { PositionDetailDialogModule } from './position-detail-dialog/position-detail-dialog.module'; | 
			
		
	
		
			
				
					|  |  |  | import { GfPositionDetailDialogModule } from './position-detail-dialog/position-detail-dialog.module'; | 
			
		
	
		
			
				
					|  |  |  | import { PositionComponent } from './position.component'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | @NgModule({ | 
			
		
	
	
		
			
				
					|  |  | @ -15,12 +15,12 @@ import { PositionComponent } from './position.component'; | 
			
		
	
		
			
				
					|  |  |  |   exports: [PositionComponent], | 
			
		
	
		
			
				
					|  |  |  |   imports: [ | 
			
		
	
		
			
				
					|  |  |  |     CommonModule, | 
			
		
	
		
			
				
					|  |  |  |     GfPositionDetailDialogModule, | 
			
		
	
		
			
				
					|  |  |  |     GfSymbolIconModule, | 
			
		
	
		
			
				
					|  |  |  |     GfTrendIndicatorModule, | 
			
		
	
		
			
				
					|  |  |  |     GfValueModule, | 
			
		
	
		
			
				
					|  |  |  |     MatDialogModule, | 
			
		
	
		
			
				
					|  |  |  |     NgxSkeletonLoaderModule, | 
			
		
	
		
			
				
					|  |  |  |     PositionDetailDialogModule, | 
			
		
	
		
			
				
					|  |  |  |     RouterModule | 
			
		
	
		
			
				
					|  |  |  |   ], | 
			
		
	
		
			
				
					|  |  |  |   providers: [], | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -10,7 +10,7 @@ import { RouterModule } from '@angular/router'; | 
			
		
	
		
			
				
					|  |  |  | import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { GfNoTransactionsInfoModule } from '../no-transactions-info/no-transactions-info.module'; | 
			
		
	
		
			
				
					|  |  |  | import { PositionDetailDialogModule } from '../position/position-detail-dialog/position-detail-dialog.module'; | 
			
		
	
		
			
				
					|  |  |  | import { GfPositionDetailDialogModule } from '../position/position-detail-dialog/position-detail-dialog.module'; | 
			
		
	
		
			
				
					|  |  |  | import { GfSymbolIconModule } from '../symbol-icon/symbol-icon.module'; | 
			
		
	
		
			
				
					|  |  |  | import { GfValueModule } from '../value/value.module'; | 
			
		
	
		
			
				
					|  |  |  | import { PositionsTableComponent } from './positions-table.component'; | 
			
		
	
	
		
			
				
					|  |  | @ -21,6 +21,7 @@ import { PositionsTableComponent } from './positions-table.component'; | 
			
		
	
		
			
				
					|  |  |  |   imports: [ | 
			
		
	
		
			
				
					|  |  |  |     CommonModule, | 
			
		
	
		
			
				
					|  |  |  |     GfNoTransactionsInfoModule, | 
			
		
	
		
			
				
					|  |  |  |     GfPositionDetailDialogModule, | 
			
		
	
		
			
				
					|  |  |  |     GfSymbolIconModule, | 
			
		
	
		
			
				
					|  |  |  |     GfValueModule, | 
			
		
	
		
			
				
					|  |  |  |     MatButtonModule, | 
			
		
	
	
		
			
				
					|  |  | @ -30,7 +31,6 @@ import { PositionsTableComponent } from './positions-table.component'; | 
			
		
	
		
			
				
					|  |  |  |     MatSortModule, | 
			
		
	
		
			
				
					|  |  |  |     MatTableModule, | 
			
		
	
		
			
				
					|  |  |  |     NgxSkeletonLoaderModule, | 
			
		
	
		
			
				
					|  |  |  |     PositionDetailDialogModule, | 
			
		
	
		
			
				
					|  |  |  |     RouterModule | 
			
		
	
		
			
				
					|  |  |  |   ], | 
			
		
	
		
			
				
					|  |  |  |   providers: [], | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -13,8 +13,8 @@ import { MatDialog } from '@angular/material/dialog'; | 
			
		
	
		
			
				
					|  |  |  | import { MatSort } from '@angular/material/sort'; | 
			
		
	
		
			
				
					|  |  |  | import { MatTableDataSource } from '@angular/material/table'; | 
			
		
	
		
			
				
					|  |  |  | import { ActivatedRoute, Router } from '@angular/router'; | 
			
		
	
		
			
				
					|  |  |  | import { DEFAULT_DATE_FORMAT } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { Order as OrderModel } from '@prisma/client'; | 
			
		
	
		
			
				
					|  |  |  | import { DEFAULT_DATE_FORMAT } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { Subject, Subscription } from 'rxjs'; | 
			
		
	
		
			
				
					|  |  |  | import { takeUntil } from 'rxjs/operators'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -8,7 +8,7 @@ import { MatTableModule } from '@angular/material/table'; | 
			
		
	
		
			
				
					|  |  |  | import { RouterModule } from '@angular/router'; | 
			
		
	
		
			
				
					|  |  |  | import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { PositionDetailDialogModule } from '../position/position-detail-dialog/position-detail-dialog.module'; | 
			
		
	
		
			
				
					|  |  |  | import { GfPositionDetailDialogModule } from '../position/position-detail-dialog/position-detail-dialog.module'; | 
			
		
	
		
			
				
					|  |  |  | import { GfSymbolIconModule } from '../symbol-icon/symbol-icon.module'; | 
			
		
	
		
			
				
					|  |  |  | import { GfValueModule } from '../value/value.module'; | 
			
		
	
		
			
				
					|  |  |  | import { TransactionsTableComponent } from './transactions-table.component'; | 
			
		
	
	
		
			
				
					|  |  | @ -18,6 +18,7 @@ import { TransactionsTableComponent } from './transactions-table.component'; | 
			
		
	
		
			
				
					|  |  |  |   exports: [TransactionsTableComponent], | 
			
		
	
		
			
				
					|  |  |  |   imports: [ | 
			
		
	
		
			
				
					|  |  |  |     CommonModule, | 
			
		
	
		
			
				
					|  |  |  |     GfPositionDetailDialogModule, | 
			
		
	
		
			
				
					|  |  |  |     GfSymbolIconModule, | 
			
		
	
		
			
				
					|  |  |  |     GfValueModule, | 
			
		
	
		
			
				
					|  |  |  |     MatButtonModule, | 
			
		
	
	
		
			
				
					|  |  | @ -26,7 +27,6 @@ import { TransactionsTableComponent } from './transactions-table.component'; | 
			
		
	
		
			
				
					|  |  |  |     MatSortModule, | 
			
		
	
		
			
				
					|  |  |  |     MatTableModule, | 
			
		
	
		
			
				
					|  |  |  |     NgxSkeletonLoaderModule, | 
			
		
	
		
			
				
					|  |  |  |     PositionDetailDialogModule, | 
			
		
	
		
			
				
					|  |  |  |     RouterModule | 
			
		
	
		
			
				
					|  |  |  |   ], | 
			
		
	
		
			
				
					|  |  |  |   providers: [], | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -5,8 +5,8 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   OnChanges, | 
			
		
	
		
			
				
					|  |  |  |   OnInit | 
			
		
	
		
			
				
					|  |  |  | } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { DEFAULT_DATE_FORMAT } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { format, isDate } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { DEFAULT_DATE_FORMAT } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { isNumber } from 'lodash'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | @Component({ | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,7 +1,7 @@ | 
			
		
	
		
			
				
					|  |  |  | import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { baseCurrency } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { User } from 'apps/api/src/app/user/interfaces/user.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { environment } from 'apps/client/src/environments/environment'; | 
			
		
	
		
			
				
					|  |  |  | import { baseCurrency } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { Subject } from 'rxjs'; | 
			
		
	
		
			
				
					|  |  |  | import { takeUntil } from 'rxjs/operators'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,7 +1,7 @@ | 
			
		
	
		
			
				
					|  |  |  | import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { DEFAULT_DATE_FORMAT } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { Access } from 'apps/api/src/app/access/interfaces/access.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { User } from 'apps/api/src/app/user/interfaces/user.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { DEFAULT_DATE_FORMAT } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { Subject } from 'rxjs'; | 
			
		
	
		
			
				
					|  |  |  | import { takeUntil } from 'rxjs/operators'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,7 +1,7 @@ | 
			
		
	
		
			
				
					|  |  |  | import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { DEFAULT_DATE_FORMAT } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { AdminData } from 'apps/api/src/app/admin/interfaces/admin-data.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { formatDistanceToNow, isValid, parseISO, sub } from 'date-fns'; | 
			
		
	
		
			
				
					|  |  |  | import { DEFAULT_DATE_FORMAT } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { Subject } from 'rxjs'; | 
			
		
	
		
			
				
					|  |  |  | import { takeUntil } from 'rxjs/operators'; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,6 +1,7 @@ | 
			
		
	
		
			
				
					|  |  |  | import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { MatDialog } from '@angular/material/dialog'; | 
			
		
	
		
			
				
					|  |  |  | import { ActivatedRoute, Router } from '@angular/router'; | 
			
		
	
		
			
				
					|  |  |  | import { hasPermission, permissions } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { DateRange } from 'apps/api/src/app/portfolio/interfaces/date-range.type'; | 
			
		
	
		
			
				
					|  |  |  | import { PortfolioOverview } from 'apps/api/src/app/portfolio/interfaces/portfolio-overview.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { PortfolioPerformance } from 'apps/api/src/app/portfolio/interfaces/portfolio-performance.interface'; | 
			
		
	
	
		
			
				
					|  |  | @ -10,7 +11,6 @@ import { | 
			
		
	
		
			
				
					|  |  |  |   RANGE, | 
			
		
	
		
			
				
					|  |  |  |   SettingsStorageService | 
			
		
	
		
			
				
					|  |  |  | } from 'apps/client/src/app/services/settings-storage.service'; | 
			
		
	
		
			
				
					|  |  |  | import { hasPermission, permissions } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { DeviceDetectorService } from 'ngx-device-detector'; | 
			
		
	
		
			
				
					|  |  |  | import { Subject, Subscription } from 'rxjs'; | 
			
		
	
		
			
				
					|  |  |  | import { takeUntil } from 'rxjs/operators'; | 
			
		
	
	
		
			
				
					|  |  | 
 | 
			
		
	
								
							
						
					 
					
				 
			 
		
			
			
			
			
			
			
				
				
					
						
							
								
									
	
		
			
				
					|  |  | @ -1,10 +1,10 @@ | 
			
		
	
		
			
				
					|  |  |  | import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; | 
			
		
	
		
			
				
					|  |  |  | import { MatDialog } from '@angular/material/dialog'; | 
			
		
	
		
			
				
					|  |  |  | import { ActivatedRoute, Router } from '@angular/router'; | 
			
		
	
		
			
				
					|  |  |  | import { hasPermission, permissions } from '@ghostfolio/helper'; | 
			
		
	
		
			
				
					|  |  |  | import { Order as OrderModel } from '@prisma/client'; | 
			
		
	
		
			
				
					|  |  |  | import { UpdateOrderDto } from 'apps/api/src/app/order/update-order.dto'; | 
			
		
	
		
			
				
					|  |  |  | import { User } from 'apps/api/src/app/user/interfaces/user.interface'; | 
			
		
	
		
			
				
					|  |  |  | import { hasPermission, permissions } from 'libs/helper/src'; | 
			
		
	
		
			
				
					|  |  |  | import { DeviceDetectorService } from 'ngx-device-detector'; | 
			
		
	
		
			
				
					|  |  |  | import { Subject, Subscription } from 'rxjs'; | 
			
		
	
		
			
				
					|  |  |  | import { takeUntil } from 'rxjs/operators'; | 
			
		
	
	
		
			
				
					|  |  | 
 |