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

- The following file formats are supported: - CSV - or - JSON +

+ + Holding + + {{ holding.name }} + + +
+ +
+
+ + +
+
+ + 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 +
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 @@

+
+
+

+ Members from around the globe are using + Ghostfolio Premium +

+
+
+ +
+
+

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

Ghostfolio

-

- Open Source Wealth Management Software -

-

- Ghostfol.ioLive Demo | Ghostfolio Premium | FAQ | Blog | Slack | Twitter -

-

- - - - - - License: AGPL v3 -

+ +[Ghostfolio logo](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_) + +[![Shield: Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-Support-yellow?logo=buymeacoffee)](https://www.buymeacoffee.com/ghostfolio) +[![Shield: Contributions Welcome](https://img.shields.io/badge/Contributions-Welcome-orange.svg)](#contributing) +[![Shield: License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](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. -
- - +
+ +[Preview image of the Ghostfolio video trailer](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 -
- +
+ +Image of a phone showing the Ghostfolio app open +
## 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`.
- - Buy me a coffee button - + +[Buy me a coffee button](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 -
    -
  1. Debug: Run yarn watch:server and click "Launch Program" in Visual Studio Code
  2. -
  3. Serve: Run yarn start:server
  4. -
+#### 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 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 1edda8478..c95a85501 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -183,7 +183,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 426 + 434 @@ -203,7 +203,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 442 + 450 @@ -387,7 +387,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 @@ -895,7 +895,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 @@ -1263,7 +1263,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 66,62 + 107,103 @@ -1975,7 +1975,7 @@ Importando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 48 + 89 @@ -1983,7 +1983,7 @@ La importación se ha completado apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 55,54 + 96,95 @@ -2131,7 +2131,7 @@ Exportar operaciones libs/ui/src/lib/activities-table/activities-table.component.html - 399 + 407 @@ -2139,7 +2139,7 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 409 + 417 @@ -2147,7 +2147,7 @@ Clonar libs/ui/src/lib/activities-table/activities-table.component.html - 430 + 438 @@ -2155,7 +2155,7 @@ Exportar borrador como ICS libs/ui/src/lib/activities-table/activities-table.component.html - 438 + 446 @@ -2163,7 +2163,7 @@ ¿Estás seguro de eliminar esta operación? libs/ui/src/lib/activities-table/activities-table.component.ts - 196 + 198 @@ -2271,7 +2271,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 63 + 104 @@ -2287,7 +2287,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 65,62 + 106,103 @@ -2303,7 +2303,7 @@ Mercados desarrollados apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 271 + 272 apps/client/src/app/pages/public/public-page.html @@ -2351,7 +2351,7 @@ Otros mercados apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 289 + 290 apps/client/src/app/pages/public/public-page.html @@ -2363,7 +2363,7 @@ Mercados emergentes apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 280 + 281 apps/client/src/app/pages/public/public-page.html @@ -2459,7 +2459,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 59 + 60 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2519,11 +2519,11 @@ Filtrar por cuenta o etiqueta... 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 @@ -2543,7 +2543,7 @@ Filtrar por cuenta, divisa, símbolo o tipo... libs/ui/src/lib/activities-table/activities-table.component.ts - 376 + 387 @@ -2691,7 +2691,7 @@ Tasa de ahorro apps/client/src/app/components/investment-chart/investment-chart.component.ts - 230 + 239 @@ -2907,7 +2907,7 @@ Elegir archivo apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 18,21 + 43,46 @@ -2915,7 +2915,7 @@ Los siguientes formatos de archivo están soportados: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 21,23 + 47,50 @@ -2923,7 +2923,7 @@ Volver apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 79,83 + 108,112 @@ -2933,6 +2933,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 @@ -3003,7 +3007,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 86 + 147 @@ -3011,7 +3015,7 @@ Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 94,99 + 123,128 @@ -3054,6 +3058,38 @@ 28 + + 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 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 8aa82e5c7..dd0a3556a 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -3,7 +3,7 @@ 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 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 6d47d7681..eeafa467f 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -183,7 +183,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 426 + 434 @@ -203,7 +203,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 442 + 450 @@ -387,7 +387,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 @@ -895,7 +895,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 @@ -1263,7 +1263,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 66,62 + 107,103 @@ -1975,7 +1975,7 @@ Importazione dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 48 + 89 @@ -1983,7 +1983,7 @@ L'importazione è stata completata apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 55,54 + 96,95 @@ -2131,7 +2131,7 @@ Esporta le attività libs/ui/src/lib/activities-table/activities-table.component.html - 399 + 407 @@ -2139,7 +2139,7 @@ Esporta le bozze come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 409 + 417 @@ -2147,7 +2147,7 @@ Clona libs/ui/src/lib/activities-table/activities-table.component.html - 430 + 438 @@ -2155,7 +2155,7 @@ Esporta la bozza come ICS libs/ui/src/lib/activities-table/activities-table.component.html - 438 + 446 @@ -2163,7 +2163,7 @@ Vuoi davvero eliminare questa attività? libs/ui/src/lib/activities-table/activities-table.component.ts - 196 + 198 @@ -2271,7 +2271,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 63 + 104 @@ -2287,7 +2287,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 65,62 + 106,103 @@ -2303,7 +2303,7 @@ Mercati sviluppati apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 271 + 272 apps/client/src/app/pages/public/public-page.html @@ -2351,7 +2351,7 @@ Altri mercati apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 289 + 290 apps/client/src/app/pages/public/public-page.html @@ -2363,7 +2363,7 @@ Mercati emergenti apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 280 + 281 apps/client/src/app/pages/public/public-page.html @@ -2459,7 +2459,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 59 + 60 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2519,11 +2519,11 @@ Filtra per account o 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 @@ -2543,7 +2543,7 @@ Filtra per account, valuta, simbolo o tipo... libs/ui/src/lib/activities-table/activities-table.component.ts - 376 + 387 @@ -2691,7 +2691,7 @@ Tasso di risparmio apps/client/src/app/components/investment-chart/investment-chart.component.ts - 230 + 239 @@ -2907,7 +2907,7 @@ Choose File apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 18,21 + 43,46 @@ -2915,7 +2915,7 @@ The following file formats are supported: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 21,23 + 47,50 @@ -2923,7 +2923,7 @@ Back apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 79,83 + 108,112 @@ -2933,6 +2933,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 @@ -3003,7 +3007,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 86 + 147 @@ -3011,7 +3015,7 @@ Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 94,99 + 123,128 @@ -3054,6 +3058,38 @@ 28 + + 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 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 770e826c0..7e31054bf 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.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 @@ Gegevens importeren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 48 + 89 @@ -1982,7 +1982,7 @@ Import is voltooid apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 55,54 + 96,95 @@ -2130,7 +2130,7 @@ Activiteiten exporteren libs/ui/src/lib/activities-table/activities-table.component.html - 399 + 407 @@ -2138,7 +2138,7 @@ Concepten exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 409 + 417 @@ -2146,7 +2146,7 @@ Kloon libs/ui/src/lib/activities-table/activities-table.component.html - 430 + 438 @@ -2154,7 +2154,7 @@ Concepten exporteren als ICS libs/ui/src/lib/activities-table/activities-table.component.html - 438 + 446 @@ -2162,7 +2162,7 @@ Wilt u deze activiteit echt verwijderen? libs/ui/src/lib/activities-table/activities-table.component.ts - 196 + 198 @@ -2270,7 +2270,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 63 + 104 @@ -2286,7 +2286,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 65,62 + 106,103 @@ -2302,7 +2302,7 @@ Ontwikkelde markten apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 271 + 272 apps/client/src/app/pages/public/public-page.html @@ -2350,7 +2350,7 @@ Andere markten apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 289 + 290 apps/client/src/app/pages/public/public-page.html @@ -2362,7 +2362,7 @@ Opkomende markten apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 280 + 281 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 @@ -2518,11 +2518,11 @@ Filter op account of 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 @@ Filter op rekening, valuta, symbool of type... libs/ui/src/lib/activities-table/activities-table.component.ts - 376 + 387 @@ -2690,7 +2690,7 @@ Spaarquote apps/client/src/app/components/investment-chart/investment-chart.component.ts - 230 + 239 @@ -2906,7 +2906,7 @@ Kies bestand apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 18,21 + 43,46 @@ -2914,7 +2914,7 @@ The volgende bestandsformaten worden ondersteund: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 21,23 + 47,50 @@ -2922,7 +2922,7 @@ Terug 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 @@ Gegevens valideren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 86 + 147 @@ -3010,7 +3014,7 @@ Importeren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 94,99 + 123,128 @@ -3053,6 +3057,38 @@ 28 + + 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 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 2424ae513..e5b6f29aa 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -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 @@ -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 @@ -1110,7 +1110,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 59 + 60 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -1130,7 +1130,7 @@ Savings Rate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 230 + 239 @@ -1154,7 +1154,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 @@ -1578,7 +1578,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 65,62 + 106,103 @@ -1590,7 +1590,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 63 + 104 @@ -1602,7 +1602,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 66,62 + 107,103 @@ -2118,7 +2118,7 @@ Importing data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 48 + 89 @@ -2126,7 +2126,7 @@ Import has been completed apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 55,54 + 96,95 @@ -2134,7 +2134,7 @@ Choose File apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 18,21 + 43,46 @@ -2142,7 +2142,7 @@ The following file formats are supported: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 21,23 + 47,50 @@ -2150,7 +2150,7 @@ Back apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 79,83 + 108,112 @@ -2182,11 +2182,11 @@ Filter by account or 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 @@ -2282,7 +2282,7 @@ Developed Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 271 + 272 apps/client/src/app/pages/public/public-page.html @@ -2294,7 +2294,7 @@ Emerging Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 280 + 281 apps/client/src/app/pages/public/public-page.html @@ -2306,7 +2306,7 @@ Other Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 289 + 290 apps/client/src/app/pages/public/public-page.html @@ -2594,7 +2594,7 @@ Export Activities libs/ui/src/lib/activities-table/activities-table.component.html - 399 + 407 @@ -2602,7 +2602,7 @@ Export Drafts as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 409 + 417 @@ -2610,7 +2610,7 @@ Clone libs/ui/src/lib/activities-table/activities-table.component.html - 430 + 438 @@ -2618,7 +2618,7 @@ Export Draft as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 438 + 446 @@ -2626,7 +2626,7 @@ Do you really want to delete this activity? libs/ui/src/lib/activities-table/activities-table.component.ts - 196 + 198 @@ -2634,7 +2634,7 @@ Filter by account, currency, symbol or type... libs/ui/src/lib/activities-table/activities-table.component.ts - 376 + 387 @@ -2980,6 +2980,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 @@ -3010,7 +3014,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 86 + 147 @@ -3018,7 +3022,7 @@ Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 94,99 + 123,128 @@ -3053,6 +3057,38 @@ 9 + + 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 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index cd0594acf..bbd75be15 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -171,7 +171,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 426 + 434 @@ -190,7 +190,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 442 + 450 @@ -357,7 +357,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 @@ -815,7 +815,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 @@ -1146,7 +1146,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 66,62 + 107,103 @@ -1780,14 +1780,14 @@ Importing data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 48 + 89 Import has been completed apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 55,54 + 96,95 @@ -1917,35 +1917,35 @@ Export Activities libs/ui/src/lib/activities-table/activities-table.component.html - 399 + 407 Export Drafts as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 409 + 417 Clone libs/ui/src/lib/activities-table/activities-table.component.html - 430 + 438 Export Draft as ICS libs/ui/src/lib/activities-table/activities-table.component.html - 438 + 446 Do you really want to delete this activity? libs/ui/src/lib/activities-table/activities-table.component.ts - 196 + 198 @@ -2040,7 +2040,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 63 + 104 @@ -2055,7 +2055,7 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 65,62 + 106,103 @@ -2069,7 +2069,7 @@ Developed Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 271 + 272 apps/client/src/app/pages/public/public-page.html @@ -2113,7 +2113,7 @@ Other Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 289 + 290 apps/client/src/app/pages/public/public-page.html @@ -2124,7 +2124,7 @@ Emerging Markets apps/client/src/app/pages/portfolio/allocations/allocations-page.html - 280 + 281 apps/client/src/app/pages/public/public-page.html @@ -2210,7 +2210,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 59 + 60 libs/ui/src/lib/fire-calculator/fire-calculator.component.ts @@ -2263,11 +2263,11 @@ Filter by account or 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 @@ -2285,7 +2285,7 @@ Filter by account, currency, symbol or type... libs/ui/src/lib/activities-table/activities-table.component.ts - 376 + 387 @@ -2415,7 +2415,7 @@ Savings Rate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 230 + 239 @@ -2605,21 +2605,21 @@ The following file formats are supported: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 21,23 + 47,50 Choose File apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 18,21 + 43,46 Back apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 79,83 + 108,112 @@ -2628,6 +2628,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 @@ -2697,14 +2701,14 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 86 + 147 Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 94,99 + 123,128 @@ -2735,6 +2739,34 @@ 20 + + Load Dividends + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 29,33 + + + + Holding + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 13,15 + + + + Yearly + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 55 + + + + Import Dividends + + libs/ui/src/lib/activities-table/activities-table.component.html + 397 + + From 152fd4fdf82a8c0c504944e7fe929be318a30566 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 11 Jan 2023 20:12:45 +0100 Subject: [PATCH 16/19] Release 1.226.0 (#1592) --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 319a661bb..2810057f0 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.226.0 - 2023-01-11 ### Added diff --git a/package.json b/package.json index 20cea4d7c..a41b54f92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "1.225.0", + "version": "1.226.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "scripts": { From e88dbb018189c9bc01836162ea3e339fdfd3776f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 12 Jan 2023 20:14:00 +0100 Subject: [PATCH 17/19] Fix wording (#1593) --- apps/client/src/app/pages/features/features-page.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/app/pages/features/features-page.html b/apps/client/src/app/pages/features/features-page.html index 05cdd8454..aaac67a0c 100644 --- a/apps/client/src/app/pages/features/features-page.html +++ b/apps/client/src/app/pages/features/features-page.html @@ -197,7 +197,7 @@

Multi-Language

- Use Ghostfolio in multiple languages: English, Dutch, Français, + Use Ghostfolio in multiple languages: English, Dutch, French, German, Italian, Portuguese From 7ad58b1a62d5142ad368c0a7eb7096321d1a76ba Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 13 Jan 2023 08:58:13 +0100 Subject: [PATCH 18/19] Add i18n (#1594) --- apps/client/src/app/pages/account/account-page.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/app/pages/account/account-page.html b/apps/client/src/app/pages/account/account-page.html index c9ed454e4..a3f69f2c5 100644 --- a/apps/client/src/app/pages/account/account-page.html +++ b/apps/client/src/app/pages/account/account-page.html @@ -24,8 +24,8 @@ >

- Valid until {{ user?.subscription?.expiresAt | date: - defaultDateFormat }} + Valid until {{ + user?.subscription?.expiresAt | date: defaultDateFormat }}
From 104cca069f57a7f551fd073630c11eb1e3ce5e2c Mon Sep 17 00:00:00 2001 From: Martin Vandenbussche Date: Fri, 13 Jan 2023 16:19:48 +0100 Subject: [PATCH 19/19] New Translations (#1597) --- apps/client/src/locales/messages.fr.xlf | 8 ++++---- apps/client/src/locales/messages.nl.xlf | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index dd0a3556a..31e3a7ef4 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -3058,7 +3058,7 @@ Holding - Holding + Position apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 13,15 @@ -3066,7 +3066,7 @@ Load Dividends - Load Dividends + Charger Dividendes apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 29,33 @@ -3074,7 +3074,7 @@ Yearly - Yearly + Annuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 55 @@ -3082,7 +3082,7 @@ Import Dividends - Import Dividends + Importer Dividendes libs/ui/src/lib/activities-table/activities-table.component.html 397 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 7e31054bf..2a6be39df 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -3059,7 +3059,7 @@ Holding - Holding + Participatie apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 13,15 @@ -3075,7 +3075,7 @@ Yearly - Yearly + Jaarlijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 55