From aa6d0a4533645b48ac9d6bd7106d562b4d918ec4 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 7 Jan 2023 08:48:06 +0100
Subject: [PATCH 01/19] Update dates (#1575)
---
README.md | 4 +--
apps/client/src/assets/sitemap.xml | 40 +++++++++++++++---------------
2 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/README.md b/README.md
index a44174edf..2b26a2335 100644
--- a/README.md
+++ b/README.md
@@ -48,7 +48,7 @@ Ghostfolio is for you if you are...
- 🧘 into minimalism
- 🧺 caring about diversifying your financial resources
- 🆓 interested in financial independence
-- 🙅 saying no to spreadsheets in 2022
+- 🙅 saying no to spreadsheets in 2023
- 😎 still reading this list
## Features
@@ -282,6 +282,6 @@ If you like to support this project, get **[Ghostfolio Premium](https://ghostfol
## License
-© 2022 [Ghostfolio](https://ghostfol.io)
+© 2023 [Ghostfolio](https://ghostfol.io)
Licensed under the [AGPLv3 License](https://www.gnu.org/licenses/agpl-3.0.html).
diff --git a/apps/client/src/assets/sitemap.xml b/apps/client/src/assets/sitemap.xml
index 8cc21e89a..f9043bed7 100644
--- a/apps/client/src/assets/sitemap.xml
+++ b/apps/client/src/assets/sitemap.xml
@@ -6,82 +6,82 @@
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
https://ghostfol.io
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/de/blog/2021/07/hallo-ghostfolio
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/about
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/about/changelog
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/blog
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/blog/2021/07/hello-ghostfolio
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/blog/2022/01/ghostfolio-first-months-in-open-source
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/blog/2022/07/ghostfolio-meets-internet-identity
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/blog/2022/07/how-do-i-get-my-finances-in-order
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/blog/2022/08/500-stars-on-github
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/blog/2022/10/hacktoberfest-2022
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/blog/2022/11/black-friday-2022
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/blog/2022/12/the-importance-of-tracking-your-personal-finances
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/demo
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/faq
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/features
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/markets
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/pricing
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/register
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
https://ghostfol.io/en/resources
- 2022-12-26T00:00:00+00:00
+ 2023-01-05T00:00:00+00:00
From b5f565c054a3bf563e58468740647ca8632e6a63 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 7 Jan 2023 17:06:42 +0100
Subject: [PATCH 02/19] Simplify data source transformation (#1578)
---
apps/api/src/helper/object.helper.ts | 37 +++++++++
...orm-data-source-in-response.interceptor.ts | 75 +++++--------------
2 files changed, 55 insertions(+), 57 deletions(-)
diff --git a/apps/api/src/helper/object.helper.ts b/apps/api/src/helper/object.helper.ts
index 2f389352f..b24ee42ee 100644
--- a/apps/api/src/helper/object.helper.ts
+++ b/apps/api/src/helper/object.helper.ts
@@ -27,3 +27,40 @@ export function nullifyValuesInObjects(aObjects: T[], keys: string[]): T[] {
return nullifyValuesInObject(object, keys);
});
}
+
+export function redactAttributes({
+ object,
+ options
+}: {
+ object: any;
+ options: { attribute: string; valueMap: { [key: string]: any } }[];
+}): any {
+ if (!object || !options || !options.length) {
+ return object;
+ }
+
+ const redactedObject = cloneDeep(object);
+
+ for (const option of options) {
+ if (redactedObject.hasOwnProperty(option.attribute)) {
+ redactedObject[option.attribute] =
+ option.valueMap[redactedObject[option.attribute]] ??
+ option.valueMap['*'] ??
+ redactedObject[option.attribute];
+ } else {
+ // If the attribute is not present on the current object,
+ // check if it exists on any nested objects
+ for (const property in redactedObject) {
+ if (typeof redactedObject[property] === 'object') {
+ // Recursively call the function on the nested object
+ redactedObject[property] = redactAttributes({
+ options,
+ object: redactedObject[property]
+ });
+ }
+ }
+ }
+ }
+
+ return redactedObject;
+}
diff --git a/apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts
index 4b80038f5..d02c26fca 100644
--- a/apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts
+++ b/apps/api/src/interceptors/transform-data-source-in-response.interceptor.ts
@@ -1,3 +1,4 @@
+import { redactAttributes } from '@ghostfolio/api/helper/object.helper';
import { encodeDataSource } from '@ghostfolio/common/helper';
import {
CallHandler,
@@ -5,7 +6,7 @@ import {
Injectable,
NestInterceptor
} from '@nestjs/common';
-import { isArray } from 'lodash';
+import { DataSource } from '@prisma/client';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@@ -28,63 +29,23 @@ export class TransformDataSourceInResponseInterceptor
if (
this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') === true
) {
- if (data.activities) {
- data.activities.map((activity) => {
- activity.SymbolProfile.dataSource = encodeDataSource(
- activity.SymbolProfile.dataSource
- );
- return activity;
- });
- }
-
- if (isArray(data.benchmarks)) {
- data.benchmarks.map((benchmark) => {
- benchmark.dataSource = encodeDataSource(benchmark.dataSource);
- return benchmark;
- });
- }
-
- if (data.dataSource) {
- data.dataSource = encodeDataSource(data.dataSource);
- }
-
- if (data.errors) {
- for (const error of data.errors) {
- if (error.dataSource) {
- error.dataSource = encodeDataSource(error.dataSource);
- }
- }
- }
-
- if (data.holdings) {
- for (const symbol of Object.keys(data.holdings)) {
- if (data.holdings[symbol].dataSource) {
- data.holdings[symbol].dataSource = encodeDataSource(
- data.holdings[symbol].dataSource
- );
+ data = redactAttributes({
+ options: [
+ {
+ attribute: 'dataSource',
+ valueMap: Object.keys(DataSource).reduce(
+ (valueMap, dataSource) => {
+ valueMap[dataSource] = encodeDataSource(
+ DataSource[dataSource]
+ );
+ return valueMap;
+ },
+ {}
+ )
}
- }
- }
-
- if (data.items) {
- data.items.map((item) => {
- item.dataSource = encodeDataSource(item.dataSource);
- return item;
- });
- }
-
- if (data.positions) {
- data.positions.map((position) => {
- position.dataSource = encodeDataSource(position.dataSource);
- return position;
- });
- }
-
- if (data.SymbolProfile) {
- data.SymbolProfile.dataSource = encodeDataSource(
- data.SymbolProfile.dataSource
- );
- }
+ ],
+ object: data
+ });
}
return data;
From a850e8ca2292b4a3ee474dbc9178ce3e06158f9a Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 7 Jan 2023 18:20:02 +0100
Subject: [PATCH 03/19] Import dividend (#1560)
* Import dividend
* Update changelog
---
CHANGELOG.md | 6 +
apps/api/src/app/import/import.controller.ts | 28 ++++-
apps/api/src/app/import/import.module.ts | 6 +-
apps/api/src/app/import/import.service.ts | 93 +++++++++++++++-
.../src/app/portfolio/portfolio.service.ts | 9 +-
.../alpha-vantage/alpha-vantage.service.ts | 14 +++
.../data-provider/data-provider.module.ts | 6 +-
.../data-provider/data-provider.service.ts | 21 ++++
.../eod-historical-data.service.ts | 14 +++
.../ghostfolio-scraper-api.service.ts | 14 +++
.../google-sheets/google-sheets.service.ts | 14 +++
.../interfaces/data-provider.interface.ts | 12 ++
.../data-provider/manual/manual.service.ts | 14 +++
.../rapid-api/rapid-api.service.ts | 14 +++
.../yahoo-finance/yahoo-finance.service.ts | 103 ++++++++++++++----
.../activities/activities-page.component.ts | 20 +++-
.../portfolio/activities/activities-page.html | 1 +
.../import-activities-dialog.component.ts | 65 ++++++++++-
.../import-activities-dialog.html | 77 +++++++++----
.../import-activities-dialog.module.ts | 9 +-
.../interfaces/interfaces.ts | 2 +
apps/client/src/app/services/data.service.ts | 7 ++
.../app/services/import-activities.service.ts | 4 +
.../enhanced-symbol-profile.interface.ts | 2 +-
.../historical-data-item.interface.ts | 1 +
.../lib/types/account-with-platform.type.ts | 3 +
libs/common/src/lib/types/index.ts | 2 +
.../src/lib/types/order-with-account.type.ts | 4 +-
.../activities-table.component.html | 21 +++-
.../activities-table.component.ts | 25 +++--
30 files changed, 536 insertions(+), 75 deletions(-)
create mode 100644 libs/common/src/lib/types/account-with-platform.type.ts
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4eababa99..0c0adb984 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## Unreleased
+
+### Added
+
+- Added support for importing dividends from a data provider
+
## 1.224.0 - 2023-01-04
### Added
diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts
index 4976e9511..4a9ef5093 100644
--- a/apps/api/src/app/import/import.controller.ts
+++ b/apps/api/src/app/import/import.controller.ts
@@ -1,19 +1,26 @@
+import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request.interceptor';
+import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response.interceptor';
import { ConfigurationService } from '@ghostfolio/api/services/configuration.service';
import { ImportResponse } from '@ghostfolio/common/interfaces';
import type { RequestWithUser } from '@ghostfolio/common/types';
import {
Body,
Controller,
+ Get,
HttpException,
Inject,
Logger,
+ Param,
Post,
Query,
- UseGuards
+ UseGuards,
+ UseInterceptors
} from '@nestjs/common';
import { REQUEST } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport';
+import { DataSource } from '@prisma/client';
import { StatusCodes, getReasonPhrase } from 'http-status-codes';
+import { isEmpty } from 'lodash';
import { ImportDataDto } from './import-data.dto';
import { ImportService } from './import.service';
@@ -74,4 +81,23 @@ export class ImportController {
);
}
}
+
+ @Get('dividends/:dataSource/:symbol')
+ @UseGuards(AuthGuard('jwt'))
+ @UseInterceptors(TransformDataSourceInRequestInterceptor)
+ @UseInterceptors(TransformDataSourceInResponseInterceptor)
+ public async gatherDividends(
+ @Param('dataSource') dataSource: DataSource,
+ @Param('symbol') symbol: string
+ ): Promise {
+ const userCurrency = this.request.user.Settings.settings.baseCurrency;
+
+ const activities = await this.importService.getDividends({
+ dataSource,
+ symbol,
+ userCurrency
+ });
+
+ return { activities };
+ }
}
diff --git a/apps/api/src/app/import/import.module.ts b/apps/api/src/app/import/import.module.ts
index 64b3a79f3..b344abff6 100644
--- a/apps/api/src/app/import/import.module.ts
+++ b/apps/api/src/app/import/import.module.ts
@@ -1,12 +1,14 @@
import { AccountModule } from '@ghostfolio/api/app/account/account.module';
import { CacheModule } from '@ghostfolio/api/app/cache/cache.module';
import { OrderModule } from '@ghostfolio/api/app/order/order.module';
+import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module';
import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module';
import { ConfigurationModule } from '@ghostfolio/api/services/configuration.module';
import { DataGatheringModule } from '@ghostfolio/api/services/data-gathering.module';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma.module';
+import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile.module';
import { Module } from '@nestjs/common';
import { ImportController } from './import.controller';
@@ -22,8 +24,10 @@ import { ImportService } from './import.service';
DataProviderModule,
ExchangeRateDataModule,
OrderModule,
+ PortfolioModule,
PrismaModule,
- RedisCacheModule
+ RedisCacheModule,
+ SymbolProfileModule
],
providers: [ImportService]
})
diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts
index 78e857e7f..d3be33bbc 100644
--- a/apps/api/src/app/import/import.service.ts
+++ b/apps/api/src/app/import/import.service.ts
@@ -2,9 +2,16 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { OrderService } from '@ghostfolio/api/app/order/order.service';
+import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service';
-import { OrderWithAccount } from '@ghostfolio/common/types';
+import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile.service';
+import { parseDate } from '@ghostfolio/common/helper';
+import { UniqueAsset } from '@ghostfolio/common/interfaces';
+import {
+ AccountWithPlatform,
+ OrderWithAccount
+} from '@ghostfolio/common/types';
import { Injectable } from '@nestjs/common';
import { SymbolProfile } from '@prisma/client';
import Big from 'big.js';
@@ -17,9 +24,81 @@ export class ImportService {
private readonly accountService: AccountService,
private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService,
- private readonly orderService: OrderService
+ private readonly orderService: OrderService,
+ private readonly portfolioService: PortfolioService,
+ private readonly symbolProfileService: SymbolProfileService
) {}
+ public async getDividends({
+ dataSource,
+ symbol,
+ userCurrency
+ }: UniqueAsset & { userCurrency: string }): Promise {
+ try {
+ const { firstBuyDate, historicalData, orders } =
+ await this.portfolioService.getPosition(dataSource, undefined, symbol);
+
+ const [[assetProfile], dividends] = await Promise.all([
+ this.symbolProfileService.getSymbolProfiles([
+ {
+ dataSource,
+ symbol
+ }
+ ]),
+ await this.dataProviderService.getDividends({
+ dataSource,
+ symbol,
+ from: parseDate(firstBuyDate),
+ granularity: 'day',
+ to: new Date()
+ })
+ ]);
+
+ const accounts = orders.map((order) => {
+ return order.Account;
+ });
+
+ const Account = this.isUniqueAccount(accounts) ? accounts[0] : undefined;
+
+ return Object.entries(dividends).map(([dateString, { marketPrice }]) => {
+ const quantity =
+ historicalData.find((historicalDataItem) => {
+ return historicalDataItem.date === dateString;
+ })?.quantity ?? 0;
+
+ const value = new Big(quantity).mul(marketPrice).toNumber();
+
+ return {
+ Account,
+ quantity,
+ value,
+ accountId: Account?.id,
+ accountUserId: undefined,
+ comment: undefined,
+ createdAt: undefined,
+ date: parseDate(dateString),
+ fee: 0,
+ feeInBaseCurrency: 0,
+ id: assetProfile.id,
+ isDraft: false,
+ SymbolProfile: (assetProfile),
+ symbolProfileId: assetProfile.id,
+ type: 'DIVIDEND',
+ unitPrice: marketPrice,
+ updatedAt: undefined,
+ userId: Account?.userId,
+ valueInBaseCurrency: this.exchangeRateDataService.toCurrency(
+ value,
+ assetProfile.currency,
+ userCurrency
+ )
+ };
+ });
+ } catch {
+ return [];
+ }
+ }
+
public async import({
activitiesDto,
isDryRun = false,
@@ -161,6 +240,16 @@ export class ImportService {
return activities;
}
+ private isUniqueAccount(accounts: AccountWithPlatform[]) {
+ const uniqueAccountIds = new Set();
+
+ for (const account of accounts) {
+ uniqueAccountIds.add(account.id);
+ }
+
+ return uniqueAccountIds.size === 1;
+ }
+
private async validateActivities({
activitiesDto,
maxActivitiesToImport,
diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts
index 02b95ab54..37fae84d7 100644
--- a/apps/api/src/app/portfolio/portfolio.service.ts
+++ b/apps/api/src/app/portfolio/portfolio.service.ts
@@ -660,8 +660,9 @@ export class PortfolioService {
}
const positionCurrency = orders[0].SymbolProfile.currency;
- const [SymbolProfile] =
- await this.symbolProfileService.getSymbolProfilesBySymbols([aSymbol]);
+ const [SymbolProfile] = await this.symbolProfileService.getSymbolProfiles([
+ { dataSource: aDataSource, symbol: aSymbol }
+ ]);
const portfolioOrders: PortfolioOrder[] = orders
.filter((order) => {
@@ -745,6 +746,7 @@ export class PortfolioService {
historicalDataArray.push({
averagePrice: orders[0].unitPrice,
date: firstBuyDate,
+ quantity: orders[0].quantity,
value: orders[0].unitPrice
});
}
@@ -761,6 +763,7 @@ export class PortfolioService {
j++;
}
let currentAveragePrice = 0;
+ let currentQuantity = 0;
const currentSymbol = transactionPoints[j].items.find(
(item) => item.symbol === aSymbol
);
@@ -768,11 +771,13 @@ export class PortfolioService {
currentAveragePrice = currentSymbol.quantity.eq(0)
? 0
: currentSymbol.investment.div(currentSymbol.quantity).toNumber();
+ currentQuantity = currentSymbol.quantity.toNumber();
}
historicalDataArray.push({
date,
averagePrice: currentAveragePrice,
+ quantity: currentQuantity,
value: marketPrice
});
diff --git a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts
index 41bd715b1..481bd0ccc 100644
--- a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts
+++ b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts
@@ -37,6 +37,20 @@ export class AlphaVantageService implements DataProviderInterface {
};
}
+ public async getDividends({
+ from,
+ granularity = 'day',
+ symbol,
+ to
+ }: {
+ from: Date;
+ granularity: Granularity;
+ symbol: string;
+ to: Date;
+ }) {
+ return {};
+ }
+
public async getHistorical(
aSymbol: string,
aGranularity: Granularity = 'day',
diff --git a/apps/api/src/services/data-provider/data-provider.module.ts b/apps/api/src/services/data-provider/data-provider.module.ts
index 3fa56e06c..07982e698 100644
--- a/apps/api/src/services/data-provider/data-provider.module.ts
+++ b/apps/api/src/services/data-provider/data-provider.module.ts
@@ -59,6 +59,10 @@ import { DataProviderService } from './data-provider.service';
]
}
],
- exports: [DataProviderService, GhostfolioScraperApiService]
+ exports: [
+ DataProviderService,
+ GhostfolioScraperApiService,
+ YahooFinanceService
+ ]
})
export class DataProviderModule {}
diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts
index 7092e1112..0173dc82e 100644
--- a/apps/api/src/services/data-provider/data-provider.service.ts
+++ b/apps/api/src/services/data-provider/data-provider.service.ts
@@ -23,6 +23,27 @@ export class DataProviderService {
private readonly prismaService: PrismaService
) {}
+ public async getDividends({
+ dataSource,
+ from,
+ granularity = 'day',
+ symbol,
+ to
+ }: {
+ dataSource: DataSource;
+ from: Date;
+ granularity: Granularity;
+ symbol: string;
+ to: Date;
+ }) {
+ return this.getDataProvider(DataSource[dataSource]).getDividends({
+ from,
+ granularity,
+ symbol,
+ to
+ });
+ }
+
public async getHistorical(
aItems: IDataGatheringItem[],
aGranularity: Granularity = 'month',
diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
index c87c6ec3e..cbfd67e2e 100644
--- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
+++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
@@ -37,6 +37,20 @@ export class EodHistoricalDataService implements DataProviderInterface {
};
}
+ public async getDividends({
+ from,
+ granularity = 'day',
+ symbol,
+ to
+ }: {
+ from: Date;
+ granularity: Granularity;
+ symbol: string;
+ to: Date;
+ }) {
+ return {};
+ }
+
public async getHistorical(
aSymbol: string,
aGranularity: Granularity = 'day',
diff --git a/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts b/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts
index 8da34410f..7412fec7b 100644
--- a/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts
+++ b/apps/api/src/services/data-provider/ghostfolio-scraper-api/ghostfolio-scraper-api.service.ts
@@ -37,6 +37,20 @@ export class GhostfolioScraperApiService implements DataProviderInterface {
};
}
+ public async getDividends({
+ from,
+ granularity = 'day',
+ symbol,
+ to
+ }: {
+ from: Date;
+ granularity: Granularity;
+ symbol: string;
+ to: Date;
+ }) {
+ return {};
+ }
+
public async getHistorical(
aSymbol: string,
aGranularity: Granularity = 'day',
diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts
index cc6af5241..201d57aa4 100644
--- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts
+++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts
@@ -34,6 +34,20 @@ export class GoogleSheetsService implements DataProviderInterface {
};
}
+ public async getDividends({
+ from,
+ granularity = 'day',
+ symbol,
+ to
+ }: {
+ from: Date;
+ granularity: Granularity;
+ symbol: string;
+ to: Date;
+ }) {
+ return {};
+ }
+
public async getHistorical(
aSymbol: string,
aGranularity: Granularity = 'day',
diff --git a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts
index 6719f3099..c51adb985 100644
--- a/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts
+++ b/apps/api/src/services/data-provider/interfaces/data-provider.interface.ts
@@ -11,6 +11,18 @@ export interface DataProviderInterface {
getAssetProfile(aSymbol: string): Promise>;
+ getDividends({
+ from,
+ granularity,
+ symbol,
+ to
+ }: {
+ from: Date;
+ granularity: Granularity;
+ symbol: string;
+ to: Date;
+ }): Promise<{ [date: string]: IDataProviderHistoricalResponse }>;
+
getHistorical(
aSymbol: string,
aGranularity: Granularity,
diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts
index a364276ef..7b6051087 100644
--- a/apps/api/src/services/data-provider/manual/manual.service.ts
+++ b/apps/api/src/services/data-provider/manual/manual.service.ts
@@ -29,6 +29,20 @@ export class ManualService implements DataProviderInterface {
};
}
+ public async getDividends({
+ from,
+ granularity = 'day',
+ symbol,
+ to
+ }: {
+ from: Date;
+ granularity: Granularity;
+ symbol: string;
+ to: Date;
+ }) {
+ return {};
+ }
+
public async getHistorical(
aSymbol: string,
aGranularity: Granularity = 'day',
diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts
index 1bf057745..f5119e0b7 100644
--- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts
+++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts
@@ -31,6 +31,20 @@ export class RapidApiService implements DataProviderInterface {
};
}
+ public async getDividends({
+ from,
+ granularity = 'day',
+ symbol,
+ to
+ }: {
+ from: Date;
+ granularity: Granularity;
+ symbol: string;
+ to: Date;
+ }) {
+ return {};
+ }
+
public async getHistorical(
aSymbol: string,
aGranularity: Granularity = 'day',
diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts
index 4e62b251e..bccc5c648 100644
--- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts
+++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts
@@ -160,6 +160,59 @@ export class YahooFinanceService implements DataProviderInterface {
return response;
}
+ public async getDividends({
+ from,
+ granularity = 'day',
+ symbol,
+ to
+ }: {
+ from: Date;
+ granularity: Granularity;
+ symbol: string;
+ to: Date;
+ }) {
+ if (isSameDay(from, to)) {
+ to = addDays(to, 1);
+ }
+
+ try {
+ const historicalResult = await yahooFinance.historical(
+ this.convertToYahooFinanceSymbol(symbol),
+ {
+ events: 'dividends',
+ interval: granularity === 'month' ? '1mo' : '1d',
+ period1: format(from, DATE_FORMAT),
+ period2: format(to, DATE_FORMAT)
+ }
+ );
+
+ const response: {
+ [date: string]: IDataProviderHistoricalResponse;
+ } = {};
+
+ for (const historicalItem of historicalResult) {
+ response[format(historicalItem.date, DATE_FORMAT)] = {
+ marketPrice: this.getConvertedValue({
+ symbol,
+ value: historicalItem.dividends
+ })
+ };
+ }
+
+ return response;
+ } catch (error) {
+ Logger.error(
+ `Could not get dividends for ${symbol} (${this.getName()}) from ${format(
+ from,
+ DATE_FORMAT
+ )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}`,
+ 'YahooFinanceService'
+ );
+
+ return {};
+ }
+ }
+
public async getHistorical(
aSymbol: string,
aGranularity: Granularity = 'day',
@@ -172,11 +225,9 @@ export class YahooFinanceService implements DataProviderInterface {
to = addDays(to, 1);
}
- const yahooFinanceSymbol = this.convertToYahooFinanceSymbol(aSymbol);
-
try {
const historicalResult = await yahooFinance.historical(
- yahooFinanceSymbol,
+ this.convertToYahooFinanceSymbol(aSymbol),
{
interval: '1d',
period1: format(from, DATE_FORMAT),
@@ -188,27 +239,14 @@ export class YahooFinanceService implements DataProviderInterface {
[symbol: string]: { [date: string]: IDataProviderHistoricalResponse };
} = {};
- // Convert symbol back
- const symbol = this.convertFromYahooFinanceSymbol(yahooFinanceSymbol);
-
- response[symbol] = {};
+ response[aSymbol] = {};
for (const historicalItem of historicalResult) {
- let marketPrice = historicalItem.close;
-
- if (symbol === `${this.baseCurrency}GBp`) {
- // Convert GPB to GBp (pence)
- marketPrice = new Big(marketPrice).mul(100).toNumber();
- } else if (symbol === `${this.baseCurrency}ILA`) {
- // Convert ILS to ILA
- marketPrice = new Big(marketPrice).mul(100).toNumber();
- } else if (symbol === `${this.baseCurrency}ZAc`) {
- // Convert ZAR to ZAc (cents)
- marketPrice = new Big(marketPrice).mul(100).toNumber();
- }
-
- response[symbol][format(historicalItem.date, DATE_FORMAT)] = {
- marketPrice,
+ response[aSymbol][format(historicalItem.date, DATE_FORMAT)] = {
+ marketPrice: this.getConvertedValue({
+ symbol: aSymbol,
+ value: historicalItem.close
+ }),
performance: historicalItem.open - historicalItem.close
};
}
@@ -423,6 +461,27 @@ export class YahooFinanceService implements DataProviderInterface {
return name || shortName || symbol;
}
+ private getConvertedValue({
+ symbol,
+ value
+ }: {
+ symbol: string;
+ value: number;
+ }) {
+ if (symbol === `${this.baseCurrency}GBp`) {
+ // Convert GPB to GBp (pence)
+ return new Big(value).mul(100).toNumber();
+ } else if (symbol === `${this.baseCurrency}ILA`) {
+ // Convert ILS to ILA
+ return new Big(value).mul(100).toNumber();
+ } else if (symbol === `${this.baseCurrency}ZAc`) {
+ // Convert ZAR to ZAc (cents)
+ return new Big(value).mul(100).toNumber();
+ }
+
+ return value;
+ }
+
private parseAssetClass(aPrice: Price): {
assetClass: AssetClass;
assetSubClass: AssetSubClass;
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 ef0a21d4e..41d8abae1 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
@@ -11,7 +11,7 @@ import { IcsService } from '@ghostfolio/client/services/ics/ics.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { downloadAsFile } from '@ghostfolio/common/helper';
-import { User } from '@ghostfolio/common/interfaces';
+import { UniqueAsset, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { DataSource, Order as OrderModel } from '@prisma/client';
import { format, parseISO } from 'date-fns';
@@ -198,6 +198,24 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit {
});
}
+ public onImportDividends() {
+ const dialogRef = this.dialog.open(ImportActivitiesDialog, {
+ data: {
+ activityTypes: ['DIVIDEND'],
+ deviceType: this.deviceType,
+ user: this.user
+ },
+ width: this.deviceType === 'mobile' ? '100vw' : '50rem'
+ });
+
+ dialogRef
+ .afterClosed()
+ .pipe(takeUntil(this.unsubscribeSubject))
+ .subscribe(() => {
+ this.fetchActivities();
+ });
+ }
+
public onUpdateActivity(aActivity: OrderModel) {
this.router.navigate([], {
queryParams: { activityId: aActivity.id, editDialog: 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 b810d777e..cec456c53 100644
--- a/apps/client/src/app/pages/portfolio/activities/activities-page.html
+++ b/apps/client/src/app/pages/portfolio/activities/activities-page.html
@@ -17,6 +17,7 @@
(export)="onExport($event)"
(exportDrafts)="onExportDrafts($event)"
(import)="onImport()"
+ (importDividends)="onImportDividends()"
>
diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
index 6a0acfb63..77ef8dfe8 100644
--- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
+++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
@@ -5,12 +5,16 @@ import {
Inject,
OnDestroy
} from '@angular/core';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { MatSnackBar } from '@angular/material/snack-bar';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
+import { DataService } from '@ghostfolio/client/services/data.service';
import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service';
-import { isArray } from 'lodash';
-import { Subject } from 'rxjs';
+import { Position } from '@ghostfolio/common/interfaces';
+import { AssetClass } from '@prisma/client';
+import { isArray, sortBy } from 'lodash';
+import { Subject, takeUntil } from 'rxjs';
import { ImportActivitiesDialogParams } from './interfaces/interfaces';
@@ -24,20 +28,55 @@ export class ImportActivitiesDialog implements OnDestroy {
public activities: Activity[] = [];
public details: any[] = [];
public errorMessages: string[] = [];
+ public holdings: Position[] = [];
public isFileSelected = false;
+ public mode: 'DIVIDEND';
public selectedActivities: Activity[] = [];
+ public uniqueAssetForm: FormGroup;
private unsubscribeSubject = new Subject();
public constructor(
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: ImportActivitiesDialogParams,
+ private dataService: DataService,
+ private formBuilder: FormBuilder,
public dialogRef: MatDialogRef,
private importActivitiesService: ImportActivitiesService,
private snackBar: MatSnackBar
) {}
- public ngOnInit() {}
+ public ngOnInit() {
+ this.uniqueAssetForm = this.formBuilder.group({
+ uniqueAsset: [undefined, Validators.required]
+ });
+
+ if (
+ this.data?.activityTypes?.length === 1 &&
+ this.data?.activityTypes?.[0] === 'DIVIDEND'
+ ) {
+ this.mode = 'DIVIDEND';
+
+ this.dataService
+ .fetchPositions({
+ filters: [
+ {
+ id: AssetClass.EQUITY,
+ type: 'ASSET_CLASS'
+ }
+ ],
+ range: 'max'
+ })
+ .pipe(takeUntil(this.unsubscribeSubject))
+ .subscribe(({ positions }) => {
+ this.holdings = sortBy(positions, ({ name }) => {
+ return name.toLowerCase();
+ });
+
+ this.changeDetectorRef.markForCheck();
+ });
+ }
+ }
public onCancel(): void {
this.dialogRef.close();
@@ -71,6 +110,24 @@ export class ImportActivitiesDialog implements OnDestroy {
}
}
+ public onLoadDividends() {
+ const { dataSource, symbol } =
+ this.uniqueAssetForm.controls['uniqueAsset'].value;
+
+ this.dataService
+ .fetchDividendsImport({
+ dataSource,
+ symbol
+ })
+ .pipe(takeUntil(this.unsubscribeSubject))
+ .subscribe(({ activities }) => {
+ this.activities = activities;
+ this.isFileSelected = true;
+
+ this.changeDetectorRef.markForCheck();
+ });
+ }
+
public onReset() {
this.details = [];
this.errorMessages = [];
@@ -95,8 +152,6 @@ export class ImportActivitiesDialog implements OnDestroy {
reader.onload = async (readerEvent) => {
const fileContent = readerEvent.target.result as string;
- console.log(fileContent);
-
try {
if (file.name.endsWith('.json')) {
const content = JSON.parse(fileContent);
diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
index 7b5ad648b..7f143f908 100644
--- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
+++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
@@ -7,31 +7,59 @@
-
-
-
- Choose File
-
-
- The following file formats are supported:
- CSV
- or
- JSON
+
+
+
+
+
-
-
+
+ Choose File
+
+
+ The following file formats are supported:
+ CSV
+ or
+ JSON
+
+
+
@@ -47,6 +75,7 @@
[locale]="data?.user?.settings?.locale"
[showActions]="false"
[showCheckbox]="true"
+ [showFooter]="false"
[showSymbolColumn]="false"
(selectedActivities)="updateSelection($event)"
>
diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts
index cba5842f8..fdae625f9 100644
--- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts
+++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.module.ts
@@ -1,8 +1,11 @@
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatDialogModule } from '@angular/material/dialog';
import { MatExpansionModule } from '@angular/material/expansion';
+import { MatFormFieldModule } from '@angular/material/form-field';
+import { MatSelectModule } from '@angular/material/select';
import { GfDialogFooterModule } from '@ghostfolio/client/components/dialog-footer/dialog-footer.module';
import { GfDialogHeaderModule } from '@ghostfolio/client/components/dialog-header/dialog-header.module';
import { GfActivitiesTableModule } from '@ghostfolio/ui/activities-table/activities-table.module';
@@ -13,12 +16,16 @@ import { ImportActivitiesDialog } from './import-activities-dialog.component';
declarations: [ImportActivitiesDialog],
imports: [
CommonModule,
+ FormsModule,
GfActivitiesTableModule,
GfDialogFooterModule,
GfDialogHeaderModule,
MatButtonModule,
MatDialogModule,
- MatExpansionModule
+ MatExpansionModule,
+ MatFormFieldModule,
+ MatSelectModule,
+ ReactiveFormsModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts
index 5141ed11c..755a50baf 100644
--- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts
+++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/interfaces/interfaces.ts
@@ -1,6 +1,8 @@
import { User } from '@ghostfolio/common/interfaces';
+import { Type } from '@prisma/client';
export interface ImportActivitiesDialogParams {
+ activityTypes: Type[];
deviceType: string;
user: User;
}
diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts
index 70c15d398..67a3e18cf 100644
--- a/apps/client/src/app/services/data.service.ts
+++ b/apps/client/src/app/services/data.service.ts
@@ -24,6 +24,7 @@ import {
BenchmarkResponse,
Export,
Filter,
+ ImportResponse,
InfoItem,
OAuthResponse,
PortfolioDetails,
@@ -119,6 +120,12 @@ export class DataService {
});
}
+ public fetchDividendsImport({ dataSource, symbol }: UniqueAsset) {
+ return this.http.get(
+ `/api/v1/import/dividends/${dataSource}/${symbol}`
+ );
+ }
+
public fetchExchangeRateForDate({
date,
symbol
diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts
index 17a6879a5..2e15f367f 100644
--- a/apps/client/src/app/services/import-activities.service.ts
+++ b/apps/client/src/app/services/import-activities.service.ts
@@ -90,13 +90,16 @@ export class ImportActivitiesService {
selectedActivities: Activity[]
): Promise {
const importData: CreateOrderDto[] = [];
+
for (const activity of selectedActivities) {
importData.push(this.convertToCreateOrderDto(activity));
}
+
return this.importJson({ content: importData });
}
private convertToCreateOrderDto({
+ accountId,
date,
fee,
quantity,
@@ -105,6 +108,7 @@ export class ImportActivitiesService {
unitPrice
}: Activity): CreateOrderDto {
return {
+ accountId,
fee,
quantity,
type,
diff --git a/libs/common/src/lib/interfaces/enhanced-symbol-profile.interface.ts b/libs/common/src/lib/interfaces/enhanced-symbol-profile.interface.ts
index d2053bb7c..5b72d9ce7 100644
--- a/libs/common/src/lib/interfaces/enhanced-symbol-profile.interface.ts
+++ b/libs/common/src/lib/interfaces/enhanced-symbol-profile.interface.ts
@@ -8,7 +8,7 @@ export interface EnhancedSymbolProfile {
activitiesCount: number;
assetClass: AssetClass;
assetSubClass: AssetSubClass;
- comment?: string;
+ comment: string | null;
countries: Country[];
createdAt: Date;
currency: string | null;
diff --git a/libs/common/src/lib/interfaces/historical-data-item.interface.ts b/libs/common/src/lib/interfaces/historical-data-item.interface.ts
index dd7bb84d8..59a53ee94 100644
--- a/libs/common/src/lib/interfaces/historical-data-item.interface.ts
+++ b/libs/common/src/lib/interfaces/historical-data-item.interface.ts
@@ -4,6 +4,7 @@ export interface HistoricalDataItem {
grossPerformancePercent?: number;
netPerformance?: number;
netPerformanceInPercentage?: number;
+ quantity?: number;
totalInvestment?: number;
value?: number;
}
diff --git a/libs/common/src/lib/types/account-with-platform.type.ts b/libs/common/src/lib/types/account-with-platform.type.ts
new file mode 100644
index 000000000..b0730abce
--- /dev/null
+++ b/libs/common/src/lib/types/account-with-platform.type.ts
@@ -0,0 +1,3 @@
+import { Account, Platform } from '@prisma/client';
+
+export type AccountWithPlatform = Account & { Platform?: Platform };
diff --git a/libs/common/src/lib/types/index.ts b/libs/common/src/lib/types/index.ts
index d70295b53..255a1c3fe 100644
--- a/libs/common/src/lib/types/index.ts
+++ b/libs/common/src/lib/types/index.ts
@@ -1,4 +1,5 @@
import type { AccessWithGranteeUser } from './access-with-grantee-user.type';
+import { AccountWithPlatform } from './account-with-platform.type';
import { AccountWithValue } from './account-with-value.type';
import type { ColorScheme } from './color-scheme';
import type { DateRange } from './date-range.type';
@@ -13,6 +14,7 @@ import type { ViewMode } from './view-mode.type';
export type {
AccessWithGranteeUser,
+ AccountWithPlatform,
AccountWithValue,
ColorScheme,
DateRange,
diff --git a/libs/common/src/lib/types/order-with-account.type.ts b/libs/common/src/lib/types/order-with-account.type.ts
index 09c64a283..af8803091 100644
--- a/libs/common/src/lib/types/order-with-account.type.ts
+++ b/libs/common/src/lib/types/order-with-account.type.ts
@@ -1,6 +1,6 @@
-import { Account, Order, Platform, SymbolProfile, Tag } from '@prisma/client';
+import { Order, SymbolProfile, Tag } from '@prisma/client';
-type AccountWithPlatform = Account & { Platform?: Platform };
+import { AccountWithPlatform } from './account-with-platform.type';
export type OrderWithAccount = Order & {
Account?: AccountWithPlatform;
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html
index 462b412ba..d2dbb95e8 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.html
+++ b/libs/ui/src/lib/activities-table/activities-table.component.html
@@ -117,7 +117,7 @@
- {{ element.SymbolProfile.name }}
+ {{ element.SymbolProfile?.name }}
-
+
{{
- element.SymbolProfile.symbol | gfSymbol
+ element.SymbolProfile?.symbol | gfSymbol
}}
@@ -149,7 +149,7 @@
class="d-none d-lg-table-cell px-1"
mat-cell
>
- {{ element.SymbolProfile.currency }}
+ {{ element.SymbolProfile?.currency }}
{{ baseCurrency }}
@@ -388,6 +388,14 @@
Import Activities
+
+
+ Import Dividends
+
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.ts b/libs/ui/src/lib/activities-table/activities-table.component.ts
index 1930072ea..167450d23 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.ts
+++ b/libs/ui/src/lib/activities-table/activities-table.component.ts
@@ -41,8 +41,9 @@ export class ActivitiesTableComponent implements OnChanges, OnDestroy {
@Input() hasPermissionToOpenDetails = true;
@Input() locale: string;
@Input() pageSize = DEFAULT_PAGE_SIZE;
- @Input() showActions: boolean;
+ @Input() showActions = true;
@Input() showCheckbox = false;
+ @Input() showFooter = true;
@Input() showNameColumn = true;
@Output() activityDeleted = new EventEmitter();
@@ -51,6 +52,7 @@ export class ActivitiesTableComponent implements OnChanges, OnDestroy {
@Output() export = new EventEmitter();
@Output() exportDrafts = new EventEmitter();
@Output() import = new EventEmitter();
+ @Output() importDividends = new EventEmitter();
@Output() selectedActivities = new EventEmitter();
@ViewChild(MatPaginator) paginator: MatPaginator;
@@ -233,6 +235,10 @@ export class ActivitiesTableComponent implements OnChanges, OnDestroy {
this.import.emit();
}
+ public onImportDividends() {
+ this.importDividends.emit();
+ }
+
public onOpenComment(aComment: string) {
alert(aComment);
}
@@ -272,13 +278,18 @@ export class ActivitiesTableComponent implements OnChanges, OnDestroy {
};
}
- fieldValueMap[activity.SymbolProfile.currency] = {
- id: activity.SymbolProfile.currency,
- label: activity.SymbolProfile.currency,
- type: 'TAG'
- };
+ if (activity.SymbolProfile?.currency) {
+ fieldValueMap[activity.SymbolProfile.currency] = {
+ id: activity.SymbolProfile.currency,
+ label: activity.SymbolProfile.currency,
+ type: 'TAG'
+ };
+ }
- if (!isUUID(activity.SymbolProfile.symbol)) {
+ if (
+ activity.SymbolProfile?.symbol &&
+ !isUUID(activity.SymbolProfile.symbol)
+ ) {
fieldValueMap[activity.SymbolProfile.symbol] = {
id: activity.SymbolProfile.symbol,
label: activity.SymbolProfile.symbol,
From 18d25fb6c2f362fda80a3c8a37af49570776b2a2 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 7 Jan 2023 18:21:09 +0100
Subject: [PATCH 04/19] Feature/extend faq page (#1577)
* Extend FAQ page
* Update changelog
---
CHANGELOG.md | 4 ++
.../hello-ghostfolio-page.html | 2 +-
.../first-months-in-open-source-page.html | 2 +-
...ostfolio-meets-internet-identity-page.html | 8 ++--
.../500-stars-on-github-page.html | 4 +-
.../hacktoberfest-2022-page.html | 2 +-
apps/client/src/app/pages/faq/faq-page.html | 43 ++++++++++++++-----
.../src/app/pages/pricing/pricing-page.html | 2 +-
8 files changed, 47 insertions(+), 20 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0c0adb984..9e81f64e7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added support for importing dividends from a data provider
+### Changed
+
+- Extended the Frequently Asked Questions (FAQ) page
+
## 1.224.0 - 2023-01-04
### Added
diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html
index 0833edb03..4a50e4475 100644
--- a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html
+++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html
@@ -125,7 +125,7 @@
feedback, bug reports, feature requests and of course contributions!
- You can reach me by email at
+ You can reach me by e-mail at
hi@ghostfol.io or on Twitter
@ghostfolio_ .
diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html
index c91c91638..93ef5d41e 100644
--- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html
+++ b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html
@@ -99,7 +99,7 @@
>
of users. In the future, I would like to involve more contributors
to further extend the functionality of Ghostfolio (e.g. with new
- reports). Get in touch with me by email at
+ reports). Get in touch with me by e-mail at
hi@ghostfol.io or on Twitter
@ghostfolio_ if you
are interested, I’m happy to discuss ideas.
diff --git a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html
index 19a6a2577..7a72ada19 100644
--- a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html
+++ b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html
@@ -64,15 +64,15 @@
When you authenticate with Internet Identity , the service
only gets a dedicated pseudonym rather than sensitive user data like
- the email address or phone number. This preserves your anonymity and
- prevents you being tracked on the Internet.
+ the e-mail address or phone number. This preserves your anonymity
+ and prevents you being tracked on the Internet.
The key benefits in a nutshell
- Authenticate yourself securely without the need of an email
+ Authenticate yourself securely without the need of an e-mail
address, username, or a password: all you need is your device to
log in.
@@ -89,7 +89,7 @@
If you would like to provide feedback or get involved in further
- development of Ghostfolio, please get in touch by email via
+ development of Ghostfolio, please get in touch by e-mail via
hi@ghostfol.io or on Twitter
@ghostfolio_ .
diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html
index 993755fdd..37f879672 100644
--- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html
+++ b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html
@@ -62,7 +62,7 @@
new and better Internet based on decentralized blockchains to give
power back to the users. Internet Identity created by the
Dfinity Foundation enables you to
- sign in securely and anonymously to Ghostfolio without an email
+ sign in securely and anonymously to Ghostfolio without an e-mail
address, username, or a password. All you need is your device with
built-in biometric authentication.
@@ -90,7 +90,7 @@
onboard more contributors who are actively involved in software
engineering to realize the full potential of open source software.
If you are a web developer and interested in personal finance,
- please get in touch by email via
+ please get in touch by e-mail via
hi@ghostfol.io or on Twitter
@ghostfolio_ . We are
happy to discuss ideas.
diff --git a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html
index f2d9e90b4..5807819e5 100644
--- a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html
+++ b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html
@@ -83,7 +83,7 @@
Slack community or get in
touch on Twitter
@ghostfolio_ or by
- email via hi@ghostfol.io .
+ e-mail via hi@ghostfol.io .
We look forward to hearing from you.
diff --git a/apps/client/src/app/pages/faq/faq-page.html b/apps/client/src/app/pages/faq/faq-page.html
index de73f3c2a..7e18aa57e 100644
--- a/apps/client/src/app/pages/faq/faq-page.html
+++ b/apps/client/src/app/pages/faq/faq-page.html
@@ -48,7 +48,7 @@
Internet Identity ) enable you to sign in securely and anonymously to Ghostfolio. There
- is no need for an email address, phone number, or a username.
+ is no need for an e-mail address, phone number, or a username.
@@ -57,10 +57,11 @@
>This project is driven by the efforts of contributors from around the
world. The
source code is
- fully available as open source software (OSS). Our
+ fully available as open source software (OSS). Thanks to our generous
Ghostfolio Premium users and
- sponsors allow
- us to run a free, limited plan for new investors.sponsors we have
+ the ability to run a free, limited plan for new
+ investors.
@@ -77,7 +78,8 @@
>Ghostfolio Premium is a fully
managed Ghostfolio cloud offering for ambitious investors. The revenue
is used to cover the hosting infrastructure. It is the Open Source
- code base with some extras like the market overview.markets overview.
@@ -85,24 +87,45 @@
Yes, you can try
Ghostfolio Premium by signing up
- for Ghostfolio and applying for a trial (see “My Ghostfolio”). It’s
+ for Ghostfolio and applying for a trial (see “My Ghostfolio”). It is
easy, free and there is no commitment. You can stop using it at any
time.
+
+ How can I get a student discount for Ghostfolio
+ Premium?
+ Request your student discount
+ here with
+ your university e-mail address.
+
Which devices are supported?
Ghostfolio works in every modern web browser on smartphones, tablets
- and desktop computers (where you have even more analysis options and
- statistics). For Android users, there is a dedicated Ghostfolio app
- available in the
+ and desktop computers. For Android users, there is a dedicated
+ Ghostfolio app available in the
Google Play Store .
+
+ I cannot find my broker in the list of platforms. What can I
+ do?
+
+ Please send an e-mail with the web address of your broker to
+ hi@ghostfol.io and we are happy to
+ add it.
+
+
Ghostfolio sounds cool, how can I get involved? , a star on
GitHub ,
feedback, bug reports, feature requests and of course contributions!
- You can reach us by email at
+ You can reach us by e-mail at
hi@ghostfol.io or on Twitter
@ghostfolio_ .here with
- your university email address.
+ your university e-mail address.
If you prefer to run Ghostfolio on your own infrastructure, please
From 38474f54b03edfd75631216ec372061a21060088 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 7 Jan 2023 18:26:38 +0100
Subject: [PATCH 05/19] Release 1.225.0 (#1580)
---
CHANGELOG.md | 2 +-
package.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9e81f64e7..c9679a3b5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## Unreleased
+## 1.225.0 - 2023-01-07
### Added
diff --git a/package.json b/package.json
index 07aa9d9bf..20cea4d7c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ghostfolio",
- "version": "1.224.0",
+ "version": "1.225.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"scripts": {
From f3c8ec27cb8db49070c63cfd23a379e43a087baf Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 10 Jan 2023 20:06:42 +0100
Subject: [PATCH 06/19] Feature/improve deprecated sass imports (#1581)
* Improve deprecated Sass imports
* Update changelog
---
CHANGELOG.md | 6 ++
apps/client/src/app/app.component.scss | 2 +-
.../access-table/access-table.component.scss | 2 +-
.../accounts-table.component.scss | 2 +-
.../app/components/admin-jobs/admin-jobs.scss | 2 +-
.../admin-market-data-detail.component.scss | 2 +-
.../admin-market-data/admin-market-data.scss | 2 +-
.../admin-overview/admin-overview.scss | 2 +-
.../components/admin-users/admin-users.scss | 2 +-
.../components/header/header.component.scss | 2 +-
.../home-holdings/home-holdings.scss | 2 +-
.../components/home-market/home-market.scss | 2 +-
.../home-overview/home-overview.scss | 2 +-
.../components/home-summary/home-summary.scss | 2 +-
.../positions/positions.component.scss | 2 +-
.../src/app/pages/admin/admin-page.scss | 2 +-
apps/client/src/app/pages/home/home-page.scss | 2 +-
.../src/app/pages/landing/landing-page.scss | 2 +-
.../app/pages/portfolio/portfolio-page.scss | 2 +-
apps/client/src/app/pages/zen/zen-page.scss | 2 +-
apps/client/src/styles.scss | 4 +-
apps/client/src/styles/bootstrap.scss | 74 +++++++++----------
apps/client/src/styles/ghostfolio-style.scss | 2 +-
.../activities-filter.component.scss | 2 +-
.../activities-table.component.scss | 2 +-
.../holdings-table.component.scss | 2 +-
26 files changed, 68 insertions(+), 62 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c9679a3b5..b331871ef 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## Unreleased
+
+### Changed
+
+- Improved the deprecated `~` in _Sass_ imports
+
## 1.225.0 - 2023-01-07
### Added
diff --git a/apps/client/src/app/app.component.scss b/apps/client/src/app/app.component.scss
index ab7878d73..6d6ac0639 100644
--- a/apps/client/src/app/app.component.scss
+++ b/apps/client/src/app/app.component.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/access-table/access-table.component.scss b/apps/client/src/app/components/access-table/access-table.component.scss
index ad5f401f6..f506edfc6 100644
--- a/apps/client/src/app/components/access-table/access-table.component.scss
+++ b/apps/client/src/app/components/access-table/access-table.component.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/accounts-table/accounts-table.component.scss b/apps/client/src/app/components/accounts-table/accounts-table.component.scss
index cd8d01321..ccb23a20e 100644
--- a/apps/client/src/app/components/accounts-table/accounts-table.component.scss
+++ b/apps/client/src/app/components/accounts-table/accounts-table.component.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/admin-jobs/admin-jobs.scss b/apps/client/src/app/components/admin-jobs/admin-jobs.scss
index b97d286cc..b5b58f67e 100644
--- a/apps/client/src/app/components/admin-jobs/admin-jobs.scss
+++ b/apps/client/src/app/components/admin-jobs/admin-jobs.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss
index 13db0835b..a922b5d69 100644
--- a/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss
+++ b/apps/client/src/app/components/admin-market-data-detail/admin-market-data-detail.component.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.scss b/apps/client/src/app/components/admin-market-data/admin-market-data.scss
index b97d286cc..b5b58f67e 100644
--- a/apps/client/src/app/components/admin-market-data/admin-market-data.scss
+++ b/apps/client/src/app/components/admin-market-data/admin-market-data.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/admin-overview/admin-overview.scss b/apps/client/src/app/components/admin-overview/admin-overview.scss
index f44df0eba..0481f246f 100644
--- a/apps/client/src/app/components/admin-overview/admin-overview.scss
+++ b/apps/client/src/app/components/admin-overview/admin-overview.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/admin-users/admin-users.scss b/apps/client/src/app/components/admin-users/admin-users.scss
index a3916f727..8dce735ff 100644
--- a/apps/client/src/app/components/admin-users/admin-users.scss
+++ b/apps/client/src/app/components/admin-users/admin-users.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/header/header.component.scss b/apps/client/src/app/components/header/header.component.scss
index 32d125703..b78df5e63 100644
--- a/apps/client/src/app/components/header/header.component.scss
+++ b/apps/client/src/app/components/header/header.component.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/home-holdings/home-holdings.scss b/apps/client/src/app/components/home-holdings/home-holdings.scss
index b97d286cc..b5b58f67e 100644
--- a/apps/client/src/app/components/home-holdings/home-holdings.scss
+++ b/apps/client/src/app/components/home-holdings/home-holdings.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/home-market/home-market.scss b/apps/client/src/app/components/home-market/home-market.scss
index 2d7ffa0dd..f9e5e6275 100644
--- a/apps/client/src/app/components/home-market/home-market.scss
+++ b/apps/client/src/app/components/home-market/home-market.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/home-overview/home-overview.scss b/apps/client/src/app/components/home-overview/home-overview.scss
index ac86f6909..ab13a3ee2 100644
--- a/apps/client/src/app/components/home-overview/home-overview.scss
+++ b/apps/client/src/app/components/home-overview/home-overview.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/home-summary/home-summary.scss b/apps/client/src/app/components/home-summary/home-summary.scss
index b97d286cc..b5b58f67e 100644
--- a/apps/client/src/app/components/home-summary/home-summary.scss
+++ b/apps/client/src/app/components/home-summary/home-summary.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/components/positions/positions.component.scss b/apps/client/src/app/components/positions/positions.component.scss
index 1f1d20bcc..90eff65ea 100644
--- a/apps/client/src/app/components/positions/positions.component.scss
+++ b/apps/client/src/app/components/positions/positions.component.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/pages/admin/admin-page.scss b/apps/client/src/app/pages/admin/admin-page.scss
index 42a21abb3..72b22f8ce 100644
--- a/apps/client/src/app/pages/admin/admin-page.scss
+++ b/apps/client/src/app/pages/admin/admin-page.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
color: rgb(var(--dark-primary-text));
diff --git a/apps/client/src/app/pages/home/home-page.scss b/apps/client/src/app/pages/home/home-page.scss
index ecb03cf29..dbb6dd2d6 100644
--- a/apps/client/src/app/pages/home/home-page.scss
+++ b/apps/client/src/app/pages/home/home-page.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
color: rgb(var(--dark-primary-text));
diff --git a/apps/client/src/app/pages/landing/landing-page.scss b/apps/client/src/app/pages/landing/landing-page.scss
index bb0b66394..74c416b08 100644
--- a/apps/client/src/app/pages/landing/landing-page.scss
+++ b/apps/client/src/app/pages/landing/landing-page.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.scss b/apps/client/src/app/pages/portfolio/portfolio-page.scss
index b5471d5ce..535b5af50 100644
--- a/apps/client/src/app/pages/portfolio/portfolio-page.scss
+++ b/apps/client/src/app/pages/portfolio/portfolio-page.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
color: rgb(var(--dark-primary-text));
diff --git a/apps/client/src/app/pages/zen/zen-page.scss b/apps/client/src/app/pages/zen/zen-page.scss
index 73e482c91..4a0154291 100644
--- a/apps/client/src/app/pages/zen/zen-page.scss
+++ b/apps/client/src/app/pages/zen/zen-page.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
color: rgb(var(--dark-primary-text));
diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss
index 83d4367e4..bb3e1ccd6 100644
--- a/apps/client/src/styles.scss
+++ b/apps/client/src/styles.scss
@@ -3,9 +3,9 @@
@import './styles/bootstrap';
@import './styles/table';
-@import '~angular-material-css-vars/src/lib/main';
+@import 'node_modules/angular-material-css-vars/src/lib/main';
-@import '~svgmap/dist/svgMap';
+@import 'node_modules/svgmap/dist/svgMap';
$mat-css-dark-theme-selector: '.is-dark-theme';
$mat-css-light-theme-selector: '.is-light-theme';
diff --git a/apps/client/src/styles/bootstrap.scss b/apps/client/src/styles/bootstrap.scss
index 49b9bf057..4c13e7978 100644
--- a/apps/client/src/styles/bootstrap.scss
+++ b/apps/client/src/styles/bootstrap.scss
@@ -5,40 +5,40 @@
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
-@import '~bootstrap/scss/functions';
-@import '~bootstrap/scss/variables';
-@import '~bootstrap/scss/mixins';
-@import '~bootstrap/scss/root';
-@import '~bootstrap/scss/reboot';
-@import '~bootstrap/scss/type';
-@import '~bootstrap/scss/images';
-// @import '~bootstrap/scss/code';
-@import '~bootstrap/scss/grid';
-// @import '~bootstrap/scss/tables';
-// @import '~bootstrap/scss/forms';
-// @import '~bootstrap/scss/buttons';
-// @import '~bootstrap/scss/transitions';
-// @import '~bootstrap/scss/dropdown';
-// @import '~bootstrap/scss/button-group';
-// @import '~bootstrap/scss/input-group';
-// @import '~bootstrap/scss/custom-forms';
-// @import '~bootstrap/scss/nav';
-// @import '~bootstrap/scss/navbar';
-// @import '~bootstrap/scss/card';
-// @import '~bootstrap/scss/breadcrumb';
-// @import '~bootstrap/scss/pagination';
-@import '~bootstrap/scss/badge';
-// @import '~bootstrap/scss/jumbotron';
-// @import '~bootstrap/scss/alert';
-// @import '~bootstrap/scss/progress';
-// @import '~bootstrap/scss/media';
-// @import '~bootstrap/scss/list-group';
-// @import '~bootstrap/scss/close';
-// @import '~bootstrap/scss/toasts';
-// @import '~bootstrap/scss/modal';
-// @import '~bootstrap/scss/tooltip';
-// @import '~bootstrap/scss/popover';
-// @import '~bootstrap/scss/carousel';
-// @import '~bootstrap/scss/spinners';
-@import '~bootstrap/scss/utilities';
-// @import '~bootstrap/scss/print';
+@import 'node_modules/bootstrap/scss/functions';
+@import 'node_modules/bootstrap/scss/variables';
+@import 'node_modules/bootstrap/scss/mixins';
+@import 'node_modules/bootstrap/scss/root';
+@import 'node_modules/bootstrap/scss/reboot';
+@import 'node_modules/bootstrap/scss/type';
+@import 'node_modules/bootstrap/scss/images';
+// @import 'node_modules/bootstrap/scss/code';
+@import 'node_modules/bootstrap/scss/grid';
+// @import 'node_modules/bootstrap/scss/tables';
+// @import 'node_modules/bootstrap/scss/forms';
+// @import 'node_modules/bootstrap/scss/buttons';
+// @import 'node_modules/bootstrap/scss/transitions';
+// @import 'node_modules/bootstrap/scss/dropdown';
+// @import 'node_modules/bootstrap/scss/button-group';
+// @import 'node_modules/bootstrap/scss/input-group';
+// @import 'node_modules/bootstrap/scss/custom-forms';
+// @import 'node_modules/bootstrap/scss/nav';
+// @import 'node_modules/bootstrap/scss/navbar';
+// @import 'node_modules/bootstrap/scss/card';
+// @import 'node_modules/bootstrap/scss/breadcrumb';
+// @import 'node_modules/bootstrap/scss/pagination';
+@import 'node_modules/bootstrap/scss/badge';
+// @import 'node_modules/bootstrap/scss/jumbotron';
+// @import 'node_modules/bootstrap/scss/alert';
+// @import 'node_modules/bootstrap/scss/progress';
+// @import 'node_modules/bootstrap/scss/media';
+// @import 'node_modules/bootstrap/scss/list-group';
+// @import 'node_modules/bootstrap/scss/close';
+// @import 'node_modules/bootstrap/scss/toasts';
+// @import 'node_modules/bootstrap/scss/modal';
+// @import 'node_modules/bootstrap/scss/tooltip';
+// @import 'node_modules/bootstrap/scss/popover';
+// @import 'node_modules/bootstrap/scss/carousel';
+// @import 'node_modules/bootstrap/scss/spinners';
+@import 'node_modules/bootstrap/scss/utilities';
+// @import 'node_modules/bootstrap/scss/print';
diff --git a/apps/client/src/styles/ghostfolio-style.scss b/apps/client/src/styles/ghostfolio-style.scss
index 9556c6b5b..51ceeb884 100644
--- a/apps/client/src/styles/ghostfolio-style.scss
+++ b/apps/client/src/styles/ghostfolio-style.scss
@@ -1,6 +1,6 @@
$mat-css-dark-theme-selector: '.is-dark-theme';
-@import '~angular-material-css-vars/src/lib/public-util';
+@import 'node_modules/angular-material-css-vars/src/lib/public-util';
$alpha-disabled-text: 0.38;
$alpha-hover: 0.04;
diff --git a/libs/ui/src/lib/activities-filter/activities-filter.component.scss b/libs/ui/src/lib/activities-filter/activities-filter.component.scss
index d859ac16d..c0d474724 100644
--- a/libs/ui/src/lib/activities-filter/activities-filter.component.scss
+++ b/libs/ui/src/lib/activities-filter/activities-filter.component.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/libs/ui/src/lib/activities-table/activities-table.component.scss b/libs/ui/src/lib/activities-table/activities-table.component.scss
index 42af383e4..6321a26c4 100644
--- a/libs/ui/src/lib/activities-table/activities-table.component.scss
+++ b/libs/ui/src/lib/activities-table/activities-table.component.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.scss b/libs/ui/src/lib/holdings-table/holdings-table.component.scss
index f0da6525f..d7c678476 100644
--- a/libs/ui/src/lib/holdings-table/holdings-table.component.scss
+++ b/libs/ui/src/lib/holdings-table/holdings-table.component.scss
@@ -1,4 +1,4 @@
-@import '~apps/client/src/styles/ghostfolio-style';
+@import 'apps/client/src/styles/ghostfolio-style';
:host {
display: block;
From fc8e23a9c8e4270f50c50b6931c41be1c00a49c1 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 10 Jan 2023 20:43:48 +0100
Subject: [PATCH 07/19] Feature/improve form of import dividends dialog (#1582)
* Disable while loading
* Update changelog
---
CHANGELOG.md | 3 ++-
.../import-activities-dialog.component.ts | 4 ++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b331871ef..4a35e673c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
-- Improved the deprecated `~` in _Sass_ imports
+- Improved the form of the import dividends dialog (disable while loading)
+- Removed the deprecated `~` in _Sass_ imports
## 1.225.0 - 2023-01-07
diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
index 77ef8dfe8..e72b7cde3 100644
--- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
+++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
@@ -56,6 +56,7 @@ export class ImportActivitiesDialog implements OnDestroy {
this.data?.activityTypes?.[0] === 'DIVIDEND'
) {
this.mode = 'DIVIDEND';
+ this.uniqueAssetForm.controls['uniqueAsset'].disable();
this.dataService
.fetchPositions({
@@ -72,6 +73,7 @@ export class ImportActivitiesDialog implements OnDestroy {
this.holdings = sortBy(positions, ({ name }) => {
return name.toLowerCase();
});
+ this.uniqueAssetForm.controls['uniqueAsset'].enable();
this.changeDetectorRef.markForCheck();
});
@@ -111,6 +113,8 @@ export class ImportActivitiesDialog implements OnDestroy {
}
public onLoadDividends() {
+ this.uniqueAssetForm.controls['uniqueAsset'].disable();
+
const { dataSource, symbol } =
this.uniqueAssetForm.controls['uniqueAsset'].value;
From 90a7a84ac5a9502ff3c002e31f16bbbe40bebb26 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Tue, 10 Jan 2023 20:52:05 +0100
Subject: [PATCH 08/19] Feature/add global heat map to landing page (#1584)
* Add global heat map
* Update changelog
---
CHANGELOG.md | 4 ++++
apps/api/src/app/info/info.service.ts | 5 +++++
.../world-map-chart.component.ts | 6 +++---
.../pages/landing/landing-page.component.ts | 18 +++++++++++++++++-
.../src/app/pages/landing/landing-page.html | 15 +++++++++++++++
.../app/pages/landing/landing-page.module.ts | 4 ++++
.../src/app/pages/landing/landing-page.scss | 4 ++++
.../allocations/allocations-page.component.ts | 6 ++++++
.../allocations/allocations-page.html | 2 +-
libs/common/src/lib/config.ts | 1 +
.../src/lib/interfaces/info-item.interface.ts | 2 +-
11 files changed, 61 insertions(+), 6 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4a35e673c..63dded11b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+### Added
+
+- Extended the landing page by a global heat map of subscribers
+
### Changed
- Improved the form of the import dividends dialog (disable while loading)
diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts
index 810611375..911243057 100644
--- a/apps/api/src/app/info/info.service.ts
+++ b/apps/api/src/app/info/info.service.ts
@@ -7,6 +7,7 @@ import { PropertyService } from '@ghostfolio/api/services/property/property.serv
import { TagService } from '@ghostfolio/api/services/tag/tag.service';
import {
DEMO_USER_ID,
+ PROPERTY_COUNTRIES_OF_SUBSCRIBERS,
PROPERTY_IS_READ_ONLY_MODE,
PROPERTY_SLACK_COMMUNITY_USERS,
PROPERTY_STRIPE_CONFIG,
@@ -92,6 +93,10 @@ export class InfoService {
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {
globalPermissions.push(permissions.enableSubscription);
+ info.countriesOfSubscribers =
+ ((await this.propertyService.getByKey(
+ PROPERTY_COUNTRIES_OF_SUBSCRIBERS
+ )) as string[]) ?? [];
info.stripePublicKey = this.configurationService.get('STRIPE_PUBLIC_KEY');
}
diff --git a/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts b/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts
index 22e4adc66..ef49eebde 100644
--- a/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts
+++ b/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts
@@ -16,8 +16,8 @@ import svgMap from 'svgmap';
styleUrls: ['./world-map-chart.component.scss']
})
export class WorldMapChartComponent implements OnChanges, OnDestroy, OnInit {
- @Input() baseCurrency: string;
- @Input() countries: { [code: string]: { name: string; value: number } };
+ @Input() countries: { [code: string]: { name?: string; value: number } };
+ @Input() format: string;
@Input() isInPercent = false;
public isLoading = true;
@@ -71,7 +71,7 @@ export class WorldMapChartComponent implements OnChanges, OnDestroy, OnInit {
applyData: 'value',
data: {
value: {
- format: this.isInPercent ? `{0}%` : `{0} ${this.baseCurrency}`
+ format: this.format
}
},
values: this.countries
diff --git a/apps/client/src/app/pages/landing/landing-page.component.ts b/apps/client/src/app/pages/landing/landing-page.component.ts
index f8c2c6a23..f4a80c652 100644
--- a/apps/client/src/app/pages/landing/landing-page.component.ts
+++ b/apps/client/src/app/pages/landing/landing-page.component.ts
@@ -13,10 +13,14 @@ import { Subject } from 'rxjs';
templateUrl: './landing-page.html'
})
export class LandingPageComponent implements OnDestroy, OnInit {
+ public countriesOfSubscribersMap: {
+ [code: string]: { value: number };
+ } = {};
public currentYear = format(new Date(), 'yyyy');
public demoAuthToken: string;
public deviceType: string;
public hasPermissionForStatistics: boolean;
+ public hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean;
public statistics: Statistics;
public testimonials = [
@@ -48,13 +52,25 @@ export class LandingPageComponent implements OnDestroy, OnInit {
private dataService: DataService,
private deviceService: DeviceDetectorService
) {
- const { globalPermissions, statistics } = this.dataService.fetchInfo();
+ const { countriesOfSubscribers, globalPermissions, statistics } =
+ this.dataService.fetchInfo();
+
+ for (const country of countriesOfSubscribers) {
+ this.countriesOfSubscribersMap[country] = {
+ value: 1
+ };
+ }
this.hasPermissionForStatistics = hasPermission(
globalPermissions,
permissions.enableStatistics
);
+ this.hasPermissionForSubscription = hasPermission(
+ globalPermissions,
+ permissions.enableSubscription
+ );
+
this.hasPermissionToCreateUser = hasPermission(
globalPermissions,
permissions.createUserAccount
diff --git a/apps/client/src/app/pages/landing/landing-page.html b/apps/client/src/app/pages/landing/landing-page.html
index 0c8f20bce..64f943f3c 100644
--- a/apps/client/src/app/pages/landing/landing-page.html
+++ b/apps/client/src/app/pages/landing/landing-page.html
@@ -269,6 +269,21 @@
+
+
diff --git a/apps/client/src/app/pages/landing/landing-page.module.ts b/apps/client/src/app/pages/landing/landing-page.module.ts
index 37c67f270..4a3ce00cb 100644
--- a/apps/client/src/app/pages/landing/landing-page.module.ts
+++ b/apps/client/src/app/pages/landing/landing-page.module.ts
@@ -3,7 +3,9 @@ import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
+import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module';
import { GfLogoModule } from '@ghostfolio/ui/logo';
+import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfValueModule } from '@ghostfolio/ui/value';
import { LandingPageRoutingModule } from './landing-page-routing.module';
@@ -14,7 +16,9 @@ import { LandingPageComponent } from './landing-page.component';
imports: [
CommonModule,
GfLogoModule,
+ GfPremiumIndicatorModule,
GfValueModule,
+ GfWorldMapChartModule,
LandingPageRoutingModule,
MatButtonModule,
MatCardModule,
diff --git a/apps/client/src/app/pages/landing/landing-page.scss b/apps/client/src/app/pages/landing/landing-page.scss
index 74c416b08..bbc3c587a 100644
--- a/apps/client/src/app/pages/landing/landing-page.scss
+++ b/apps/client/src/app/pages/landing/landing-page.scss
@@ -9,6 +9,10 @@
}
}
+ .customer-map-container {
+ aspect-ratio: 16 / 9;
+ }
+
.downloads {
img {
height: 2.5rem;
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
index ea0f65ac0..16cad4a90 100644
--- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
+++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
@@ -84,6 +84,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
};
public user: User;
+ public worldMapChartFormat: string;
private unsubscribeSubject = new Subject();
@@ -193,6 +194,11 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
...tagFilters
];
+ this.worldMapChartFormat =
+ this.hasImpersonationId || this.user.settings.isRestrictedView
+ ? `{0}%`
+ : `{0} ${this.user?.settings?.baseCurrency}`;
+
this.changeDetectorRef.markForCheck();
}
});
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
index 43d838808..907b62d51 100644
--- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
+++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
@@ -257,8 +257,8 @@
diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts
index 5c8529231..91e83e2e0 100644
--- a/libs/common/src/lib/config.ts
+++ b/libs/common/src/lib/config.ts
@@ -72,6 +72,7 @@ export const GATHER_HISTORICAL_MARKET_DATA_PROCESS_OPTIONS: JobOptions = {
export const MAX_CHART_ITEMS = 365;
export const PROPERTY_BENCHMARKS = 'BENCHMARKS';
+export const PROPERTY_COUNTRIES_OF_SUBSCRIBERS = 'COUNTRIES_OF_SUBSCRIBERS';
export const PROPERTY_COUPONS = 'COUPONS';
export const PROPERTY_CURRENCIES = 'CURRENCIES';
export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE';
diff --git a/libs/common/src/lib/interfaces/info-item.interface.ts b/libs/common/src/lib/interfaces/info-item.interface.ts
index 3751c6405..bcb28402c 100644
--- a/libs/common/src/lib/interfaces/info-item.interface.ts
+++ b/libs/common/src/lib/interfaces/info-item.interface.ts
@@ -6,12 +6,12 @@ import { Subscription } from './subscription.interface';
export interface InfoItem {
baseCurrency: string;
benchmarks: Partial
[];
+ countriesOfSubscribers?: string[];
currencies: string[];
demoAuthToken: string;
fearAndGreedDataSource?: string;
globalPermissions: string[];
isReadOnlyMode?: boolean;
- lastDataGathering?: Date;
platforms: { id: string; name: string }[];
statistics: Statistics;
stripePublicKey?: string;
From 1b899da9ff87f14fd7657426797e581957116528 Mon Sep 17 00:00:00 2001
From: Martin Vandenbussche
Date: Tue, 10 Jan 2023 20:59:32 +0100
Subject: [PATCH 09/19] Minor tweaks to README.md (#1585)
* Minor tweaks to README.md
- Reduced reliance on HTML in the README.md file.
- Added alt text on images for improved accessibility
- Very minor formatting tweaks
Signed-off-by: Martin Vandenbussche
---
README.md | 73 +++++++++++++++++++++++++------------------------------
1 file changed, 33 insertions(+), 40 deletions(-)
diff --git a/README.md b/README.md
index 2b26a2335..675a5a48f 100644
--- a/README.md
+++ b/README.md
@@ -1,34 +1,26 @@
-
-
-
-
-
Ghostfolio
-
- Open Source Wealth Management Software
-
-
- Ghostfol.io | Live Demo | Ghostfolio Premium | FAQ | Blog | Slack | Twitter
-
-
-
-
-
-
-
-
-
+
+[
](https://ghostfol.io)
+
+# Ghostfolio
+
+**Open Source Wealth Management Software**
+
+[**Ghostfol.io**](https://ghostfol.io) | [**Live Demo**](https://ghostfol.io/en/demo) | [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) | [**FAQ**](https://ghostfol.io/en/faq) |
+[**Blog**](https://ghostfol.io/en/blog) | [**Slack**](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg) | [**Twitter**](https://twitter.com/ghostfolio_)
+
+[](https://www.buymeacoffee.com/ghostfolio)
+[](#contributing)
+[](https://www.gnu.org/licenses/agpl-3.0)
+
**Ghostfolio** is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. The software is designed for personal use in continuous operation.
-
-
-
+
+
+[
](https://www.youtube.com/watch?v=yY6ObSQVJZk)
+
## Ghostfolio Premium
@@ -63,8 +55,10 @@ Ghostfolio is for you if you are...
- ✅ Zen Mode
- ✅ Progressive Web App (PWA) with a mobile-first design
-
-
+
+
+
+
## Technology Stack
@@ -84,13 +78,9 @@ The frontend is built with [Angular](https://angular.io) and uses [Angular Mater
We provide official container images hosted on [Docker Hub](https://hub.docker.com/r/ghostfolio/ghostfolio) for `linux/amd64` and `linux/arm64`.
-
-
-
+
+[
](https://www.buymeacoffee.com/ghostfolio)
+
### Supported Environment Variables
@@ -175,10 +165,13 @@ Please follow the instructions of the Ghostfolio [Unraid Community App](https://
### Start Server
-
- Debug: Run yarn watch:server
and click "Launch Program" in Visual Studio Code
- Serve: Run yarn start:server
-
+#### Debug
+
+Run `yarn watch:server` and click "Launch program" in [Visual Studio Code](https://code.visualstudio.com)
+
+##### Serve
+
+Run `yarn start:server`
### Start Client
@@ -278,7 +271,7 @@ Ghostfolio is **100% free** and **open source**. We encourage and support an act
Not sure what to work on? We have got some ideas. Please join the Ghostfolio [Slack channel](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg), tweet to [@ghostfolio\_](https://twitter.com/ghostfolio_) or send an e-mail to hi@ghostfol.io. We would love to hear from you.
-If you like to support this project, get **[Ghostfolio Premium](https://ghostfol.io/en/pricing)** or **[Buy me a coffee](https://www.buymeacoffee.com/ghostfolio)**.
+If you like to support this project, get [**Ghostfolio Premium**](https://ghostfol.io/en/pricing) or [**Buy me a coffee**](https://www.buymeacoffee.com/ghostfolio).
## License
From aeba6e1f03badf0744e40b403e029adcb7fd0cdf Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 11 Jan 2023 07:47:44 +0100
Subject: [PATCH 10/19] Feature/configure thousand separator in world map chart
(#1588)
* Set thousandSeparator
* Update changelog
---
CHANGELOG.md | 1 +
.../components/world-map-chart/world-map-chart.component.ts | 5 ++++-
apps/client/src/app/pages/landing/landing-page.module.ts | 2 --
.../app/pages/portfolio/allocations/allocations-page.html | 1 +
4 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 63dded11b..ce50bb067 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Extended the landing page by a global heat map of subscribers
+- Added support for the thousand separator in the global heat map component
### Changed
diff --git a/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts b/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts
index ef49eebde..9d7c61d62 100644
--- a/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts
+++ b/apps/client/src/app/components/world-map-chart/world-map-chart.component.ts
@@ -7,6 +7,7 @@ import {
OnDestroy,
OnInit
} from '@angular/core';
+import { getNumberFormatGroup } from '@ghostfolio/common/helper';
import svgMap from 'svgmap';
@Component({
@@ -19,6 +20,7 @@ export class WorldMapChartComponent implements OnChanges, OnDestroy, OnInit {
@Input() countries: { [code: string]: { name?: string; value: number } };
@Input() format: string;
@Input() isInPercent = false;
+ @Input() locale: string;
public isLoading = true;
public svgMapElement;
@@ -71,7 +73,8 @@ export class WorldMapChartComponent implements OnChanges, OnDestroy, OnInit {
applyData: 'value',
data: {
value: {
- format: this.format
+ format: this.format,
+ thousandSeparator: getNumberFormatGroup(this.locale)
}
},
values: this.countries
diff --git a/apps/client/src/app/pages/landing/landing-page.module.ts b/apps/client/src/app/pages/landing/landing-page.module.ts
index 4a3ce00cb..9a3f02cce 100644
--- a/apps/client/src/app/pages/landing/landing-page.module.ts
+++ b/apps/client/src/app/pages/landing/landing-page.module.ts
@@ -5,7 +5,6 @@ import { MatCardModule } from '@angular/material/card';
import { RouterModule } from '@angular/router';
import { GfWorldMapChartModule } from '@ghostfolio/client/components/world-map-chart/world-map-chart.module';
import { GfLogoModule } from '@ghostfolio/ui/logo';
-import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
import { GfValueModule } from '@ghostfolio/ui/value';
import { LandingPageRoutingModule } from './landing-page-routing.module';
@@ -16,7 +15,6 @@ import { LandingPageComponent } from './landing-page.component';
imports: [
CommonModule,
GfLogoModule,
- GfPremiumIndicatorModule,
GfValueModule,
GfWorldMapChartModule,
LandingPageRoutingModule,
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
index 907b62d51..78d86d182 100644
--- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
+++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.html
@@ -260,6 +260,7 @@
[countries]="countries"
[format]="worldMapChartFormat"
[isInPercent]="hasImpersonationId || user.settings.isRestrictedView"
+ [locale]="user?.settings?.locale"
>
From 0208bd0923d5a67b74a537a4cb9a9dc69d5749af Mon Sep 17 00:00:00 2001
From: Martin Vandenbussche
Date: Wed, 11 Jan 2023 19:38:46 +0100
Subject: [PATCH 11/19] Feature/French translation (#1583)
* Finished the French translation
---
.../src/app/pages/account/account-page.html | 4 +-
apps/client/src/locales/messages.fr.xlf | 638 +++++++++---------
2 files changed, 321 insertions(+), 321 deletions(-)
diff --git a/apps/client/src/app/pages/account/account-page.html b/apps/client/src/app/pages/account/account-page.html
index 7746ba902..c9ed454e4 100644
--- a/apps/client/src/app/pages/account/account-page.html
+++ b/apps/client/src/app/pages/account/account-page.html
@@ -135,10 +135,10 @@
>Español (Community )
-
+ >
Italiano (Community )
The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term.
- The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term.
+ Le risque de perte en investissant peut être important. Il est déconseillé d'investir de l'argent dont vous pourriez avoir besoin à court terme.
apps/client/src/app/app.component.html
56,57
@@ -11,7 +11,7 @@
Alias
- Alias
+ Alias
apps/client/src/app/components/access-table/access-table.component.html
3
@@ -23,7 +23,7 @@
Grantee
- Grantee
+ Bénéficiaire
apps/client/src/app/components/access-table/access-table.component.html
10
@@ -31,7 +31,7 @@
Type
- Type
+ Type
apps/client/src/app/components/access-table/access-table.component.html
17
@@ -59,7 +59,7 @@
Details
- Details
+ Détails
apps/client/src/app/components/access-table/access-table.component.html
27
@@ -67,7 +67,7 @@
Revoke
- Revoke
+ Révoquer
apps/client/src/app/components/access-table/access-table.component.html
54
@@ -75,7 +75,7 @@
Do you really want to revoke this granted access?
- Do you really want to revoke this granted access?
+ Voulez-vous vraiment révoquer cet accès ?
apps/client/src/app/components/access-table/access-table.component.ts
49
@@ -83,7 +83,7 @@
Account Type
- Account Type
+ Type de Compte
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
25
@@ -91,7 +91,7 @@
Platform
- Platform
+ Plateforme
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
29
@@ -107,7 +107,7 @@
Activities
- Activities
+ Activités
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
35
@@ -135,7 +135,7 @@
Name
- Name
+ Nom
apps/client/src/app/components/accounts-table/accounts-table.component.html
22
@@ -159,7 +159,7 @@
Total
- Total
+ Total
apps/client/src/app/components/accounts-table/accounts-table.component.html
38
@@ -171,7 +171,7 @@
Currency
- Currency
+ Devise
apps/client/src/app/components/accounts-table/accounts-table.component.html
48
@@ -195,7 +195,7 @@
Cash Balance
- Cash Balance
+ Balance Cash
apps/client/src/app/components/accounts-table/accounts-table.component.html
112
@@ -207,7 +207,7 @@
Value
- Value
+ Valeur
apps/client/src/app/components/accounts-table/accounts-table.component.html
147
@@ -235,7 +235,7 @@
Edit
- Edit
+ Modifier
apps/client/src/app/components/accounts-table/accounts-table.component.html
224
@@ -247,7 +247,7 @@
Delete
- Delete
+ Supprimer
apps/client/src/app/components/accounts-table/accounts-table.component.html
232
@@ -267,7 +267,7 @@
Do you really want to delete this account?
- Do you really want to delete this account?
+ Voulez-vous vraiment supprimer ce compte ?
apps/client/src/app/components/accounts-table/accounts-table.component.ts
81
@@ -275,7 +275,7 @@
Symbol
- Symbol
+ Symbole
apps/client/src/app/components/admin-jobs/admin-jobs.html
24
@@ -291,7 +291,7 @@
Data Source
- Data Source
+ Source Données
apps/client/src/app/components/admin-jobs/admin-jobs.html
25
@@ -307,7 +307,7 @@
Attempts
- Attempts
+ Tentatives
apps/client/src/app/components/admin-jobs/admin-jobs.html
26
@@ -315,7 +315,7 @@
Created
- Created
+ Créé
apps/client/src/app/components/admin-jobs/admin-jobs.html
27
@@ -323,7 +323,7 @@
Finished
- Finished
+ Terminé
apps/client/src/app/components/admin-jobs/admin-jobs.html
28
@@ -331,7 +331,7 @@
Status
- Status
+ Statut
apps/client/src/app/components/admin-jobs/admin-jobs.html
29
@@ -339,7 +339,7 @@
Delete Jobs
- Delete Jobs
+ Supprimer Tâches
apps/client/src/app/components/admin-jobs/admin-jobs.html
41
@@ -347,7 +347,7 @@
Asset Profile
- Asset Profile
+ Profil d'Actifs
apps/client/src/app/components/admin-jobs/admin-jobs.html
58
@@ -355,7 +355,7 @@
Historical Market Data
- Historical Market Data
+ Données de Marché Historiques
apps/client/src/app/components/admin-jobs/admin-jobs.html
63
@@ -363,7 +363,7 @@
View Data
- View Data
+ Voir Données
apps/client/src/app/components/admin-jobs/admin-jobs.html
118
@@ -371,7 +371,7 @@
View Stacktrace
- View Stacktrace
+ Voir la Stacktrace
apps/client/src/app/components/admin-jobs/admin-jobs.html
125
@@ -379,7 +379,7 @@
Delete Job
- Delete Job
+ Supprimer Tâche
apps/client/src/app/components/admin-jobs/admin-jobs.html
128
@@ -387,7 +387,7 @@
Details for
- Details for
+ Détails pour
apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html
2
@@ -395,7 +395,7 @@
Date
- Date
+ Date
apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html
6
@@ -411,7 +411,7 @@
Market Price
- Market Price
+ Prix du Marché
apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html
26
@@ -423,7 +423,7 @@
Cancel
- Cancel
+ Annuler
apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html
46
@@ -455,7 +455,7 @@
Save
- Save
+ Sauvegarder
apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html
48
@@ -479,7 +479,7 @@
Filter by...
- Filter by...
+ Filtrer par...
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
128
@@ -487,7 +487,7 @@
Asset Class
- Asset Class
+ Classe d'Actifs
apps/client/src/app/components/admin-market-data/admin-market-data.html
42
@@ -507,7 +507,7 @@
Asset Sub Class
- Asset Sub Class
+ Sous-classe d'Actifs
apps/client/src/app/components/admin-market-data/admin-market-data.html
51
@@ -527,7 +527,7 @@
First Activity
- First Activity
+ Première Activité
apps/client/src/app/components/admin-market-data/admin-market-data.html
60
@@ -543,7 +543,7 @@
Activities Count
- Activities Count
+ Nombre d'Activités
apps/client/src/app/components/admin-market-data/admin-market-data.html
69
@@ -551,7 +551,7 @@
Historical Data
- Historical Data
+ Données Historiques
apps/client/src/app/components/admin-market-data/admin-market-data.html
78
@@ -559,7 +559,7 @@
Sectors Count
- Sectors Count
+ Nombre de Secteurs
apps/client/src/app/components/admin-market-data/admin-market-data.html
87
@@ -567,7 +567,7 @@
Countries Count
- Countries Count
+ Nombre de Pays
apps/client/src/app/components/admin-market-data/admin-market-data.html
96
@@ -575,7 +575,7 @@
Gather Recent Data
- Gather Recent Data
+ Obtenir les Données Récentes
apps/client/src/app/components/admin-market-data/admin-market-data.html
131
@@ -583,7 +583,7 @@
Gather All Data
- Gather All Data
+ Obtenir toutes les Données
apps/client/src/app/components/admin-market-data/admin-market-data.html
134
@@ -591,7 +591,7 @@
Gather Profile Data
- Gather Profile Data
+ Obtenir les Données du Profil
apps/client/src/app/components/admin-market-data/admin-market-data.html
137
@@ -607,7 +607,7 @@
Gather Data
- Gather Data
+ Obtenir les Données
apps/client/src/app/components/admin-market-data/admin-market-data.html
155
@@ -619,7 +619,7 @@
Refresh
- Refresh
+ Rafraîchir
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
22
@@ -627,7 +627,7 @@
Sector
- Sector
+ Secteur
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
110
@@ -639,7 +639,7 @@
Country
- Country
+ Pays
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
119
@@ -651,7 +651,7 @@
Sectors
- Sectors
+ Secteurs
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
125
@@ -667,7 +667,7 @@
Countries
- Countries
+ Pays
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
135
@@ -679,7 +679,7 @@
Symbol Mapping
- Symbol Mapping
+ Équivalence de Symboles
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
149
@@ -687,7 +687,7 @@
Note
- Note
+ Note
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
160
@@ -699,7 +699,7 @@
Please add a currency:
- Please add a currency:
+ Veuillez ajouter une devise :
apps/client/src/app/components/admin-overview/admin-overview.component.ts
110
@@ -707,7 +707,7 @@
Do you really want to delete this coupon?
- Do you really want to delete this coupon?
+ Voulez-vous vraiment supprimer ce code promotionnel ?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
124
@@ -715,7 +715,7 @@
Do you really want to delete this currency?
- Do you really want to delete this currency?
+ Voulez-vous vraiment supprimer cette devise ?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
137
@@ -723,7 +723,7 @@
Do you really want to flush the cache?
- Do you really want to flush the cache?
+ Voulez-vous vraiment vider le cache ?
apps/client/src/app/components/admin-overview/admin-overview.component.ts
154
@@ -731,7 +731,7 @@
Please set your system message:
- Please set your system message:
+ Veuillez définir votre message système :
apps/client/src/app/components/admin-overview/admin-overview.component.ts
184
@@ -739,7 +739,7 @@
User Count
- User Count
+ Nombre d'Utilisateurs
apps/client/src/app/components/admin-overview/admin-overview.html
7
@@ -747,7 +747,7 @@
Activity Count
- Activity Count
+ Nombre d'Activités
apps/client/src/app/components/admin-overview/admin-overview.html
17
@@ -755,7 +755,7 @@
per User
- per User
+ par Utilisateur
apps/client/src/app/components/admin-overview/admin-overview.html
26
@@ -763,7 +763,7 @@
Exchange Rates
- Exchange Rates
+ Taux de Conversion
apps/client/src/app/components/admin-overview/admin-overview.html
31
@@ -771,7 +771,7 @@
Add Currency
- Add Currency
+ Ajouter Devise
apps/client/src/app/components/admin-overview/admin-overview.html
70
@@ -779,7 +779,7 @@
Benchmarks
- Benchmarks
+ Références
apps/client/src/app/components/admin-overview/admin-overview.html
79
@@ -787,7 +787,7 @@
Tags
- Tags
+ Étiquettes
apps/client/src/app/components/admin-overview/admin-overview.html
92
@@ -803,7 +803,7 @@
User Signup
- User Signup
+ Inscription de Nouveaux Utilisateurs
apps/client/src/app/components/admin-overview/admin-overview.html
102
@@ -811,7 +811,7 @@
Read-only Mode
- Read-only Mode
+ Mode Lecture Seule
apps/client/src/app/components/admin-overview/admin-overview.html
112
@@ -819,7 +819,7 @@
System Message
- System Message
+ Message Système
apps/client/src/app/components/admin-overview/admin-overview.html
122
@@ -827,7 +827,7 @@
Set Message
- Set Message
+ Définir Message
apps/client/src/app/components/admin-overview/admin-overview.html
144
@@ -835,7 +835,7 @@
Coupons
- Coupons
+ Codes promotionnels
apps/client/src/app/components/admin-overview/admin-overview.html
152
@@ -843,7 +843,7 @@
Add
- Add
+ Ajouter
apps/client/src/app/components/admin-overview/admin-overview.html
187
@@ -851,7 +851,7 @@
Housekeeping
- Housekeeping
+ Maintenance
apps/client/src/app/components/admin-overview/admin-overview.html
194
@@ -859,7 +859,7 @@
Flush Cache
- Flush Cache
+ Vider le Cache
apps/client/src/app/components/admin-overview/admin-overview.html
198
@@ -867,7 +867,7 @@
Do you really want to delete this user?
- Do you really want to delete this user?
+ Voulez-vous vraiment supprimer cet·te utilisateur·rice ?
apps/client/src/app/components/admin-users/admin-users.component.ts
59
@@ -875,7 +875,7 @@
User
- User
+ Utilisateur
apps/client/src/app/components/admin-users/admin-users.html
9
@@ -887,7 +887,7 @@
Registration
- Registration
+ Inscription
apps/client/src/app/components/admin-users/admin-users.html
11
@@ -895,7 +895,7 @@
Accounts
- Accounts
+ Comptes
apps/client/src/app/components/admin-users/admin-users.html
14
@@ -915,7 +915,7 @@
Engagement per Day
- Engagement per Day
+ Engagement par Jour
apps/client/src/app/components/admin-users/admin-users.html
20
@@ -923,7 +923,7 @@
Last Request
- Last Request
+ Dernière Requête
apps/client/src/app/components/admin-users/admin-users.html
22
@@ -931,7 +931,7 @@
Performance
- Performance
+ Performance
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html
4
@@ -947,7 +947,7 @@
Compare with...
- Compare with...
+ Comparer avec...
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html
18
@@ -955,7 +955,7 @@
Portfolio
- Portfolio
+ Portefeuille
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
101
@@ -967,7 +967,7 @@
Benchmark
- Benchmark
+ Référence
apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
110
@@ -975,7 +975,7 @@
Current Market Mood
- Current Market Mood
+ Sentiment Actuel du Marché
apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html
12
@@ -983,7 +983,7 @@
Overview
- Overview
+ Aperçu
apps/client/src/app/components/header/header.component.html
21
@@ -995,7 +995,7 @@
Portfolio
- Portfolio
+ Portefeuille
apps/client/src/app/components/header/header.component.html
32
@@ -1007,7 +1007,7 @@
Admin Control
- Admin Control
+ Contrôle Administrateur
apps/client/src/app/components/header/header.component.html
55
@@ -1019,7 +1019,7 @@
Resources
- Resources
+ Ressources
apps/client/src/app/components/header/header.component.html
66
@@ -1035,7 +1035,7 @@
Pricing
- Pricing
+ Prix
apps/client/src/app/components/header/header.component.html
80
@@ -1051,7 +1051,7 @@
About
- About
+ À propos
apps/client/src/app/components/header/header.component.html
91
@@ -1063,7 +1063,7 @@
Me
- Me
+ Moi
apps/client/src/app/components/header/header.component.html
127
@@ -1071,7 +1071,7 @@
My Ghostfolio
- My Ghostfolio
+ Mon Ghostfolio
apps/client/src/app/components/header/header.component.html
183
@@ -1079,7 +1079,7 @@
About Ghostfolio
- About Ghostfolio
+ À propos de Ghostfolio
apps/client/src/app/components/header/header.component.html
222
@@ -1087,7 +1087,7 @@
Features
- Features
+ Fonctionnalités
apps/client/src/app/components/header/header.component.html
249
@@ -1095,7 +1095,7 @@
Markets
- Markets
+ Marchés
apps/client/src/app/components/header/header.component.html
283
@@ -1107,7 +1107,7 @@
Sign in
- Sign in
+ Se connecter
apps/client/src/app/components/header/header.component.html
292
@@ -1119,7 +1119,7 @@
Get started
- Get started
+ Démarrer
apps/client/src/app/components/header/header.component.html
300
@@ -1127,7 +1127,7 @@
Sign in
- Sign in
+ Se connecter
apps/client/src/app/components/header/header.component.ts
119
@@ -1139,7 +1139,7 @@
Oops! Incorrect Security Token.
- Oops! Incorrect Security Token.
+ Oups! Jeton de Sécurité Incorrect.
apps/client/src/app/components/header/header.component.ts
133
@@ -1147,7 +1147,7 @@
Manage Activities
- Manage Activities
+ Gérer les Activités
apps/client/src/app/components/home-holdings/home-holdings.html
30
@@ -1159,7 +1159,7 @@
Fear
- Fear
+ Peur
apps/client/src/app/components/home-market/home-market.component.ts
24
@@ -1167,7 +1167,7 @@
Greed
- Greed
+ Avidité
apps/client/src/app/components/home-market/home-market.component.ts
25
@@ -1175,7 +1175,7 @@
Last Days
- Last Days
+ derniers jours
apps/client/src/app/components/home-market/home-market.html
6
@@ -1183,7 +1183,7 @@
This feature requires a subscription.
- This feature requires a subscription.
+ Cette fonctionnalité requiert un Abonnement.
apps/client/src/app/components/home-summary/home-summary.component.ts
112
@@ -1195,7 +1195,7 @@
Upgrade Plan
- Upgrade Plan
+ Mettre à Niveau l'Abonnement
apps/client/src/app/components/home-summary/home-summary.component.ts
114
@@ -1207,7 +1207,7 @@
Summary
- Summary
+ Résumé
apps/client/src/app/components/home-summary/home-summary.html
2
@@ -1215,7 +1215,7 @@
Total Amount
- Total Amount
+ Montant Total
apps/client/src/app/components/investment-chart/investment-chart.component.ts
178
@@ -1223,7 +1223,7 @@
Savings Rate
- Savings Rate
+ Taux d'Épargne
apps/client/src/app/components/investment-chart/investment-chart.component.ts
230
@@ -1231,7 +1231,7 @@
Security Token
- Security Token
+ Jeton de Sécurité
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
10,14
@@ -1243,7 +1243,7 @@
or
- or
+ ou
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
20,22
@@ -1263,7 +1263,7 @@
Sign in with Internet Identity
- Sign in with Internet Identity
+ Se connecter avec Internet Identity
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
30,34
@@ -1271,7 +1271,7 @@
Sign in with Google
- Sign in with Google
+ Se connecter avec Google
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
40,46
@@ -1279,7 +1279,7 @@
Stay signed in
- Stay signed in
+ Rester connecté
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
49,55
@@ -1287,7 +1287,7 @@
Time in Market
- Time in Market
+ Temps sur le Marché
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
3
@@ -1295,7 +1295,7 @@
Buy
- Buy
+ Achat
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
12
@@ -1307,7 +1307,7 @@
Sell
- Sell
+ Vente
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
23
@@ -1319,7 +1319,7 @@
Investment
- Investment
+ Investissement
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
37
@@ -1331,7 +1331,7 @@
Absolute Gross Performance
- Absolute Gross Performance
+ Performance Absolue Brute
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
48
@@ -1339,7 +1339,7 @@
Gross Performance (TWR)
- Gross Performance (TWR)
+ Performance Brute (TWR)
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
59
@@ -1347,7 +1347,7 @@
Fees for
- Fees for
+ Frais pour
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
74,77
@@ -1355,7 +1355,7 @@
{VAR_PLURAL, plural, =1 {transaction} other {transactions}}
- {VAR_PLURAL, plural, =1 {transaction} other {transactions}}
+ {VAR_PLURAL, plural, =1 {transaction} autres {transactions}}
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
75,76
@@ -1363,7 +1363,7 @@
Absolute Net Performance
- Absolute Net Performance
+ Performance Absolue Nette
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
92
@@ -1371,7 +1371,7 @@
Net Performance (TWR)
- Net Performance (TWR)
+ Performance nette (TWR)
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
103
@@ -1379,7 +1379,7 @@
Total Assets
- Total Assets
+ Actifs Totaux
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
119
@@ -1387,7 +1387,7 @@
Valuables
- Valuables
+ Biens
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
131
@@ -1395,7 +1395,7 @@
Emergency Fund
- Emergency Fund
+ Fonds d'Urgence
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
142
@@ -1403,7 +1403,7 @@
Buying Power
- Buying Power
+ Pouvoir d'Achat
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
162
@@ -1411,7 +1411,7 @@
Excluded from Analysis
- Excluded from Analysis
+ Exclus de l'Analyse
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
173
@@ -1419,7 +1419,7 @@
Net Worth
- Net Worth
+ Fortune
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
187
@@ -1427,7 +1427,7 @@
Annualized Performance
- Annualized Performance
+ Performance annualisée
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
198
@@ -1435,7 +1435,7 @@
Dividend
- Dividend
+ Dividende
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
214
@@ -1451,7 +1451,7 @@
Please enter the amount of your emergency fund:
- Please enter the amount of your emergency fund:
+ Veuillez entrer le montant de votre fonds d'urgence :
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
52
@@ -1459,7 +1459,7 @@
Change
- Change
+ Différence
apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html
46
@@ -1467,7 +1467,7 @@
Average Unit Price
- Average Unit Price
+ Prix Unitaire Moyen
apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html
67
@@ -1475,7 +1475,7 @@
Minimum Price
- Minimum Price
+ Prix Minimum
apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html
88
@@ -1483,7 +1483,7 @@
Maximum Price
- Maximum Price
+ Prix Maximum
apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html
99
@@ -1491,7 +1491,7 @@
Quantity
- Quantity
+ Quantité
apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html
109
@@ -1507,7 +1507,7 @@
First Buy Date
- First Buy Date
+ Date du Premier Achat
apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html
129
@@ -1515,7 +1515,7 @@
Transactions
- Transactions
+ Transactions
apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html
138
@@ -1523,7 +1523,7 @@
Report Data Glitch
- Report Data Glitch
+ Signaler une Erreur de Données
apps/client/src/app/components/position/position-detail-dialog/position-detail-dialog.html
249
@@ -1531,7 +1531,7 @@
Today
- Today
+ Aujourd'hui
apps/client/src/app/components/toggle/toggle.component.ts
21
@@ -1539,7 +1539,7 @@
YTD
- YTD
+ CDA
apps/client/src/app/components/toggle/toggle.component.ts
22
@@ -1547,7 +1547,7 @@
1Y
- 1Y
+ 1A
apps/client/src/app/components/toggle/toggle.component.ts
23
@@ -1555,7 +1555,7 @@
5Y
- 5Y
+ 5A
apps/client/src/app/components/toggle/toggle.component.ts
24
@@ -1563,7 +1563,7 @@
Max
- Max
+ Max
apps/client/src/app/components/toggle/toggle.component.ts
25
@@ -1571,7 +1571,7 @@
This feature is currently unavailable.
- This feature is currently unavailable.
+ Cette fonctionnalité est momentanément indisponible.
apps/client/src/app/core/http-response.interceptor.ts
59
@@ -1579,7 +1579,7 @@
Please try again later.
- Please try again later.
+ Veuillez réessayer plus tard.
apps/client/src/app/core/http-response.interceptor.ts
61
@@ -1595,7 +1595,7 @@
Oops! Something went wrong.
- Oops! Something went wrong.
+ Oups! Quelque chose s'est mal passé.
apps/client/src/app/core/http-response.interceptor.ts
86
@@ -1607,7 +1607,7 @@
Okay
- Okay
+ D'accord
apps/client/src/app/core/http-response.interceptor.ts
89
@@ -1619,7 +1619,7 @@
About
- About
+ À propos
apps/client/src/app/pages/about/about-page-routing.module.ts
12
@@ -1627,7 +1627,7 @@
Changelog & License
- Changelog & License
+ Historique des modifications & License
apps/client/src/app/pages/about/changelog/changelog-page-routing.module.ts
12
@@ -1635,7 +1635,7 @@
Changelog
- Changelog
+ Historique des modifications
apps/client/src/app/pages/about/changelog/changelog-page.html
4
@@ -1643,7 +1643,7 @@
License
- License
+ License
apps/client/src/app/pages/about/changelog/changelog-page.html
15
@@ -1651,7 +1651,7 @@
Privacy Policy
- Privacy Policy
+ Politique de Vie Privée
apps/client/src/app/pages/about/privacy-policy/privacy-policy-page-routing.module.ts
12
@@ -1659,7 +1659,7 @@
Privacy Policy
- Privacy Policy
+ Politique de Vie Privée
apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html
4
@@ -1667,7 +1667,7 @@
My Ghostfolio
- My Ghostfolio
+ Mon Ghostfolio
apps/client/src/app/pages/account/account-page-routing.module.ts
12
@@ -1675,7 +1675,7 @@
Auto
- Auto
+ Auto
apps/client/src/app/pages/account/account-page.component.ts
45
@@ -1683,7 +1683,7 @@
Please enter your coupon code:
- Please enter your coupon code:
+ Veuillez entrer votre code promotionnel :
apps/client/src/app/pages/account/account-page.component.ts
236
@@ -1691,7 +1691,7 @@
Could not redeem coupon code
- Could not redeem coupon code
+ Le code promotionnel n'a pas pu être appliqué
apps/client/src/app/pages/account/account-page.component.ts
246
@@ -1699,7 +1699,7 @@
Coupon code has been redeemed
- Coupon code has been redeemed
+ Le code promotionnel a été appliqué
apps/client/src/app/pages/account/account-page.component.ts
258
@@ -1707,7 +1707,7 @@
Reload
- Reload
+ Rafraîchir
apps/client/src/app/pages/account/account-page.component.ts
259
@@ -1715,7 +1715,7 @@
Do you really want to remove this sign in method?
- Do you really want to remove this sign in method?
+ Voulez-vous vraiment supprimer cette méthode de connexion ?
apps/client/src/app/pages/account/account-page.component.ts
305
@@ -1723,7 +1723,7 @@
Account
- Account
+ Compte
apps/client/src/app/pages/account/account-page.html
4
@@ -1739,7 +1739,7 @@
Membership
- Membership
+ Adhésion
apps/client/src/app/pages/account/account-page.html
15
@@ -1747,7 +1747,7 @@
Upgrade
- Upgrade
+ Mettre à niveau
apps/client/src/app/pages/account/account-page.html
37
@@ -1755,7 +1755,7 @@
per year
- per year
+ par an
apps/client/src/app/pages/account/account-page.html
48
@@ -1763,7 +1763,7 @@
Try Premium
- Try Premium
+ Essayer Premium
apps/client/src/app/pages/account/account-page.html
56
@@ -1771,7 +1771,7 @@
Redeem Coupon
- Redeem Coupon
+ Utiliser un Code Promotionnel
apps/client/src/app/pages/account/account-page.html
68
@@ -1779,7 +1779,7 @@
Presenter View
- Presenter View
+ Vue de Présentation
apps/client/src/app/pages/account/account-page.html
75
@@ -1787,7 +1787,7 @@
Hides sensitive values such as absolute performances and quantities.
- Hides sensitive values such as absolute performances and quantities.
+ Masque les données sensibles telles que la performance absolue et les quantités.
apps/client/src/app/pages/account/account-page.html
76,79
@@ -1795,7 +1795,7 @@
Base Currency
- Base Currency
+ Devise de Base
apps/client/src/app/pages/account/account-page.html
94
@@ -1803,7 +1803,7 @@
Language
- Language
+ Langue
apps/client/src/app/pages/account/account-page.html
118
@@ -1811,7 +1811,7 @@
Community
- Community
+ Communauté
apps/client/src/app/pages/account/account-page.html
135
@@ -1827,7 +1827,7 @@
Locale
- Locale
+ Paramètres régionaux
apps/client/src/app/pages/account/account-page.html
160
@@ -1835,7 +1835,7 @@
Date and number format
- Date and number format
+ Format de date et d'heure
apps/client/src/app/pages/account/account-page.html
162
@@ -1843,7 +1843,7 @@
Appearance
- Appearance
+ Apparence
apps/client/src/app/pages/account/account-page.html
188
@@ -1851,7 +1851,7 @@
Auto
- Auto
+ Auto
apps/client/src/app/pages/account/account-page.html
203
@@ -1859,7 +1859,7 @@
Light
- Light
+ Clair
apps/client/src/app/pages/account/account-page.html
204
@@ -1867,7 +1867,7 @@
Dark
- Dark
+ Sombre
apps/client/src/app/pages/account/account-page.html
205
@@ -1875,7 +1875,7 @@
Zen Mode
- Zen Mode
+ Mode Zen
apps/client/src/app/pages/account/account-page.html
214
@@ -1883,7 +1883,7 @@
Sign in with fingerprint
- Sign in with fingerprint
+ Se connecter avec empreinte
apps/client/src/app/pages/account/account-page.html
226
@@ -1891,7 +1891,7 @@
Experimental Features
- Experimental Features
+ Fonctionnalités expérimentales
apps/client/src/app/pages/account/account-page.html
241
@@ -1899,7 +1899,7 @@
User ID
- User ID
+ ID d'utilisateur
apps/client/src/app/pages/account/account-page.html
253
@@ -1907,7 +1907,7 @@
Granted Access
- Granted Access
+ Accès donné
apps/client/src/app/pages/account/account-page.html
262
@@ -1915,7 +1915,7 @@
Grant access
- Grant access
+ Donner accès
apps/client/src/app/pages/account/create-or-update-access-dialog/create-or-update-access-dialog.html
2
@@ -1923,7 +1923,7 @@
Public
- Public
+ Public
apps/client/src/app/pages/account/create-or-update-access-dialog/create-or-update-access-dialog.html
19
@@ -1931,7 +1931,7 @@
Accounts
- Accounts
+ Comptes
apps/client/src/app/pages/accounts/accounts-page-routing.module.ts
12
@@ -1939,7 +1939,7 @@
Update account
- Update account
+ Mettre à jour compte
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
2
@@ -1947,7 +1947,7 @@
Add account
- Add account
+ Ajouter compte
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
3
@@ -1955,7 +1955,7 @@
Cash
- Cash
+ Cash
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
15
@@ -1963,7 +1963,7 @@
Securities
- Securities
+ Titres
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
16
@@ -1971,7 +1971,7 @@
Account ID
- Account ID
+ ID du compte
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html
63
@@ -1979,7 +1979,7 @@
Jobs
- Jobs
+ Tâches
apps/client/src/app/pages/admin/admin-page-routing.module.ts
16
@@ -1987,7 +1987,7 @@
Market Data
- Market Data
+ Données de Marché
apps/client/src/app/pages/admin/admin-page-routing.module.ts
20
@@ -1995,7 +1995,7 @@
Admin Control
- Admin Control
+ Contrôle Admin
apps/client/src/app/pages/admin/admin-page-routing.module.ts
25
@@ -2003,7 +2003,7 @@
Users
- Users
+ Utilisateurs
apps/client/src/app/pages/admin/admin-page-routing.module.ts
27
@@ -2011,7 +2011,7 @@
Blog
- Blog
+ Blog
apps/client/src/app/pages/blog/blog-page-routing.module.ts
12
@@ -2019,7 +2019,7 @@
Blog
- Blog
+ Blog
apps/client/src/app/pages/blog/blog-page.html
4
@@ -2027,7 +2027,7 @@
As you are already logged in, you cannot access the demo account.
- As you are already logged in, you cannot access the demo account.
+ Puisque vous êtes déjà connecté·e, vous ne pouvez pas accéder au compte de démonstration.
apps/client/src/app/pages/demo/demo-page.component.ts
31
@@ -2035,7 +2035,7 @@
FAQ
- FAQ
+ FAQ
apps/client/src/app/pages/faq/faq-page-routing.module.ts
12
@@ -2043,7 +2043,7 @@
Features
- Features
+ Fonctionnalités
apps/client/src/app/pages/features/features-page-routing.module.ts
12
@@ -2051,7 +2051,7 @@
Holdings
- Holdings
+ Positions
apps/client/src/app/pages/home/home-page-routing.module.ts
23
@@ -2063,7 +2063,7 @@
Summary
- Summary
+ Résumé
apps/client/src/app/pages/home/home-page-routing.module.ts
28
@@ -2071,7 +2071,7 @@
Markets
- Markets
+ Marchés
apps/client/src/app/pages/home/home-page-routing.module.ts
33
@@ -2083,7 +2083,7 @@
Activities
- Activities
+ Activités
apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts
12
@@ -2091,7 +2091,7 @@
Update activity
- Update activity
+ Mettre à jour activité
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
7,8
@@ -2099,7 +2099,7 @@
Add activity
- Add activity
+ Ajouter activité
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
8,11
@@ -2107,7 +2107,7 @@
Item
- Item
+ Bien
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
16,18
@@ -2115,7 +2115,7 @@
Name, symbol or ISIN
- Name, symbol or ISIN
+ Nom, symbole, ou ISIN
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
37,40
@@ -2123,7 +2123,7 @@
Unit Price
- Unit Price
+ Prix Unitaire
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
118,121
@@ -2135,7 +2135,7 @@
Fee
- Fee
+ Frais
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
139,140
@@ -2151,7 +2151,7 @@
Importing data...
- Importing data...
+ Import des données...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
48
@@ -2159,7 +2159,7 @@
Import has been completed
- Import has been completed
+ L'import est terminé
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
55,54
@@ -2167,7 +2167,7 @@
Validating data...
- Validating data...
+ Validation des données...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
86
@@ -2175,7 +2175,7 @@
Choose File
- Choose File
+ Choisir Fichier
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
18,21
@@ -2183,7 +2183,7 @@
The following file formats are supported:
- The following file formats are supported:
+ Les formats de fichier suivants sont supportés :
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
21,23
@@ -2191,7 +2191,7 @@
Back
- Back
+ Retour
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
79,83
@@ -2199,7 +2199,7 @@
Import
- Import
+ Importer
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
94,99
@@ -2207,7 +2207,7 @@
Allocations
- Allocations
+ Répartitions
apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts
12
@@ -2215,7 +2215,7 @@
Initial
- Initial
+ Initial
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
58
@@ -2223,7 +2223,7 @@
Current
- Current
+ Actuel
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
59
@@ -2231,7 +2231,7 @@
Filter by account or tag...
- Filter by account or tag...
+ Filtrer par compte ou étiquette...
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
136
@@ -2247,7 +2247,7 @@
Allocations
- Allocations
+ Répartitions
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
4
@@ -2255,7 +2255,7 @@
Proportion of Net Worth
- Proportion of Net Worth
+ Proportion de votre Fortune
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
18
@@ -2263,7 +2263,7 @@
By Account
- By Account
+ Par Compte
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
41
@@ -2271,7 +2271,7 @@
By Currency
- By Currency
+ Par Devise
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
67
@@ -2279,7 +2279,7 @@
By Asset Class
- By Asset Class
+ Par Classe d'Actifs
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
96
@@ -2287,7 +2287,7 @@
By Holding
- By Holding
+ Par Position
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
125
@@ -2295,7 +2295,7 @@
By Sector
- By Sector
+ Par Secteur
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
154
@@ -2303,7 +2303,7 @@
By Continent
- By Continent
+ Par Continent
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
184
@@ -2311,7 +2311,7 @@
By Country
- By Country
+ Par Pays
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
213
@@ -2319,7 +2319,7 @@
Regions
- Regions
+ Régions
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
245
@@ -2331,7 +2331,7 @@
Developed Markets
- Developed Markets
+ Marchés Développés
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
271
@@ -2343,7 +2343,7 @@
Emerging Markets
- Emerging Markets
+ Marchés Émergents
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
280
@@ -2355,7 +2355,7 @@
Other Markets
- Other Markets
+ Autres marchés
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
289
@@ -2367,7 +2367,7 @@
Analysis
- Analysis
+ Analyse
apps/client/src/app/pages/portfolio/analysis/analysis-page-routing.module.ts
12
@@ -2375,7 +2375,7 @@
Dividend
- Dividend
+ Dividende
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
43
@@ -2383,7 +2383,7 @@
Deposit
- Deposit
+ Dépôt
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
48
@@ -2399,7 +2399,7 @@
Monthly
- Monthly
+ Mensuel
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
54
@@ -2407,7 +2407,7 @@
Analysis
- Analysis
+ Analyse
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
2
@@ -2415,7 +2415,7 @@
Top
- Top
+ Haut
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
40
@@ -2423,7 +2423,7 @@
Bottom
- Bottom
+ Bas
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
86
@@ -2431,7 +2431,7 @@
Portfolio Evolution
- Portfolio Evolution
+ Évolution du Portefeuille
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
136
@@ -2439,7 +2439,7 @@
Investment Timeline
- Investment Timeline
+ Historique des Investissements
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
166
@@ -2447,7 +2447,7 @@
Dividend Timeline
- Dividend Timeline
+ Historique des Dividendes
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
203
@@ -2455,7 +2455,7 @@
FIRE
- FIRE
+ FIRE
apps/client/src/app/pages/portfolio/fire/fire-page-routing.module.ts
12
@@ -2463,7 +2463,7 @@
FIRE
- FIRE
+ FIRE
apps/client/src/app/pages/portfolio/fire/fire-page.html
4
@@ -2471,7 +2471,7 @@
Calculator
- Calculator
+ Calculatrice
apps/client/src/app/pages/portfolio/fire/fire-page.html
7
@@ -2479,7 +2479,7 @@
4% Rule
- 4% Rule
+ Règle des 4%
apps/client/src/app/pages/portfolio/fire/fire-page.html
28
@@ -2487,7 +2487,7 @@
If you retire today, you would be able to withdraw per year or per month , based on your total assets of and a withdrawal rate of 4%.
- If you retire today, you would be able to withdraw per year or per month , based on your total assets of and a withdrawal rate of 4%.
+ Si vous prenez votre retraite aujourd'hui, vous pourriez retirer par an ou par mois , sur base de vos actifs totaux de et un taux de retrait de 4%.
apps/client/src/app/pages/portfolio/fire/fire-page.html
51,79
@@ -2495,7 +2495,7 @@
Holdings
- Holdings
+ Positions
apps/client/src/app/pages/portfolio/holdings/holdings-page.html
4
@@ -2507,7 +2507,7 @@
Pricing
- Pricing
+ Prix
apps/client/src/app/pages/pricing/pricing-page-routing.module.ts
12
@@ -2515,7 +2515,7 @@
Hello, has shared a Portfolio with you!
- Hello, has shared a Portfolio with you!
+ Bonjour, a partagé un Portefeuille avec vous !
apps/client/src/app/pages/public/public-page.html
4,7
@@ -2523,7 +2523,7 @@
Currencies
- Currencies
+ Devises
apps/client/src/app/pages/public/public-page.html
30
@@ -2531,7 +2531,7 @@
Continents
- Continents
+ Continents
apps/client/src/app/pages/public/public-page.html
60
@@ -2539,7 +2539,7 @@
Ghostfolio empowers you to keep track of your wealth.
- Ghostfolio empowers you to keep track of your wealth.
+ Ghostfolio vous aide à garder un aperçu de votre patrimoine.
apps/client/src/app/pages/public/public-page.html
132,134
@@ -2547,7 +2547,7 @@
Get Started
- Get Started
+ Démarrer
apps/client/src/app/pages/public/public-page.html
137
@@ -2555,7 +2555,7 @@
Registration
- Registration
+ Enregistrement
apps/client/src/app/pages/register/register-page-routing.module.ts
12
@@ -2563,7 +2563,7 @@
Create Account
- Create Account
+ Creér Compte
apps/client/src/app/pages/register/register-page.html
27,29
@@ -2575,7 +2575,7 @@
Continue with Internet Identity
- Continue with Internet Identity
+ Continue avec Internet Identity
apps/client/src/app/pages/register/register-page.html
41,44
@@ -2583,7 +2583,7 @@
Continue with Google
- Continue with Google
+ Continuer avec Google
apps/client/src/app/pages/register/register-page.html
51,56
@@ -2591,7 +2591,7 @@
Copy to clipboard
- Copy to clipboard
+ Copier vers le presse-papier
apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html
26
@@ -2599,7 +2599,7 @@
I agree to have stored my Security Token from above in a secure place. If I lose it, I cannot get my account back.
- I agree to have stored my Security Token from above in a secure place. If I lose it, I cannot get my account back.
+ Je certifie avoir sauvé mon Jeton de Sécurité ci-dessus dans un endroit sûr. Si je le perds, je ne pourrai pas récupérer mon compte.
apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html
31,34
@@ -2607,7 +2607,7 @@
Agree and continue
- Agree and continue
+ Accepter et continuer
apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html
44
@@ -2615,7 +2615,7 @@
Resources
- Resources
+ Ressources
apps/client/src/app/pages/resources/resources-page-routing.module.ts
12
@@ -2623,7 +2623,7 @@
Oops, authentication has failed.
- Oops, authentication has failed.
+ Oups, l'identification a échoué.
apps/client/src/app/pages/webauthn/webauthn-page.html
18
@@ -2631,7 +2631,7 @@
Try again
- Try again
+ Essayer à nouveau
apps/client/src/app/pages/webauthn/webauthn-page.html
26
@@ -2639,7 +2639,7 @@
Go back to Home Page
- Go back to Home Page
+ Retour à la Page d'Accueil
apps/client/src/app/pages/webauthn/webauthn-page.html
30
@@ -2647,7 +2647,7 @@
Overview
- Overview
+ Aperçu
apps/client/src/app/pages/zen/zen-page-routing.module.ts
19
@@ -2655,7 +2655,7 @@
Draft
- Draft
+ Brouillon
libs/ui/src/lib/activities-table/activities-table.component.html
125
@@ -2663,7 +2663,7 @@
Import Activities
- Import Activities
+ Importer Activités
libs/ui/src/lib/activities-table/activities-table.component.html
389
@@ -2671,7 +2671,7 @@
Export Activities
- Export Activities
+ Exporter Activités
libs/ui/src/lib/activities-table/activities-table.component.html
399
@@ -2679,7 +2679,7 @@
Export Drafts as ICS
- Export Drafts as ICS
+ Exporter Brouillons sous ICS
libs/ui/src/lib/activities-table/activities-table.component.html
409
@@ -2687,7 +2687,7 @@
Clone
- Clone
+ Dupliquer
libs/ui/src/lib/activities-table/activities-table.component.html
430
@@ -2695,7 +2695,7 @@
Export Draft as ICS
- Export Draft as ICS
+ Exporter Brouillon sous ICS
libs/ui/src/lib/activities-table/activities-table.component.html
438
@@ -2703,7 +2703,7 @@
Do you really want to delete this activity?
- Do you really want to delete this activity?
+ Voulez-vous vraiment supprimer cette activité ?
libs/ui/src/lib/activities-table/activities-table.component.ts
196
@@ -2711,7 +2711,7 @@
Filter by account, currency, symbol or type...
- Filter by account, currency, symbol or type...
+ Filtrer par compte, devise, symbole, ou type...
libs/ui/src/lib/activities-table/activities-table.component.ts
376
@@ -2719,7 +2719,7 @@
Index
- Index
+ Indice
libs/ui/src/lib/benchmark/benchmark.component.html
3
@@ -2727,7 +2727,7 @@
Change from All Time High
- Change from All Time High
+ Différence avec le Record Historique
libs/ui/src/lib/benchmark/benchmark.component.html
12
@@ -2735,7 +2735,7 @@
from ATH
- from ATH
+ par rapport au record historique
libs/ui/src/lib/benchmark/benchmark.component.html
14
@@ -2743,7 +2743,7 @@
Savings Rate
- Savings Rate
+ Taux d'Épargne
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
10
@@ -2751,7 +2751,7 @@
per month
- per month
+ par mois
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
17
@@ -2759,7 +2759,7 @@
Investment Horizon
- Investment Horizon
+ Horizon d'Investissement
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
21
@@ -2767,7 +2767,7 @@
years
- years
+ années
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
23
@@ -2775,7 +2775,7 @@
Annual Interest Rate
- Annual Interest Rate
+ Taux d'Intérêt Annuel
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
27
@@ -2783,7 +2783,7 @@
Projected Total Amount
- Projected Total Amount
+ Montant Total Prévu
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
44
@@ -2791,7 +2791,7 @@
Interest
- Interest
+ Intérêt
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
291
@@ -2799,7 +2799,7 @@
Savings
- Savings
+ Épargne
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
301
@@ -2807,7 +2807,7 @@
Allocation
- Allocation
+ Part
libs/ui/src/lib/holdings-table/holdings-table.component.html
95
@@ -2815,7 +2815,7 @@
Show all
- Show all
+ Montrer tout
libs/ui/src/lib/holdings-table/holdings-table.component.html
171
@@ -2823,7 +2823,7 @@
Account
- Account
+ Compte
libs/ui/src/lib/i18n.ts
4
@@ -2831,7 +2831,7 @@
Asset Class
- Asset Class
+ Classe d'Actifs
libs/ui/src/lib/i18n.ts
5
@@ -2839,7 +2839,7 @@
Asset Sub Class
- Asset Sub Class
+ Sous-classe d'Actifs
libs/ui/src/lib/i18n.ts
6
@@ -2847,15 +2847,15 @@
Emergency Fund
- Emergency Fund
+ Fonds d'Urgence
libs/ui/src/lib/i18n.ts
7
Other
- Other
+ Autre
libs/ui/src/lib/i18n.ts
8
@@ -2867,7 +2867,7 @@
Securities
- Securities
+ Titres
libs/ui/src/lib/i18n.ts
9
@@ -2875,7 +2875,7 @@
Symbol
- Symbol
+ Symbole
libs/ui/src/lib/i18n.ts
10
@@ -2883,7 +2883,7 @@
Tag
- Tag
+ Étiquette
libs/ui/src/lib/i18n.ts
11
@@ -2891,7 +2891,7 @@
Cash
- Cash
+ Cash
libs/ui/src/lib/i18n.ts
14
@@ -2899,7 +2899,7 @@
Commodity
- Commodity
+ Marchandise
libs/ui/src/lib/i18n.ts
15
@@ -2907,7 +2907,7 @@
Equity
- Equity
+ Capital
libs/ui/src/lib/i18n.ts
16
@@ -2915,7 +2915,7 @@
Fixed Income
- Fixed Income
+ Revenu Fixe
libs/ui/src/lib/i18n.ts
17
@@ -2923,7 +2923,7 @@
Real Estate
- Real Estate
+ Immobilier
libs/ui/src/lib/i18n.ts
18
@@ -2931,7 +2931,7 @@
Bond
- Bond
+ Obligation
libs/ui/src/lib/i18n.ts
21
@@ -2939,7 +2939,7 @@
Cryptocurrency
- Cryptocurrency
+ Cryptomonnaie
libs/ui/src/lib/i18n.ts
22
@@ -2947,7 +2947,7 @@
ETF
- ETF
+ ETF
libs/ui/src/lib/i18n.ts
23
@@ -2955,7 +2955,7 @@
Mutual Fund
- Mutual Fund
+ SICAV
libs/ui/src/lib/i18n.ts
24
@@ -2963,7 +2963,7 @@
Precious Metal
- Precious Metal
+ Métal Précieux
libs/ui/src/lib/i18n.ts
25
@@ -2971,7 +2971,7 @@
Private Equity
- Private Equity
+ Capital Propre
libs/ui/src/lib/i18n.ts
26
@@ -2979,7 +2979,7 @@
Stock
- Stock
+ Action
libs/ui/src/lib/i18n.ts
27
@@ -2987,7 +2987,7 @@
Africa
- Africa
+ Afrique
libs/ui/src/lib/i18n.ts
30
@@ -2995,7 +2995,7 @@
Asia
- Asia
+ Asie
libs/ui/src/lib/i18n.ts
31
@@ -3003,7 +3003,7 @@
Europe
- Europe
+ Europe
libs/ui/src/lib/i18n.ts
32
@@ -3011,7 +3011,7 @@
North America
- North America
+ Amérique du Nord
libs/ui/src/lib/i18n.ts
33
@@ -3019,7 +3019,7 @@
Oceania
- Oceania
+ Océanie
libs/ui/src/lib/i18n.ts
34
@@ -3027,7 +3027,7 @@
South America
- South America
+ Amérique du Sud
libs/ui/src/lib/i18n.ts
35
@@ -3035,7 +3035,7 @@
Time to add your first activity.
- Time to add your first activity.
+ Il est temps d'ajouter votre première activité.
libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html
12
@@ -3043,7 +3043,7 @@
No data available
- No data available
+ Pas de données disponibles
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
371
From 3f2d3a2da9a9b0ad20f94f3b7ad9f5c94b92fbe5 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 11 Jan 2023 19:45:44 +0100
Subject: [PATCH 12/19] Minor improvements (#1589)
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 675a5a48f..f09dd7541 100644
--- a/README.md
+++ b/README.md
@@ -167,9 +167,9 @@ Please follow the instructions of the Ghostfolio [Unraid Community App](https://
#### Debug
-Run `yarn watch:server` and click "Launch program" in [Visual Studio Code](https://code.visualstudio.com)
+Run `yarn watch:server` and click _Launch Program_ in [Visual Studio Code](https://code.visualstudio.com)
-##### Serve
+#### Serve
Run `yarn start:server`
From a7e5a316be75e03878d1b9023b880c936611ce0d Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 11 Jan 2023 19:59:13 +0100
Subject: [PATCH 13/19] Bugfix/fix big.js exception in report endpoint (#1586)
* Fix exception with missing marketPrice
* Update changelog
---
CHANGELOG.md | 4 +++
.../src/app/portfolio/portfolio.service.ts | 25 +++++++++++++------
.../base-currency-current-investment.ts | 7 +++---
.../base-currency-initial-investment.ts | 7 +++---
.../current-investment.ts | 9 +++----
.../initial-investment.ts | 7 +++---
6 files changed, 34 insertions(+), 25 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ce50bb067..5eb0f323c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Improved the form of the import dividends dialog (disable while loading)
- Removed the deprecated `~` in _Sass_ imports
+### Fixed
+
+- Fixed an exception in the _X-ray_ section
+
## 1.225.0 - 2023-01-07
### Added
diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts
index 37fae84d7..f752010b3 100644
--- a/apps/api/src/app/portfolio/portfolio.service.ts
+++ b/apps/api/src/app/portfolio/portfolio.service.ts
@@ -910,12 +910,14 @@ export class PortfolioService {
const positions = currentPositions.positions.filter(
(item) => !item.quantity.eq(0)
);
+
const dataGatheringItem = positions.map((position) => {
return {
dataSource: position.dataSource,
symbol: position.symbol
};
});
+
const symbols = positions.map((position) => position.symbol);
const [dataProviderResponses, symbolProfiles] = await Promise.all([
@@ -1103,16 +1105,23 @@ export class PortfolioService {
portfolioStart
);
+ const positions = currentPositions.positions.filter(
+ (item) => !item.quantity.eq(0)
+ );
+
const portfolioItemsNow: { [symbol: string]: TimelinePosition } = {};
- for (const position of currentPositions.positions) {
+
+ for (const position of positions) {
portfolioItemsNow[position.symbol] = position;
}
+
const accounts = await this.getValueOfAccounts({
orders,
portfolioItemsNow,
- userId,
- userCurrency
+ userCurrency,
+ userId
});
+
return {
rules: {
accountClusterRisk: await this.rulesService.evaluate(
@@ -1136,19 +1145,19 @@ export class PortfolioService {
[
new CurrencyClusterRiskBaseCurrencyInitialInvestment(
this.exchangeRateDataService,
- currentPositions
+ positions
),
new CurrencyClusterRiskBaseCurrencyCurrentInvestment(
this.exchangeRateDataService,
- currentPositions
+ positions
),
new CurrencyClusterRiskInitialInvestment(
this.exchangeRateDataService,
- currentPositions
+ positions
),
new CurrencyClusterRiskCurrentInvestment(
this.exchangeRateDataService,
- currentPositions
+ positions
)
],
this.request.user.Settings.settings
@@ -1682,7 +1691,7 @@ export class PortfolioService {
for (const order of ordersByAccount) {
let currentValueOfSymbolInBaseCurrency =
order.quantity *
- portfolioItemsNow[order.SymbolProfile.symbol].marketPrice;
+ portfolioItemsNow[order.SymbolProfile.symbol]?.marketPrice ?? 0;
let originalValueOfSymbolInBaseCurrency =
this.exchangeRateDataService.toCurrency(
order.quantity * order.unitPrice,
diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
index 5f1f4cf93..1d584b04f 100644
--- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
+++ b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts
@@ -1,14 +1,13 @@
-import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface';
import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service';
-import { UserSettings } from '@ghostfolio/common/interfaces';
+import { TimelinePosition, UserSettings } from '@ghostfolio/common/interfaces';
import { Rule } from '../../rule';
export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule {
public constructor(
protected exchangeRateDataService: ExchangeRateDataService,
- private currentPositions: CurrentPositions
+ private positions: TimelinePosition[]
) {
super(exchangeRateDataService, {
name: 'Current Investment: Base Currency'
@@ -17,7 +16,7 @@ export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule {
public constructor(
protected exchangeRateDataService: ExchangeRateDataService,
- private currentPositions: CurrentPositions
+ private positions: TimelinePosition[]
) {
super(exchangeRateDataService, {
name: 'Initial Investment: Base Currency'
@@ -17,7 +16,7 @@ export class CurrencyClusterRiskBaseCurrencyInitialInvestment extends Rule {
public constructor(
- public exchangeRateDataService: ExchangeRateDataService,
- private currentPositions: CurrentPositions
+ protected exchangeRateDataService: ExchangeRateDataService,
+ private positions: TimelinePosition[]
) {
super(exchangeRateDataService, {
name: 'Current Investment'
@@ -17,7 +16,7 @@ export class CurrencyClusterRiskCurrentInvestment extends Rule {
public evaluate(ruleSettings: Settings) {
const positionsGroupedByCurrency = this.groupCurrentPositionsByAttribute(
- this.currentPositions.positions,
+ this.positions,
'currency',
ruleSettings.baseCurrency
);
diff --git a/apps/api/src/models/rules/currency-cluster-risk/initial-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/initial-investment.ts
index 331074f16..18477f6f7 100644
--- a/apps/api/src/models/rules/currency-cluster-risk/initial-investment.ts
+++ b/apps/api/src/models/rules/currency-cluster-risk/initial-investment.ts
@@ -1,14 +1,13 @@
-import { CurrentPositions } from '@ghostfolio/api/app/portfolio/interfaces/current-positions.interface';
import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data.service';
-import { UserSettings } from '@ghostfolio/common/interfaces';
+import { TimelinePosition, UserSettings } from '@ghostfolio/common/interfaces';
import { Rule } from '../../rule';
export class CurrencyClusterRiskInitialInvestment extends Rule {
public constructor(
protected exchangeRateDataService: ExchangeRateDataService,
- private currentPositions: CurrentPositions
+ private positions: TimelinePosition[]
) {
super(exchangeRateDataService, {
name: 'Initial Investment'
@@ -17,7 +16,7 @@ export class CurrencyClusterRiskInitialInvestment extends Rule {
public evaluate(ruleSettings: Settings) {
const positionsGroupedByCurrency = this.groupCurrentPositionsByAttribute(
- this.currentPositions.positions,
+ this.positions,
'currency',
ruleSettings.baseCurrency
);
From 7ab699e5fe3b2ae3a2025a0bc79e40d5dec80e31 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 11 Jan 2023 19:59:41 +0100
Subject: [PATCH 14/19] Feature/uncover french translation feature (#1590)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Uncover Français
* Update changelog
---
CHANGELOG.md | 1 +
apps/client/src/app/pages/features/features-page.html | 3 +--
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5eb0f323c..319a661bb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
+- Added the language localization for Français (`fr`)
- Extended the landing page by a global heat map of subscribers
- Added support for the thousand separator in the global heat map component
diff --git a/apps/client/src/app/pages/features/features-page.html b/apps/client/src/app/pages/features/features-page.html
index 88a36f8af..05cdd8454 100644
--- a/apps/client/src/app/pages/features/features-page.html
+++ b/apps/client/src/app/pages/features/features-page.html
@@ -197,8 +197,7 @@
Multi-Language
- Use Ghostfolio in multiple languages: English,
- Dutch, Français ,
+ Use Ghostfolio in multiple languages: English, Dutch, Français,
German, Italian, Portuguese
From 6b022b8de8877d5dc6a6a9ed7d4898881b59aa21 Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Wed, 11 Jan 2023 20:10:57 +0100
Subject: [PATCH 15/19] Extract locales (#1591)
---
apps/client/src/locales/messages.de.xlf | 90 +++++++++-----
apps/client/src/locales/messages.es.xlf | 90 +++++++++-----
apps/client/src/locales/messages.fr.xlf | 151 +++++++++++++++---------
apps/client/src/locales/messages.it.xlf | 90 +++++++++-----
apps/client/src/locales/messages.nl.xlf | 90 +++++++++-----
apps/client/src/locales/messages.pt.xlf | 90 +++++++++-----
apps/client/src/locales/messages.xlf | 86 +++++++++-----
7 files changed, 467 insertions(+), 220 deletions(-)
diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf
index 3bbf3db34..558f53694 100644
--- a/apps/client/src/locales/messages.de.xlf
+++ b/apps/client/src/locales/messages.de.xlf
@@ -182,7 +182,7 @@
libs/ui/src/lib/activities-table/activities-table.component.html
- 426
+ 434
@@ -202,7 +202,7 @@
libs/ui/src/lib/activities-table/activities-table.component.html
- 442
+ 450
@@ -386,7 +386,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 87,91
+ 116,120
apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html
@@ -894,7 +894,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 27,29
+ 54,56
apps/client/src/app/pages/register/register-page.html
@@ -1262,7 +1262,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 66,62
+ 107,103
@@ -1974,7 +1974,7 @@
Daten importieren...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 48
+ 89
@@ -1982,7 +1982,7 @@
Der Import wurde abgeschlossen
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 55,54
+ 96,95
@@ -2130,7 +2130,7 @@
Aktivitäten exportieren
libs/ui/src/lib/activities-table/activities-table.component.html
- 399
+ 407
@@ -2138,7 +2138,7 @@
Geplante Aktivitäten als ICS exportieren
libs/ui/src/lib/activities-table/activities-table.component.html
- 409
+ 417
@@ -2146,7 +2146,7 @@
Kopieren
libs/ui/src/lib/activities-table/activities-table.component.html
- 430
+ 438
@@ -2154,7 +2154,7 @@
Geplante Aktivität als ICS exportieren
libs/ui/src/lib/activities-table/activities-table.component.html
- 438
+ 446
@@ -2162,7 +2162,7 @@
Möchtest du diese Aktivität wirklich löschen?
libs/ui/src/lib/activities-table/activities-table.component.ts
- 196
+ 198
@@ -2274,7 +2274,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 65,62
+ 106,103
@@ -2286,7 +2286,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 63
+ 104
@@ -2378,7 +2378,7 @@
Entwickelte Länder
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
- 271
+ 272
apps/client/src/app/pages/public/public-page.html
@@ -2390,7 +2390,7 @@
Schwellenländer
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
- 280
+ 281
apps/client/src/app/pages/public/public-page.html
@@ -2402,7 +2402,7 @@
Andere Länder
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
- 289
+ 290
apps/client/src/app/pages/public/public-page.html
@@ -2458,7 +2458,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 59
+ 60
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
@@ -2526,11 +2526,11 @@
Filtern nach Konto oder Tag...
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
- 136
+ 137
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 111
+ 123
apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts
@@ -2542,7 +2542,7 @@
Filtern nach Konto, Währung, Symbol oder Typ...
libs/ui/src/lib/activities-table/activities-table.component.ts
- 376
+ 387
@@ -2690,7 +2690,7 @@
Sparrate
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 230
+ 239
@@ -2906,7 +2906,7 @@
Datei auswählen
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 18,21
+ 43,46
@@ -2914,7 +2914,7 @@
Folgende Dateiformate werden unterstützt:
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 21,23
+ 47,50
@@ -2922,7 +2922,7 @@
Zurück
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 79,83
+ 108,112
@@ -2932,6 +2932,10 @@
apps/client/src/app/pages/account/account-page.html
135
+
+ apps/client/src/app/pages/account/account-page.html
+ 139
+
apps/client/src/app/pages/account/account-page.html
143
@@ -3002,7 +3006,7 @@
Daten validieren...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 86
+ 147
@@ -3010,7 +3014,7 @@
Importieren
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 94,99
+ 123,128
@@ -3053,6 +3057,38 @@
28
+
+ Holding
+ Position
+
+ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
+ 13,15
+
+
+
+ Load Dividends
+ Dividenden laden
+
+ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
+ 29,33
+
+
+
+ Yearly
+ Jährlich
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
+ 55
+
+
+
+ Import Dividends
+ Dividenden importieren
+
+ libs/ui/src/lib/activities-table/activities-table.component.html
+ 397
+
+
The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term.
- Le risque de perte en investissant peut être important. Il est déconseillé d'investir de l'argent dont vous pourriez avoir besoin à court terme.
+ Le risque de perte en investissant peut être important. Il est déconseillé d'investir de l'argent dont vous pourriez avoir besoin à court terme.
apps/client/src/app/app.component.html
56,57
@@ -242,7 +242,7 @@
libs/ui/src/lib/activities-table/activities-table.component.html
- 426
+ 434
@@ -262,7 +262,7 @@
libs/ui/src/lib/activities-table/activities-table.component.html
- 442
+ 450
@@ -347,7 +347,7 @@
Asset Profile
- Profil d'Actifs
+ Profil d'Actifs
apps/client/src/app/components/admin-jobs/admin-jobs.html
58
@@ -446,7 +446,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 87,91
+ 116,120
apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html
@@ -487,7 +487,7 @@
Asset Class
- Classe d'Actifs
+ Classe d'Actifs
apps/client/src/app/components/admin-market-data/admin-market-data.html
42
@@ -507,7 +507,7 @@
Asset Sub Class
- Sous-classe d'Actifs
+ Sous-classe d'Actifs
apps/client/src/app/components/admin-market-data/admin-market-data.html
51
@@ -543,7 +543,7 @@
Activities Count
- Nombre d'Activités
+ Nombre d'Activités
apps/client/src/app/components/admin-market-data/admin-market-data.html
69
@@ -739,7 +739,7 @@
User Count
- Nombre d'Utilisateurs
+ Nombre d'Utilisateurs
apps/client/src/app/components/admin-overview/admin-overview.html
7
@@ -747,7 +747,7 @@
Activity Count
- Nombre d'Activités
+ Nombre d'Activités
apps/client/src/app/components/admin-overview/admin-overview.html
17
@@ -1195,7 +1195,7 @@
Upgrade Plan
- Mettre à Niveau l'Abonnement
+ Mettre à Niveau l'Abonnement
apps/client/src/app/components/home-summary/home-summary.component.ts
114
@@ -1223,10 +1223,10 @@
Savings Rate
- Taux d'Épargne
+ Taux d'Épargne
apps/client/src/app/components/investment-chart/investment-chart.component.ts
- 230
+ 239
@@ -1250,7 +1250,7 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 27,29
+ 54,56
apps/client/src/app/pages/register/register-page.html
@@ -1395,7 +1395,7 @@
Emergency Fund
- Fonds d'Urgence
+ Fonds d'Urgence
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
142
@@ -1403,7 +1403,7 @@
Buying Power
- Pouvoir d'Achat
+ Pouvoir d'Achat
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
162
@@ -1411,7 +1411,7 @@
Excluded from Analysis
- Exclus de l'Analyse
+ Exclus de l'Analyse
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html
173
@@ -1451,7 +1451,7 @@
Please enter the amount of your emergency fund:
- Veuillez entrer le montant de votre fonds d'urgence :
+ Veuillez entrer le montant de votre fonds d'urgence :
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
52
@@ -1531,7 +1531,7 @@
Today
- Aujourd'hui
+ Aujourd'hui
apps/client/src/app/components/toggle/toggle.component.ts
21
@@ -1590,31 +1590,31 @@
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 65,62
+ 106,103
Oops! Something went wrong.
- Oups! Quelque chose s'est mal passé.
+ Oups! Quelque chose s'est mal passé.
apps/client/src/app/core/http-response.interceptor.ts
86
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 63
+ 104
Okay
- D'accord
+ D'accord
apps/client/src/app/core/http-response.interceptor.ts
89
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 66,62
+ 107,103
@@ -1691,7 +1691,7 @@
Could not redeem coupon code
- Le code promotionnel n'a pas pu être appliqué
+ Le code promotionnel n'a pas pu être appliqué
apps/client/src/app/pages/account/account-page.component.ts
246
@@ -1816,6 +1816,10 @@
apps/client/src/app/pages/account/account-page.html
135
+
+ apps/client/src/app/pages/account/account-page.html
+ 139
+
apps/client/src/app/pages/account/account-page.html
143
@@ -1835,7 +1839,7 @@
Date and number format
- Format de date et d'heure
+ Format de date et d'heure
apps/client/src/app/pages/account/account-page.html
162
@@ -1899,7 +1903,7 @@
User ID
- ID d'utilisateur
+ ID d'utilisateur
apps/client/src/app/pages/account/account-page.html
253
@@ -2154,15 +2158,15 @@
Import des données...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 48
+ 89
Import has been completed
- L'import est terminé
+ L'import est terminé
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 55,54
+ 96,95
@@ -2170,7 +2174,7 @@
Validation des données...
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
- 86
+ 147
@@ -2178,7 +2182,7 @@
Choisir Fichier
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 18,21
+ 43,46
@@ -2186,7 +2190,7 @@
Les formats de fichier suivants sont supportés :
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 21,23
+ 47,50
@@ -2194,7 +2198,7 @@
Retour
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 79,83
+ 108,112
@@ -2202,7 +2206,7 @@
Importer
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
- 94,99
+ 123,128
@@ -2234,11 +2238,11 @@
Filtrer par compte ou étiquette...
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
- 136
+ 137
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 111
+ 123
apps/client/src/app/pages/portfolio/holdings/holdings-page.component.ts
@@ -2279,7 +2283,7 @@
By Asset Class
- Par Classe d'Actifs
+ Par Classe d'Actifs
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
96
@@ -2334,7 +2338,7 @@
Marchés Développés
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
- 271
+ 272
apps/client/src/app/pages/public/public-page.html
@@ -2346,7 +2350,7 @@
Marchés Émergents
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
- 280
+ 281
apps/client/src/app/pages/public/public-page.html
@@ -2358,7 +2362,7 @@
Autres marchés
apps/client/src/app/pages/portfolio/allocations/allocations-page.html
- 289
+ 290
apps/client/src/app/pages/public/public-page.html
@@ -2390,7 +2394,7 @@
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
- 59
+ 60
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
@@ -2487,7 +2491,7 @@
If you retire today, you would be able to withdraw per year or per month , based on your total assets of and a withdrawal rate of 4%.
- Si vous prenez votre retraite aujourd'hui, vous pourriez retirer par an ou par mois , sur base de vos actifs totaux de et un taux de retrait de 4%.
+ Si vous prenez votre retraite aujourd'hui, vous pourriez retirer par an ou par mois , sur base de vos actifs totaux de et un taux de retrait de 4%.
apps/client/src/app/pages/portfolio/fire/fire-page.html
51,79
@@ -2623,7 +2627,7 @@
Oops, authentication has failed.
- Oups, l'identification a échoué.
+ Oups, l'identification a échoué.
apps/client/src/app/pages/webauthn/webauthn-page.html
18
@@ -2639,7 +2643,7 @@
Go back to Home Page
- Retour à la Page d'Accueil
+ Retour à la Page d'Accueil
apps/client/src/app/pages/webauthn/webauthn-page.html
30
@@ -2674,7 +2678,7 @@
Exporter Activités
libs/ui/src/lib/activities-table/activities-table.component.html
- 399
+ 407
@@ -2682,7 +2686,7 @@
Exporter Brouillons sous ICS
libs/ui/src/lib/activities-table/activities-table.component.html
- 409
+ 417
@@ -2690,7 +2694,7 @@
Dupliquer
libs/ui/src/lib/activities-table/activities-table.component.html
- 430
+ 438
@@ -2698,7 +2702,7 @@
Exporter Brouillon sous ICS
libs/ui/src/lib/activities-table/activities-table.component.html
- 438
+ 446
@@ -2706,7 +2710,7 @@
Voulez-vous vraiment supprimer cette activité ?
libs/ui/src/lib/activities-table/activities-table.component.ts
- 196
+ 198
@@ -2714,7 +2718,7 @@
Filtrer par compte, devise, symbole, ou type...
libs/ui/src/lib/activities-table/activities-table.component.ts
- 376
+ 387
@@ -2743,7 +2747,7 @@
Savings Rate
- Taux d'Épargne
+ Taux d'Épargne
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
10
@@ -2759,7 +2763,7 @@
Investment Horizon
- Horizon d'Investissement
+ Horizon d'Investissement
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
21
@@ -2775,7 +2779,7 @@
Annual Interest Rate
- Taux d'Intérêt Annuel
+ Taux d'Intérêt Annuel
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
27
@@ -2831,7 +2835,7 @@
Asset Class
- Classe d'Actifs
+ Classe d'Actifs
libs/ui/src/lib/i18n.ts
5
@@ -2839,7 +2843,7 @@
Asset Sub Class
- Sous-classe d'Actifs
+ Sous-classe d'Actifs
libs/ui/src/lib/i18n.ts
6
@@ -2848,7 +2852,6 @@
Emergency Fund
- Fonds d'Urgence
libs/ui/src/lib/i18n.ts
7
@@ -3035,7 +3038,7 @@
Time to add your first activity.
- Il est temps d'ajouter votre première activité.
+ Il est temps d'ajouter votre première activité.
libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html
12
@@ -3053,6 +3056,38 @@
384
+
+ Holding
+ Holding
+
+ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
+ 13,15
+
+
+
+ Load Dividends
+ Load Dividends
+
+ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
+ 29,33
+
+
+
+ Yearly
+ Yearly
+
+ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
+ 55
+
+
+
+ Import Dividends
+ Import Dividends
+
+ libs/ui/src/lib/activities-table/activities-table.component.html
+ 397
+
+