From a5f934460bc4a79d5eaeb9a912b917a4743e7b5f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 2 Nov 2025 19:51:27 +0100 Subject: [PATCH 01/31] Task/introduce interface for get admin users response (#5903) * Introduce interface for get admin users response --- apps/api/src/app/admin/admin.controller.ts | 4 ++-- apps/api/src/app/admin/admin.service.ts | 6 +++--- .../app/components/admin-users/admin-users.component.ts | 8 ++++++-- .../user-detail-dialog/interfaces/interfaces.ts | 4 ++-- apps/client/src/app/services/admin.service.ts | 4 ++-- libs/common/src/lib/interfaces/index.ts | 4 ++-- .../admin-users-response.interface.ts} | 2 +- 7 files changed, 18 insertions(+), 14 deletions(-) rename libs/common/src/lib/interfaces/{admin-users.interface.ts => responses/admin-users-response.interface.ts} (88%) diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index d7c4c5d3d..2419b0a7d 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -17,7 +17,7 @@ import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { AdminData, AdminMarketData, - AdminUsers, + AdminUsersResponse, EnhancedSymbolProfile, ScraperConfiguration } from '@ghostfolio/common/interfaces'; @@ -315,7 +315,7 @@ export class AdminController { public async getUsers( @Query('skip') skip?: number, @Query('take') take?: number - ): Promise { + ): Promise { return this.adminService.getUsers({ skip: isNaN(skip) ? undefined : skip, take: isNaN(take) ? undefined : take diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 11f6f0599..683e72cb8 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -23,7 +23,7 @@ import { AdminMarketData, AdminMarketDataDetails, AdminMarketDataItem, - AdminUsers, + AdminUsersResponse, AssetProfileIdentifier, EnhancedSymbolProfile, Filter @@ -513,7 +513,7 @@ export class AdminService { }: { skip?: number; take?: number; - }): Promise { + }): Promise { const [count, users] = await Promise.all([ this.countUsersWithAnalytics(), this.getUsersWithAnalytics({ skip, take }) @@ -818,7 +818,7 @@ export class AdminService { }: { skip?: number; take?: number; - }): Promise { + }): Promise { let orderBy: Prisma.Enumerable = [ { createdAt: 'desc' } ]; diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts index c0d058ad2..94b5839c6 100644 --- a/apps/client/src/app/components/admin-users/admin-users.component.ts +++ b/apps/client/src/app/components/admin-users/admin-users.component.ts @@ -5,7 +5,11 @@ import { getDateFormatString, getEmojiFlag } from '@ghostfolio/common/helper'; -import { AdminUsers, InfoItem, User } from '@ghostfolio/common/interfaces'; +import { + AdminUsersResponse, + InfoItem, + User +} from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -75,7 +79,7 @@ import { GfUserDetailDialogComponent } from '../user-detail-dialog/user-detail-d export class GfAdminUsersComponent implements OnDestroy, OnInit { @ViewChild(MatPaginator) paginator: MatPaginator; - public dataSource = new MatTableDataSource(); + public dataSource = new MatTableDataSource(); public defaultDateFormat: string; public deviceType: string; public displayedColumns: string[] = []; diff --git a/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts index 5f3f4b87a..d29bc01bc 100644 --- a/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts @@ -1,8 +1,8 @@ -import { AdminUsers } from '@ghostfolio/common/interfaces'; +import { AdminUsersResponse } from '@ghostfolio/common/interfaces'; export interface UserDetailDialogParams { deviceType: string; hasPermissionForSubscription: boolean; locale: string; - userData: AdminUsers['users'][0]; + userData: AdminUsersResponse['users'][0]; } diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index a04ad8d56..2f3040ba3 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -12,7 +12,7 @@ import { AdminData, AdminJobs, AdminMarketData, - AdminUsers, + AdminUsersResponse, DataProviderGhostfolioStatusResponse, EnhancedSymbolProfile, Filter @@ -154,7 +154,7 @@ export class AdminService { params = params.append('skip', skip); params = params.append('take', take); - return this.http.get('/api/v1/admin/user', { params }); + return this.http.get('/api/v1/admin/user', { params }); } public gather7Days() { diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index eac5db68c..06ecf32e8 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -7,7 +7,6 @@ import type { AdminMarketData, AdminMarketDataItem } from './admin-market-data.interface'; -import type { AdminUsers } from './admin-users.interface'; import type { AssetClassSelectorOption } from './asset-class-selector-option.interface'; import type { AssetProfileIdentifier } from './asset-profile-identifier.interface'; import type { BenchmarkProperty } from './benchmark-property.interface'; @@ -39,6 +38,7 @@ import type { AccountBalancesResponse } from './responses/account-balances-respo import type { AccountsResponse } from './responses/accounts-response.interface'; import type { ActivitiesResponse } from './responses/activities-response.interface'; import type { ActivityResponse } from './responses/activity-response.interface'; +import type { AdminUsersResponse } from './responses/admin-users-response.interface'; import type { AiPromptResponse } from './responses/ai-prompt-response.interface'; import type { ApiKeyResponse } from './responses/api-key-response.interface'; import type { AssetResponse } from './responses/asset-response.interface'; @@ -92,7 +92,7 @@ export { AdminMarketData, AdminMarketDataDetails, AdminMarketDataItem, - AdminUsers, + AdminUsersResponse, AiPromptResponse, ApiKeyResponse, AssetClassSelectorOption, diff --git a/libs/common/src/lib/interfaces/admin-users.interface.ts b/libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts similarity index 88% rename from libs/common/src/lib/interfaces/admin-users.interface.ts rename to libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts index 79031425a..d9f58ee18 100644 --- a/libs/common/src/lib/interfaces/admin-users.interface.ts +++ b/libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts @@ -1,6 +1,6 @@ import { Role } from '@prisma/client'; -export interface AdminUsers { +export interface AdminUsersResponse { count: number; users: { accountCount: number; From a892f51799205206359e74bc1f8de9dce11ee159 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 4 Nov 2025 18:30:24 +0100 Subject: [PATCH 02/31] Task/improve localization in lib components (#5907) * Improve localization --- .../accounts-table.component.html | 2 +- libs/ui/src/lib/assistant/assistant.html | 22 +++++++++---------- .../lib/benchmark/benchmark.component.html | 4 ++-- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.html b/libs/ui/src/lib/accounts-table/accounts-table.component.html index e9e0337c9..805ffe77d 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.html +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -290,7 +290,7 @@ - + diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index 2b75e5672..ab6db8887 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -8,8 +8,8 @@ [dataSource]="dataSource" > - - Name + + Name
From dfb4310904f9815820af4726da8721ad5adbedb9 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 4 Nov 2025 18:49:18 +0100 Subject: [PATCH 03/31] Task/improve localization of get started buttons (#5913) * Improve localization --- apps/client/src/app/components/header/header.component.html | 5 +++-- apps/client/src/app/pages/landing/landing-page.html | 6 ++---- apps/client/src/app/pages/pricing/pricing-page.html | 3 +-- .../resources/personal-finance-tools/product-page.html | 6 +++--- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/apps/client/src/app/components/header/header.component.html b/apps/client/src/app/components/header/header.component.html index 27f136a3a..501119b31 100644 --- a/apps/client/src/app/components/header/header.component.html +++ b/apps/client/src/app/components/header/header.component.html @@ -427,10 +427,11 @@ Get started - + >Get Started } diff --git a/apps/client/src/app/pages/landing/landing-page.html b/apps/client/src/app/pages/landing/landing-page.html index 7f77c31a7..50602858a 100644 --- a/apps/client/src/app/pages/landing/landing-page.html +++ b/apps/client/src/app/pages/landing/landing-page.html @@ -38,9 +38,8 @@ i18n mat-flat-button [routerLink]="routerLinkRegister" + >Get Started - Get Started - } @if (hasPermissionForDemo) { @if (hasPermissionToCreateUser) { @@ -342,9 +341,8 @@ i18n mat-flat-button [routerLink]="routerLinkRegister" + >Get Started - Get Started - @if (hasPermissionForDemo) {
or
Get Started - Get Started -

It’s free.

diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.html b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.html index 3c5c97558..a71ca0038 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.html +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -330,9 +330,9 @@ Ghostfolio.

From c84f4bd5e6360db661aa7886e2dc516cc491c8f5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 19:03:09 +0100 Subject: [PATCH 04/31] Feature/update locales (#5875) * Update locales * Update changelog --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 1 + apps/client/src/locales/messages.ca.xlf | 228 ++++++++++-------------- apps/client/src/locales/messages.de.xlf | 220 ++++++++++------------- apps/client/src/locales/messages.es.xlf | 220 ++++++++++------------- apps/client/src/locales/messages.fr.xlf | 228 ++++++++++-------------- apps/client/src/locales/messages.it.xlf | 220 ++++++++++------------- apps/client/src/locales/messages.nl.xlf | 220 ++++++++++------------- apps/client/src/locales/messages.pl.xlf | 228 ++++++++++-------------- apps/client/src/locales/messages.pt.xlf | 220 ++++++++++------------- apps/client/src/locales/messages.tr.xlf | 228 ++++++++++-------------- apps/client/src/locales/messages.uk.xlf | 228 ++++++++++-------------- apps/client/src/locales/messages.xlf | 221 ++++++++++------------- apps/client/src/locales/messages.zh.xlf | 228 ++++++++++-------------- 13 files changed, 1133 insertions(+), 1557 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ecf2a57d..0ff76b0c2 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 ### Changed - Changed the build executor of the client from `@nx/angular:webpack-browser` to `@nx/angular:browser-esbuild` +- Improved the language localization for German (`de`) ### Fixed diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 7c676e092..361c4ec31 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -42,7 +42,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -398,14 +398,6 @@ 86 - - Holdings - En cartera - - libs/ui/src/lib/assistant/assistant.html - 110 - - Cash Balances Balanç de Caixa @@ -473,6 +465,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1475,7 +1471,7 @@ Està segur que vol eliminar aquest usuari? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -1646,14 +1642,6 @@ 5 - - Get started - Primers Passos - - apps/client/src/app/components/header/header.component.html - 432 - - Oops! Incorrect Security Token. Oooh! El testimoni de seguretat és incorrecte. @@ -1747,7 +1735,7 @@ Informar d’un Problema amb les Dades apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -1991,11 +1979,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -2018,20 +2006,12 @@ 30 - - Sign in with Internet Identity - Inicieu la sessió amb la identitat d’Internet - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google Inicieu la sessió amb Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -2039,7 +2019,7 @@ Manteniu la sessió iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -2889,6 +2869,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. @@ -3334,14 +3318,34 @@ Get Started Comença + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -3366,6 +3370,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -3479,32 +3487,12 @@ 11 - - Get Started - Comença - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users Usuaris actius mensuals apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -3512,7 +3500,7 @@ Estrelles a GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -3524,7 +3512,7 @@ Activa el Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -3536,7 +3524,7 @@ Com es veu a apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -3544,7 +3532,7 @@ Protegeix els teus actius. Refina la teva estratègia d’inversió personal. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -3552,7 +3540,7 @@ Ghostfolio permet a la gent ocupada fer un seguiment d’accions, ETF o criptomonedes sense ser rastrejada. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -3560,7 +3548,7 @@ Vista de 360° apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -3568,7 +3556,7 @@ Obtingueu la imatge completa de les vostres finances personals en múltiples plataformes. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -3576,7 +3564,7 @@ Web3 llest apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -3584,7 +3572,7 @@ Utilitza Ghostfolio de manera anònima i sigues propietari de les teves dades financeres. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -3592,7 +3580,7 @@ Beneficia’t de millores contínues gràcies a una comunitat forta. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -3608,7 +3596,7 @@ Per què Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -3616,7 +3604,7 @@ Ghostfolio és per a tu si ets... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -3624,7 +3612,7 @@ negociar accions, ETF o criptomonedes en múltiples plataformes apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -3632,7 +3620,7 @@ perseguint una compra & mantenir l’estratègia apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -3640,7 +3628,7 @@ interessat a obtenir informació sobre la composició de la vostra cartera apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -3648,7 +3636,7 @@ valorant la privadesa i la propietat de les dades apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -3656,7 +3644,7 @@ al minimalisme apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -3664,7 +3652,7 @@ preocupant-se per diversificar els seus recursos econòmics apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -3672,7 +3660,7 @@ interessada en la independència financera apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -3680,7 +3668,7 @@ dir no als fulls de càlcul apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -3688,7 +3676,7 @@ encara llegint aquesta llista apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -3696,7 +3684,7 @@ Més informació sobre Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -3704,7 +3692,7 @@ Que nostre usuaris estan dient apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -3712,7 +3700,7 @@ Membres de tot el món estan utilitzant Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -3720,7 +3708,7 @@ Com ho fa Ghostfolio treballar? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -3728,7 +3716,7 @@ Comença en només 3 passos apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -3744,7 +3732,7 @@ Registra’t de manera anònima* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -3752,7 +3740,7 @@ * no es requereix cap adreça de correu electrònic ni targeta de crèdit apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -3760,7 +3748,7 @@ Afegiu qualsevol de les vostres transaccions històriques apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -3768,7 +3756,7 @@ Obteniu informació valuosa sobre la composició de la vostra cartera apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -3776,7 +3764,7 @@ Són tu llest? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -3784,7 +3772,7 @@ Uneix-te ara o consulteu el compte d’exemple apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -4460,7 +4448,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -4788,7 +4776,7 @@ És gratuït. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4843,20 +4831,12 @@ 281 - - Continue with Internet Identity - Continueu amb Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continueu amb Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -5439,6 +5419,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Date Range @@ -5448,20 +5432,20 @@ 170 - + Reset Filters Restableix els filtres libs/ui/src/lib/assistant/assistant.html - 205 + 204 - + Apply Filters Aplicar filtres libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -5833,7 +5817,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -6209,11 +6193,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6329,7 +6313,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6719,10 +6703,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7395,7 +7375,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7415,11 +7395,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7515,7 +7495,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7527,7 +7507,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7804,15 +7784,7 @@ 158 - - Name - Name - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Quick Links @@ -7820,24 +7792,16 @@ 58 - - Asset Profiles - Asset Profiles - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8192,7 +8156,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index fa47cc6a6..9a0ebd159 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -144,6 +144,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -376,6 +380,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -646,7 +654,7 @@ Möchtest du diesen Benutzer wirklich löschen? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -700,14 +708,34 @@ Get Started Registrieren + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Sign in @@ -722,7 +750,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -810,11 +838,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -837,20 +865,12 @@ 30 - - Sign in with Internet Identity - Einloggen mit Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google Einloggen mit Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -858,7 +878,7 @@ Eingeloggt bleiben apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -990,7 +1010,7 @@ Datenfehler melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -1344,6 +1364,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1840,10 +1864,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Positionen libs/ui/src/lib/assistant/assistant.html 110 @@ -2117,20 +2137,12 @@ 281 - - Continue with Internet Identity - Weiter mit Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Weiter mit Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2309,14 +2321,6 @@ 56 - - Get started - Registrieren - - apps/client/src/app/components/header/header.component.html - 432 - - This feature is currently unavailable. Diese Funktion ist derzeit nicht verfügbar. @@ -2906,7 +2910,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2926,11 +2930,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3537,32 +3541,12 @@ 303 - - Get Started - Jetzt loslegen - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. Es ist kostenlos. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4598,7 +4582,7 @@ Sterne auf GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4610,7 +4594,7 @@ Downloads auf Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4730,7 +4714,7 @@ Monatlich aktive Nutzer apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4738,7 +4722,7 @@ Bekannt aus apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4746,7 +4730,7 @@ Schütze dein Vermögen. Optimiere deine persönliche Anlagestrategie. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -4754,7 +4738,7 @@ Ghostfolio ermöglicht es geschäftigen Leuten, den Überblick über Aktien, ETFs oder Kryptowährungen zu behalten, ohne überwacht zu werden. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -4762,7 +4746,7 @@ 360° Ansicht apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -4770,7 +4754,7 @@ Web3 ready apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -4778,7 +4762,7 @@ Nutze Ghostfolio ganz anonym und behalte deine Finanzdaten. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -4786,7 +4770,7 @@ Profitiere von kontinuierlichen Verbesserungen durch eine aktive Community. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -4802,7 +4786,7 @@ Warum Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -4810,7 +4794,7 @@ Ghostfolio ist für dich geeignet, wenn du... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -4818,7 +4802,7 @@ Aktien, ETFs oder Kryptowährungen auf unterschiedlichen Plattformen handelst apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -4826,7 +4810,7 @@ eine Buy & Hold Strategie verfolgst apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -4834,7 +4818,7 @@ dich für die Zusammensetzung deines Portfolios interessierst apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -4842,7 +4826,7 @@ Privatsphäre und Datenhoheit wertschätzt apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -4850,7 +4834,7 @@ zum Frugalismus oder Minimalismus neigst apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -4858,7 +4842,7 @@ dich um die Diversifizierung deiner finanziellen Mittel kümmerst apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -4866,7 +4850,7 @@ Interesse an finanzieller Freiheit hast apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -4874,7 +4858,7 @@ Nein sagst zu Excel-Tabellen im Jahr apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -4882,7 +4866,7 @@ diese Liste bis zum Ende liest apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -4890,7 +4874,7 @@ Erfahre mehr über Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -4898,7 +4882,7 @@ Was unsere Nutzer sagen apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -4906,7 +4890,7 @@ Nutzer aus aller Welt verwenden Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -4914,7 +4898,7 @@ Wie funktioniert Ghostfolio ? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -4922,7 +4906,7 @@ Registriere dich anonym* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -4930,7 +4914,7 @@ * Keine E-Mail-Adresse oder Kreditkarte erforderlich apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -4938,7 +4922,7 @@ Füge historische Transaktionen hinzu apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -4946,7 +4930,7 @@ Erhalte nützliche Erkenntnisse über die Zusammensetzung deines Portfolios apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -4954,7 +4938,7 @@ Bist du bereit? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -4962,7 +4946,7 @@ Verschaffe dir einen vollständigen Überblick deiner persönlichen Finanzen über mehrere Plattformen hinweg. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -4970,7 +4954,7 @@ Beginne mit nur 3 Schritten apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -5788,7 +5772,7 @@ Position abschliessen apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5907,12 +5891,12 @@ 8 - + Reset Filters Filter zurücksetzen libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5947,12 +5931,12 @@ 411 - + Apply Filters Filter anwenden libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6177,7 +6161,7 @@ Melde dich jetzt an oder probiere die Live Demo aus apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -6353,7 +6337,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6743,10 +6727,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7419,7 +7399,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7439,11 +7419,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7539,7 +7519,7 @@ Sicherheits-Token apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7551,7 +7531,7 @@ Möchtest du für diesen Benutzer wirklich ein neues Sicherheits-Token generieren? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7804,15 +7784,7 @@ 158 - - Name - Name - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Schnellzugriff @@ -7820,24 +7792,16 @@ 58 - - Asset Profiles - Anlageprofile - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8192,7 +8156,7 @@ Anlageprofil verwalten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 4c380b007..07e4e855d 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -145,6 +145,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -377,6 +381,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -631,7 +639,7 @@ ¿Estás seguro de eliminar este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -685,14 +693,34 @@ Get Started Empezar + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Sign in @@ -707,7 +735,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -795,11 +823,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -822,20 +850,12 @@ 30 - - Sign in with Internet Identity - Iniciar sesión con Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google Iniciar sesión con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -843,7 +863,7 @@ Seguir conectado apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -975,7 +995,7 @@ Reporta un anomalía de los datos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -1329,6 +1349,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1825,10 +1849,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Participaciones libs/ui/src/lib/assistant/assistant.html 110 @@ -2102,20 +2122,12 @@ 281 - - Continue with Internet Identity - Continuar con Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continuar con Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2294,14 +2306,6 @@ 56 - - Get started - Comenzar - - apps/client/src/app/components/header/header.component.html - 432 - - This feature is currently unavailable. Esta funcionalidad no está disponible actualmente. @@ -2891,7 +2895,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2911,11 +2915,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3522,32 +3526,12 @@ 303 - - Get Started - Empieza - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. Es gratis. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4575,7 +4559,7 @@ Estrellas en GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4587,7 +4571,7 @@ Descargas en Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4707,7 +4691,7 @@ Usuarios activos mensuales apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4715,7 +4699,7 @@ Visto en apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4723,7 +4707,7 @@ Protege tus assets. Mejora tu estrategia de inversión personal. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -4731,7 +4715,7 @@ Ghostfolio permite a las personas ocupadas hacer un seguimiento de acciones, ETFs o criptomonedas sin ser rastreadas. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -4739,7 +4723,7 @@ Vista 360° apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -4747,7 +4731,7 @@ Preparado para Web3 apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -4755,7 +4739,7 @@ Usa Ghostfolio de forma anónima y sé dueño de tus datos financieros. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -4763,7 +4747,7 @@ Disfruta de mejoras continuas gracias a una comunidad sólida. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -4779,7 +4763,7 @@ ¿Por qué Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -4787,7 +4771,7 @@ Ghostfolio es para ti si estás... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -4795,7 +4779,7 @@ operando con acciones, ETFs o criptomonedas en múltiples plataformas apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -4803,7 +4787,7 @@ persiguiendo una compra & mantener estrategia apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -4811,7 +4795,7 @@ interesado en obtener información sobre la composición de tu portafolio apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -4819,7 +4803,7 @@ valorando la privacidad y la propiedad de tus datos apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -4827,7 +4811,7 @@ en el minimalismo apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -4835,7 +4819,7 @@ preocuparse por diversificar tus recursos financieros apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -4843,7 +4827,7 @@ interesado en la independencia financiera apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -4851,7 +4835,7 @@ diciendo no a las hojas de cálculo en apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -4859,7 +4843,7 @@ todavía leyendo esta lista apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -4867,7 +4851,7 @@ Más información sobre Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -4875,7 +4859,7 @@ Lo que nuestros usuarios están diciendo apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -4883,7 +4867,7 @@ Miembros de todo el mundo están usando Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -4891,7 +4875,7 @@ ¿Cómo Ghostfolio work? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -4899,7 +4883,7 @@ Regístrate de forma anónima* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -4907,7 +4891,7 @@ * no se requiere dirección de correo electrónico ni tarjeta de crédito apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -4915,7 +4899,7 @@ Agrega cualquiera de tus transacciones históricas apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -4923,7 +4907,7 @@ Obtén información valiosa sobre la composición de tu portafolio apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -4931,7 +4915,7 @@ ¿Estás listo? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -4939,7 +4923,7 @@ Obtén una visión completa de tus finanzas personales en múltiples plataformas. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -4947,7 +4931,7 @@ Comienza en solo 3 pasos apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -5765,7 +5749,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5884,12 +5868,12 @@ 8 - + Reset Filters Reiniciar filtros libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5924,12 +5908,12 @@ 411 - + Apply Filters Aplicar filtros libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6154,7 +6138,7 @@ Únete ahora o consulta la cuenta de ejemplo apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -6330,7 +6314,7 @@ Código abierto apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6720,10 +6704,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7396,7 +7376,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7416,11 +7396,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7516,7 +7496,7 @@ Token de seguridad apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7528,7 +7508,7 @@ ¿Realmente deseas generar un nuevo token de seguridad para este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7805,15 +7785,7 @@ 158 - - Name - Nombre - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Enlaces rápidos @@ -7821,24 +7793,16 @@ 58 - - Asset Profiles - Perfiles de activos - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Demostración en vivo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8193,7 +8157,7 @@ Gestionar perfil de activo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index b25a87570..f51609582 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -152,6 +152,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -432,6 +436,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -838,7 +846,7 @@ Voulez-vous vraiment supprimer cet·te utilisateur·rice ? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -933,14 +941,6 @@ 5 - - Get started - Démarrer - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in Se connecter @@ -954,7 +954,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -1090,11 +1090,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1117,20 +1117,12 @@ 30 - - 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 - 38 - - Sign in with Google Se connecter avec Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -1138,7 +1130,7 @@ Rester connecté apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -1262,7 +1254,7 @@ Signaler une Erreur de Données apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -1676,6 +1668,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1912,6 +1908,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -2425,14 +2425,6 @@ 7 - - Holdings - Positions - - libs/ui/src/lib/assistant/assistant.html - 110 - - Pricing Prix @@ -2500,14 +2492,34 @@ Get Started Démarrer + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Registration @@ -2541,20 +2553,12 @@ 101 - - Continue with Internet Identity - Continue avec Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continuer avec Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2922,7 +2926,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -3150,11 +3154,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3521,32 +3525,12 @@ 303 - - Get Started - Démarrer - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. C’est gratuit. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4574,7 +4558,7 @@ Etoiles sur GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4586,7 +4570,7 @@ Téléchargement depuis Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4706,7 +4690,7 @@ Utilisateurs actifs mensuels apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4714,7 +4698,7 @@ Médias apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4722,7 +4706,7 @@ Protégez vos actifs. Affinez votre stratégie d’investissement personnelle.. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -4730,7 +4714,7 @@ Ghostfolio permet aux personnes occupées de suivre ses actions, ETF ou cryptomonnaies sans être pistées. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -4738,7 +4722,7 @@ Vision 360° apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -4746,7 +4730,7 @@ Compatible Web3 apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -4754,7 +4738,7 @@ Utilisez Ghostfolio de manière anonyme et soyez propriétaire de vos données financières. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -4762,7 +4746,7 @@ Bénéficiez d’améliorations continues grâce à une communauté impliquée. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -4778,7 +4762,7 @@ Pourquoi Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -4786,7 +4770,7 @@ Ghostfolio est pour vous si vous ... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -4794,7 +4778,7 @@ tradez des actions, ETFs or crypto-monnaies sur plusieurs plateforme. apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -4802,7 +4786,7 @@ adoptez une stratégie Buy & and Hold apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -4810,7 +4794,7 @@ êtes intéressés d’avoir un aperçu de la composition de votre portefeuille apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -4818,7 +4802,7 @@ valorisez la confidentialité et la propriété de vos données apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -4826,7 +4810,7 @@ êtes minimaliste apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -4834,7 +4818,7 @@ vous souciez de diversifier vos ressources financières apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -4842,7 +4826,7 @@ êtes intéressés d’atteindre l’indépendance financière apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -4850,7 +4834,7 @@ dites non aux feuilles de calcul en apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -4858,7 +4842,7 @@ continuez à lire cette liste apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -4866,7 +4850,7 @@ En appendre plus sur Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -4874,7 +4858,7 @@ Qu’en pensent nos utilisateurs apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -4882,7 +4866,7 @@ Les utilisateurs du monde entier utilisent Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -4890,7 +4874,7 @@ Comment fonctionne Ghostfolio ? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -4898,7 +4882,7 @@ Inscrivez-vous de manière anonyme* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -4906,7 +4890,7 @@ * aucune adresse mail ni carte de crédit requise apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -4914,7 +4898,7 @@ Ajoutez l’une de vos transactions historiques apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -4922,7 +4906,7 @@ Obtenez de précieuses informations sur la composition de votre portefeuille apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -4930,7 +4914,7 @@ Êtes- vous prêts ? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -4938,7 +4922,7 @@ Obtenez une vue d’ensemble de vos finances personnelles sur plusieurs plateformes. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -4946,7 +4930,7 @@ Démarrer en seulement 3 étapes apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -5764,7 +5748,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5883,12 +5867,12 @@ 8 - + Reset Filters Réinitialiser les Filtres libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5923,12 +5907,12 @@ 411 - + Apply Filters Appliquer les Filtres libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6153,7 +6137,7 @@ Rejoindre ou voir un compte démo apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -6329,7 +6313,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6719,10 +6703,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7395,7 +7375,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7415,11 +7395,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7515,7 +7495,7 @@ Jeton de sécurité apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7527,7 +7507,7 @@ Voulez-vous vraiment générer un nouveau jeton de sécurité pour cet utilisateur ? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7804,15 +7784,7 @@ 158 - - Name - Nom - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Liens rapides @@ -7820,24 +7792,16 @@ 58 - - Asset Profiles - Profils d’Actifs - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Démo Live apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8192,7 +8156,7 @@ Gérer le profil d’actif apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index f5c8f799c..5b4058606 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -145,6 +145,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -377,6 +381,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -631,7 +639,7 @@ Vuoi davvero eliminare questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -685,14 +693,34 @@ Get Started Inizia + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Sign in @@ -707,7 +735,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -795,11 +823,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -822,20 +850,12 @@ 30 - - Sign in with Internet Identity - Accedi con Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google Accedi con Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -843,7 +863,7 @@ Rimani connesso apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -975,7 +995,7 @@ Segnala un’anomalia dei dati apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -1329,6 +1349,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1825,10 +1849,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Partecipazioni libs/ui/src/lib/assistant/assistant.html 110 @@ -2102,20 +2122,12 @@ 281 - - Continue with Internet Identity - Continua con Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continua con Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2294,14 +2306,6 @@ 56 - - Get started - Inizia - - apps/client/src/app/components/header/header.component.html - 432 - - This feature is currently unavailable. Questa funzionalità non è attualmente disponibile. @@ -2891,7 +2895,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2911,11 +2915,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3522,32 +3526,12 @@ 303 - - Get Started - Inizia - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. È gratuito. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4575,7 +4559,7 @@ Stelle su GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4587,7 +4571,7 @@ Estrazioni su Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4707,7 +4691,7 @@ Utenti attivi mensili apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4715,7 +4699,7 @@ Come si vede su apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4723,7 +4707,7 @@ Proteggi i tuoi asset. Perfeziona la tua strategia di investimento personale. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -4731,7 +4715,7 @@ Ghostfolio permette alle persone impegnate di tenere traccia di azioni, ETF o criptovalute senza essere tracciate. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -4739,7 +4723,7 @@ Vista a 360° apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -4747,7 +4731,7 @@ Pronto per il Web3 apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -4755,7 +4739,7 @@ Usa Ghostfolio in modo anonimo e possiedi i tuoi dati finanziari. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -4763,7 +4747,7 @@ Beneficia dei continui miglioramenti grazie a una forte comunità. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -4779,7 +4763,7 @@ Perché Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -4787,7 +4771,7 @@ Ghostfolio è per te se... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -4795,7 +4779,7 @@ fai trading di azioni, ETF o criptovalute su più piattaforme apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -4803,7 +4787,7 @@ persegui una strategia buy & hold apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -4811,7 +4795,7 @@ sei interessato a conoscere la composizione del tuo portafoglio apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -4819,7 +4803,7 @@ valorizzi la privacy e la proprietà dei dati apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -4827,7 +4811,7 @@ sei per il minimalismo apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -4835,7 +4819,7 @@ ti interessa diversificare le tue risorse finanziarie apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -4843,7 +4827,7 @@ sei interessato all’indipendenza finanziaria apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -4851,7 +4835,7 @@ non vuoi utilizzare il foglio elettronico nel apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -4859,7 +4843,7 @@ stai ancora leggendo questo elenco apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -4867,7 +4851,7 @@ Ulteriori informazioni su Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -4875,7 +4859,7 @@ Cosa dicono i nostri utenti apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -4883,7 +4867,7 @@ Membri da tutto il mondo utilizzano Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -4891,7 +4875,7 @@ Come funziona Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -4899,7 +4883,7 @@ Iscriviti in modo anonimo* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -4907,7 +4891,7 @@ * non è richiesto alcun indirizzo email né la carta di credito apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -4915,7 +4899,7 @@ Aggiungi le tue transazioni storiche apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -4923,7 +4907,7 @@ Ottieni informazioni preziose sulla composizione del tuo portafoglio apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -4931,7 +4915,7 @@ Sei pronto? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -4939,7 +4923,7 @@ Ottieni un quadro completo delle tue finanze personali su più piattaforme. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -4947,7 +4931,7 @@ Inizia in soli 3 passi apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -5765,7 +5749,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5884,12 +5868,12 @@ 8 - + Reset Filters Reset Filtri libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5924,12 +5908,12 @@ 411 - + Apply Filters Applica i Filtri libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6154,7 +6138,7 @@ Registrati adesso o prova l’account demo apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -6330,7 +6314,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6720,10 +6704,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7396,7 +7376,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7416,11 +7396,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7516,7 +7496,7 @@ Token di sicurezza apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7528,7 +7508,7 @@ Vuoi davvero generare un nuovo token di sicurezza per questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7805,15 +7785,7 @@ 158 - - Name - Nome - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Collegamenti rapidi @@ -7821,24 +7793,16 @@ 58 - - Asset Profiles - Profili delle risorse - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Dimostrazione dal vivo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8193,7 +8157,7 @@ Gestisci profilo risorsa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 1ec127b22..6a1f871a6 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -144,6 +144,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -376,6 +380,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -630,7 +638,7 @@ Wilt je deze gebruiker echt verwijderen? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -684,14 +692,34 @@ Get Started Aan de slag + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Sign in @@ -706,7 +734,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -794,11 +822,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -821,20 +849,12 @@ 30 - - Sign in with Internet Identity - Aanmelden met Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google Aanmelden met Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -842,7 +862,7 @@ Aangemeld blijven apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -974,7 +994,7 @@ Gegevensstoring melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -1328,6 +1348,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -1824,10 +1848,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Posities libs/ui/src/lib/assistant/assistant.html 110 @@ -2101,20 +2121,12 @@ 281 - - Continue with Internet Identity - Ga verder met Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Verder met Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2293,14 +2305,6 @@ 56 - - Get started - Aan de slag - - apps/client/src/app/components/header/header.component.html - 432 - - This feature is currently unavailable. Deze functie is momenteel niet beschikbaar. @@ -2890,7 +2894,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2910,11 +2914,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3521,32 +3525,12 @@ 303 - - Get Started - Aan de slag - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. Het is gratis. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4574,7 +4558,7 @@ Sterren op GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4586,7 +4570,7 @@ Pulls op Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4706,7 +4690,7 @@ Maandelijkse actieve gebruikers apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4714,7 +4698,7 @@ Zoals te zien in apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4722,7 +4706,7 @@ Bescherm je financiële bezittingen. Verfijn je persoonlijke investeringsstrategie. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -4730,7 +4714,7 @@ Ghostfolio stelt drukbezette mensen in staat om aandelen, ETF’s of cryptocurrencies bij te houden zonder gevolgd te worden. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -4738,7 +4722,7 @@ 360°-overzicht apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -4746,7 +4730,7 @@ Klaar voor Web3 apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -4754,7 +4738,7 @@ Gebruik Ghostfolio anoniem en bezit je financiële gegevens. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -4762,7 +4746,7 @@ Profiteer van voortdurende verbeteringen door een sterke gemeenschap. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -4778,7 +4762,7 @@ Waarom Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -4786,7 +4770,7 @@ Ghostfolio is iets voor je als je... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -4794,7 +4778,7 @@ handelt in aandelen, ETF’s of cryptocurrencies op meerdere platforms apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -4802,7 +4786,7 @@ streeft naar een buy & hold strategie apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -4810,7 +4794,7 @@ geïnteresseerd bent in het krijgen van inzicht in je portefeuillesamenstelling apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -4818,7 +4802,7 @@ privacy en eigendom van gegevens waardeert apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -4826,7 +4810,7 @@ houdt van een minimalistisch ontwerp apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -4834,7 +4818,7 @@ zorgdraagt voor het diversifiëren van je financiële middelen apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -4842,7 +4826,7 @@ geïnteresseerd bent in financiële onafhankelijkheid apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -4850,7 +4834,7 @@ "nee" zegt tegen spreadsheets in apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -4858,7 +4842,7 @@ nog steeds deze lijst aan het lezen bent apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -4866,7 +4850,7 @@ Leer meer over Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -4874,7 +4858,7 @@ Wat onze gebruikers zeggen apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -4882,7 +4866,7 @@ Leden van over de hele wereld gebruikenGhostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -4890,7 +4874,7 @@ Hoe Ghostfolio werkt? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -4898,7 +4882,7 @@ Anoniem aanmelden* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -4906,7 +4890,7 @@ * geen e-mailadres of creditcard nodig apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -4914,7 +4898,7 @@ Voeg al je historische transacties toe apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -4922,7 +4906,7 @@ Krijg waardevolle inzichten in de samenstelling van je portefeuille apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -4930,7 +4914,7 @@ Ben jij er klaar voor? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -4938,7 +4922,7 @@ Krijg een volledig beeld van je persoonlijke financiën op meerdere platforms. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -4946,7 +4930,7 @@ Aan de slag in slechts 3 stappen apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -5764,7 +5748,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5883,12 +5867,12 @@ 8 - + Reset Filters Filters Herstellen libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5923,12 +5907,12 @@ 411 - + Apply Filters Filters Toepassen libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6153,7 +6137,7 @@ Word nu lid of bekijk het voorbeeldaccount apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -6329,7 +6313,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6719,10 +6703,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7395,7 +7375,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7415,11 +7395,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7515,7 +7495,7 @@ Beveiligingstoken apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7527,7 +7507,7 @@ Wilt u echt een nieuw beveiligingstoken voor deze gebruiker aanmaken? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7804,15 +7784,7 @@ 158 - - Name - Naam - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Snelle koppelingen @@ -7820,24 +7792,16 @@ 58 - - Asset Profiles - Activaprofielen - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live-demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8192,7 +8156,7 @@ Beheer activaprofiel apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index d8e342569..a52b15599 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -389,6 +389,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1295,7 +1299,7 @@ Czy na pewno chcesz usunąć tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -1422,14 +1426,6 @@ 5 - - Get started - Rozpocznij - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in Zaloguj się @@ -1443,7 +1439,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -1679,11 +1675,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1706,20 +1702,12 @@ 30 - - Sign in with Internet Identity - Zaloguj się przy użyciu Tożsamości Internetowej (Internet Identity) - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google Zaloguj się przez Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -1727,7 +1715,7 @@ Pozostań zalogowany apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -1883,7 +1871,7 @@ Zgłoś Błąd Danych apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -2557,6 +2545,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. @@ -2969,14 +2961,34 @@ Get Started Rozpocznij + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -3001,6 +3013,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -3106,32 +3122,12 @@ 11 - - Get Started - Rozpocznij - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users Aktywni Użytkownicy w Miesiącu apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -3139,7 +3135,7 @@ Gwiazdki na GitHubie apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -3151,7 +3147,7 @@ Pobrania na Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -3163,7 +3159,7 @@ Dostrzegli Nas apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -3171,7 +3167,7 @@ Chroń swoje zasoby. Udoskonal swoją osobistą strategię inwestycyjną. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -3179,7 +3175,7 @@ Ghostfolio umożliwia zapracowanym osobom śledzenie akcji, funduszy ETF lub kryptowalut, jednocześnie zachowując prywatność. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -3187,7 +3183,7 @@ Widok 360° apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -3195,7 +3191,7 @@ Uzyskaj pełny obraz swoich finansów osobistych na wielu różnych platformach. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -3203,7 +3199,7 @@ Gotowy na Web3 apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -3211,7 +3207,7 @@ Korzystaj z Ghostfolio anonimowo i zachowaj pełną kontrolę nad swoimi danymi finansowymi. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -3219,7 +3215,7 @@ Czerp korzyści z nieustannych ulepszeń dzięki silnej społeczności. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -3235,7 +3231,7 @@ Dlaczego Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -3243,7 +3239,7 @@ Ghostfolio jest dla Ciebie, jeśli... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -3251,7 +3247,7 @@ handlujesz akcjami, funduszami ETF lub kryptowalutami na wielu platformach apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -3259,7 +3255,7 @@ realizujesz strategię buy & hold apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -3267,7 +3263,7 @@ chcesz uzyskać wgląd w strukturę swojego portfolio apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -3275,7 +3271,7 @@ cenisz sobie prywatność i własność swoich danych apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -3283,7 +3279,7 @@ lubisz minimalizm apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -3291,7 +3287,7 @@ zależy Ci na dywersyfikacji swoich zasobów finansowych apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -3299,7 +3295,7 @@ jesteś zainteresowany niezależnością finansową apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -3307,7 +3303,7 @@ mówisz „nie” arkuszom kalkulacyjnym w roku apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -3315,7 +3311,7 @@ nadal czytasz tę listę apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -3323,7 +3319,7 @@ Dowiedz się więcej o Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -3331,7 +3327,7 @@ Co mówią nasi użytkownicy apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -3339,7 +3335,7 @@ Użytkownicy z całego świata korzystają z Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -3347,7 +3343,7 @@ Jak działa Ghostfolio ? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -3355,7 +3351,7 @@ Rozpocznij w zaledwie 3 krokach apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -3371,7 +3367,7 @@ Zarejestruj się anonimowo* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -3379,7 +3375,7 @@ * nie jest wymagany ani adres e-mail, ani karta kredytowa apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -3387,7 +3383,7 @@ Dodaj dowolne z Twoich historycznych transakcji apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -3395,7 +3391,7 @@ Zyskaj cenny wgląd w strukturę swojego portfolio apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -3403,7 +3399,7 @@ Czy jesteś gotów? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -4114,14 +4110,6 @@ 7 - - Holdings - Inwestycje - - libs/ui/src/lib/assistant/assistant.html - 110 - - Pricing Cennik @@ -4343,7 +4331,7 @@ Jest bezpłatny. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4390,20 +4378,12 @@ 281 - - Continue with Internet Identity - Kontynuuj z tożsamością internetową - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Zaloguj z Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -4870,6 +4850,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + , @@ -5208,7 +5192,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -5576,11 +5560,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5764,7 +5748,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5883,12 +5867,12 @@ 8 - + Reset Filters Resetuj Filtry libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5923,12 +5907,12 @@ 411 - + Apply Filters Zastosuj Filtry libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6153,7 +6137,7 @@ Dołącz teraz lub sprawdź przykładowe konto apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -6329,7 +6313,7 @@ Otwarty Kod Źródłowy apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6719,10 +6703,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7395,7 +7375,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7415,11 +7395,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7515,7 +7495,7 @@ Token bezpieczeństwa apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7527,7 +7507,7 @@ Czy napewno chcesz wygenerować nowy token bezpieczeństwa dla tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7804,15 +7784,7 @@ 158 - - Name - Nazwa - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Szybkie linki @@ -7820,24 +7792,16 @@ 58 - - Asset Profiles - Profile zasobów - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Demonstracja na żywo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8192,7 +8156,7 @@ Zarządzaj profilem aktywów apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 9280de1dd..3867d6fbe 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -152,6 +152,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -432,6 +436,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -710,7 +718,7 @@ Deseja realmente excluir este utilizador? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -805,14 +813,6 @@ 5 - - Get started - Começar - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in Iniciar sessão @@ -826,7 +826,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -970,11 +970,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -997,20 +997,12 @@ 30 - - Sign in with Internet Identity - Iniciar sessão com Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google Iniciar sessão com Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -1018,7 +1010,7 @@ Manter sessão iniciada apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -1222,7 +1214,7 @@ Dados do Relatório com Problema apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -1672,6 +1664,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -2360,10 +2356,6 @@ libs/common/src/lib/routes/routes.ts 167 - - - Holdings - Posições libs/ui/src/lib/assistant/assistant.html 110 @@ -2436,14 +2428,34 @@ Get Started Começar + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Registration @@ -2477,20 +2489,12 @@ 101 - - Continue with Internet Identity - Continuar com Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Continuar com Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -2766,7 +2770,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -2994,11 +2998,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3521,32 +3525,12 @@ 303 - - Get Started - Começar - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - It’s free. É gratuito. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4574,7 +4558,7 @@ Estrelas no GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -4586,7 +4570,7 @@ Não puxa Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -4706,7 +4690,7 @@ Usuários ativos mensais apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -4714,7 +4698,7 @@ Como visto em apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -4722,7 +4706,7 @@ Proteja o seu assets. Refine your personal investment strategy. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -4730,7 +4714,7 @@ O Ghostfolio permite que pessoas ocupadas acompanhem ações, ETFs ou criptomoedas sem serem rastreadas. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -4738,7 +4722,7 @@ 360° visualizar apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -4746,7 +4730,7 @@ Web3 Preparar apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -4754,7 +4738,7 @@ Use o Ghostfolio anonimamente e possua seus dados financeiros. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -4762,7 +4746,7 @@ Beneficie-se de melhorias contínuas através de uma comunidade forte. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -4778,7 +4762,7 @@ Por que Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -4786,7 +4770,7 @@ Ghostfolio é para você se você for... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -4794,7 +4778,7 @@ negociar ações, ETFs ou criptomoedas em múltiplas plataformas apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -4802,7 +4786,7 @@ buscando uma compra & estratégia de retenção apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -4810,7 +4794,7 @@ interessado em obter insights sobre a composição do seu portfólio apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -4818,7 +4802,7 @@ valorizando a privacidade e a propriedade dos dados apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -4826,7 +4810,7 @@ no minimalismo apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -4834,7 +4818,7 @@ preocupando-se em diversificar seus recursos financeiros apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -4842,7 +4826,7 @@ interessado em independência financeira apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -4850,7 +4834,7 @@ dizendo não às planilhas em apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -4858,7 +4842,7 @@ ainda lendo esta lista apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -4866,7 +4850,7 @@ Saiba mais sobre o Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -4874,7 +4858,7 @@ Qual é o nosso users are saying apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -4882,7 +4866,7 @@ Membros de todo o mundo estão usando Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -4890,7 +4874,7 @@ Como é que Ghostfolio work? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -4898,7 +4882,7 @@ Inscreva-se anonimamente* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -4906,7 +4890,7 @@ * no e-mail address nor credit card required apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -4914,7 +4898,7 @@ Adicione qualquer uma de suas transações históricas apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -4922,7 +4906,7 @@ Obtenha insights valiosos sobre a composição do seu portfólio apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -4930,7 +4914,7 @@ São you preparar? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -4938,7 +4922,7 @@ Tenha uma visão completa das suas finanças pessoais em diversas plataformas. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -4946,7 +4930,7 @@ Comece em apenas 3 passos apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -5764,7 +5748,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5883,12 +5867,12 @@ 8 - + Reset Filters Redefinir filtros libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5923,12 +5907,12 @@ 411 - + Apply Filters Aplicar filtros libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6153,7 +6137,7 @@ Cadastre-se agora ou confira a conta de exemplo apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -6329,7 +6313,7 @@ Código aberto apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6719,10 +6703,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7395,7 +7375,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7415,11 +7395,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7515,7 +7495,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7527,7 +7507,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7804,15 +7784,7 @@ 158 - - Name - Nome - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Links rápidos @@ -7820,24 +7792,16 @@ 58 - - Asset Profiles - Perfis de ativos - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8192,7 +8156,7 @@ Gerenciar perfil de ativos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index b867b8da8..b672a6f2c 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -349,6 +349,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -613,6 +617,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Historical Market Data @@ -1159,7 +1167,7 @@ Bu kullanıcıyı silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -1278,14 +1286,6 @@ 5 - - Get started - Haydi Başlayalım - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in Giriş @@ -1299,7 +1299,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -1535,11 +1535,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1562,20 +1562,12 @@ 30 - - Sign in with Internet Identity - İnternet Kimliği (Internet Identity) ile Oturum Aç - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google Google ile Oturum Aç apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -1583,7 +1575,7 @@ Oturumu açık tut apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -1739,7 +1731,7 @@ Rapor Veri Sorunu apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -2157,6 +2149,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Update account @@ -2549,14 +2545,34 @@ Get Started Başla + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -2581,6 +2597,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -2662,32 +2682,12 @@ 11 - - Get Started - Başla - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users Aylık Aktif Kullanıcılar apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -2695,7 +2695,7 @@ GitHub’daki Beğeniler apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -2707,7 +2707,7 @@ Docker Hub’ta Çekmeler apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -2719,7 +2719,7 @@ Şurada görüldüğü gibi apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -2727,7 +2727,7 @@ varlıklarınızı koruyun. Kişisel yatırım stratejinizi geliştirin. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -2735,7 +2735,7 @@ Ghostfolio, takip edilmeden hisse senetleri, ETF’ler veya kripto paraları izlemek isteyen yoğun insanlara güç verir. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -2743,7 +2743,7 @@ 360° Görünüm apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -2751,7 +2751,7 @@ Kişisel finansınızın tam resmini birden fazla platformda edinin. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -2759,7 +2759,7 @@ Web3 Hazır apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -2767,7 +2767,7 @@ Ghostfolio’yu anonim olarak kullanın ve finansal verilerinize sahip çıkın. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -2775,7 +2775,7 @@ Güçlü bir topluluk aracılığıyla sürekli gelişmelerden faydalanın. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -2791,7 +2791,7 @@ Neden Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -2799,7 +2799,7 @@ Ghostfolio tam size göre, apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -2807,7 +2807,7 @@ Birden fazla platformda hisse senedi, ETF veya kripto para ticareti yapıyorsanız, apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -2815,7 +2815,7 @@ al ve tut stratejisi izliyorsanız, apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -2823,7 +2823,7 @@ Portföy bileşimine dair içgörüleri edinmek istiyorsanız, apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -2831,7 +2831,7 @@ Gizliliğe ve verilerinize sahip çıkmayı önemsiyorsanız apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -2839,7 +2839,7 @@ minimalizme ilgi duyuyorsanız apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -2847,7 +2847,7 @@ finansal kaynaklarınızı çeşitlendirmeye önem veriyorsanız apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -2855,7 +2855,7 @@ finansal özgürlük peşindeyseniz apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -2863,7 +2863,7 @@ elektronik tablo uygulamalarına hayır diyorsanız apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -2871,7 +2871,7 @@ bu listeyi hala okuyorsanız apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -2879,7 +2879,7 @@ Ghostfolio hakkında daha fazla bilgi edinin apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -2887,7 +2887,7 @@ Kullanıcılarımızın görüşleri apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -2895,7 +2895,7 @@ Dünyanın dört bir yanındaki kullanıcılar Ghostfolio Premium kullanıyorlar. apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -2903,7 +2903,7 @@ NasılGhostfolio çalışır? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -2911,7 +2911,7 @@ Sadece 3 adımda başlayın apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -2927,7 +2927,7 @@ Anonim olarak kaydolun* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -2935,7 +2935,7 @@ * e-posta adresi veya kredi kartı gerekmez apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -2943,7 +2943,7 @@ Herhangi bir geçmiş işleminizi ekleyin apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -2951,7 +2951,7 @@ Portföy bileşiminizle ilgili değerli bilgiler edinin apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -2959,7 +2959,7 @@ Hazır mısınız? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -3602,14 +3602,6 @@ 7 - - Holdings - Varlıklar - - libs/ui/src/lib/assistant/assistant.html - 110 - - Pricing Fiyatlandırma @@ -3831,7 +3823,7 @@ Ücretsiz. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -3898,20 +3890,12 @@ 101 - - Continue with Internet Identity - İnternet Kimliği ile Devam Et - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Google ile Devam Et apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -4904,7 +4888,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -5220,11 +5204,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5764,7 +5748,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5883,12 +5867,12 @@ 8 - + Reset Filters Filtreleri Sıfırla libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5923,12 +5907,12 @@ 411 - + Apply Filters Filtreleri Uygula libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6153,7 +6137,7 @@ Hemen katıl ya da örnek hesabı incele apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -6329,7 +6313,7 @@ Açık Kaynak apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6719,10 +6703,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7395,7 +7375,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7415,11 +7395,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7515,7 +7495,7 @@ Güvenlik belirteci apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7527,7 +7507,7 @@ Bu kullanıcı için yeni bir güvenlik belirteci oluşturmak istediğinize emin misiniz? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7804,15 +7784,7 @@ 158 - - Name - İsim - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Hızlı Bağlantılar @@ -7820,24 +7792,16 @@ 58 - - Asset Profiles - Varlık Profilleri - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Canlı Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8192,7 +8156,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 0305608c2..5677f32ca 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -42,7 +42,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -349,10 +349,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -426,14 +422,6 @@ 86 - - Holdings - Активи - - libs/ui/src/lib/assistant/assistant.html - 110 - - Cash Balances Баланс готівки @@ -501,6 +489,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1519,11 +1511,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1595,7 +1587,7 @@ Ви дійсно хочете видалити цього користувача? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -1762,14 +1754,6 @@ 5 - - Get started - Почати - - apps/client/src/app/components/header/header.component.html - 432 - - Oops! Incorrect Security Token. Упс! Неправильний Секретний Токен. @@ -1887,7 +1871,7 @@ Повідомити про збій даних apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -2118,20 +2102,12 @@ 72 - - Sign in with Internet Identity - Увійти з Інтернет-Ідентичністю - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google Увійти з Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -2139,7 +2115,7 @@ Залишатися в системі apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -3177,6 +3153,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. @@ -3630,14 +3610,34 @@ Get Started Почати + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -3662,6 +3662,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -3775,32 +3779,12 @@ 11 - - Get Started - Почати - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users Щомісячні активні користувачі apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -3808,7 +3792,7 @@ Зірки на GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -3820,7 +3804,7 @@ Завантаження на Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -3832,7 +3816,7 @@ Як видно в apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -3840,7 +3824,7 @@ Захищайте свої активи. Вдосконалюйте власну інвестиційну стратегію. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -3848,7 +3832,7 @@ Ghostfolio допомагає зайнятим людям відстежувати акції, ETF або криптовалюти без ризику бути відстеженими. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -3856,7 +3840,7 @@ 360° огляд apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -3864,7 +3848,7 @@ Отримайте повну картину ваших особистих фінансів на різних платформах. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -3872,7 +3856,7 @@ Готовий до Web3 apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -3880,7 +3864,7 @@ Використовуйте Ghostfolio анонімно та володійте своїми фінансовими даними. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -3888,7 +3872,7 @@ Отримуйте користь від постійних покращень завдяки сильній спільноті. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -3904,7 +3888,7 @@ Чому Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -3912,7 +3896,7 @@ Ghostfolio для вас, якщо ви... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -3920,7 +3904,7 @@ торгуєте акціями, ETF або криптовалютами на різних платформах apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -3928,7 +3912,7 @@ дотримуєтеся стратегії купівлі та утримання apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -3936,7 +3920,7 @@ вас цікавлять інсайти вашого складу портфеля apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -3944,7 +3928,7 @@ цінуєте конфіденційність і володіння даними apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -3952,7 +3936,7 @@ займаєтесь мінімалізмом apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -3960,7 +3944,7 @@ піклуєтесь про диверсифікацію ваших фінансових ресурсів apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -3968,7 +3952,7 @@ цікавитесь фінансовою незалежністю apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -3976,7 +3960,7 @@ кажете ні таблицям у apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -3984,7 +3968,7 @@ все ще читаєте цей список apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -3992,7 +3976,7 @@ Дізнайтеся більше про Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -4000,7 +3984,7 @@ Що говорять користувачі apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -4008,7 +3992,7 @@ Члени зі всього світу використовують Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -4016,7 +4000,7 @@ Як працює Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -4024,7 +4008,7 @@ Почніть всього за 3 кроки apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -4040,7 +4024,7 @@ Зареєструйтеся анонімно* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -4048,7 +4032,7 @@ * не потрібні електронна адреса та кредитна картка apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -4056,7 +4040,7 @@ Додайте будь-які з ваших історичних транзакцій apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -4064,7 +4048,7 @@ Отримуйте цінні інсайти вашого складу портфеля apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -4072,7 +4056,7 @@ Ви готові? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -4080,7 +4064,7 @@ Приєднуйтесь зараз або перегляньте демонстраційний рахунок apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -4792,7 +4776,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5160,7 +5144,7 @@ Це безкоштовно. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -5231,20 +5215,12 @@ 281 - - Continue with Internet Identity - Продовжити з Інтернет-Ідентичністю - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google Продовжити з Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -5503,7 +5479,7 @@ Відкритий код apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6181,6 +6157,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + Date Range @@ -6190,20 +6170,20 @@ 170 - + Reset Filters Скинути фільтри libs/ui/src/lib/assistant/assistant.html - 205 + 204 - + Apply Filters Застосувати фільтри libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6683,7 +6663,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -7263,11 +7243,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7395,7 +7375,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7415,11 +7395,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7515,7 +7495,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7527,7 +7507,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7804,15 +7784,7 @@ 158 - - Name - Name - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links Quick Links @@ -7820,24 +7792,16 @@ 58 - - Asset Profiles - Asset Profiles - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8192,7 +8156,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 34502dbc9..d6f615dc8 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -372,6 +372,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1221,7 +1225,7 @@ Do you really want to delete this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -1336,13 +1340,6 @@ 5 - - Get started - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in @@ -1355,7 +1352,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -1570,11 +1567,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1597,25 +1594,18 @@ 30 - - Sign in with Internet Identity - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 Stay signed in apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -1754,7 +1744,7 @@ Report Data Glitch apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -2370,6 +2360,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. @@ -2751,14 +2745,34 @@ Get Started + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -2782,6 +2796,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -2879,37 +2897,18 @@ 11 - - Get Started - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users apps/client/src/app/pages/landing/landing-page.html - 70 + 69 Stars on GitHub apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -2920,7 +2919,7 @@ Pulls on Docker Hub apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -2931,56 +2930,56 @@ As seen in apps/client/src/app/pages/landing/landing-page.html - 115 + 114 Protect your assets. Refine your personal investment strategy. apps/client/src/app/pages/landing/landing-page.html - 125 + 124 Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. apps/client/src/app/pages/landing/landing-page.html - 129 + 128 360° View apps/client/src/app/pages/landing/landing-page.html - 139 + 138 Get the full picture of your personal finances across multiple platforms. apps/client/src/app/pages/landing/landing-page.html - 142 + 141 Web3 Ready apps/client/src/app/pages/landing/landing-page.html - 150 + 149 Use Ghostfolio anonymously and own your financial data. apps/client/src/app/pages/landing/landing-page.html - 153 + 152 Benefit from continuous improvements through a strong community. apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -2994,112 +2993,112 @@ Why Ghostfolio? apps/client/src/app/pages/landing/landing-page.html - 171 + 170 Ghostfolio is for you if you are... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 trading stocks, ETFs or cryptocurrencies on multiple platforms apps/client/src/app/pages/landing/landing-page.html - 179 + 178 pursuing a buy & hold strategy apps/client/src/app/pages/landing/landing-page.html - 185 + 184 interested in getting insights of your portfolio composition apps/client/src/app/pages/landing/landing-page.html - 190 + 189 valuing privacy and data ownership apps/client/src/app/pages/landing/landing-page.html - 195 + 194 into minimalism apps/client/src/app/pages/landing/landing-page.html - 198 + 197 caring about diversifying your financial resources apps/client/src/app/pages/landing/landing-page.html - 202 + 201 interested in financial independence apps/client/src/app/pages/landing/landing-page.html - 206 + 205 saying no to spreadsheets in apps/client/src/app/pages/landing/landing-page.html - 210 + 209 still reading this list apps/client/src/app/pages/landing/landing-page.html - 213 + 212 Learn more about Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 218 + 217 What our users are saying apps/client/src/app/pages/landing/landing-page.html - 227 + 226 Members from around the globe are using Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html - 266 + 265 How does Ghostfolio work? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 Get started in only 3 steps apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -3113,35 +3112,35 @@ Sign up anonymously* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 * no e-mail address nor credit card required apps/client/src/app/pages/landing/landing-page.html - 293 + 292 Add any of your historical transactions apps/client/src/app/pages/landing/landing-page.html - 305 + 304 Get valuable insights of your portfolio composition apps/client/src/app/pages/landing/landing-page.html - 317 + 316 Are you ready? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -3780,13 +3779,6 @@ 7 - - Holdings - - libs/ui/src/lib/assistant/assistant.html - 110 - - Pricing @@ -3989,7 +3981,7 @@ It’s free. apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4031,18 +4023,11 @@ 281 - - Continue with Internet Identity - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -4482,6 +4467,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + 50-Day Trend @@ -4803,7 +4792,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -5133,11 +5122,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5247,7 +5236,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5369,11 +5358,11 @@ 42 - + Reset Filters libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5406,11 +5395,11 @@ 411 - + Apply Filters libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -5609,7 +5598,7 @@ Join now or check out the example account apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -5906,7 +5895,7 @@ Open Source apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6171,10 +6160,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -6727,7 +6712,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -6746,11 +6731,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -6834,7 +6819,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -6848,7 +6833,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7028,13 +7013,6 @@ 275 - - Name - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - Set up @@ -7077,29 +7055,22 @@ 158 - + Quick Links libs/ui/src/lib/assistant/assistant.html 58 - - Asset Profiles - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -7414,7 +7385,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 6d490fc0e..524e28259 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -398,6 +398,10 @@ libs/ui/src/lib/activities-table/activities-table.component.html 135 + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -1304,7 +1308,7 @@ 您真的要删除该用户吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 207 + 211 @@ -1431,14 +1435,6 @@ 5 - - Get started - 开始使用 - - apps/client/src/app/components/header/header.component.html - 432 - - Sign in 登入 @@ -1452,7 +1448,7 @@ apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 71 + 60 libs/common/src/lib/routes/routes.ts @@ -1688,11 +1684,11 @@ apps/client/src/app/pages/landing/landing-page.html - 48 + 47 apps/client/src/app/pages/landing/landing-page.html - 350 + 348 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -1715,20 +1711,12 @@ 30 - - Sign in with Internet Identity - 使用互联网身份登录 - - apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 38 - - Sign in with Google 使用 Google 登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 48 + 37 @@ -1736,7 +1724,7 @@ 保持登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html - 59 + 48 @@ -1892,7 +1880,7 @@ 报告数据故障 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 450 + 451 @@ -2566,6 +2554,10 @@ libs/common/src/lib/routes/routes.ts 69 + + libs/ui/src/lib/assistant/assistant.html + 84 + Oops, cash balance transfer has failed. @@ -2978,14 +2970,34 @@ Get Started 立即开始 + + apps/client/src/app/components/header/header.component.html + 433 + apps/client/src/app/pages/features/features-page.html 320 + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 377 + apps/client/src/app/pages/public/public-page.html 242 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + Holdings @@ -3010,6 +3022,10 @@ libs/common/src/lib/routes/routes.ts 167 + + libs/ui/src/lib/assistant/assistant.html + 110 + Summary @@ -3115,32 +3131,12 @@ 11 - - Get Started - 开始使用 - - apps/client/src/app/pages/landing/landing-page.html - 42 - - - apps/client/src/app/pages/landing/landing-page.html - 346 - - - apps/client/src/app/pages/pricing/pricing-page.html - 378 - - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 334 - - Monthly Active Users 每月活跃用户数 apps/client/src/app/pages/landing/landing-page.html - 70 + 69 @@ -3148,7 +3144,7 @@ GitHub 上的星星 apps/client/src/app/pages/landing/landing-page.html - 88 + 87 apps/client/src/app/pages/open/open-page.html @@ -3160,7 +3156,7 @@ Docker Hub 拉取次数 apps/client/src/app/pages/landing/landing-page.html - 106 + 105 apps/client/src/app/pages/open/open-page.html @@ -3172,7 +3168,7 @@ 如图所示 apps/client/src/app/pages/landing/landing-page.html - 115 + 114 @@ -3180,7 +3176,7 @@ 保护你的资产。完善你的个人投资策略 apps/client/src/app/pages/landing/landing-page.html - 125 + 124 @@ -3188,7 +3184,7 @@ Ghostfolio 使忙碌的人们能够在不被追踪的情况下跟踪股票、ETF 或加密货币。 apps/client/src/app/pages/landing/landing-page.html - 129 + 128 @@ -3196,7 +3192,7 @@ 360° 视角 apps/client/src/app/pages/landing/landing-page.html - 139 + 138 @@ -3204,7 +3200,7 @@ 跨多个平台全面了解您的个人财务状况。 apps/client/src/app/pages/landing/landing-page.html - 142 + 141 @@ -3212,7 +3208,7 @@ Web3 就绪 apps/client/src/app/pages/landing/landing-page.html - 150 + 149 @@ -3220,7 +3216,7 @@ 匿名使用 Ghostfolio 并拥有您的财务数据。 apps/client/src/app/pages/landing/landing-page.html - 153 + 152 @@ -3228,7 +3224,7 @@ 通过强大的社区不断改进,从中受益。 apps/client/src/app/pages/landing/landing-page.html - 163 + 162 @@ -3244,7 +3240,7 @@ 为什么使用Ghostfolio apps/client/src/app/pages/landing/landing-page.html - 171 + 170 @@ -3252,7 +3248,7 @@ 如果您符合以下条件,那么 Ghostfolio 适合您... apps/client/src/app/pages/landing/landing-page.html - 173 + 172 @@ -3260,7 +3256,7 @@ 在多个平台上交易股票、ETF 或加密货币 apps/client/src/app/pages/landing/landing-page.html - 179 + 178 @@ -3268,7 +3264,7 @@ 采取买入并持有策略 apps/client/src/app/pages/landing/landing-page.html - 185 + 184 @@ -3276,7 +3272,7 @@ 有兴趣深入了解您的投资组合构成 apps/client/src/app/pages/landing/landing-page.html - 190 + 189 @@ -3284,7 +3280,7 @@ 重视隐私和数据所有权 apps/client/src/app/pages/landing/landing-page.html - 195 + 194 @@ -3292,7 +3288,7 @@ 进入极简主义 apps/client/src/app/pages/landing/landing-page.html - 198 + 197 @@ -3300,7 +3296,7 @@ 关心您的财务资源多元化 apps/client/src/app/pages/landing/landing-page.html - 202 + 201 @@ -3308,7 +3304,7 @@ 对财务独立感兴趣 apps/client/src/app/pages/landing/landing-page.html - 206 + 205 @@ -3316,7 +3312,7 @@ 年对电子表格说不 apps/client/src/app/pages/landing/landing-page.html - 210 + 209 @@ -3324,7 +3320,7 @@ 仍在阅读此列表 apps/client/src/app/pages/landing/landing-page.html - 213 + 212 @@ -3332,7 +3328,7 @@ 了解有关 Ghostfolio 的更多信息 apps/client/src/app/pages/landing/landing-page.html - 218 + 217 @@ -3340,7 +3336,7 @@ 听听我们的用户怎么说 apps/client/src/app/pages/landing/landing-page.html - 227 + 226 @@ -3348,7 +3344,7 @@ 来自世界各地的会员正在使用Ghostfolio 高级版 apps/client/src/app/pages/landing/landing-page.html - 266 + 265 @@ -3356,7 +3352,7 @@ Ghostfolio 如何工作? apps/client/src/app/pages/landing/landing-page.html - 283 + 282 @@ -3364,7 +3360,7 @@ 只需 3 步即可开始 apps/client/src/app/pages/landing/landing-page.html - 285 + 284 @@ -3380,7 +3376,7 @@ 匿名注册* apps/client/src/app/pages/landing/landing-page.html - 291 + 290 @@ -3388,7 +3384,7 @@ * 无需电子邮件地址或信用卡 apps/client/src/app/pages/landing/landing-page.html - 293 + 292 @@ -3396,7 +3392,7 @@ 添加您的任何历史交易 apps/client/src/app/pages/landing/landing-page.html - 305 + 304 @@ -3404,7 +3400,7 @@ 获取有关您的投资组合构成的宝贵见解 apps/client/src/app/pages/landing/landing-page.html - 317 + 316 @@ -3412,7 +3408,7 @@ 准备好了吗? apps/client/src/app/pages/landing/landing-page.html - 331 + 330 @@ -4123,14 +4119,6 @@ 7 - - Holdings - 持仓 - - libs/ui/src/lib/assistant/assistant.html - 110 - - Pricing 价格 @@ -4352,7 +4340,7 @@ 免费。 apps/client/src/app/pages/pricing/pricing-page.html - 380 + 379 @@ -4399,20 +4387,12 @@ 281 - - Continue with Internet Identity - 继续互联网身份 - - apps/client/src/app/pages/register/register-page.html - 42 - - Continue with Google 继续使用谷歌 apps/client/src/app/pages/register/register-page.html - 53 + 39 @@ -4899,6 +4879,10 @@ apps/client/src/app/components/admin-settings/admin-settings.component.html 106 + + libs/ui/src/lib/assistant/assistant.html + 140 + 50-Day Trend @@ -5253,7 +5237,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 412 + 413 @@ -5621,11 +5605,11 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 414 + 415 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 427 + 428 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5749,7 +5733,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 441 + 442 @@ -5884,12 +5868,12 @@ 42 - + Reset Filters 重置过滤器 libs/ui/src/lib/assistant/assistant.html - 205 + 204 @@ -5924,12 +5908,12 @@ 411 - + Apply Filters 应用过滤器 libs/ui/src/lib/assistant/assistant.html - 219 + 217 @@ -6154,7 +6138,7 @@ 立即加入 或查看示例账户 apps/client/src/app/pages/landing/landing-page.html - 334 + 333 @@ -6330,7 +6314,7 @@ 开源 apps/client/src/app/pages/landing/landing-page.html - 160 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6720,10 +6704,6 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 - - libs/ui/src/lib/assistant/assistant.html - 84 - Copy link to clipboard @@ -7396,7 +7376,7 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 @@ -7416,11 +7396,11 @@ libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 367 + 368 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 380 + 381 @@ -7516,7 +7496,7 @@ 安全令牌 apps/client/src/app/components/admin-users/admin-users.component.ts - 228 + 232 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7528,7 +7508,7 @@ 您确定要为此用户生成新的安全令牌吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 233 + 237 @@ -7805,15 +7785,7 @@ 158 - - Name - 名称 - - libs/ui/src/lib/benchmark/benchmark.component.html - 12 - - - + Quick Links 快速链接 @@ -7821,24 +7793,16 @@ 58 - - Asset Profiles - 资产概况 - - libs/ui/src/lib/assistant/assistant.html - 140 - - Live Demo 现场演示 apps/client/src/app/pages/landing/landing-page.html - 49 + 48 apps/client/src/app/pages/landing/landing-page.html - 351 + 349 libs/common/src/lib/routes/routes.ts @@ -8193,7 +8157,7 @@ 管理资产概况 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 465 + 466 From a1920fedd5fd52ce1cff78366bef770701b178f2 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 5 Nov 2025 11:54:22 +0100 Subject: [PATCH 05/31] Feature/improve usability for benchmark and markets management in asset profile dialog (#5911) * Improve usability for benchmark and markets management * Update changelog --- CHANGELOG.md | 2 ++ .../asset-profile-dialog/asset-profile-dialog.html | 8 ++++++-- .../app/pages/faq/self-hosting/self-hosting-page.html | 9 ++++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ff76b0c2..bca1a8de9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Improved the _Self-Hosting_ section content for the _Compare with..._ concept on the Frequently Asked Questions (FAQ) page +- Improved the _Self-Hosting_ section content for the _Markets_ concept on the Frequently Asked Questions (FAQ) page - Changed the build executor of the client from `@nx/angular:webpack-browser` to `@nx/angular:browser-esbuild` - Improved the language localization for German (`de`) diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index b2c063684..3d855e6e0 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -352,7 +352,6 @@
Benchmark + Include in +   + Benchmark + / + Markets +
diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html index bc468fe96..f44759124 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html @@ -184,7 +184,9 @@
  • Open the Admin Control panel
  • Navigate to the Market Data section
  • Choose an asset profile
  • -
  • In the dialog, check the Benchmark box
  • +
  • + In the dialog, check the Include in Benchmark / Markets box +
  • @@ -212,12 +214,13 @@ How do I set up Markets? -

    The Markets list is derived from your Benchmarks.

    1. Open the Admin Control panel
    2. Navigate to the Market Data section
    3. Choose an asset profile
    4. -
    5. In the dialog, check the Benchmark box
    6. +
    7. + In the dialog, check the Include in Benchmark / Markets box +

    Please note: Data is cached, meaning changes may take a few minutes From 58d9235b8a195f0e05152f9c61c2d8a49f14e134 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:25:41 +0100 Subject: [PATCH 06/31] Feature/update locales (#5916) * Update locales * Update translation --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- apps/client/src/locales/messages.ca.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.de.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.es.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.fr.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.it.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.nl.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.pl.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.pt.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.tr.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.uk.xlf | 50 +++++++++++++++---------- apps/client/src/locales/messages.xlf | 49 ++++++++++++++---------- apps/client/src/locales/messages.zh.xlf | 50 +++++++++++++++---------- 12 files changed, 371 insertions(+), 228 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 361c4ec31..7513eedaf 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -687,7 +687,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -1071,7 +1071,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1091,7 +1091,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1103,7 +1103,7 @@ Mapatge de Símbols apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -1119,7 +1119,7 @@ Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -1127,7 +1127,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -1135,11 +1135,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1155,7 +1155,7 @@ Notes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1303,7 +1303,7 @@ Recollida de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1563,7 +1563,7 @@ Punt de Referència apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2498,6 +2498,14 @@ 280 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Ups! Hi ha hagut un error en configurar l’autenticació biomètrica. @@ -2551,7 +2559,7 @@ Localització apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -3390,6 +3398,10 @@ Markets Mercats + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -6589,7 +6601,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6641,7 +6653,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7183,7 +7195,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7307,7 +7319,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7315,7 +7327,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7323,7 +7335,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7331,7 +7343,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 9a0ebd159..a3583df02 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -394,7 +394,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -962,7 +962,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -982,7 +982,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1262,7 +1262,7 @@ Lokalität apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1664,6 +1664,10 @@ Markets Märkte + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -1966,7 +1970,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2606,7 +2610,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -3038,7 +3042,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -3774,11 +3778,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4142,7 +4146,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -5660,7 +5664,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5944,7 +5948,7 @@ Finanzmarktdaten synchronisieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6164,6 +6168,14 @@ 333 + + Include in + Berücksichtigen in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Ups! Beim Einrichten der biometrischen Authentifizierung ist ein Fehler aufgetreten. @@ -6613,7 +6625,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6665,7 +6677,7 @@ Schliessen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7207,7 +7219,7 @@ Speichern apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7331,7 +7343,7 @@ Standardmarktpreis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7339,7 +7351,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7347,7 +7359,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7355,7 +7367,7 @@ HTTP Request-Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 07e4e855d..62f437994 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -395,7 +395,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -947,7 +947,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -967,7 +967,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1247,7 +1247,7 @@ Ubicación apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1649,6 +1649,10 @@ Markets Mercados + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -1951,7 +1955,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2583,7 +2587,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -3023,7 +3027,7 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -3751,11 +3755,11 @@ ¿La URL? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4119,7 +4123,7 @@ Configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -5637,7 +5641,7 @@ Prueba apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5921,7 +5925,7 @@ Recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6141,6 +6145,14 @@ 333 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. ¡Ups! Hubo un error al configurar la autenticación biométrica. @@ -6590,7 +6602,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6642,7 +6654,7 @@ Cerca apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7184,7 +7196,7 @@ Ahorrar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7308,7 +7320,7 @@ Precio de mercado por defecto apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7316,7 +7328,7 @@ Modo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7324,7 +7336,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7332,7 +7344,7 @@ Encabezados de solicitud HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index f51609582..560859d05 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -450,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -642,7 +642,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -662,7 +662,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -674,7 +674,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -682,7 +682,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -914,7 +914,7 @@ Référence apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1534,7 +1534,7 @@ Paramètres régionaux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1928,6 +1928,10 @@ Markets Marchés + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -3750,11 +3754,11 @@ Lien apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4118,7 +4122,7 @@ Configuration du Scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -5636,7 +5640,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5920,7 +5924,7 @@ Collecter les données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6140,6 +6144,14 @@ 333 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Oops! Une erreur s’est produite lors de la configuration de l’authentification biométrique. @@ -6589,7 +6601,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6641,7 +6653,7 @@ Fermer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7183,7 +7195,7 @@ Sauvegarder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7307,7 +7319,7 @@ Prix du marché par défaut apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7315,7 +7327,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7323,7 +7335,7 @@ Selecteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7331,7 +7343,7 @@ En-têtes de requête HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 5b4058606..076c02068 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -395,7 +395,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -947,7 +947,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -967,7 +967,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1247,7 +1247,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1649,6 +1649,10 @@ Markets Mercati + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -1951,7 +1955,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2583,7 +2587,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -3023,7 +3027,7 @@ Mappatura dei simboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -3751,11 +3755,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4119,7 +4123,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -5637,7 +5641,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5921,7 +5925,7 @@ Raccolta Dati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6141,6 +6145,14 @@ 333 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Ops! C’è stato un errore impostando l’autenticazione biometrica. @@ -6590,7 +6602,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6642,7 +6654,7 @@ Chiudi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7184,7 +7196,7 @@ Salva apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7308,7 +7320,7 @@ Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7316,7 +7328,7 @@ Modalità apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7324,7 +7336,7 @@ Selettore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7332,7 +7344,7 @@ Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 6a1f871a6..4a17736b4 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -394,7 +394,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -946,7 +946,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -966,7 +966,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1246,7 +1246,7 @@ Locatie apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1648,6 +1648,10 @@ Markets Markten + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -1950,7 +1954,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2582,7 +2586,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -3022,7 +3026,7 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -3750,11 +3754,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4118,7 +4122,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -5636,7 +5640,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5920,7 +5924,7 @@ Data Verzamelen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6140,6 +6144,14 @@ 333 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Oeps! Er is een fout opgetreden met het instellen van de biometrische authenticatie. @@ -6589,7 +6601,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6641,7 +6653,7 @@ Sluiten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7183,7 +7195,7 @@ Opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7307,7 +7319,7 @@ Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7315,7 +7327,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7323,7 +7335,7 @@ Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7331,7 +7343,7 @@ HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index a52b15599..321cfbecd 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -591,7 +591,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -919,7 +919,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -939,7 +939,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -951,7 +951,7 @@ Mapowanie Symboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -967,7 +967,7 @@ Konfiguracja Scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -975,7 +975,7 @@ Notatka apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1191,11 +1191,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1391,7 +1391,7 @@ Poziom Odniesienia (Benchmark) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2247,7 +2247,7 @@ Ustawienia Regionalne apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -3033,6 +3033,10 @@ Markets Rynki + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -5636,7 +5640,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5920,7 +5924,7 @@ Gromadzenie Danych apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6140,6 +6144,14 @@ 333 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Ups! Wystąpił błąd podczas konfigurowania uwierzytelniania biometrycznego. @@ -6589,7 +6601,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6641,7 +6653,7 @@ Zamknij apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7183,7 +7195,7 @@ Zapisz apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7307,7 +7319,7 @@ Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7315,7 +7327,7 @@ Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7323,7 +7335,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7331,7 +7343,7 @@ Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 3867d6fbe..dc8804544 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -450,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -786,7 +786,7 @@ Referência apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1166,7 +1166,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1186,7 +1186,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1530,7 +1530,7 @@ Localidade apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1900,6 +1900,10 @@ Markets Mercados + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -2062,7 +2066,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -3030,7 +3034,7 @@ Mapeamento de Símbolo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -3750,11 +3754,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -4118,7 +4122,7 @@ Configuração do raspador apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -5636,7 +5640,7 @@ Teste apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5920,7 +5924,7 @@ Coleta de dados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6140,6 +6144,14 @@ 333 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Ops! Ocorreu um erro ao configurar a autenticação biométrica. @@ -6589,7 +6601,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6641,7 +6653,7 @@ Fechar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7183,7 +7195,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7307,7 +7319,7 @@ Preço de mercado padrão apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7315,7 +7327,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7323,7 +7335,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7331,7 +7343,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index b672a6f2c..235f670a3 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -631,7 +631,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -851,7 +851,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -871,7 +871,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -883,7 +883,7 @@ Sembol Eşleştirme apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -899,7 +899,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -907,7 +907,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1107,11 +1107,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1259,7 +1259,7 @@ Karşılaştırma Ölçütü apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2617,6 +2617,10 @@ Markets Piyasalar + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -4380,7 +4384,7 @@ Yerel Ayarlar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -5636,7 +5640,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5920,7 +5924,7 @@ Veri Toplama apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6140,6 +6144,14 @@ 333 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Oops! Biyometrik kimlik doğrulama ayarlanırken bir hata oluştu. @@ -6589,7 +6601,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6641,7 +6653,7 @@ Kapat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7183,7 +7195,7 @@ Kaydet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7307,7 +7319,7 @@ Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7315,7 +7327,7 @@ Mod apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7323,7 +7335,7 @@ Seçici apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7331,7 +7343,7 @@ HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 5677f32ca..c1f2c7bce 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -711,7 +711,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -1059,7 +1059,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1079,7 +1079,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1091,7 +1091,7 @@ Зіставлення символів apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -1107,7 +1107,7 @@ Конфігурація скребка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -1115,7 +1115,7 @@ Тест apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -1123,11 +1123,11 @@ URL apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1143,7 +1143,7 @@ Примітка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1299,7 +1299,7 @@ Збір даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1683,7 +1683,7 @@ Порівняльний показник apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2239,7 +2239,7 @@ Зберегти apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2798,6 +2798,14 @@ 280 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. Упс! Виникла помилка під час налаштування біометричної автентифікації. @@ -2851,7 +2859,7 @@ Локалізація apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -3682,6 +3690,10 @@ Markets Ринки + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -6467,7 +6479,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6527,7 +6539,7 @@ Закрити apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7307,7 +7319,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7315,7 +7327,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7323,7 +7335,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7331,7 +7343,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index d6f615dc8..3a6ce2f09 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -566,7 +566,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -885,7 +885,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -904,7 +904,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -915,7 +915,7 @@ Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -929,14 +929,14 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1128,11 +1128,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1308,7 +1308,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2087,7 +2087,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2814,6 +2814,10 @@ Markets + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -5158,7 +5162,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5429,7 +5433,7 @@ Data Gathering apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -5601,6 +5605,13 @@ 333 + + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. @@ -5966,7 +5977,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6045,7 +6056,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6538,7 +6549,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6631,7 +6642,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -6645,14 +6656,14 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -6673,7 +6684,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 524e28259..1595ea726 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -600,7 +600,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 563 + 567 @@ -928,7 +928,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 515 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -948,7 +948,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 526 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -960,7 +960,7 @@ 代码映射 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 375 + 379 @@ -976,7 +976,7 @@ 刮削配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 400 + 404 @@ -984,7 +984,7 @@ 笔记 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 547 + 551 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1200,11 +1200,11 @@ 网址 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 534 + 538 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1400,7 +1400,7 @@ 基准 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 369 + 371 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2256,7 +2256,7 @@ 语言环境 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 437 + 441 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -3042,6 +3042,10 @@ Markets 市场 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 373 + apps/client/src/app/components/footer/footer.component.html 11 @@ -5645,7 +5649,7 @@ 测试 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 500 + 504 @@ -5946,7 +5950,7 @@ 数据收集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 593 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6141,6 +6145,14 @@ 333 + + Include in + Include in + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 369 + + Oops! There was an error setting up biometric authentication. 哎呀!设置生物识别认证时发生错误。 @@ -6590,7 +6602,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 598 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6642,7 +6654,7 @@ 关闭 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 600 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7184,7 +7196,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7308,7 +7320,7 @@ 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 @@ -7316,7 +7328,7 @@ 模式 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 450 + 454 @@ -7324,7 +7336,7 @@ 选择器 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 466 + 470 @@ -7332,7 +7344,7 @@ HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 422 + 426 From f0ea31279e84ef4cd1845f88dab91bba414dbf35 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 5 Nov 2025 19:58:55 +0100 Subject: [PATCH 07/31] Bugfix/header alignment in admin platform and tag tables (#5908) * Fix header alignment * Update changelog --- CHANGELOG.md | 2 ++ .../app/components/admin-platform/admin-platform.component.html | 2 +- .../src/app/components/admin-tag/admin-tag.component.html | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bca1a8de9..a73619a2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed the style of the safe withdrawal rate selector in the _FIRE_ section (experimental) +- Improved the table headers’ alignment in the platform management of the admin control panel +- Improved the table headers’ alignment in the tag management of the admin control panel ## 2.214.0 - 2025-11-01 diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.html b/apps/client/src/app/components/admin-platform/admin-platform.component.html index 9e38d5de7..e71dcf17b 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.html +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -45,7 +45,7 @@ diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.html b/apps/client/src/app/components/admin-tag/admin-tag.component.html index 5979d2778..8b1b510d7 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.html +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -38,7 +38,7 @@ From 45b21cada92eb26c56056470ba758886c95d68c6 Mon Sep 17 00:00:00 2001 From: David Requeno <108202767+DavidReque@users.noreply.github.com> Date: Wed, 5 Nov 2025 13:21:03 -0600 Subject: [PATCH 08/31] Task/migrate app component to standalone (#5906) * Migrate app component to standalone * Update changelog --- CHANGELOG.md | 1 + apps/client/src/app/app.component.ts | 18 ++-- apps/client/src/app/app.module.ts | 83 ----------------- .../{app-routing.module.ts => app.routes.ts} | 30 +----- apps/client/src/main.ts | 91 +++++++++++++++++-- 5 files changed, 97 insertions(+), 126 deletions(-) delete mode 100644 apps/client/src/app/app.module.ts rename apps/client/src/app/{app-routing.module.ts => app.routes.ts} (81%) diff --git a/CHANGELOG.md b/CHANGELOG.md index a73619a2f..6bbaba5ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the _Self-Hosting_ section content for the _Compare with..._ concept on the Frequently Asked Questions (FAQ) page - Improved the _Self-Hosting_ section content for the _Markets_ concept on the Frequently Asked Questions (FAQ) page - Changed the build executor of the client from `@nx/angular:webpack-browser` to `@nx/angular:browser-esbuild` +- Refactored the app component to standalone - Improved the language localization for German (`de`) ### Fixed diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 5ecb7bf8b..b70850016 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -1,5 +1,3 @@ -import { GfHoldingDetailDialogComponent } from '@ghostfolio/client/components/holding-detail-dialog/holding-detail-dialog.component'; -import { HoldingDetailDialogParams } from '@ghostfolio/client/components/holding-detail-dialog/interfaces/interfaces'; import { getCssVariable } from '@ghostfolio/common/helper'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -22,7 +20,9 @@ import { ActivatedRoute, NavigationEnd, PRIMARY_OUTLET, - Router + Router, + RouterLink, + RouterOutlet } from '@angular/router'; import { DataSource } from '@prisma/client'; import { addIcons } from 'ionicons'; @@ -31,6 +31,10 @@ import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; +import { GfFooterComponent } from './components/footer/footer.component'; +import { GfHeaderComponent } from './components/header/header.component'; +import { GfHoldingDetailDialogComponent } from './components/holding-detail-dialog/holding-detail-dialog.component'; +import { HoldingDetailDialogParams } from './components/holding-detail-dialog/interfaces/interfaces'; import { NotificationService } from './core/notification/notification.service'; import { DataService } from './services/data.service'; import { ImpersonationStorageService } from './services/impersonation-storage.service'; @@ -38,13 +42,13 @@ import { TokenStorageService } from './services/token-storage.service'; import { UserService } from './services/user/user.service'; @Component({ - selector: 'gf-root', changeDetection: ChangeDetectionStrategy.OnPush, - templateUrl: './app.component.html', + imports: [GfFooterComponent, GfHeaderComponent, RouterLink, RouterOutlet], + selector: 'gf-root', styleUrls: ['./app.component.scss'], - standalone: false + templateUrl: './app.component.html' }) -export class AppComponent implements OnDestroy, OnInit { +export class GfAppComponent implements OnDestroy, OnInit { @HostBinding('class.has-info-message') get getHasMessage() { return this.hasInfoMessage; } diff --git a/apps/client/src/app/app.module.ts b/apps/client/src/app/app.module.ts deleted file mode 100644 index 63de8fca7..000000000 --- a/apps/client/src/app/app.module.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Platform } from '@angular/cdk/platform'; -import { - provideHttpClient, - withInterceptorsFromDi -} from '@angular/common/http'; -import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatChipsModule } from '@angular/material/chips'; -import { - DateAdapter, - MAT_DATE_FORMATS, - MAT_DATE_LOCALE, - MatNativeDateModule -} from '@angular/material/core'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { BrowserModule } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { ServiceWorkerModule } from '@angular/service-worker'; -import { provideIonicAngular } from '@ionic/angular/standalone'; -import { provideMarkdown } from 'ngx-markdown'; -import { provideNgxSkeletonLoader } from 'ngx-skeleton-loader'; -import { NgxStripeModule, STRIPE_PUBLISHABLE_KEY } from 'ngx-stripe'; - -import { environment } from '../environments/environment'; -import { CustomDateAdapter } from './adapter/custom-date-adapter'; -import { DateFormats } from './adapter/date-formats'; -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { GfFooterComponent } from './components/footer/footer.component'; -import { GfHeaderComponent } from './components/header/header.component'; -import { authInterceptorProviders } from './core/auth.interceptor'; -import { httpResponseInterceptorProviders } from './core/http-response.interceptor'; -import { LanguageService } from './core/language.service'; -import { GfNotificationModule } from './core/notification/notification.module'; - -export function NgxStripeFactory(): string { - return environment.stripePublicKey; -} - -@NgModule({ - bootstrap: [AppComponent], - declarations: [AppComponent], - imports: [ - AppRoutingModule, - BrowserAnimationsModule, - BrowserModule, - GfFooterComponent, - GfHeaderComponent, - GfNotificationModule, - MatAutocompleteModule, - MatChipsModule, - MatNativeDateModule, - MatSnackBarModule, - MatTooltipModule, - NgxStripeModule.forRoot(environment.stripePublicKey), - ServiceWorkerModule.register('ngsw-worker.js', { - enabled: environment.production, - registrationStrategy: 'registerImmediately' - }) - ], - providers: [ - authInterceptorProviders, - httpResponseInterceptorProviders, - LanguageService, - provideHttpClient(withInterceptorsFromDi()), - provideIonicAngular(), - provideMarkdown(), - provideNgxSkeletonLoader(), - { - provide: DateAdapter, - useClass: CustomDateAdapter, - deps: [LanguageService, MAT_DATE_LOCALE, Platform] - }, - { provide: MAT_DATE_FORMATS, useValue: DateFormats }, - { - provide: STRIPE_PUBLISHABLE_KEY, - useFactory: NgxStripeFactory - } - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] -}) -export class AppModule {} diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app.routes.ts similarity index 81% rename from apps/client/src/app/app-routing.module.ts rename to apps/client/src/app/app.routes.ts index fb045a174..9588cee68 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app.routes.ts @@ -1,13 +1,10 @@ -import { publicRoutes, internalRoutes } from '@ghostfolio/common/routes/routes'; +import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; -import { NgModule } from '@angular/core'; -import { RouterModule, Routes, TitleStrategy } from '@angular/router'; +import { Routes } from '@angular/router'; import { AuthGuard } from './core/auth.guard'; -import { ModulePreloadService } from './core/module-preload.service'; -import { PageTitleStrategy } from './services/page-title.strategy'; -const routes: Routes = [ +export const routes: Routes = [ { path: publicRoutes.about.path, loadChildren: () => @@ -147,24 +144,3 @@ const routes: Routes = [ pathMatch: 'full' } ]; - -@NgModule({ - imports: [ - RouterModule.forRoot( - routes, - // Preload all lazy loaded modules with the attribute preload === true - { - anchorScrolling: 'enabled', - // enableTracing: true, // <-- debugging purposes only - preloadingStrategy: ModulePreloadService, - scrollPositionRestoration: 'top' - } - ) - ], - providers: [ - ModulePreloadService, - { provide: TitleStrategy, useClass: PageTitleStrategy } - ], - exports: [RouterModule] -}) -export class AppRoutingModule {} diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index 96d6c0582..fc8a9ef7a 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -2,11 +2,39 @@ import { locale } from '@ghostfolio/common/config'; import { InfoResponse } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; -import { enableProdMode } from '@angular/core'; -import { LOCALE_ID } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { Platform } from '@angular/cdk/platform'; +import { + provideHttpClient, + withInterceptorsFromDi +} from '@angular/common/http'; +import { enableProdMode, importProvidersFrom, LOCALE_ID } from '@angular/core'; +import { + DateAdapter, + MAT_DATE_FORMATS, + MAT_DATE_LOCALE, + MatNativeDateModule +} from '@angular/material/core'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { provideAnimations } from '@angular/platform-browser/animations'; +import { RouterModule, TitleStrategy } from '@angular/router'; +import { ServiceWorkerModule } from '@angular/service-worker'; +import { provideIonicAngular } from '@ionic/angular/standalone'; +import { provideMarkdown } from 'ngx-markdown'; +import { provideNgxSkeletonLoader } from 'ngx-skeleton-loader'; +import { NgxStripeModule, STRIPE_PUBLISHABLE_KEY } from 'ngx-stripe'; -import { AppModule } from './app/app.module'; +import { CustomDateAdapter } from './app/adapter/custom-date-adapter'; +import { DateFormats } from './app/adapter/date-formats'; +import { GfAppComponent } from './app/app.component'; +import { routes } from './app/app.routes'; +import { authInterceptorProviders } from './app/core/auth.interceptor'; +import { httpResponseInterceptorProviders } from './app/core/http-response.interceptor'; +import { LanguageService } from './app/core/language.service'; +import { ModulePreloadService } from './app/core/module-preload.service'; +import { GfNotificationModule } from './app/core/notification/notification.module'; +import { PageTitleStrategy } from './app/services/page-title.strategy'; import { environment } from './environments/environment'; (async () => { @@ -29,9 +57,54 @@ import { environment } from './environments/environment'; enableProdMode(); } - platformBrowserDynamic() - .bootstrapModule(AppModule, { - providers: [{ provide: LOCALE_ID, useValue: locale }] - }) - .catch((error) => console.error(error)); + await bootstrapApplication(GfAppComponent, { + providers: [ + authInterceptorProviders, + httpResponseInterceptorProviders, + importProvidersFrom( + GfNotificationModule, + MatNativeDateModule, + MatSnackBarModule, + MatTooltipModule, + NgxStripeModule.forRoot(environment.stripePublicKey), + RouterModule.forRoot(routes, { + anchorScrolling: 'enabled', + preloadingStrategy: ModulePreloadService, + scrollPositionRestoration: 'top' + }), + ServiceWorkerModule.register('ngsw-worker.js', { + enabled: environment.production, + registrationStrategy: 'registerImmediately' + }) + ), + LanguageService, + ModulePreloadService, + provideAnimations(), + provideHttpClient(withInterceptorsFromDi()), + provideIonicAngular(), + provideMarkdown(), + provideNgxSkeletonLoader(), + { + deps: [LanguageService, MAT_DATE_LOCALE, Platform], + provide: DateAdapter, + useClass: CustomDateAdapter + }, + { + provide: LOCALE_ID, + useValue: locale + }, + { + provide: MAT_DATE_FORMATS, + useValue: DateFormats + }, + { + provide: STRIPE_PUBLISHABLE_KEY, + useFactory: () => environment.stripePublicKey + }, + { + provide: TitleStrategy, + useClass: PageTitleStrategy + } + ] + }); })(); From 1ae3519d7f89223568cd725a3fab44c51e061d17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Mart=C3=ADn?= Date: Wed, 5 Nov 2025 20:26:59 +0100 Subject: [PATCH 09/31] Bugfix/assign admin role to first user signing up (#5914) * Assign admin role to first user signing up * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/user/user.controller.ts | 6 +----- apps/api/src/app/user/user.service.ts | 20 ++++++++++++++------ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bbaba5ac..59142bbbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed the style of the safe withdrawal rate selector in the _FIRE_ section (experimental) +- Assigned the `ADMIN` role to the first user signing up via a social login provider if no administrator existed - Improved the table headers’ alignment in the platform management of the admin control panel - Improved the table headers’ alignment in the tag management of the admin control panel diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index e545fd335..8704662f7 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -126,11 +126,7 @@ export class UserController { ); } - const hasAdmin = await this.userService.hasAdmin(); - - const { accessToken, id, role } = await this.userService.createUser({ - data: { role: hasAdmin ? 'USER' : 'ADMIN' } - }); + const { accessToken, id, role } = await this.userService.createUser(); return { accessToken, diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index f797270ff..65ce92cb2 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -526,15 +526,23 @@ export class UserService { }); } - public async createUser({ - data - }: { - data: Prisma.UserCreateInput; - }): Promise { - if (!data?.provider) { + public async createUser( + { + data + }: { + data: Prisma.UserCreateInput; + } = { data: {} } + ): Promise { + if (!data.provider) { data.provider = 'ANONYMOUS'; } + if (!data.role) { + const hasAdmin = await this.hasAdmin(); + + data.role = hasAdmin ? 'USER' : 'ADMIN'; + } + const user = await this.prismaService.user.create({ data: { ...data, From 21dc25119dbd55812da114c755ed045f8b2b0a5e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 5 Nov 2025 21:03:42 +0100 Subject: [PATCH 10/31] Release 2.215.0-beta.1 (#5918) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59142bbbd..801b33652 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 +## 2.215.0-beta.1 - 2025-11-05 ### Changed diff --git a/package-lock.json b/package-lock.json index 6429912bb..095b9f7f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.214.0", + "version": "2.215.0-beta.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.214.0", + "version": "2.215.0-beta.1", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 7648cee02..ea8646565 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.214.0", + "version": "2.215.0-beta.1", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 697ecfe9bd5f7be000e1aadf3013a85c821ea27f Mon Sep 17 00:00:00 2001 From: Arghya Das Date: Thu, 6 Nov 2025 01:54:52 +0530 Subject: [PATCH 11/31] Feature/add endpoint to get user by id (#5910) * Add endpoint to get user by id * Update changelog --------- Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 4 ++ apps/api/src/app/admin/admin.controller.ts | 8 ++++ apps/api/src/app/admin/admin.service.ts | 38 +++++++++++++------ .../lib/interfaces/admin-user.interface.ts | 13 +++++++ libs/common/src/lib/interfaces/index.ts | 4 ++ .../admin-user-response.interface.ts | 3 ++ .../admin-users-response.interface.ts | 14 +------ 7 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 libs/common/src/lib/interfaces/admin-user.interface.ts create mode 100644 libs/common/src/lib/interfaces/responses/admin-user-response.interface.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 801b33652..79ff17256 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 ## 2.215.0-beta.1 - 2025-11-05 +### Added + +- Added the endpoint `GET /api/v1/admin/user/:id` + ### Changed - Improved the _Self-Hosting_ section content for the _Compare with..._ concept on the Frequently Asked Questions (FAQ) page diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 2419b0a7d..7ed7f364b 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -17,6 +17,7 @@ import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { AdminData, AdminMarketData, + AdminUserResponse, AdminUsersResponse, EnhancedSymbolProfile, ScraperConfiguration @@ -321,4 +322,11 @@ export class AdminController { take: isNaN(take) ? undefined : take }); } + + @Get('user/:id') + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async getUser(@Param('id') id: string): Promise { + return this.adminService.getUser(id); + } } diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 683e72cb8..6b29b141a 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -23,6 +23,7 @@ import { AdminMarketData, AdminMarketDataDetails, AdminMarketDataItem, + AdminUserResponse, AdminUsersResponse, AssetProfileIdentifier, EnhancedSymbolProfile, @@ -35,7 +36,8 @@ import { BadRequestException, HttpException, Injectable, - Logger + Logger, + NotFoundException } from '@nestjs/common'; import { AssetClass, @@ -507,6 +509,18 @@ export class AdminService { }; } + public async getUser(id: string): Promise { + const [user] = await this.getUsersWithAnalytics({ + where: { id } + }); + + if (!user) { + throw new NotFoundException(`User with ID ${id} not found`); + } + + return user; + } + public async getUsers({ skip, take = Number.MAX_SAFE_INTEGER @@ -516,7 +530,15 @@ export class AdminService { }): Promise { const [count, users] = await Promise.all([ this.countUsersWithAnalytics(), - this.getUsersWithAnalytics({ skip, take }) + this.getUsersWithAnalytics({ + skip, + take, + where: { + NOT: { + analytics: null + } + } + }) ]); return { count, users }; @@ -814,17 +836,17 @@ export class AdminService { private async getUsersWithAnalytics({ skip, - take + take, + where }: { skip?: number; take?: number; + where?: Prisma.UserWhereInput; }): Promise { let orderBy: Prisma.Enumerable = [ { createdAt: 'desc' } ]; - let where: Prisma.UserWhereInput; - if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { orderBy = [ { @@ -833,12 +855,6 @@ export class AdminService { } } ]; - - where = { - NOT: { - analytics: null - } - }; } const usersWithAnalytics = await this.prismaService.user.findMany({ diff --git a/libs/common/src/lib/interfaces/admin-user.interface.ts b/libs/common/src/lib/interfaces/admin-user.interface.ts new file mode 100644 index 000000000..872abca90 --- /dev/null +++ b/libs/common/src/lib/interfaces/admin-user.interface.ts @@ -0,0 +1,13 @@ +import { Role } from '@prisma/client'; + +export interface AdminUser { + accountCount: number; + activityCount: number; + country: string; + createdAt: Date; + dailyApiRequests: number; + engagement: number; + id: string; + lastActivity: Date; + role: Role; +} diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 06ecf32e8..899813f30 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -7,6 +7,7 @@ import type { AdminMarketData, AdminMarketDataItem } from './admin-market-data.interface'; +import type { AdminUser } from './admin-user.interface'; import type { AssetClassSelectorOption } from './asset-class-selector-option.interface'; import type { AssetProfileIdentifier } from './asset-profile-identifier.interface'; import type { BenchmarkProperty } from './benchmark-property.interface'; @@ -38,6 +39,7 @@ import type { AccountBalancesResponse } from './responses/account-balances-respo import type { AccountsResponse } from './responses/accounts-response.interface'; import type { ActivitiesResponse } from './responses/activities-response.interface'; import type { ActivityResponse } from './responses/activity-response.interface'; +import type { AdminUserResponse } from './responses/admin-user-response.interface'; import type { AdminUsersResponse } from './responses/admin-users-response.interface'; import type { AiPromptResponse } from './responses/ai-prompt-response.interface'; import type { ApiKeyResponse } from './responses/api-key-response.interface'; @@ -92,6 +94,8 @@ export { AdminMarketData, AdminMarketDataDetails, AdminMarketDataItem, + AdminUser, + AdminUserResponse, AdminUsersResponse, AiPromptResponse, ApiKeyResponse, diff --git a/libs/common/src/lib/interfaces/responses/admin-user-response.interface.ts b/libs/common/src/lib/interfaces/responses/admin-user-response.interface.ts new file mode 100644 index 000000000..8e93fc097 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/admin-user-response.interface.ts @@ -0,0 +1,3 @@ +import { AdminUser } from '../admin-user.interface'; + +export interface AdminUserResponse extends AdminUser {} diff --git a/libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts b/libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts index d9f58ee18..8dd058030 100644 --- a/libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/admin-users-response.interface.ts @@ -1,16 +1,6 @@ -import { Role } from '@prisma/client'; +import { AdminUser } from '../admin-user.interface'; export interface AdminUsersResponse { count: number; - users: { - accountCount: number; - activityCount: number; - country: string; - createdAt: Date; - dailyApiRequests: number; - engagement: number; - id: string; - lastActivity: Date; - role: Role; - }[]; + users: AdminUser[]; } From 5954e586948a816678cd89161a36d2db4c17316c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 6 Nov 2025 08:25:47 +0100 Subject: [PATCH 12/31] Task/upgrade @ionic/angular to version 8.7.8 (#5909) * Upgrade @ionic/angular to version 8.7.8 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 47 ++++++++++++----------------------------------- package.json | 2 +- 3 files changed, 14 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79ff17256..7f0afe895 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Changed the build executor of the client from `@nx/angular:webpack-browser` to `@nx/angular:browser-esbuild` - Refactored the app component to standalone - Improved the language localization for German (`de`) +- Upgraded `@ionic/angular` from version `8.7.3` to `8.7.8` ### Fixed diff --git a/package-lock.json b/package-lock.json index 095b9f7f3..f66e02cdd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.0", "@internationalized/number": "3.6.3", - "@ionic/angular": "8.7.3", + "@ionic/angular": "8.7.8", "@keyv/redis": "4.4.0", "@nestjs/bull": "11.0.4", "@nestjs/cache-manager": "3.0.1", @@ -6015,12 +6015,12 @@ } }, "node_modules/@ionic/angular": { - "version": "8.7.3", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-8.7.3.tgz", - "integrity": "sha512-Fd2bsluwsi88d8AEvSVANn3a7xZ7NEmlvgVTLnuF9VTI0TgdkLQptgEolty00axnQdjCaxSXxgFJd/m0gVpKIg==", + "version": "8.7.8", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-8.7.8.tgz", + "integrity": "sha512-IBN5h3nIOwbuglLit48S7wNeg7NHtl/vaKAHDggICyzI92cSg5yYL07Fz59pszhkBlZQUB5SQnml990Zj2bZUg==", "license": "MIT", "dependencies": { - "@ionic/core": "8.7.3", + "@ionic/core": "8.7.8", "ionicons": "^8.0.13", "jsonc-parser": "^3.0.0", "tslib": "^2.3.0" @@ -6034,12 +6034,12 @@ } }, "node_modules/@ionic/core": { - "version": "8.7.3", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.3.tgz", - "integrity": "sha512-KdyMxpMDQj+uqpztpK6yvN/T96hqcDiGXQ4T+aAZ+LW3wV3+0it6/rbh9C1B/wCl4Isnm4IRltPabgEfNJ50nw==", + "version": "8.7.8", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.7.8.tgz", + "integrity": "sha512-GLWb/lz3kocpzTZTeQQ5xxoWz4CKHD6zpnbwJknTKsncebohAaw2KTe7uOw5toKQEDdohTseFuSGoDDBoRQ1Ug==", "license": "MIT", "dependencies": { - "@stencil/core": "4.36.2", + "@stencil/core": "4.38.0", "ionicons": "^8.0.13", "tslib": "^2.1.0" } @@ -12995,9 +12995,9 @@ "license": "MIT" }, "node_modules/@stencil/core": { - "version": "4.36.2", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.2.tgz", - "integrity": "sha512-PRFSpxNzX9Oi0Wfh02asztN9Sgev/MacfZwmd+VVyE6ZxW+a/kEpAYZhzGAmE+/aKVOGYuug7R9SulanYGxiDQ==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.38.0.tgz", + "integrity": "sha512-oC3QFKO0X1yXVvETgc8OLY525MNKhn9vISBrbtKnGoPlokJ6rI8Vk1RK22TevnNrHLI4SExNLbcDnqilKR35JQ==", "license": "MIT", "bin": { "stencil": "bin/stencil" @@ -24942,29 +24942,6 @@ "@stencil/core": "^4.35.3" } }, - "node_modules/ionicons/node_modules/@stencil/core": { - "version": "4.36.3", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.36.3.tgz", - "integrity": "sha512-C9DOaAjm+hSYRuVoUuYWG/lrYT8+4DG0AL0m1Ea9+G5v2Y6ApVpNJLbXvFlRZIdDMGecH86s6v0Gp39uockLxg==", - "license": "MIT", - "bin": { - "stencil": "bin/stencil" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.10.0" - }, - "optionalDependencies": { - "@rollup/rollup-darwin-arm64": "4.34.9", - "@rollup/rollup-darwin-x64": "4.34.9", - "@rollup/rollup-linux-arm64-gnu": "4.34.9", - "@rollup/rollup-linux-arm64-musl": "4.34.9", - "@rollup/rollup-linux-x64-gnu": "4.34.9", - "@rollup/rollup-linux-x64-musl": "4.34.9", - "@rollup/rollup-win32-arm64-msvc": "4.34.9", - "@rollup/rollup-win32-x64-msvc": "4.34.9" - } - }, "node_modules/ioredis": { "version": "5.8.2", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", diff --git a/package.json b/package.json index ea8646565..b247cfcc0 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.0", "@internationalized/number": "3.6.3", - "@ionic/angular": "8.7.3", + "@ionic/angular": "8.7.8", "@keyv/redis": "4.4.0", "@nestjs/bull": "11.0.4", "@nestjs/cache-manager": "3.0.1", From ef6310bc75218208e9c2a443e20e8d637015db13 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 6 Nov 2025 19:30:35 +0100 Subject: [PATCH 13/31] Release 2.215.0 (#5922) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f0afe895..4c3542ff5 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). -## 2.215.0-beta.1 - 2025-11-05 +## 2.215.0 - 2025-11-06 ### Added diff --git a/package-lock.json b/package-lock.json index f66e02cdd..2e32c7d2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.215.0-beta.1", + "version": "2.215.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.215.0-beta.1", + "version": "2.215.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index b247cfcc0..49d2978de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.215.0-beta.1", + "version": "2.215.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 87891976ab91a8afc43fe59e1607e8bda483272a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 7 Nov 2025 11:55:53 +0100 Subject: [PATCH 14/31] Task/reorder lifecycle hooks in various components (#5919) * Reorder lifecycle hooks --- .../create-asset-profile-dialog.component.ts | 2 +- .../app/components/admin-platform/admin-platform.component.ts | 2 +- apps/client/src/app/components/admin-tag/admin-tag.component.ts | 2 +- .../create-watchlist-item-dialog.component.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts index 18dc48c39..44a0b374b 100644 --- a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts @@ -53,7 +53,7 @@ import { CreateAssetProfileDialogMode } from './interfaces/interfaces'; styleUrls: ['./create-asset-profile-dialog.component.scss'], templateUrl: 'create-asset-profile-dialog.html' }) -export class GfCreateAssetProfileDialogComponent implements OnInit, OnDestroy { +export class GfCreateAssetProfileDialogComponent implements OnDestroy, OnInit { public createAssetProfileForm: FormGroup; public ghostfolioPrefix = `${ghostfolioPrefix}_`; public mode: CreateAssetProfileDialogMode; diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.ts b/apps/client/src/app/components/admin-platform/admin-platform.component.ts index 6c95cee0b..6642d2315 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.ts +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.ts @@ -51,7 +51,7 @@ import { CreateOrUpdatePlatformDialogParams } from './create-or-update-platform- styleUrls: ['./admin-platform.component.scss'], templateUrl: './admin-platform.component.html' }) -export class GfAdminPlatformComponent implements OnInit, OnDestroy { +export class GfAdminPlatformComponent implements OnDestroy, OnInit { @ViewChild(MatSort) sort: MatSort; public dataSource = new MatTableDataSource(); diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.ts b/apps/client/src/app/components/admin-tag/admin-tag.component.ts index 5552fa01b..88e8faa9d 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.ts +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.ts @@ -48,7 +48,7 @@ import { CreateOrUpdateTagDialogParams } from './create-or-update-tag-dialog/int styleUrls: ['./admin-tag.component.scss'], templateUrl: './admin-tag.component.html' }) -export class GfAdminTagComponent implements OnInit, OnDestroy { +export class GfAdminTagComponent implements OnDestroy, OnInit { @ViewChild(MatSort) sort: MatSort; public dataSource = new MatTableDataSource(); diff --git a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts index 7bd7d2ae1..60d74be92 100644 --- a/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts +++ b/apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts @@ -36,7 +36,7 @@ import { Subject } from 'rxjs'; styleUrls: ['./create-watchlist-item-dialog.component.scss'], templateUrl: 'create-watchlist-item-dialog.html' }) -export class GfCreateWatchlistItemDialogComponent implements OnInit, OnDestroy { +export class GfCreateWatchlistItemDialogComponent implements OnDestroy, OnInit { public createWatchlistItemForm: FormGroup; private unsubscribeSubject = new Subject(); From 4746a64d3be32d9c65af1d3833c2a792ecf6670a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 7 Nov 2025 11:56:46 +0100 Subject: [PATCH 15/31] Task/upgrade chart.js to version 4.5.1 (#5905) * Upgrade chart.js to version 4.5.1 * Update changelog --- CHANGELOG.md | 6 ++++++ package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c3542ff5..6fc83484d 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 + +- Upgraded `chart.js` from version `4.5.0` to `4.5.1` + ## 2.215.0 - 2025-11-06 ### Added diff --git a/package-lock.json b/package-lock.json index 2e32c7d2b..ca3a9f30e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "big.js": "7.0.1", "bootstrap": "4.6.2", "bull": "4.16.5", - "chart.js": "4.5.0", + "chart.js": "4.5.1", "chartjs-adapter-date-fns": "3.0.0", "chartjs-chart-treemap": "3.1.0", "chartjs-plugin-annotation": "3.1.0", @@ -17502,9 +17502,9 @@ "license": "MIT" }, "node_modules/chart.js": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", - "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" diff --git a/package.json b/package.json index 49d2978de..829eb2bde 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "big.js": "7.0.1", "bootstrap": "4.6.2", "bull": "4.16.5", - "chart.js": "4.5.0", + "chart.js": "4.5.1", "chartjs-adapter-date-fns": "3.0.0", "chartjs-chart-treemap": "3.1.0", "chartjs-plugin-annotation": "3.1.0", From d1190fc15a6d9f49ddeb71c28c95fbae2459b4ba Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 8 Nov 2025 17:57:01 +0100 Subject: [PATCH 16/31] Task/upgrade svgmap to version 2.14.0 (#5904) * Upgrade svgmap to version 2.14.0 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fc83484d..8a503cc42 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 ### Changed - Upgraded `chart.js` from version `4.5.0` to `4.5.1` +- Upgraded `svgmap` from version `2.12.2` to `2.14.0` ## 2.215.0 - 2025-11-06 diff --git a/package-lock.json b/package-lock.json index ca3a9f30e..c33710231 100644 --- a/package-lock.json +++ b/package-lock.json @@ -86,7 +86,7 @@ "reflect-metadata": "0.2.2", "rxjs": "7.8.1", "stripe": "18.5.0", - "svgmap": "2.12.2", + "svgmap": "2.14.0", "tablemark": "4.1.0", "twitter-api-v2": "1.27.0", "uuid": "11.1.0", @@ -38794,9 +38794,9 @@ "license": "BSD-2-Clause" }, "node_modules/svgmap": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/svgmap/-/svgmap-2.12.2.tgz", - "integrity": "sha512-SCX1Oys3v1dz3mTEbQha+6lrHGyu3LwXBhcgW0HlTh7waQDMFqNUKD8hADvDaPkPapRvNCLMnXaVD1Pbxbnhow==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/svgmap/-/svgmap-2.14.0.tgz", + "integrity": "sha512-+Vklx4DO1uv1SFq6wnJWl/dRjX4uRT9CcsIHuADxAcZ+h5X1OSyDVbNdIu837fx5TtYYuaGRhWuFCXIioN/1ww==", "license": "MIT", "dependencies": { "svg-pan-zoom": "^3.6.2" diff --git a/package.json b/package.json index 829eb2bde..ff7f05ea0 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "reflect-metadata": "0.2.2", "rxjs": "7.8.1", "stripe": "18.5.0", - "svgmap": "2.12.2", + "svgmap": "2.14.0", "tablemark": "4.1.0", "twitter-api-v2": "1.27.0", "uuid": "11.1.0", From 9383fc00cb61482e162df7fa6dcfcdbe32626b23 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 9 Nov 2025 07:44:53 +0100 Subject: [PATCH 17/31] Task/introduce interface for get account response (#5902) * Introduce interface for get account response --- apps/api/src/app/account/account.controller.ts | 8 +++----- apps/client/src/app/services/data.service.ts | 4 ++-- libs/common/src/lib/interfaces/index.ts | 2 ++ .../interfaces/responses/account-response.interface.ts | 3 +++ 4 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 libs/common/src/lib/interfaces/responses/account-response.interface.ts diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index 7b24ccdcb..cd6892ab8 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -9,13 +9,11 @@ import { ImpersonationService } from '@ghostfolio/api/services/impersonation/imp import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { AccountBalancesResponse, + AccountResponse, AccountsResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; -import type { - AccountWithValue, - RequestWithUser -} from '@ghostfolio/common/types'; +import type { RequestWithUser } from '@ghostfolio/common/types'; import { Body, @@ -114,7 +112,7 @@ export class AccountController { public async getAccountById( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Param('id') id: string - ): Promise { + ): Promise { const impersonationUserId = await this.impersonationService.validateImpersonationId(impersonationId); diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 6f0b17ed1..f83746009 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -22,6 +22,7 @@ import { Access, AccessTokenResponse, AccountBalancesResponse, + AccountResponse, AccountsResponse, ActivitiesResponse, ActivityResponse, @@ -54,7 +55,6 @@ import { } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; import type { - AccountWithValue, AiPromptMode, DateRange, GroupBy @@ -186,7 +186,7 @@ export class DataService { } public fetchAccount(aAccountId: string) { - return this.http.get(`/api/v1/account/${aAccountId}`); + return this.http.get(`/api/v1/account/${aAccountId}`); } public fetchAccountBalances(aAccountId: string) { diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 899813f30..5c516a4a6 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -36,6 +36,7 @@ import type { Position } from './position.interface'; import type { Product } from './product'; import type { AccessTokenResponse } from './responses/access-token-response.interface'; import type { AccountBalancesResponse } from './responses/account-balances-response.interface'; +import type { AccountResponse } from './responses/account-response.interface'; import type { AccountsResponse } from './responses/accounts-response.interface'; import type { ActivitiesResponse } from './responses/activities-response.interface'; import type { ActivityResponse } from './responses/activity-response.interface'; @@ -86,6 +87,7 @@ export { AccessTokenResponse, AccountBalance, AccountBalancesResponse, + AccountResponse, AccountsResponse, ActivitiesResponse, ActivityResponse, diff --git a/libs/common/src/lib/interfaces/responses/account-response.interface.ts b/libs/common/src/lib/interfaces/responses/account-response.interface.ts new file mode 100644 index 000000000..3e954dc72 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/account-response.interface.ts @@ -0,0 +1,3 @@ +import { AccountWithValue } from '@ghostfolio/common/types'; + +export interface AccountResponse extends AccountWithValue {} From 385d7f65629422b256d7ad55e6f960f032febc2b Mon Sep 17 00:00:00 2001 From: TMs Date: Tue, 11 Nov 2025 03:19:38 +0700 Subject: [PATCH 18/31] Feature/improve language localization for ZH 20251110 (#5928) * Improve language localization for ZH * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.zh.xlf | 118 ++++++++++++------------ 2 files changed, 60 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a503cc42..4a4adc311 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 ### Changed +- Improved the language localization for Chinese (`zh`) - Upgraded `chart.js` from version `4.5.0` to `4.5.1` - Upgraded `svgmap` from version `2.12.2` to `2.14.0` diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 1595ea726..d5090164d 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -241,7 +241,7 @@ please - please + apps/client/src/app/pages/pricing/pricing-page.html 350 @@ -285,7 +285,7 @@ with - with + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 87 @@ -665,7 +665,7 @@ and is driven by the efforts of its contributors - and is driven by the efforts of its contributors + 并且得益于其 贡献者 apps/client/src/app/pages/about/overview/about-overview-page.html 49 @@ -965,7 +965,7 @@ and we share aggregated key metrics of the platform’s performance - and we share aggregated key metrics of the platform’s performance + 并且我们分享平台性能的聚合 关键指标 apps/client/src/app/pages/about/overview/about-overview-page.html 32 @@ -1181,7 +1181,7 @@ Activities - Activities + 活动 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 61 @@ -1233,7 +1233,7 @@ Current year - Current year + 当前年份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 204 @@ -1545,7 +1545,7 @@ The source code is fully available as open source software (OSS) under the AGPL-3.0 license - The source code is fully available as open source software (OSS) under the AGPL-3.0 license + 源代码完全可用,作为开源软件 (OSS),遵循AGPL-3.0许可证 apps/client/src/app/pages/about/overview/about-overview-page.html 16 @@ -1609,7 +1609,7 @@ Current week - Current week + 当前周 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 196 @@ -2517,7 +2517,7 @@ for - for + 用于 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 128 @@ -2953,7 +2953,7 @@ per week - per week + 每周 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 130 @@ -3129,7 +3129,7 @@ Edit access - Edit access + 编辑权限 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 11 @@ -3233,7 +3233,7 @@ Get access to 80’000+ tickers from over 50 exchanges - Get access to 80’000+ tickers from over 50 exchanges + 获取来自 50 多个交易所的 80,000 多个行情的访问权限 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 84 @@ -3369,7 +3369,7 @@ less than - less than + 少于 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 129 @@ -3433,7 +3433,7 @@ Ghostfolio Status - Ghostfolio Status + Ghostfolio 状态 apps/client/src/app/pages/about/overview/about-overview-page.html 62 @@ -3441,7 +3441,7 @@ with your university e-mail address - with your university e-mail address + 使用您的学校电子邮件地址 apps/client/src/app/pages/pricing/pricing-page.html 365 @@ -3473,7 +3473,7 @@ and a safe withdrawal rate (SWR) of - and a safe withdrawal rate (SWR) of + 和安全取款率 (SWR) 为 apps/client/src/app/pages/portfolio/fire/fire-page.html 107 @@ -3497,7 +3497,7 @@ Job ID - Job ID + 作业 ID apps/client/src/app/components/admin-jobs/admin-jobs.html 34 @@ -3709,7 +3709,7 @@ or start a discussion at - or start a discussion at + 或在以下位置开始讨论 apps/client/src/app/pages/about/overview/about-overview-page.html 94 @@ -3897,7 +3897,7 @@ Exclude from Analysis - Exclude from Analysis + 排除在分析之外 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 90 @@ -3921,7 +3921,7 @@ Latest activities - Latest activities + 最新活动 apps/client/src/app/pages/public/public-page.html 211 @@ -3989,7 +3989,7 @@ Looking for a student discount? - Looking for a student discount? + 寻找学生折扣? apps/client/src/app/pages/pricing/pricing-page.html 359 @@ -4165,7 +4165,7 @@ Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover operational costs for the hosting infrastructure and professional data providers, and to fund ongoing development. - 我们的官方 Ghostfolio Premium 云产品是最简单的入门方法。由于它节省了时间,这对于大多数人来说将是最佳选择。收入用于支付托管基础设施的成本和资助持续开发。 + 我们的官方 Ghostfolio Premium 云产品是最简单的入门方法。由于它节省了时间,这对于大多数人来说将是最佳选择。收入用于支付托管基础设施的成本和资助持续开发。 apps/client/src/app/pages/pricing/pricing-page.html 7 @@ -4365,7 +4365,7 @@ Sustainable retirement income - Sustainable retirement income + 可持续的退休收入 apps/client/src/app/pages/portfolio/fire/fire-page.html 40 @@ -4498,7 +4498,7 @@ per month - per month + 每月 apps/client/src/app/pages/portfolio/fire/fire-page.html 92 @@ -4514,7 +4514,7 @@ Website of Thomas Kaul - Website of Thomas Kaul + Thomas Kaul 的网站 apps/client/src/app/pages/about/overview/about-overview-page.html 44 @@ -4642,7 +4642,7 @@ User ID - User ID + 用户 ID apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 12 @@ -4762,7 +4762,7 @@ Request it - Request it + 请求它 apps/client/src/app/pages/pricing/pricing-page.html 361 @@ -4906,7 +4906,7 @@ , - , + , apps/client/src/app/pages/portfolio/fire/fire-page.html 93 @@ -4930,7 +4930,7 @@ contact us - contact us + 联系我们 apps/client/src/app/pages/pricing/pricing-page.html 353 @@ -5318,7 +5318,7 @@ View Details - View Details + 查看详细信息 apps/client/src/app/components/admin-users/admin-users.html 225 @@ -5526,7 +5526,7 @@ If you retire today, you would be able to withdraw - If you retire today, you would be able to withdraw + 如果您今天退休,您将能够提取 apps/client/src/app/pages/portfolio/fire/fire-page.html 66 @@ -5662,7 +5662,7 @@ Argentina - Argentina + 阿根廷 libs/ui/src/lib/i18n.ts 78 @@ -5734,7 +5734,7 @@ Close Holding - Close Holding + 关闭持仓 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 442 @@ -5774,7 +5774,7 @@ here - here + 这里 apps/client/src/app/pages/pricing/pricing-page.html 364 @@ -6011,7 +6011,7 @@ Indonesia - Indonesia + 印度尼西亚 libs/ui/src/lib/i18n.ts 90 @@ -6147,7 +6147,7 @@ Include in - Include in + 包含在 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 369 @@ -6427,7 +6427,7 @@ View Holding - View Holding + 查看持仓 libs/ui/src/lib/activities-table/activities-table.component.html 444 @@ -6571,7 +6571,7 @@ Oops! Could not update access. - Oops! Could not update access. + 哎呀!无法更新访问权限。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts 179 @@ -6579,7 +6579,7 @@ based on your total assets of - based on your total assets of + 基于您总资产的 apps/client/src/app/pages/portfolio/fire/fire-page.html 95 @@ -6695,7 +6695,7 @@ Role - Role + 角色 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 31 @@ -6711,7 +6711,7 @@ Accounts - Accounts + 账户 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 51 @@ -6743,7 +6743,7 @@ If you plan to open an account at - If you plan to open an account at + 如果您计划开通账户在 apps/client/src/app/pages/pricing/pricing-page.html 329 @@ -6775,7 +6775,7 @@ send an e-mail to - send an e-mail to + 发送电子邮件至 apps/client/src/app/pages/about/overview/about-overview-page.html 87 @@ -6855,7 +6855,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year - to use our referral link and get a Ghostfolio Premium membership for one year + 使用我们的推荐链接并获得一年的Ghostfolio Premium会员资格 apps/client/src/app/pages/pricing/pricing-page.html 357 @@ -6935,7 +6935,7 @@ Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. - Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. + Ghostfolio 是一款轻量级的财富管理应用程序,旨在帮助个人跟踪股票、ETF 或加密货币,并做出基于数据的稳健投资决策。 apps/client/src/app/pages/about/overview/about-overview-page.html 10 @@ -7007,7 +7007,7 @@ Engagement per Day - Engagement per Day + 每日参与度 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 76 @@ -7153,7 +7153,7 @@ Country - Country + 国家 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 37 @@ -7261,7 +7261,7 @@ Check the system status at - Check the system status at + 检查系统状态 apps/client/src/app/pages/about/overview/about-overview-page.html 57 @@ -7309,7 +7309,7 @@ API Requests Today - API Requests Today + 今日 API 请求 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 86 @@ -7417,7 +7417,7 @@ The project has been initiated by - The project has been initiated by + 该项目发起于 apps/client/src/app/pages/about/overview/about-overview-page.html 40 @@ -7525,7 +7525,7 @@ Find account, holding or page... - Find account, holding or page... + 查找账户、持仓或页面... libs/ui/src/lib/assistant/assistant.component.ts 152 @@ -7941,7 +7941,7 @@ Current month - Current month + 当前月份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 200 @@ -8126,7 +8126,7 @@ If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_ - If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_ + 如果您遇到错误,想要建议改进或新功能,请加入 Ghostfolio Slack 社区,发布到 @ghostfolio_ apps/client/src/app/pages/about/overview/about-overview-page.html 69 @@ -8250,7 +8250,7 @@ Liquidity - Liquidity + 流动性 apps/client/src/app/pages/i18n/i18n-page.html 70 @@ -8258,7 +8258,7 @@ Buying Power - Buying Power + 购买力 apps/client/src/app/pages/i18n/i18n-page.html 71 @@ -8266,7 +8266,7 @@ Your buying power is below ${thresholdMin} ${baseCurrency} - Your buying power is below ${thresholdMin} ${baseCurrency} + 您的购买力低于 ${thresholdMin} ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 73 @@ -8274,7 +8274,7 @@ Your buying power is 0 ${baseCurrency} - Your buying power is 0 ${baseCurrency} + 您的购买力为 0 ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 77 @@ -8282,7 +8282,7 @@ Your buying power exceeds ${thresholdMin} ${baseCurrency} - Your buying power exceeds ${thresholdMin} ${baseCurrency} + 您的购买力超过了 ${thresholdMin} ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 80 @@ -8586,7 +8586,7 @@ Registration Date - Registration Date + 注册日期 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 23 From 9b4392eee094c225969a1a428728cbdeddc357f9 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 10 Nov 2025 22:09:14 +0100 Subject: [PATCH 19/31] Task/improve localization of limited offer (#5929) * Improve localization --- .../user-account-membership/user-account-membership.html | 7 +++++-- apps/client/src/app/pages/pricing/pricing-page.html | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.html b/apps/client/src/app/components/user-account-membership/user-account-membership.html index eadf85612..321efbcdd 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.html +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -37,8 +37,11 @@

    - Limited Offer! Get - {{ durationExtension }} extra + Limited Offer! +   + Get {{ durationExtension }} extra
    } diff --git a/apps/client/src/app/pages/pricing/pricing-page.html b/apps/client/src/app/pages/pricing/pricing-page.html index bea55f47f..41af9f277 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.html +++ b/apps/client/src/app/pages/pricing/pricing-page.html @@ -310,6 +310,7 @@ class="badge badge-warning font-weight-normal line-height-1 p-3 w-100" > Limited Offer! +   Get {{ durationExtension }} extra From da71ee73d0b2b355d4f4d9d9ed4b237009f97fad Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 10 Nov 2025 22:09:41 +0100 Subject: [PATCH 20/31] Task/improve promotion system (#5930) * Add fallback to promotion logic --- apps/client/src/app/app.component.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index b70850016..de82c7d9c 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -110,10 +110,6 @@ export class GfAppComponent implements OnDestroy, OnInit { this.deviceType = this.deviceService.getDeviceInfo().deviceType; this.info = this.dataService.fetchInfo(); - this.hasPromotion = - !!this.info?.subscriptionOffer?.coupon || - !!this.info?.subscriptionOffer?.durationExtension; - this.impersonationStorageService .onChangeHasImpersonation() .pipe(takeUntil(this.unsubscribeSubject)) @@ -217,9 +213,11 @@ export class GfAppComponent implements OnDestroy, OnInit { this.hasInfoMessage = this.canCreateAccount || !!this.user?.systemMessage; - this.hasPromotion = - !!this.user?.subscription?.offer?.coupon || - !!this.user?.subscription?.offer?.durationExtension; + this.hasPromotion = this.user + ? !!this.user.subscription?.offer?.coupon || + !!this.user.subscription?.offer?.durationExtension + : !!this.info?.subscriptionOffer?.coupon || + !!this.info?.subscriptionOffer?.durationExtension; this.initializeTheme(this.user?.settings.colorScheme); From 332216ae1c90ece5a6ebfe31efc41e256808e7be Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 10 Nov 2025 22:10:42 +0100 Subject: [PATCH 21/31] Task/refactor primary text colors (#5900) * Refactor primary text colors --- apps/client/src/styles.scss | 9 +++++++-- apps/client/src/styles/variables.scss | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index 6c9742f23..b7a031bfa 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -1,5 +1,6 @@ @import './styles/bootstrap'; @import './styles/table'; +@import './styles/variables'; @import 'svgmap/dist/svgMap'; @@ -8,14 +9,18 @@ --font-family-sans-serif: 'Inter', Roboto, 'Helvetica Neue', sans-serif; --light-background: rgb(255, 255, 255); - --dark-primary-text: 0, 0, 0, 0.87; + --dark-primary-text: + #{red($dark-primary-text)}, #{green($dark-primary-text)}, + #{blue($dark-primary-text)}, #{alpha($dark-primary-text)}; --dark-secondary-text: 0, 0, 0, 0.54; --dark-accent-text: 0, 0, 0, 0.87; --dark-warn-text: 0, 0, 0, 0.87; --dark-disabled-text: 0, 0, 0, 0.38; --dark-dividers: 0, 0, 0, 0.12; --dark-focused: 0, 0, 0, 0.12; - --light-primary-text: 255, 255, 255, 1; + --light-primary-text: + #{red($light-primary-text)}, #{green($light-primary-text)}, + #{blue($light-primary-text)}, #{alpha($light-primary-text)}; --light-secondary-text: 255, 255, 255, 0.7; --light-accent-text: 255, 255, 255, 1; --light-warn-text: 255, 255, 255, 1; diff --git a/apps/client/src/styles/variables.scss b/apps/client/src/styles/variables.scss index dcf26eecc..061c182fd 100644 --- a/apps/client/src/styles/variables.scss +++ b/apps/client/src/styles/variables.scss @@ -1,4 +1,4 @@ $dark-primary-text: rgba(black, 0.87); -$light-primary-text: white; +$light-primary-text: rgba(white, 1); $mat-css-dark-theme-selector: '.theme-dark'; From 4c3b95353d058c173ac70425f3b551410c895868 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 10 Nov 2025 22:16:08 +0100 Subject: [PATCH 22/31] Release 2.216.0 (#5932) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a4adc311..bc0ef2df9 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 +## 2.216.0 - 2025-11-10 ### Changed diff --git a/package-lock.json b/package-lock.json index c33710231..e44d8a513 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.215.0", + "version": "2.216.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.215.0", + "version": "2.216.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index ff7f05ea0..cc151f19c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.215.0", + "version": "2.216.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From e7270bfee3dd6a94be031fe8c2ae1254cca9ecfd Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 11 Nov 2025 20:19:46 +0100 Subject: [PATCH 23/31] Task/improve localization of auto-renewal (#5933) * Improve localization --- .../user-account-membership/user-account-membership.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.html b/apps/client/src/app/components/user-account-membership/user-account-membership.html index 321efbcdd..351d5608a 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.html +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -70,7 +70,7 @@ } @else {
    - No auto-renewal. + No auto-renewal on membership.
    } From 9f878c42f4ec39673d1c757c30f0b6900385af67 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 11 Nov 2025 20:20:16 +0100 Subject: [PATCH 24/31] Task/refactor getHolding() in portfolio service (#5898) * Refactor getHolding() if no holding has been found * Update changelog --- CHANGELOG.md | 6 + apps/api/src/app/import/import.service.ts | 19 +- .../src/app/portfolio/portfolio.service.ts | 421 ++++++------------ 3 files changed, 166 insertions(+), 280 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc0ef2df9..50e770f2c 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 + +- Refactored the get holding functionality in the portfolio service + ## 2.216.0 - 2025-11-10 ### Changed diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 2ec28365e..669432db5 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -58,13 +58,18 @@ export class ImportService { userId }: AssetProfileIdentifier & { userId: string }): Promise { try { - const { activities, firstBuyDate, historicalData } = - await this.portfolioService.getHolding({ - dataSource, - symbol, - userId, - impersonationId: undefined - }); + const holding = await this.portfolioService.getHolding({ + dataSource, + symbol, + userId, + impersonationId: undefined + }); + + if (!holding) { + return []; + } + + const { activities, firstBuyDate, historicalData } = holding; const [[assetProfile], dividends] = await Promise.all([ this.symbolProfileService.getSymbolProfiles([ diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index b74b779f6..1ae6190e1 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -88,7 +88,6 @@ import { parseISO, set } from 'date-fns'; -import { isEmpty } from 'lodash'; import { PortfolioCalculator } from './calculator/portfolio-calculator'; import { PortfolioCalculatorFactory } from './calculator/portfolio-calculator.factory'; @@ -776,35 +775,7 @@ export class PortfolioService { }); if (activities.length === 0) { - return { - activities: [], - activitiesCount: 0, - averagePrice: undefined, - dataProviderInfo: undefined, - dividendInBaseCurrency: undefined, - dividendYieldPercent: undefined, - dividendYieldPercentWithCurrencyEffect: undefined, - feeInBaseCurrency: undefined, - firstBuyDate: undefined, - grossPerformance: undefined, - grossPerformancePercent: undefined, - grossPerformancePercentWithCurrencyEffect: undefined, - grossPerformanceWithCurrencyEffect: undefined, - historicalData: [], - investmentInBaseCurrencyWithCurrencyEffect: undefined, - marketPrice: undefined, - marketPriceMax: undefined, - marketPriceMin: undefined, - netPerformance: undefined, - netPerformancePercent: undefined, - netPerformancePercentWithCurrencyEffect: undefined, - netPerformanceWithCurrencyEffect: undefined, - performances: undefined, - quantity: undefined, - SymbolProfile: undefined, - tags: [], - value: undefined - }; + return undefined; } const [SymbolProfile] = await this.symbolProfileService.getSymbolProfiles([ @@ -818,7 +789,6 @@ export class PortfolioService { currency: userCurrency }); - const portfolioStart = portfolioCalculator.getStartDate(); const transactionPoints = portfolioCalculator.getTransactionPoints(); const { positions } = await portfolioCalculator.getSnapshot(); @@ -827,225 +797,108 @@ export class PortfolioService { return position.dataSource === dataSource && position.symbol === symbol; }); - if (holding) { - const { - averagePrice, - currency, - dividendInBaseCurrency, - fee, - firstBuyDate, - grossPerformance, - grossPerformancePercentage, - grossPerformancePercentageWithCurrencyEffect, - grossPerformanceWithCurrencyEffect, - investmentWithCurrencyEffect, - marketPrice, - netPerformance, - netPerformancePercentage, - netPerformancePercentageWithCurrencyEffectMap, - netPerformanceWithCurrencyEffectMap, - quantity, - tags, - timeWeightedInvestment, - timeWeightedInvestmentWithCurrencyEffect, - transactionCount - } = holding; - - const activitiesOfHolding = activities.filter(({ SymbolProfile }) => { - return ( - SymbolProfile.dataSource === dataSource && - SymbolProfile.symbol === symbol - ); - }); - - const dividendYieldPercent = getAnnualizedPerformancePercent({ - daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), - netPerformancePercentage: timeWeightedInvestment.eq(0) - ? new Big(0) - : dividendInBaseCurrency.div(timeWeightedInvestment) - }); - - const dividendYieldPercentWithCurrencyEffect = - getAnnualizedPerformancePercent({ - daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), - netPerformancePercentage: timeWeightedInvestmentWithCurrencyEffect.eq( - 0 - ) - ? new Big(0) - : dividendInBaseCurrency.div( - timeWeightedInvestmentWithCurrencyEffect - ) - }); + if (!holding) { + return undefined; + } - const historicalData = await this.dataProviderService.getHistorical( - [{ dataSource, symbol }], - 'day', - parseISO(firstBuyDate), - new Date() - ); + const { + averagePrice, + currency, + dividendInBaseCurrency, + fee, + firstBuyDate, + grossPerformance, + grossPerformancePercentage, + grossPerformancePercentageWithCurrencyEffect, + grossPerformanceWithCurrencyEffect, + investmentWithCurrencyEffect, + marketPrice, + netPerformance, + netPerformancePercentage, + netPerformancePercentageWithCurrencyEffectMap, + netPerformanceWithCurrencyEffectMap, + quantity, + tags, + timeWeightedInvestment, + timeWeightedInvestmentWithCurrencyEffect, + transactionCount + } = holding; - const historicalDataArray: HistoricalDataItem[] = []; - let marketPriceMax = Math.max( - activitiesOfHolding[0].unitPriceInAssetProfileCurrency, - marketPrice - ); - let marketPriceMaxDate = - marketPrice > activitiesOfHolding[0].unitPriceInAssetProfileCurrency - ? new Date() - : activitiesOfHolding[0].date; - let marketPriceMin = Math.min( - activitiesOfHolding[0].unitPriceInAssetProfileCurrency, - marketPrice + const activitiesOfHolding = activities.filter(({ SymbolProfile }) => { + return ( + SymbolProfile.dataSource === dataSource && + SymbolProfile.symbol === symbol ); + }); - if (historicalData[symbol]) { - let j = -1; - for (const [date, { marketPrice }] of Object.entries( - historicalData[symbol] - )) { - while ( - j + 1 < transactionPoints.length && - !isAfter(parseDate(transactionPoints[j + 1].date), parseDate(date)) - ) { - j++; - } - - let currentAveragePrice = 0; - let currentQuantity = 0; + const dividendYieldPercent = getAnnualizedPerformancePercent({ + daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), + netPerformancePercentage: timeWeightedInvestment.eq(0) + ? new Big(0) + : dividendInBaseCurrency.div(timeWeightedInvestment) + }); - const currentSymbol = transactionPoints[j]?.items.find( - (transactionPointSymbol) => { - return transactionPointSymbol.symbol === symbol; - } - ); + const dividendYieldPercentWithCurrencyEffect = + getAnnualizedPerformancePercent({ + daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), + netPerformancePercentage: timeWeightedInvestmentWithCurrencyEffect.eq(0) + ? new Big(0) + : dividendInBaseCurrency.div(timeWeightedInvestmentWithCurrencyEffect) + }); - if (currentSymbol) { - currentAveragePrice = currentSymbol.averagePrice.toNumber(); - currentQuantity = currentSymbol.quantity.toNumber(); - } + const historicalData = await this.dataProviderService.getHistorical( + [{ dataSource, symbol }], + 'day', + parseISO(firstBuyDate), + new Date() + ); - historicalDataArray.push({ - date, - averagePrice: currentAveragePrice, - marketPrice: - historicalDataArray.length > 0 - ? marketPrice - : currentAveragePrice, - quantity: currentQuantity - }); + const historicalDataArray: HistoricalDataItem[] = []; + let marketPriceMax = Math.max( + activitiesOfHolding[0].unitPriceInAssetProfileCurrency, + marketPrice + ); + let marketPriceMaxDate = + marketPrice > activitiesOfHolding[0].unitPriceInAssetProfileCurrency + ? new Date() + : activitiesOfHolding[0].date; + let marketPriceMin = Math.min( + activitiesOfHolding[0].unitPriceInAssetProfileCurrency, + marketPrice + ); - if (marketPrice > marketPriceMax) { - marketPriceMax = marketPrice; - marketPriceMaxDate = parseISO(date); - } - marketPriceMin = Math.min( - marketPrice ?? Number.MAX_SAFE_INTEGER, - marketPriceMin - ); + if (historicalData[symbol]) { + let j = -1; + for (const [date, { marketPrice }] of Object.entries( + historicalData[symbol] + )) { + while ( + j + 1 < transactionPoints.length && + !isAfter(parseDate(transactionPoints[j + 1].date), parseDate(date)) + ) { + j++; } - } else { - // Add historical entry for buy date, if no historical data available - historicalDataArray.push({ - averagePrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, - date: firstBuyDate, - marketPrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, - quantity: activitiesOfHolding[0].quantity - }); - } - const performancePercent = - this.benchmarkService.calculateChangeInPercentage( - marketPriceMax, - marketPrice - ); + let currentAveragePrice = 0; + let currentQuantity = 0; - return { - firstBuyDate, - marketPrice, - marketPriceMax, - marketPriceMin, - SymbolProfile, - tags, - activities: activitiesOfHolding, - activitiesCount: transactionCount, - averagePrice: averagePrice.toNumber(), - dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], - dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), - dividendYieldPercent: dividendYieldPercent.toNumber(), - dividendYieldPercentWithCurrencyEffect: - dividendYieldPercentWithCurrencyEffect.toNumber(), - feeInBaseCurrency: this.exchangeRateDataService.toCurrency( - fee.toNumber(), - SymbolProfile.currency, - userCurrency - ), - grossPerformance: grossPerformance?.toNumber(), - grossPerformancePercent: grossPerformancePercentage?.toNumber(), - grossPerformancePercentWithCurrencyEffect: - grossPerformancePercentageWithCurrencyEffect?.toNumber(), - grossPerformanceWithCurrencyEffect: - grossPerformanceWithCurrencyEffect?.toNumber(), - historicalData: historicalDataArray, - investmentInBaseCurrencyWithCurrencyEffect: - investmentWithCurrencyEffect?.toNumber(), - netPerformance: netPerformance?.toNumber(), - netPerformancePercent: netPerformancePercentage?.toNumber(), - netPerformancePercentWithCurrencyEffect: - netPerformancePercentageWithCurrencyEffectMap?.['max']?.toNumber(), - netPerformanceWithCurrencyEffect: - netPerformanceWithCurrencyEffectMap?.['max']?.toNumber(), - performances: { - allTimeHigh: { - performancePercent, - date: marketPriceMaxDate + const currentSymbol = transactionPoints[j]?.items.find( + (transactionPointSymbol) => { + return transactionPointSymbol.symbol === symbol; } - }, - quantity: quantity.toNumber(), - value: this.exchangeRateDataService.toCurrency( - quantity.mul(marketPrice ?? 0).toNumber(), - currency, - userCurrency - ) - }; - } else { - const currentData = await this.dataProviderService.getQuotes({ - user, - items: [{ symbol, dataSource: DataSource.YAHOO }] - }); - const marketPrice = currentData[symbol]?.marketPrice; - - let historicalData = await this.dataProviderService.getHistorical( - [{ symbol, dataSource: DataSource.YAHOO }], - 'day', - portfolioStart, - new Date() - ); + ); - if (isEmpty(historicalData)) { - try { - historicalData = await this.dataProviderService.getHistoricalRaw({ - assetProfileIdentifiers: [{ symbol, dataSource: DataSource.YAHOO }], - from: portfolioStart, - to: new Date() - }); - } catch { - historicalData = { - [symbol]: {} - }; + if (currentSymbol) { + currentAveragePrice = currentSymbol.averagePrice.toNumber(); + currentQuantity = currentSymbol.quantity.toNumber(); } - } - - const historicalDataArray: HistoricalDataItem[] = []; - let marketPriceMax = marketPrice; - let marketPriceMaxDate = new Date(); - let marketPriceMin = marketPrice; - for (const [date, { marketPrice }] of Object.entries( - historicalData[symbol] - )) { historicalDataArray.push({ date, - value: marketPrice + averagePrice: currentAveragePrice, + marketPrice: + historicalDataArray.length > 0 ? marketPrice : currentAveragePrice, + quantity: currentQuantity }); if (marketPrice > marketPriceMax) { @@ -1057,48 +910,70 @@ export class PortfolioService { marketPriceMin ); } + } else { + // Add historical entry for buy date, if no historical data available + historicalDataArray.push({ + averagePrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, + date: firstBuyDate, + marketPrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, + quantity: activitiesOfHolding[0].quantity + }); + } - const performancePercent = - this.benchmarkService.calculateChangeInPercentage( - marketPriceMax, - marketPrice - ); - - return { - marketPrice, + const performancePercent = + this.benchmarkService.calculateChangeInPercentage( marketPriceMax, - marketPriceMin, - SymbolProfile, - activities: [], - activitiesCount: 0, - averagePrice: 0, - dataProviderInfo: undefined, - dividendInBaseCurrency: 0, - dividendYieldPercent: 0, - dividendYieldPercentWithCurrencyEffect: 0, - feeInBaseCurrency: 0, - firstBuyDate: undefined, - grossPerformance: undefined, - grossPerformancePercent: undefined, - grossPerformancePercentWithCurrencyEffect: undefined, - grossPerformanceWithCurrencyEffect: undefined, - historicalData: historicalDataArray, - investmentInBaseCurrencyWithCurrencyEffect: 0, - netPerformance: undefined, - netPerformancePercent: undefined, - netPerformancePercentWithCurrencyEffect: undefined, - netPerformanceWithCurrencyEffect: undefined, - performances: { - allTimeHigh: { - performancePercent, - date: marketPriceMaxDate - } - }, - quantity: 0, - tags: [], - value: 0 - }; - } + marketPrice + ); + + return { + firstBuyDate, + marketPrice, + marketPriceMax, + marketPriceMin, + SymbolProfile, + tags, + activities: activitiesOfHolding, + activitiesCount: transactionCount, + averagePrice: averagePrice.toNumber(), + dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], + dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), + dividendYieldPercent: dividendYieldPercent.toNumber(), + dividendYieldPercentWithCurrencyEffect: + dividendYieldPercentWithCurrencyEffect.toNumber(), + feeInBaseCurrency: this.exchangeRateDataService.toCurrency( + fee.toNumber(), + SymbolProfile.currency, + userCurrency + ), + grossPerformance: grossPerformance?.toNumber(), + grossPerformancePercent: grossPerformancePercentage?.toNumber(), + grossPerformancePercentWithCurrencyEffect: + grossPerformancePercentageWithCurrencyEffect?.toNumber(), + grossPerformanceWithCurrencyEffect: + grossPerformanceWithCurrencyEffect?.toNumber(), + historicalData: historicalDataArray, + investmentInBaseCurrencyWithCurrencyEffect: + investmentWithCurrencyEffect?.toNumber(), + netPerformance: netPerformance?.toNumber(), + netPerformancePercent: netPerformancePercentage?.toNumber(), + netPerformancePercentWithCurrencyEffect: + netPerformancePercentageWithCurrencyEffectMap?.['max']?.toNumber(), + netPerformanceWithCurrencyEffect: + netPerformanceWithCurrencyEffectMap?.['max']?.toNumber(), + performances: { + allTimeHigh: { + performancePercent, + date: marketPriceMaxDate + } + }, + quantity: quantity.toNumber(), + value: this.exchangeRateDataService.toCurrency( + quantity.mul(marketPrice ?? 0).toNumber(), + currency, + userCurrency + ) + }; } public async getPerformance({ From cca1590c2a3eb2383dcf251ff8df20959e5f99c9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Nov 2025 21:07:31 +0100 Subject: [PATCH 25/31] Feature/update locales (#5931) * Update locales * Update translation * Update changelog --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 1 + apps/client/src/locales/messages.ca.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.de.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.es.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.fr.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.it.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.nl.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.pl.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.pt.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.tr.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.uk.xlf | 52 ++++++++++++++----------- apps/client/src/locales/messages.xlf | 50 ++++++++++++++---------- apps/client/src/locales/messages.zh.xlf | 52 ++++++++++++++----------- 13 files changed, 360 insertions(+), 263 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50e770f2c..f176dd4af 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 ### Changed - Refactored the get holding functionality in the portfolio service +- Improved the language localization for German (`de`) ## 2.216.0 - 2025-11-10 diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 7513eedaf..e75cabf4a 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -295,7 +295,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351
    @@ -1486,6 +1486,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day Implicació per Dia @@ -1995,7 +2003,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -2459,7 +2467,7 @@ Prova Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -2467,7 +2475,7 @@ Bescanviar el cupó apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -3344,7 +3352,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -3816,7 +3824,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -4372,7 +4380,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -4436,7 +4444,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -4788,7 +4796,7 @@ És gratuït. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -5217,7 +5225,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -5505,7 +5513,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -6745,7 +6753,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6788,14 +6796,6 @@ 69 - - No auto-renewal. - No auto-renewal. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year This year @@ -6857,7 +6857,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7909,6 +7909,10 @@ Limited Offer! Limited Offer! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7917,9 +7921,13 @@ Get extra Get extra + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index a3583df02..9b515539c 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -42,7 +42,7 @@ bitte apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -669,6 +669,14 @@ 231 + + No auto-renewal on membership. + Keine automatische Erneuerung der Mitgliedschaft. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day Engagement pro Tag @@ -726,7 +734,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -854,7 +862,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -1230,7 +1238,7 @@ Premium ausprobieren apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -1238,7 +1246,7 @@ Gutschein einlösen apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -2290,7 +2298,7 @@ kontaktiere uns apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -3058,7 +3066,7 @@ Suchst du nach einem Studentenrabatt? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -3550,7 +3558,7 @@ Es ist kostenlos. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -5264,7 +5272,7 @@ mit deiner Universitäts-E-Mail-Adresse apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -5444,7 +5452,7 @@ Fordere ihn an apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -5768,7 +5776,7 @@ hier apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6769,7 +6777,7 @@ Wenn du die Eröffnung eines Kontos planst bei apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6812,14 +6820,6 @@ 69 - - No auto-renewal. - Keine automatische Erneuerung. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year Dieses Jahr @@ -6881,7 +6881,7 @@ um unseren Empfehlungslink zu verwenden und ein Ghostfolio Premium-Abonnement für ein Jahr zu erhalten apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7909,6 +7909,10 @@ Limited Offer! Begrenztes Angebot! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7917,9 +7921,13 @@ Get extra Erhalte extra + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 62f437994..c70552d1f 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -43,7 +43,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -654,6 +654,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day Contratación diaria @@ -711,7 +719,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -839,7 +847,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -1215,7 +1223,7 @@ Prueba Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -1223,7 +1231,7 @@ Canjea el cupón apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -2275,7 +2283,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -3035,7 +3043,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -3535,7 +3543,7 @@ Es gratis. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -5241,7 +5249,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -5421,7 +5429,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -5745,7 +5753,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6746,7 +6754,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6789,14 +6797,6 @@ 69 - - No auto-renewal. - Sin renovación automática. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year Este año @@ -6858,7 +6858,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7910,6 +7910,10 @@ Limited Offer! ¡Oferta limitada! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7918,9 +7922,13 @@ Get extra Obtén extra + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 560859d05..af07071c6 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -34,7 +34,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -861,6 +861,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day Engagement par Jour @@ -1106,7 +1114,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -1494,7 +1502,7 @@ Essayer Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -1502,7 +1510,7 @@ Utiliser un Code Promotionnel apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -2322,7 +2330,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -2514,7 +2522,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -2742,7 +2750,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -3534,7 +3542,7 @@ C’est gratuit. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -5240,7 +5248,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -5420,7 +5428,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -5744,7 +5752,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6745,7 +6753,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6788,14 +6796,6 @@ 69 - - No auto-renewal. - Pas de renouvellement automatique. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year Cette année @@ -6857,7 +6857,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7909,6 +7909,10 @@ Limited Offer! Offre Limitée ! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7917,9 +7921,13 @@ Get extra Obtenez supplémentaires + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 076c02068..b5987e2b6 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -43,7 +43,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -654,6 +654,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day Partecipazione giornaliera @@ -711,7 +719,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -839,7 +847,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -1215,7 +1223,7 @@ Prova Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -1223,7 +1231,7 @@ Riscatta il buono apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -2275,7 +2283,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -3035,7 +3043,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -3535,7 +3543,7 @@ È gratuito. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -5241,7 +5249,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -5421,7 +5429,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -5745,7 +5753,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6746,7 +6754,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6789,14 +6797,6 @@ 69 - - No auto-renewal. - No rinnovo automatico. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year Anno corrente @@ -6858,7 +6858,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7910,6 +7910,10 @@ Limited Offer! Offerta limitata! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7918,9 +7922,13 @@ Get extra Get extra + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 4a17736b4..b88340f52 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -42,7 +42,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -653,6 +653,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day Betrokkenheid per dag @@ -710,7 +718,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -838,7 +846,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -1214,7 +1222,7 @@ Probeer Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -1222,7 +1230,7 @@ Coupon inwisselen apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -2274,7 +2282,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -3034,7 +3042,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -3534,7 +3542,7 @@ Het is gratis. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -5240,7 +5248,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -5420,7 +5428,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -5744,7 +5752,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6745,7 +6753,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6788,14 +6796,6 @@ 69 - - No auto-renewal. - Geen automatische verlenging. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year Dit jaar @@ -6857,7 +6857,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7909,6 +7909,10 @@ Limited Offer! Beperkt aanbod! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7917,9 +7921,13 @@ Get extra Krijg extra + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 321cfbecd..dddb4f79c 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -243,7 +243,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -1314,6 +1314,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day Zaangażowanie na Dzień @@ -1691,7 +1699,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -2179,7 +2187,7 @@ Wypróbuj Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -2187,7 +2195,7 @@ Wykorzystaj kupon apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -2979,7 +2987,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -3435,7 +3443,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -3983,7 +3991,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -4335,7 +4343,7 @@ Jest bezpłatny. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -4744,7 +4752,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -4888,7 +4896,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -5744,7 +5752,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6745,7 +6753,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6788,14 +6796,6 @@ 69 - - No auto-renewal. - Bez automatycznego odnawiania. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year W tym roku @@ -6857,7 +6857,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7909,6 +7909,10 @@ Limited Offer! Oferta ograniczona czasowo! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7917,9 +7921,13 @@ Get extra Uzyskaj dodatkowo + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index dc8804544..fbbd51c47 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -34,7 +34,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -733,6 +733,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day Envolvimento por Dia @@ -986,7 +994,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -1482,7 +1490,7 @@ Experimentar Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -1490,7 +1498,7 @@ Resgatar Cupão apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -2450,7 +2458,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -2642,7 +2650,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -3098,7 +3106,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -3534,7 +3542,7 @@ É gratuito. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -5240,7 +5248,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -5420,7 +5428,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -5744,7 +5752,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6745,7 +6753,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6788,14 +6796,6 @@ 69 - - No auto-renewal. - Sem renovação automática. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year Este ano @@ -6857,7 +6857,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7909,6 +7909,10 @@ Limited Offer! Limited Offer! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7917,9 +7921,13 @@ Get extra Get extra + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 235f670a3..9c3820229 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -215,7 +215,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -1182,6 +1182,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day Günlük etkileşim @@ -1551,7 +1559,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -2563,7 +2571,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -3475,7 +3483,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -3827,7 +3835,7 @@ Ücretsiz. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -4336,7 +4344,7 @@ Premium’u Deneyin apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -4344,7 +4352,7 @@ Kupon Kullan apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -4584,7 +4592,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -5248,7 +5256,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -5420,7 +5428,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -5744,7 +5752,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6745,7 +6753,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6788,14 +6796,6 @@ 69 - - No auto-renewal. - Otomatik yenileme yok. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year Bu yıl @@ -6857,7 +6857,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7909,6 +7909,10 @@ Limited Offer! Sınırlı Teklif! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7917,9 +7921,13 @@ Get extra Get extra + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index c1f2c7bce..f34d576b2 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -295,7 +295,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -1527,7 +1527,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -1558,6 +1558,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Do you really want to delete this tag? Ви дійсно хочете видалити цей тег? @@ -1783,7 +1791,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -2751,7 +2759,7 @@ Спробуйте Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -2759,15 +2767,7 @@ Обміняти купон apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 - - - - No auto-renewal. - Без автоматичного поновлення. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 + 66 @@ -3636,7 +3636,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -4108,7 +4108,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -4700,7 +4700,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -4764,7 +4764,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -5156,7 +5156,7 @@ Це безкоштовно. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -5763,7 +5763,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -5955,7 +5955,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -6243,7 +6243,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -7909,6 +7909,10 @@ Limited Offer! Limited Offer! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7917,9 +7921,13 @@ Get extra Get extra + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 3a6ce2f09..1d8c395ad 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -228,7 +228,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -1239,6 +1239,13 @@ 231 + + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day @@ -1583,7 +1590,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -2027,14 +2034,14 @@ Try Premium apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 Redeem Coupon apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -2763,7 +2770,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -3172,7 +3179,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -3665,7 +3672,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -3985,7 +3992,7 @@ It’s free. apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -4366,7 +4373,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -4515,7 +4522,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -5277,7 +5284,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6155,7 +6162,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6186,13 +6193,6 @@ 63 - - No auto-renewal. - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - From the beginning @@ -6240,7 +6240,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7167,6 +7167,10 @@ Limited Offer! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7174,9 +7178,13 @@ Get extra + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index d5090164d..4b5e3efd8 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -244,7 +244,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 350 + 351 @@ -1323,6 +1323,14 @@ 231 + + No auto-renewal on membership. + No auto-renewal on membership. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 73 + + Engagement per Day 每天的参与度 @@ -1700,7 +1708,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 343 + 344 apps/client/src/app/pages/register/register-page.html @@ -2188,7 +2196,7 @@ 尝试高级版 apps/client/src/app/components/user-account-membership/user-account-membership.html - 49 + 52 @@ -2196,7 +2204,7 @@ 兑换优惠券 apps/client/src/app/components/user-account-membership/user-account-membership.html - 63 + 66 @@ -2988,7 +2996,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 377 + 378 apps/client/src/app/pages/public/public-page.html @@ -3444,7 +3452,7 @@ 使用您的学校电子邮件地址 apps/client/src/app/pages/pricing/pricing-page.html - 365 + 366 @@ -3992,7 +4000,7 @@ 寻找学生折扣? apps/client/src/app/pages/pricing/pricing-page.html - 359 + 360 @@ -4344,7 +4352,7 @@ 免费。 apps/client/src/app/pages/pricing/pricing-page.html - 379 + 380 @@ -4765,7 +4773,7 @@ 请求它 apps/client/src/app/pages/pricing/pricing-page.html - 361 + 362 @@ -4933,7 +4941,7 @@ 联系我们 apps/client/src/app/pages/pricing/pricing-page.html - 353 + 354 @@ -5777,7 +5785,7 @@ 这里 apps/client/src/app/pages/pricing/pricing-page.html - 364 + 365 @@ -6746,7 +6754,7 @@ 如果您计划开通账户在 apps/client/src/app/pages/pricing/pricing-page.html - 329 + 330 @@ -6789,14 +6797,6 @@ 69 - - No auto-renewal. - 不自动续订。 - - apps/client/src/app/components/user-account-membership/user-account-membership.html - 70 - - This year 今年 @@ -6858,7 +6858,7 @@ 使用我们的推荐链接并获得一年的Ghostfolio Premium会员资格 apps/client/src/app/pages/pricing/pricing-page.html - 357 + 358 @@ -7910,6 +7910,10 @@ Limited Offer! 限时优惠! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 40 + apps/client/src/app/pages/pricing/pricing-page.html 312 @@ -7918,9 +7922,13 @@ Get extra 获取额外 + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 43 + apps/client/src/app/pages/pricing/pricing-page.html - 314 + 315 From 54cc82e328fb2c8f845a86e03424bf6f74b1794d Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 13 Nov 2025 20:27:16 +0100 Subject: [PATCH 26/31] Task/upgrade prisma to version 6.19.0 (#5937) * Upgrade prisma to version 6.19.0 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 72 +++++++++++++++++++++++------------------------ package.json | 4 +-- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f176dd4af..a46674ef3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Refactored the get holding functionality in the portfolio service - Improved the language localization for German (`de`) +- Upgraded `prisma` from version `6.18.0` to `6.19.0` ## 2.216.0 - 2025-11-10 diff --git a/package-lock.json b/package-lock.json index e44d8a513..a1d1551e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "@nestjs/schedule": "6.0.1", "@nestjs/serve-static": "5.0.4", "@openrouter/ai-sdk-provider": "0.7.2", - "@prisma/client": "6.18.0", + "@prisma/client": "6.19.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "7.9.0", @@ -146,7 +146,7 @@ "nx": "21.5.1", "prettier": "3.6.2", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.18.0", + "prisma": "6.19.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", @@ -11883,9 +11883,9 @@ "license": "MIT" }, "node_modules/@prisma/client": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.18.0.tgz", - "integrity": "sha512-jnL2I9gDnPnw4A+4h5SuNn8Gc+1mL1Z79U/3I9eE2gbxJG1oSA+62ByPW4xkeDgwE0fqMzzpAZ7IHxYnLZ4iQA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.0.tgz", + "integrity": "sha512-QXFT+N/bva/QI2qoXmjBzL7D6aliPffIwP+81AdTGq0FXDoLxLkWivGMawG8iM5B9BKfxLIXxfWWAF6wbuJU6g==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -11905,9 +11905,9 @@ } }, "node_modules/@prisma/config": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.18.0.tgz", - "integrity": "sha512-rgFzspCpwsE+q3OF/xkp0fI2SJ3PfNe9LLMmuSVbAZ4nN66WfBiKqJKo/hLz3ysxiPQZf8h1SMf2ilqPMeWATQ==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.0.tgz", + "integrity": "sha512-zwCayme+NzI/WfrvFEtkFhhOaZb/hI+X8TTjzjJ252VbPxAl2hWHK5NMczmnG9sXck2lsXrxIZuK524E25UNmg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -11918,53 +11918,53 @@ } }, "node_modules/@prisma/debug": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.18.0.tgz", - "integrity": "sha512-PMVPMmxPj0ps1VY75DIrT430MoOyQx9hmm174k6cmLZpcI95rAPXOQ+pp8ANQkJtNyLVDxnxVJ0QLbrm/ViBcg==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.0.tgz", + "integrity": "sha512-8hAdGG7JmxrzFcTzXZajlQCidX0XNkMJkpqtfbLV54wC6LSSX6Vni25W/G+nAANwLnZ2TmwkfIuWetA7jJxJFA==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.18.0.tgz", - "integrity": "sha512-i5RzjGF/ex6AFgqEe2o1IW8iIxJGYVQJVRau13kHPYEL1Ck8Zvwuzamqed/1iIljs5C7L+Opiz5TzSsUebkriA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.0.tgz", + "integrity": "sha512-pMRJ+1S6NVdXoB8QJAPIGpKZevFjxhKt0paCkRDTZiczKb7F4yTgRP8M4JdVkpQwmaD4EoJf6qA+p61godDokw==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.18.0", - "@prisma/engines-version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", - "@prisma/fetch-engine": "6.18.0", - "@prisma/get-platform": "6.18.0" + "@prisma/debug": "6.19.0", + "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", + "@prisma/fetch-engine": "6.19.0", + "@prisma/get-platform": "6.19.0" } }, "node_modules/@prisma/engines-version": { - "version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f.tgz", - "integrity": "sha512-T7Af4QsJQnSgWN1zBbX+Cha5t4qjHRxoeoWpK4JugJzG/ipmmDMY5S+O0N1ET6sCBNVkf6lz+Y+ZNO9+wFU8pQ==", + "version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773.tgz", + "integrity": "sha512-gV7uOBQfAFlWDvPJdQxMT1aSRur3a0EkU/6cfbAC5isV67tKDWUrPauyaHNpB+wN1ebM4A9jn/f4gH+3iHSYSQ==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.18.0.tgz", - "integrity": "sha512-TdaBvTtBwP3IoqVYoGIYpD4mWlk0pJpjTJjir/xLeNWlwog7Sl3bD2J0jJ8+5+q/6RBg+acb9drsv5W6lqae7A==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.0.tgz", + "integrity": "sha512-OOx2Lda0DGrZ1rodADT06ZGqHzr7HY7LNMaFE2Vp8dp146uJld58sRuasdX0OiwpHgl8SqDTUKHNUyzEq7pDdQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.18.0", - "@prisma/engines-version": "6.18.0-8.34b5a692b7bd79939a9a2c3ef97d816e749cda2f", - "@prisma/get-platform": "6.18.0" + "@prisma/debug": "6.19.0", + "@prisma/engines-version": "6.19.0-26.2ba551f319ab1df4bc874a89965d8b3641056773", + "@prisma/get-platform": "6.19.0" } }, "node_modules/@prisma/get-platform": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.18.0.tgz", - "integrity": "sha512-uXNJCJGhxTCXo2B25Ta91Rk1/Nmlqg9p7G9GKh8TPhxvAyXCvMNQoogj4JLEUy+3ku8g59cpyQIKFhqY2xO2bg==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.0.tgz", + "integrity": "sha512-ym85WDO2yDhC3fIXHWYpG3kVMBA49cL1XD2GCsCF8xbwoy2OkDQY44gEbAt2X46IQ4Apq9H6g0Ex1iFfPqEkHA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.18.0" + "@prisma/debug": "6.19.0" } }, "node_modules/@redis/client": { @@ -35617,15 +35617,15 @@ } }, "node_modules/prisma": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.18.0.tgz", - "integrity": "sha512-bXWy3vTk8mnRmT+SLyZBQoC2vtV9Z8u7OHvEu+aULYxwiop/CPiFZ+F56KsNRNf35jw+8wcu8pmLsjxpBxAO9g==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.0.tgz", + "integrity": "sha512-F3eX7K+tWpkbhl3l4+VkFtrwJlLXbAM+f9jolgoUZbFcm1DgHZ4cq9AgVEgUym2au5Ad/TDLN8lg83D+M10ycw==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "6.18.0", - "@prisma/engines": "6.18.0" + "@prisma/config": "6.19.0", + "@prisma/engines": "6.19.0" }, "bin": { "prisma": "build/index.js" diff --git a/package.json b/package.json index cc151f19c..5bf5e6775 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "@nestjs/schedule": "6.0.1", "@nestjs/serve-static": "5.0.4", "@openrouter/ai-sdk-provider": "0.7.2", - "@prisma/client": "6.18.0", + "@prisma/client": "6.19.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "7.9.0", @@ -192,7 +192,7 @@ "nx": "21.5.1", "prettier": "3.6.2", "prettier-plugin-organize-attributes": "1.0.0", - "prisma": "6.18.0", + "prisma": "6.19.0", "react": "18.2.0", "react-dom": "18.2.0", "replace-in-file": "8.3.0", From 8d2fde35da6be7be72fb83cdf7949c4899e5f2dc Mon Sep 17 00:00:00 2001 From: David Requeno <108202767+DavidReque@users.noreply.github.com> Date: Thu, 13 Nov 2025 13:58:33 -0600 Subject: [PATCH 27/31] Task/fetch user data on demand in user detail dialog (#5923) * Fetch user data on demand in user detail dialog * Update changelog --- CHANGELOG.md | 1 + .../admin-users/admin-users.component.ts | 30 +++++--------- .../interfaces/interfaces.ts | 4 +- .../user-detail-dialog.component.ts | 33 ++++++++++++++-- .../user-detail-dialog.html | 39 +++++++------------ apps/client/src/app/services/admin.service.ts | 7 +++- 6 files changed, 63 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a46674ef3..4437d077c 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 ### Changed - Refactored the get holding functionality in the portfolio service +- Changed the user data loading in the user detail dialog of the admin control panel’s users section to fetch data on demand - Improved the language localization for German (`de`) - Upgraded `prisma` from version `6.18.0` to `6.19.0` diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts index 94b5839c6..6b3335927 100644 --- a/apps/client/src/app/components/admin-users/admin-users.component.ts +++ b/apps/client/src/app/components/admin-users/admin-users.component.ts @@ -1,4 +1,12 @@ +import { UserDetailDialogParams } from '@ghostfolio/client/components/user-detail-dialog/interfaces/interfaces'; +import { GfUserDetailDialogComponent } from '@ghostfolio/client/components/user-detail-dialog/user-detail-dialog.component'; +import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; +import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; +import { AdminService } from '@ghostfolio/client/services/admin.service'; +import { DataService } from '@ghostfolio/client/services/data.service'; +import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; +import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { getDateFnsLocale, @@ -51,15 +59,6 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; -import { ConfirmationDialogType } from '../../core/notification/confirmation-dialog/confirmation-dialog.type'; -import { NotificationService } from '../../core/notification/notification.service'; -import { AdminService } from '../../services/admin.service'; -import { DataService } from '../../services/data.service'; -import { ImpersonationStorageService } from '../../services/impersonation-storage.service'; -import { UserService } from '../../services/user/user.service'; -import { UserDetailDialogParams } from '../user-detail-dialog/interfaces/interfaces'; -import { GfUserDetailDialogComponent } from '../user-detail-dialog/user-detail-dialog.component'; - @Component({ imports: [ CommonModule, @@ -283,25 +282,16 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { } private openUserDetailDialog(aUserId: string) { - const userData = this.dataSource.data.find(({ id }) => { - return id === aUserId; - }); - - if (!userData) { - this.router.navigate(['.'], { relativeTo: this.route }); - return; - } - const dialogRef = this.dialog.open< GfUserDetailDialogComponent, UserDetailDialogParams >(GfUserDetailDialogComponent, { autoFocus: false, data: { - userData, deviceType: this.deviceType, hasPermissionForSubscription: this.hasPermissionForSubscription, - locale: this.user?.settings?.locale + locale: this.user?.settings?.locale, + userId: aUserId }, height: this.deviceType === 'mobile' ? '98vh' : '60vh', width: this.deviceType === 'mobile' ? '100vw' : '50rem' diff --git a/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts index d29bc01bc..b922e7a54 100644 --- a/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts @@ -1,8 +1,6 @@ -import { AdminUsersResponse } from '@ghostfolio/common/interfaces'; - export interface UserDetailDialogParams { deviceType: string; hasPermissionForSubscription: boolean; locale: string; - userData: AdminUsersResponse['users'][0]; + userId: string; } diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts index bd336c4f8..6dabf2f78 100644 --- a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts @@ -1,19 +1,24 @@ import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; +import { AdminService } from '@ghostfolio/client/services/admin.service'; +import { AdminUserResponse } from '@ghostfolio/common/interfaces'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, + ChangeDetectorRef, Component, CUSTOM_ELEMENTS_SCHEMA, Inject, - OnDestroy + OnDestroy, + OnInit } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog'; -import { Subject } from 'rxjs'; +import { EMPTY, Subject } from 'rxjs'; +import { catchError, takeUntil } from 'rxjs/operators'; import { UserDetailDialogParams } from './interfaces/interfaces'; @@ -33,14 +38,36 @@ import { UserDetailDialogParams } from './interfaces/interfaces'; styleUrls: ['./user-detail-dialog.component.scss'], templateUrl: './user-detail-dialog.html' }) -export class GfUserDetailDialogComponent implements OnDestroy { +export class GfUserDetailDialogComponent implements OnDestroy, OnInit { + public user: AdminUserResponse; + private unsubscribeSubject = new Subject(); public constructor( + private adminService: AdminService, + private changeDetectorRef: ChangeDetectorRef, @Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams, public dialogRef: MatDialogRef ) {} + public ngOnInit() { + this.adminService + .fetchUserById(this.data.userId) + .pipe( + takeUntil(this.unsubscribeSubject), + catchError(() => { + this.dialogRef.close(); + + return EMPTY; + }) + ) + .subscribe((user) => { + this.user = user; + + this.changeDetectorRef.markForCheck(); + }); + } + public onClose() { this.dialogRef.close(); } diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html index 6bc468b59..fcefee4f0 100644 --- a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -8,9 +8,7 @@
    - - User ID - + User ID
    Registration Date - Registration Date -
    - - Role - + Role
    @if (data.hasPermissionForSubscription) {
    - - Country - + Country
    }
    @@ -46,20 +41,18 @@ i18n size="medium" [locale]="data.locale" - [value]="data.userData.accountCount" + [value]="user?.accountCount" + >Accounts - Accounts -
    Activities - Activities -
    @@ -71,20 +64,18 @@ size="medium" [locale]="data.locale" [precision]="0" - [value]="data.userData.engagement" + [value]="user?.engagement" + >Engagement per Day - Engagement per Day -
    API Requests Today - API Requests Today -
    } diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index 2f3040ba3..cdac3ed38 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -8,11 +8,12 @@ import { } from '@ghostfolio/common/config'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { - AssetProfileIdentifier, AdminData, AdminJobs, AdminMarketData, + AdminUserResponse, AdminUsersResponse, + AssetProfileIdentifier, DataProviderGhostfolioStatusResponse, EnhancedSymbolProfile, Filter @@ -142,6 +143,10 @@ export class AdminService { return this.http.get('/api/v1/platform'); } + public fetchUserById(id: string) { + return this.http.get(`/api/v1/admin/user/${id}`); + } + public fetchUsers({ skip, take = DEFAULT_PAGE_SIZE From a57b670d7b9562524d9450d637628be6d12837e3 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Fri, 14 Nov 2025 20:30:03 +0700 Subject: [PATCH 28/31] Task/enforce module boundaries for api and common modules (#5925) * feat(lint): allow circular self deps * feat(lint): enforce module boundaries * feat(lib): move data provider response interface to common * feat(lib): move symbol item interface to common * feat(lib): move activity interface to common * feat(lint): temporarily disable @nx/enforce-module-boundaries for ui files * feat(lint): temporarily disable @nx/enforce-module-boundaries for client files * feat(lint): ignore circular deps between client and ui * feat(common): implement barrel export for data provider response interface * feat(common): implement barrel export for activity interface * feat(common): implement barrel export for symbol item interface --- .../ghostfolio/ghostfolio.service.ts | 2 +- .../exchange-rate/exchange-rate.controller.ts | 2 +- apps/api/src/app/import/import.service.ts | 10 +++++----- .../portfolio-calculator.factory.ts | 7 +++++-- .../calculator/portfolio-calculator.ts | 2 +- ...tfolio-calculator-baln-buy-and-buy.spec.ts | 2 +- ...aln-buy-and-sell-in-two-activities.spec.ts | 2 +- ...folio-calculator-baln-buy-and-sell.spec.ts | 2 +- .../portfolio-calculator-baln-buy.spec.ts | 2 +- ...ulator-btceur-in-base-currency-eur.spec.ts | 3 +-- .../roai/portfolio-calculator-btceur.spec.ts | 3 +-- ...ator-btcusd-buy-and-sell-partially.spec.ts | 2 +- .../portfolio-calculator-btcusd-short.spec.ts | 3 +-- .../roai/portfolio-calculator-btcusd.spec.ts | 3 +-- .../roai/portfolio-calculator-fee.spec.ts | 2 +- .../portfolio-calculator-googl-buy.spec.ts | 2 +- .../portfolio-calculator-liability.spec.ts | 2 +- ...folio-calculator-msft-buy-and-sell.spec.ts | 2 +- ...-calculator-msft-buy-with-dividend.spec.ts | 2 +- ...ulator-novn-buy-and-sell-partially.spec.ts | 3 +-- ...folio-calculator-novn-buy-and-sell.spec.ts | 3 +-- .../portfolio-calculator-valuable.spec.ts | 2 +- .../interfaces/portfolio-order.interface.ts | 2 +- .../src/app/portfolio/portfolio.service.ts | 2 +- apps/api/src/app/symbol/symbol.controller.ts | 8 +++++--- apps/api/src/app/symbol/symbol.service.ts | 11 ++++------ .../alpha-vantage/alpha-vantage.service.ts | 6 ++---- .../coingecko/coingecko.service.ts | 6 ++---- .../data-provider/data-provider.service.ts | 6 ++---- .../eod-historical-data.service.ts | 6 ++---- .../financial-modeling-prep.service.ts | 6 ++---- .../ghostfolio/ghostfolio.service.ts | 6 ++---- .../google-sheets/google-sheets.service.ts | 6 ++---- .../interfaces/data-provider.interface.ts | 4 +--- .../data-provider/manual/manual.service.ts | 6 ++---- .../rapid-api/rapid-api.service.ts | 6 ++---- .../yahoo-finance/yahoo-finance.service.ts | 6 ++---- .../api/src/services/interfaces/interfaces.ts | 20 +------------------ .../account-detail-dialog.component.ts | 3 ++- .../asset-profile-dialog.component.ts | 1 + .../admin-platform.component.ts | 1 + ...ate-or-update-platform-dialog.component.ts | 1 + .../admin-tag/admin-tag.component.ts | 1 + .../create-or-update-tag-dialog.component.ts | 1 + .../app/components/header/header.component.ts | 1 + .../holding-detail-dialog.component.ts | 3 ++- .../src/app/components/rule/rule.component.ts | 1 + .../app/components/rules/rules.component.ts | 1 + ...reate-or-update-access-dialog.component.ts | 1 + .../user-account-access.component.ts | 1 + .../pages/accounts/accounts-page.component.ts | 1 + ...eate-or-update-account-dialog.component.ts | 1 + .../transfer-balance-dialog.component.ts | 1 + .../activities/activities-page.component.ts | 8 ++++++-- ...ate-or-update-activity-dialog.component.ts | 1 + .../interfaces/interfaces.ts | 3 +-- .../import-activities-dialog.component.ts | 4 ++-- .../portfolio/x-ray/x-ray-page.component.ts | 1 + apps/client/src/app/services/admin.service.ts | 3 ++- apps/client/src/app/services/data.service.ts | 5 +++-- .../app/services/import-activities.service.ts | 3 ++- .../src/app/services/web-authn.service.ts | 1 + eslint.config.cjs | 9 ++++++--- .../lib}/interfaces/activities.interface.ts | 0 libs/common/src/lib/interfaces/index.ts | 13 +++++++++++- .../activities-response.interface.ts | 2 +- .../responses/activity-response.interface.ts | 2 +- .../data-provider-response.interface.ts | 16 +++++++++++++++ .../responses/dividends-response.interface.ts | 2 +- .../historical-response.interface.ts | 2 +- .../responses/import-response.interface.ts | 2 +- ...rket-data-of-markets-response.interface.ts | 2 +- .../portfolio-holding-response.interface.ts | 2 +- .../responses/quotes-response.interface.ts | 2 +- .../lib}/interfaces/symbol-item.interface.ts | 0 .../account-balances.component.ts | 1 + .../accounts-table.component.ts | 1 + .../activities-filter.component.ts | 1 + .../activities-table.component.stories.ts | 2 +- .../activities-table.component.ts | 7 +++++-- .../assistant-list-item.component.ts | 1 + .../src/lib/assistant/assistant.component.ts | 1 + .../benchmark-detail-dialog.component.ts | 1 + .../src/lib/benchmark/benchmark.component.ts | 1 + ...cal-market-data-editor-dialog.component.ts | 1 + ...historical-market-data-editor.component.ts | 1 + .../portfolio-filter-form.component.ts | 1 + .../symbol-autocomplete.component.ts | 1 + .../top-holdings/top-holdings.component.ts | 1 + 89 files changed, 159 insertions(+), 134 deletions(-) rename {apps/api/src/app/order => libs/common/src/lib}/interfaces/activities.interface.ts (100%) create mode 100644 libs/common/src/lib/interfaces/responses/data-provider-response.interface.ts rename {apps/api/src/app/symbol => libs/common/src/lib}/interfaces/symbol-item.interface.ts (100%) diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index 1094858cb..d088bf3ac 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -8,7 +8,6 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { @@ -18,6 +17,7 @@ import { import { PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS } from '@ghostfolio/common/config'; import { DataProviderGhostfolioAssetProfileResponse, + DataProviderHistoricalResponse, DataProviderInfo, DividendsResponse, HistoricalResponse, diff --git a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts b/apps/api/src/app/exchange-rate/exchange-rate.controller.ts index fc9e61d61..239b4b27a 100644 --- a/apps/api/src/app/exchange-rate/exchange-rate.controller.ts +++ b/apps/api/src/app/exchange-rate/exchange-rate.controller.ts @@ -1,5 +1,5 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; -import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/common/interfaces'; import { Controller, diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 669432db5..cac466192 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -1,10 +1,6 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { - Activity, - ActivityError -} from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; @@ -19,7 +15,11 @@ import { getAssetProfileIdentifier, parseDate } from '@ghostfolio/common/helper'; -import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; +import { + Activity, + ActivityError, + AssetProfileIdentifier +} from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { AccountWithPlatform, diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts index 24fe2b2f3..7b5ab1a0d 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts @@ -1,10 +1,13 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; -import { Filter, HistoricalDataItem } from '@ghostfolio/common/interfaces'; +import { + Activity, + Filter, + HistoricalDataItem +} from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Injectable } from '@nestjs/common'; diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 10e5c15cb..b3cedb00b 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; @@ -26,6 +25,7 @@ import { resetHours } from '@ghostfolio/common/helper'; import { + Activity, AssetProfileIdentifier, DataProviderInfo, Filter, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts index aa174f319..f0e2f6488 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts index 69b6c3dfc..10b1fabd3 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts index a3cb8716e..32cd9f7d4 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts index ae083a7db..84cab99e1 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts index 87893e647..1f64684a0 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -16,7 +15,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { Activity, ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts index cef8938c2..ce639b564 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { Activity, ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts index 36e6fa900..0c111fab2 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -15,6 +14,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts index 5a4dfdc07..618dc805c 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { Activity, ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts index 2ee367530..a7cbe746c 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { Activity, ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts index 002be9154..aae77c876 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts index bf0b15020..495728e22 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -15,6 +14,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts index 32822014c..1fd88dacc 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts index 08015da5b..4c8ccdcf5 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts index e5b128085..0331e163e 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts index cf330d136..650944421 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { Activity, ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts index 681169062..2e408dc3c 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, loadExportFile, @@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; -import { ExportResponse } from '@ghostfolio/common/interfaces'; +import { Activity, ExportResponse } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts index fc1d477a6..3c7c3be4b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts @@ -1,4 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { activityDummyData, symbolProfileDummyData, @@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate- import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { parseDate } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Big } from 'big.js'; diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts index 1c53430f6..9362184c7 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts @@ -1,4 +1,4 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { Activity } from '@ghostfolio/common/interfaces'; export interface PortfolioOrder extends Pick { date: string; diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 1ae6190e1..084c8f4ed 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1,7 +1,6 @@ import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; @@ -40,6 +39,7 @@ import { import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper'; import { AccountsResponse, + Activity, EnhancedSymbolProfile, Filter, HistoricalDataItem, diff --git a/apps/api/src/app/symbol/symbol.controller.ts b/apps/api/src/app/symbol/symbol.controller.ts index b374a914b..501692ae5 100644 --- a/apps/api/src/app/symbol/symbol.controller.ts +++ b/apps/api/src/app/symbol/symbol.controller.ts @@ -1,8 +1,11 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; -import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; -import { LookupResponse } from '@ghostfolio/common/interfaces'; +import { + DataProviderHistoricalResponse, + LookupResponse, + SymbolItem +} from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { @@ -22,7 +25,6 @@ import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { isDate, isEmpty } from 'lodash'; -import { SymbolItem } from './interfaces/symbol-item.interface'; import { SymbolService } from './symbol.service'; @Controller('symbol') diff --git a/apps/api/src/app/symbol/symbol.service.ts b/apps/api/src/app/symbol/symbol.service.ts index 9eac234c9..15498e80d 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -1,21 +1,18 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; -import { - DataGatheringItem, - DataProviderHistoricalResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { + DataProviderHistoricalResponse, HistoricalDataItem, - LookupResponse + LookupResponse, + SymbolItem } from '@ghostfolio/common/interfaces'; import { UserWithSettings } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { format, subDays } from 'date-fns'; -import { SymbolItem } from './interfaces/symbol-item.interface'; - @Injectable() export class SymbolService { public constructor( 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 1e631f8c8..3cf935b1e 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 @@ -7,14 +7,12 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, LookupResponse } from '@ghostfolio/common/interfaces'; diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index e06cb6ab3..4123cc6cc 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -7,14 +7,12 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, LookupItem, LookupResponse } from '@ghostfolio/common/interfaces'; 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 53ef5c5e4..5a088c0e4 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -1,10 +1,6 @@ import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; @@ -23,6 +19,8 @@ import { } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, + DataProviderHistoricalResponse, + DataProviderResponse, LookupItem, LookupResponse } from '@ghostfolio/common/interfaces'; 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 b837b2e6f..b93ca492a 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 @@ -7,10 +7,6 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { DEFAULT_CURRENCY, @@ -18,7 +14,9 @@ import { } from '@ghostfolio/common/config'; import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper'; import { + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, LookupItem, LookupResponse } from '@ghostfolio/common/interfaces'; diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index 0caad99ca..90035b1a8 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -8,10 +8,6 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { DEFAULT_CURRENCY, @@ -19,7 +15,9 @@ import { } from '@ghostfolio/common/config'; import { DATE_FORMAT, isCurrency, parseDate } from '@ghostfolio/common/helper'; import { + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, LookupItem, LookupResponse } from '@ghostfolio/common/interfaces'; diff --git a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts index 9928af8eb..afbecc118 100644 --- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts @@ -8,10 +8,6 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { HEADER_KEY_TOKEN, @@ -20,7 +16,9 @@ import { import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DataProviderGhostfolioAssetProfileResponse, + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, DividendsResponse, HistoricalResponse, LookupResponse, 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 fc188c345..ba1e5bbe5 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 @@ -7,15 +7,13 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, LookupResponse } from '@ghostfolio/common/interfaces'; 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 38eb62a2b..a55c9f328 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 @@ -1,9 +1,7 @@ import { DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; -import { DataProviderInfo, + DataProviderResponse, LookupResponse } from '@ghostfolio/common/interfaces'; import { Granularity } from '@ghostfolio/common/types'; 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 00c28d9d2..f18da49ab 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -7,10 +7,6 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { @@ -19,7 +15,9 @@ import { getYesterday } from '@ghostfolio/common/helper'; import { + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, LookupResponse, ScraperConfiguration } from '@ghostfolio/common/interfaces'; 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 4d22e0feb..d6bc8d0e4 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 @@ -7,17 +7,15 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { ghostfolioFearAndGreedIndexSymbol, ghostfolioFearAndGreedIndexSymbolStocks } from '@ghostfolio/common/config'; import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper'; import { + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, LookupResponse } from '@ghostfolio/common/interfaces'; 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 b36b0f215..de8807098 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 @@ -9,14 +9,12 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; -import { - DataProviderHistoricalResponse, - DataProviderResponse -} from '@ghostfolio/api/services/interfaces/interfaces'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, LookupItem, LookupResponse } from '@ghostfolio/common/interfaces'; diff --git a/apps/api/src/services/interfaces/interfaces.ts b/apps/api/src/services/interfaces/interfaces.ts index 492c2bd35..87eaa3a75 100644 --- a/apps/api/src/services/interfaces/interfaces.ts +++ b/apps/api/src/services/interfaces/interfaces.ts @@ -1,22 +1,4 @@ -import { - AssetProfileIdentifier, - DataProviderInfo -} from '@ghostfolio/common/interfaces'; -import { MarketState } from '@ghostfolio/common/types'; - -import { DataSource } from '@prisma/client'; - -export interface DataProviderHistoricalResponse { - marketPrice: number; -} - -export interface DataProviderResponse { - currency: string; - dataProviderInfo?: DataProviderInfo; - dataSource: DataSource; - marketPrice: number; - marketState: MarketState; -} +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; export interface DataGatheringItem extends AssetProfileIdentifier { date?: Date; diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index 94cb22699..47ba48f4e 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -1,5 +1,5 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; @@ -9,6 +9,7 @@ import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/conf import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; import { AccountBalancesResponse, + Activity, HistoricalDataItem, PortfolioPosition, User diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index a56f6dec5..83b2586ce 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.ts b/apps/client/src/app/components/admin-platform/admin-platform.component.ts index 6642d2315..76d00bb10 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.ts +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts index 48a6ca432..0d9e6f8bd 100644 --- a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.ts b/apps/client/src/app/components/admin-tag/admin-tag.component.ts index 88e8faa9d..4fd34acc0 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.ts +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; diff --git a/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts b/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts index 336fb9b22..2d1babeb4 100644 --- a/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts +++ b/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 3f011fec4..24fa82d02 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { LoginWithAccessTokenDialogParams } from '@ghostfolio/client/components/login-with-access-token-dialog/interfaces/interfaces'; import { GfLoginWithAccessTokenDialogComponent } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.component'; diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index b443a37e7..a6c02f7dc 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -1,5 +1,5 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { DataService } from '@ghostfolio/client/services/data.service'; @@ -11,6 +11,7 @@ import { } from '@ghostfolio/common/config'; import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; import { + Activity, DataProviderInfo, EnhancedSymbolProfile, Filter, diff --git a/apps/client/src/app/components/rule/rule.component.ts b/apps/client/src/app/components/rule/rule.component.ts index 5ed39d5be..9b40f8f50 100644 --- a/apps/client/src/app/components/rule/rule.component.ts +++ b/apps/client/src/app/components/rule/rule.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { diff --git a/apps/client/src/app/components/rules/rules.component.ts b/apps/client/src/app/components/rules/rules.component.ts index 80a59740b..7dd322c21 100644 --- a/apps/client/src/app/components/rules/rules.component.ts +++ b/apps/client/src/app/components/rules/rules.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { GfRuleComponent } from '@ghostfolio/client/components/rule/rule.component'; import { diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts index 315f86244..9c21c4f34 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; import { UpdateAccessDto } from '@ghostfolio/api/app/access/update-access.dto'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; diff --git a/apps/client/src/app/components/user-account-access/user-account-access.component.ts b/apps/client/src/app/components/user-account-access/user-account-access.component.ts index afcb9d9c8..de2483e50 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.component.ts +++ b/apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; import { GfAccessTableComponent } from '@ghostfolio/client/components/access-table/access-table.component'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index 3a1616b6f..010d727c6 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto'; diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts index beb815e0c..8df990d3d 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto'; import { DataService } from '@ghostfolio/client/services/data.service'; diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts index 368c7f2f0..4af1dbe6f 100644 --- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts +++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; 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 6ee02bd8e..d6a1540d0 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 @@ -1,5 +1,5 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { DataService } from '@ghostfolio/client/services/data.service'; import { IcsService } from '@ghostfolio/client/services/ics/ics.service'; @@ -7,7 +7,11 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/imperso import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { downloadAsFile } from '@ghostfolio/common/helper'; -import { AssetProfileIdentifier, User } from '@ghostfolio/common/interfaces'; +import { + Activity, + AssetProfileIdentifier, + User +} from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index 3261e9752..4d2f958e7 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { UserService } from '@ghostfolio/client/services/user/user.service'; diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts index cc454a66a..5206aacf9 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts @@ -1,5 +1,4 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; -import { User } from '@ghostfolio/common/interfaces'; +import { Activity, User } from '@ghostfolio/common/interfaces'; import { Account } from '@prisma/client'; 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 0c0054e9b..e2b1403c0 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 @@ -1,14 +1,14 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto'; import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive'; import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; -import { PortfolioPosition } from '@ghostfolio/common/interfaces'; +import { Activity, PortfolioPosition } from '@ghostfolio/common/interfaces'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { diff --git a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts index 364564383..bbd50a0e1 100644 --- a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts +++ b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { GfRulesComponent } from '@ghostfolio/client/components/rules/rules.component'; import { DataService } from '@ghostfolio/client/services/data.service'; diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index cdac3ed38..68a02facc 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -1,7 +1,7 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; -import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { HEADER_KEY_SKIP_INTERCEPTOR, HEADER_KEY_TOKEN @@ -15,6 +15,7 @@ import { AdminUsersResponse, AssetProfileIdentifier, DataProviderGhostfolioStatusResponse, + DataProviderHistoricalResponse, EnhancedSymbolProfile, Filter } from '@ghostfolio/common/interfaces'; diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index f83746009..60118d205 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; import { UpdateAccessDto } from '@ghostfolio/api/app/access/update-access.dto'; import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto'; @@ -10,12 +11,10 @@ import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto' import { CreateWatchlistItemDto } from '@ghostfolio/api/app/endpoints/watchlist/create-watchlist-item.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; -import { SymbolItem } from '@ghostfolio/api/app/symbol/interfaces/symbol-item.interface'; import { DeleteOwnUserDto } from '@ghostfolio/api/app/user/delete-own-user.dto'; import { UserItem } from '@ghostfolio/api/app/user/interfaces/user-item.interface'; import { UpdateOwnAccessTokenDto } from '@ghostfolio/api/app/user/update-own-access-token.dto'; import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; -import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { @@ -34,6 +33,7 @@ import { BenchmarkResponse, CreateStripeCheckoutSessionResponse, DataProviderHealthResponse, + DataProviderHistoricalResponse, ExportResponse, Filter, ImportResponse, @@ -50,6 +50,7 @@ import { PortfolioPerformanceResponse, PortfolioReportResponse, PublicPortfolioResponse, + SymbolItem, User, WatchlistResponse } from '@ghostfolio/common/interfaces'; diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts index 0f2715e47..607b8a0a0 100644 --- a/apps/client/src/app/services/import-activities.service.ts +++ b/apps/client/src/app/services/import-activities.service.ts @@ -1,9 +1,10 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto'; import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { parseDate as parseDateHelper } from '@ghostfolio/common/helper'; +import { Activity } from '@ghostfolio/common/interfaces'; import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; diff --git a/apps/client/src/app/services/web-authn.service.ts b/apps/client/src/app/services/web-authn.service.ts index 3885b2f94..9ace943b6 100644 --- a/apps/client/src/app/services/web-authn.service.ts +++ b/apps/client/src/app/services/web-authn.service.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { AuthDeviceDto } from '@ghostfolio/api/app/auth-device/auth-device.dto'; import { PublicKeyCredentialCreationOptionsJSON, diff --git a/eslint.config.cjs b/eslint.config.cjs index a88d0cc85..5962e261d 100644 --- a/eslint.config.cjs +++ b/eslint.config.cjs @@ -18,16 +18,19 @@ module.exports = [ files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], rules: { '@nx/enforce-module-boundaries': [ - 'warn', + 'error', { - enforceBuildableLibDependency: true, allow: [], + allowCircularSelfDependency: true, depConstraints: [ { sourceTag: '*', onlyDependOnLibsWithTags: ['*'] } - ] + ], + enforceBuildableLibDependency: true, + // Temporary fix, should be removed eventually + ignoredCircularDependencies: [['client', 'ui']] } ], '@typescript-eslint/no-extra-semi': 'error', diff --git a/apps/api/src/app/order/interfaces/activities.interface.ts b/libs/common/src/lib/interfaces/activities.interface.ts similarity index 100% rename from apps/api/src/app/order/interfaces/activities.interface.ts rename to libs/common/src/lib/interfaces/activities.interface.ts diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 5c516a4a6..c47af2d97 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -1,5 +1,6 @@ import type { Access } from './access.interface'; import type { AccountBalance } from './account-balance.interface'; +import type { Activity, ActivityError } from './activities.interface'; import type { AdminData } from './admin-data.interface'; import type { AdminJobs } from './admin-jobs.interface'; import type { AdminMarketDataDetails } from './admin-market-data-details.interface'; @@ -52,6 +53,10 @@ import type { DataEnhancerHealthResponse } from './responses/data-enhancer-healt import type { DataProviderGhostfolioAssetProfileResponse } from './responses/data-provider-ghostfolio-asset-profile-response.interface'; import type { DataProviderGhostfolioStatusResponse } from './responses/data-provider-ghostfolio-status-response.interface'; import type { DataProviderHealthResponse } from './responses/data-provider-health-response.interface'; +import type { + DataProviderResponse, + DataProviderHistoricalResponse +} from './responses/data-provider-response.interface'; import type { DividendsResponse } from './responses/dividends-response.interface'; import type { ResponseError } from './responses/errors.interface'; import type { ExportResponse } from './responses/export-response.interface'; @@ -74,6 +79,7 @@ import type { WatchlistResponse } from './responses/watchlist-response.interface import type { ScraperConfiguration } from './scraper-configuration.interface'; import type { Statistics } from './statistics.interface'; import type { SubscriptionOffer } from './subscription-offer.interface'; +import type { SymbolItem } from './symbol-item.interface'; import type { SymbolMetrics } from './symbol-metrics.interface'; import type { SystemMessage } from './system-message.interface'; import type { TabConfiguration } from './tab-configuration.interface'; @@ -90,6 +96,8 @@ export { AccountResponse, AccountsResponse, ActivitiesResponse, + Activity, + ActivityError, ActivityResponse, AdminData, AdminJobs, @@ -114,7 +122,9 @@ export { DataProviderGhostfolioAssetProfileResponse, DataProviderGhostfolioStatusResponse, DataProviderHealthResponse, + DataProviderHistoricalResponse, DataProviderInfo, + DataProviderResponse, DividendsResponse, EnhancedSymbolProfile, ExportResponse, @@ -156,8 +166,9 @@ export { ScraperConfiguration, Statistics, SubscriptionOffer, - SystemMessage, + SymbolItem, SymbolMetrics, + SystemMessage, TabConfiguration, ToggleOption, User, diff --git a/libs/common/src/lib/interfaces/responses/activities-response.interface.ts b/libs/common/src/lib/interfaces/responses/activities-response.interface.ts index e6abe4618..863ae4665 100644 --- a/libs/common/src/lib/interfaces/responses/activities-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/activities-response.interface.ts @@ -1,4 +1,4 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { Activity } from '@ghostfolio/common/interfaces'; export interface ActivitiesResponse { activities: Activity[]; diff --git a/libs/common/src/lib/interfaces/responses/activity-response.interface.ts b/libs/common/src/lib/interfaces/responses/activity-response.interface.ts index 5dd338627..d26f13a5a 100644 --- a/libs/common/src/lib/interfaces/responses/activity-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/activity-response.interface.ts @@ -1,3 +1,3 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { Activity } from '@ghostfolio/common/interfaces'; export interface ActivityResponse extends Activity {} diff --git a/libs/common/src/lib/interfaces/responses/data-provider-response.interface.ts b/libs/common/src/lib/interfaces/responses/data-provider-response.interface.ts new file mode 100644 index 000000000..ff152b1b2 --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/data-provider-response.interface.ts @@ -0,0 +1,16 @@ +import { DataProviderInfo } from '@ghostfolio/common/interfaces'; +import { MarketState } from '@ghostfolio/common/types'; + +import { DataSource } from '@prisma/client'; + +export interface DataProviderHistoricalResponse { + marketPrice: number; +} + +export interface DataProviderResponse { + currency: string; + dataProviderInfo?: DataProviderInfo; + dataSource: DataSource; + marketPrice: number; + marketState: MarketState; +} diff --git a/libs/common/src/lib/interfaces/responses/dividends-response.interface.ts b/libs/common/src/lib/interfaces/responses/dividends-response.interface.ts index 15afc54c9..8bbd8b755 100644 --- a/libs/common/src/lib/interfaces/responses/dividends-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/dividends-response.interface.ts @@ -1,4 +1,4 @@ -import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/common/interfaces'; export interface DividendsResponse { dividends: { diff --git a/libs/common/src/lib/interfaces/responses/historical-response.interface.ts b/libs/common/src/lib/interfaces/responses/historical-response.interface.ts index 24383ab07..211b19b4d 100644 --- a/libs/common/src/lib/interfaces/responses/historical-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/historical-response.interface.ts @@ -1,4 +1,4 @@ -import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderHistoricalResponse } from '@ghostfolio/common/interfaces'; export interface HistoricalResponse { historicalData: { diff --git a/libs/common/src/lib/interfaces/responses/import-response.interface.ts b/libs/common/src/lib/interfaces/responses/import-response.interface.ts index be2da9837..24b0e4f4b 100644 --- a/libs/common/src/lib/interfaces/responses/import-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/import-response.interface.ts @@ -1,4 +1,4 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +import { Activity } from '@ghostfolio/common/interfaces'; export interface ImportResponse { activities: Activity[]; diff --git a/libs/common/src/lib/interfaces/responses/market-data-of-markets-response.interface.ts b/libs/common/src/lib/interfaces/responses/market-data-of-markets-response.interface.ts index aecfbb28b..997a42737 100644 --- a/libs/common/src/lib/interfaces/responses/market-data-of-markets-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/market-data-of-markets-response.interface.ts @@ -1,4 +1,4 @@ -import { SymbolItem } from '@ghostfolio/api/app/symbol/interfaces/symbol-item.interface'; +import { SymbolItem } from '@ghostfolio/common/interfaces'; export interface MarketDataOfMarketsResponse { fearAndGreedIndex: { diff --git a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index b82a8f85d..31f027ee9 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -1,5 +1,5 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { + Activity, Benchmark, DataProviderInfo, EnhancedSymbolProfile, diff --git a/libs/common/src/lib/interfaces/responses/quotes-response.interface.ts b/libs/common/src/lib/interfaces/responses/quotes-response.interface.ts index 8b9b09cb8..933220ed7 100644 --- a/libs/common/src/lib/interfaces/responses/quotes-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/quotes-response.interface.ts @@ -1,4 +1,4 @@ -import { DataProviderResponse } from '@ghostfolio/api/services/interfaces/interfaces'; +import { DataProviderResponse } from '@ghostfolio/common/interfaces'; export interface QuotesResponse { quotes: { [symbol: string]: DataProviderResponse }; diff --git a/apps/api/src/app/symbol/interfaces/symbol-item.interface.ts b/libs/common/src/lib/interfaces/symbol-item.interface.ts similarity index 100% rename from apps/api/src/app/symbol/interfaces/symbol-item.interface.ts rename to libs/common/src/lib/interfaces/symbol-item.interface.ts diff --git a/libs/ui/src/lib/account-balances/account-balances.component.ts b/libs/ui/src/lib/account-balances/account-balances.component.ts index caeaebc64..904e7d46c 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.ts +++ b/libs/ui/src/lib/account-balances/account-balances.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.ts index 607fa67dc..b96905981 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.ts +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { getLocale } from '@ghostfolio/common/helper'; diff --git a/libs/ui/src/lib/activities-filter/activities-filter.component.ts b/libs/ui/src/lib/activities-filter/activities-filter.component.ts index cb659988a..177312490 100644 --- a/libs/ui/src/lib/activities-filter/activities-filter.component.ts +++ b/libs/ui/src/lib/activities-filter/activities-filter.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { Filter, FilterGroup } from '@ghostfolio/common/interfaces'; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts index 5e774730b..78e712c89 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts @@ -1,5 +1,5 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; +import { Activity } from '@ghostfolio/common/interfaces'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; 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 1313ef1e2..99ba2aded 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -1,4 +1,4 @@ -import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; +/* eslint-disable @nx/enforce-module-boundaries */ import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; @@ -7,7 +7,10 @@ import { TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; import { getLocale } from '@ghostfolio/common/helper'; -import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; +import { + Activity, + AssetProfileIdentifier +} from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { SelectionModel } from '@angular/cdk/collections'; diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts index f9034df71..059bbaf9e 100644 --- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts +++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index eaf96f496..e9c6e77b3 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; diff --git a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts index 8f7d30847..bcac9c6b5 100644 --- a/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { DataService } from '@ghostfolio/client/services/data.service'; diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index bb66acba8..4c1ca97cd 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { getLocale, resolveMarketCondition } from '@ghostfolio/common/helper'; diff --git a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts index d2d53f7ca..21202981d 100644 --- a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts +++ b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; diff --git a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts index 002422c57..b36a70e69 100644 --- a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts +++ b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { UpdateMarketDataDto } from '@ghostfolio/api/app/admin/update-market-data.dto'; import { DataService } from '@ghostfolio/client/services/data.service'; import { diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts index 794f43d4d..274c3f994 100644 --- a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts +++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { Filter, PortfolioPosition } from '@ghostfolio/common/interfaces'; diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts index 80315fc06..dcfcaf3f1 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { DataService } from '@ghostfolio/client/services/data.service'; import { LookupItem } from '@ghostfolio/common/interfaces'; diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.ts b/libs/ui/src/lib/top-holdings/top-holdings.component.ts index c9f7e0372..b67cc1b80 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.ts +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @nx/enforce-module-boundaries */ import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { getLocale } from '@ghostfolio/common/helper'; import { From 66a3e319a878ad9fb1cd054b1f25cd4d00e7ea47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Mart=C3=ADn?= Date: Fri, 14 Nov 2025 20:02:03 +0100 Subject: [PATCH 29/31] Feature/separate Google OAuth and token authentication (#5915) * Separate Google OAuth and token authentication * Update changelog --- CHANGELOG.md | 5 ++ apps/api/src/app/info/info.service.ts | 12 ++-- .../configuration/configuration.service.ts | 3 +- .../interfaces/environment.interface.ts | 3 +- .../app/components/header/header.component.ts | 15 +++-- .../interfaces/interfaces.ts | 3 +- .../login-with-access-token-dialog.html | 67 +++++++++++-------- .../pages/features/features-page.component.ts | 6 ++ .../src/app/pages/features/features-page.html | 2 +- .../pages/landing/landing-page.component.ts | 1 + .../pages/pricing/pricing-page.component.ts | 12 +++- .../src/app/pages/pricing/pricing-page.html | 2 +- .../pages/register/register-page.component.ts | 12 +++- .../src/app/pages/register/register-page.html | 22 +++--- libs/common/src/lib/permissions.ts | 5 +- 15 files changed, 112 insertions(+), 58 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4437d077c..5e9e362cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,9 +11,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Refactored the get holding functionality in the portfolio service - Changed the user data loading in the user detail dialog of the admin control panel’s users section to fetch data on demand +- Exposed the authentication with access token as an environment variable (`ENABLE_FEATURE_AUTH_TOKEN`) - Improved the language localization for German (`de`) - Upgraded `prisma` from version `6.18.0` to `6.19.0` +### Todo + +- Rename the environment variable from `ENABLE_FEATURE_SOCIAL_LOGIN` to `ENABLE_FEATURE_AUTH_GOOGLE` + ## 2.216.0 - 2025-11-10 ### Changed diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index c31f601e3..634fc959c 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -51,6 +51,14 @@ export class InfoService { const globalPermissions: string[] = []; + if (this.configurationService.get('ENABLE_FEATURE_AUTH_GOOGLE')) { + globalPermissions.push(permissions.enableAuthGoogle); + } + + if (this.configurationService.get('ENABLE_FEATURE_AUTH_TOKEN')) { + globalPermissions.push(permissions.enableAuthToken); + } + if (this.configurationService.get('ENABLE_FEATURE_FEAR_AND_GREED_INDEX')) { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { info.fearAndGreedDataSource = encodeDataSource( @@ -70,10 +78,6 @@ export class InfoService { ); } - if (this.configurationService.get('ENABLE_FEATURE_SOCIAL_LOGIN')) { - globalPermissions.push(permissions.enableSocialLogin); - } - if (this.configurationService.get('ENABLE_FEATURE_STATISTICS')) { globalPermissions.push(permissions.enableStatistics); } diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts index 473d909ee..cb9fde832 100644 --- a/apps/api/src/services/configuration/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -40,9 +40,10 @@ export class ConfigurationService { DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER: json({ default: [] }), + ENABLE_FEATURE_AUTH_GOOGLE: bool({ default: false }), + ENABLE_FEATURE_AUTH_TOKEN: bool({ default: true }), ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }), ENABLE_FEATURE_READ_ONLY_MODE: bool({ default: false }), - ENABLE_FEATURE_SOCIAL_LOGIN: bool({ default: false }), ENABLE_FEATURE_STATISTICS: bool({ default: false }), ENABLE_FEATURE_SUBSCRIPTION: bool({ default: false }), ENABLE_FEATURE_SYSTEM_MESSAGE: bool({ default: false }), diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index 2f94739fb..f2ee84926 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -16,9 +16,10 @@ export interface Environment extends CleanedEnvAccessors { DATA_SOURCE_IMPORT: string; DATA_SOURCES: string[]; DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER: string[]; + ENABLE_FEATURE_AUTH_GOOGLE: boolean; + ENABLE_FEATURE_AUTH_TOKEN: boolean; ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean; ENABLE_FEATURE_READ_ONLY_MODE: boolean; - ENABLE_FEATURE_SOCIAL_LOGIN: boolean; ENABLE_FEATURE_STATISTICS: boolean; ENABLE_FEATURE_SUBSCRIPTION: boolean; ENABLE_FEATURE_SYSTEM_MESSAGE: boolean; diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 24fa82d02..03d53e058 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -105,7 +105,8 @@ export class GfHeaderComponent implements OnChanges { public hasFilters: boolean; public hasImpersonationId: boolean; - public hasPermissionForSocialLogin: boolean; + public hasPermissionForAuthGoogle: boolean; + public hasPermissionForAuthToken: boolean; public hasPermissionForSubscription: boolean; public hasPermissionToAccessAdminControl: boolean; public hasPermissionToAccessAssistant: boolean; @@ -165,9 +166,14 @@ export class GfHeaderComponent implements OnChanges { public ngOnChanges() { this.hasFilters = this.userService.hasFilters(); - this.hasPermissionForSocialLogin = hasPermission( + this.hasPermissionForAuthGoogle = hasPermission( this.info?.globalPermissions, - permissions.enableSocialLogin + permissions.enableAuthGoogle + ); + + this.hasPermissionForAuthToken = hasPermission( + this.info?.globalPermissions, + permissions.enableAuthToken ); this.hasPermissionForSubscription = hasPermission( @@ -280,7 +286,8 @@ export class GfHeaderComponent implements OnChanges { autoFocus: false, data: { accessToken: '', - hasPermissionToUseSocialLogin: this.hasPermissionForSocialLogin, + hasPermissionToUseAuthGoogle: this.hasPermissionForAuthGoogle, + hasPermissionToUseAuthToken: this.hasPermissionForAuthToken, title: $localize`Sign in` }, width: '30rem' diff --git a/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts index 2fa8b7ea4..c7c4ab3fd 100644 --- a/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts @@ -1,5 +1,6 @@ export interface LoginWithAccessTokenDialogParams { accessToken: string; - hasPermissionToUseSocialLogin: boolean; + hasPermissionToUseAuthGoogle: boolean; + hasPermissionToUseAuthToken: boolean; title: string; } diff --git a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html index 15e68822a..bc232cfb7 100644 --- a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html +++ b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -3,28 +3,35 @@
    - - Security Token - - - + + + } - @if (data.hasPermissionToUseSocialLogin) { + @if ( + data.hasPermissionToUseAuthGoogle && data.hasPermissionToUseAuthToken + ) {
    or
    + } + + @if (data.hasPermissionToUseAuthGoogle) {
    - + @if (data.hasPermissionToUseAuthToken) { + + }
    diff --git a/apps/client/src/app/pages/features/features-page.component.ts b/apps/client/src/app/pages/features/features-page.component.ts index dc9d30f07..dc2dfaf42 100644 --- a/apps/client/src/app/pages/features/features-page.component.ts +++ b/apps/client/src/app/pages/features/features-page.component.ts @@ -25,6 +25,7 @@ import { Subject, takeUntil } from 'rxjs'; }) export class GfFeaturesPageComponent implements OnDestroy { public hasPermissionForSubscription: boolean; + public hasPermissionToCreateUser: boolean; public info: InfoItem; public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkResources = publicRoutes.resources.routerLink; @@ -55,6 +56,11 @@ export class GfFeaturesPageComponent implements OnDestroy { this.info?.globalPermissions, permissions.enableSubscription ); + + this.hasPermissionToCreateUser = hasPermission( + this.info?.globalPermissions, + permissions.createUserAccount + ); } public ngOnDestroy() { diff --git a/apps/client/src/app/pages/features/features-page.html b/apps/client/src/app/pages/features/features-page.html index 7d8f3eda0..d172347f7 100644 --- a/apps/client/src/app/pages/features/features-page.html +++ b/apps/client/src/app/pages/features/features-page.html @@ -309,7 +309,7 @@
    - @if (!user) { + @if (hasPermissionToCreateUser && !user) { - } @else if (!user) { + } @else if (hasPermissionToCreateUser && !user) {
    - - @if (hasPermissionForSocialLogin) { + @if (hasPermissionForAuthToken) { + + } + @if (hasPermissionForAuthToken && hasPermissionForAuthGoogle) {
    or
    + } + @if (hasPermissionForAuthGoogle) {
    { return ( - permission !== permissions.enableSocialLogin && + permission !== permissions.enableAuthGoogle && permission !== permissions.enableSubscription ); }); From 9d25d5c5f490c8534ec8759c962ecd315af329b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sven=20G=C3=BCnther?= Date: Sat, 15 Nov 2025 10:51:48 +0100 Subject: [PATCH 30/31] Feature/automatically gather required exchange rates (#5917) * Automatically gather required exchange rates * Update changelog --- CHANGELOG.md | 4 ++ apps/api/src/app/order/order.service.ts | 10 +++ .../src/events/asset-profile-changed.event.ts | 11 ++++ .../events/asset-profile-changed.listener.ts | 61 +++++++++++++++++++ apps/api/src/events/events.module.ts | 17 +++++- .../configuration/configuration.service.ts | 1 + .../interfaces/environment.interface.ts | 1 + 7 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 apps/api/src/events/asset-profile-changed.event.ts create mode 100644 apps/api/src/events/asset-profile-changed.listener.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e9e362cd..51ae02bdd 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 + +- Introduced support for automatically gathering required exchange rates, exposed as an environment variable (`ENABLE_FEATURE_GATHER_NEW_EXCHANGE_RATES`) + ### Changed - Refactored the get holding functionality in the portfolio service diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index e4c642977..7dc6c646d 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -1,4 +1,5 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; +import { AssetProfileChangedEvent } from '@ghostfolio/api/events/asset-profile-changed.event'; import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.event'; import { LogPerformance } from '@ghostfolio/api/interceptors/performance-logging/performance-logging.interceptor'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; @@ -225,6 +226,15 @@ export class OrderService { }); } + this.eventEmitter.emit( + AssetProfileChangedEvent.getName(), + new AssetProfileChangedEvent({ + currency: order.SymbolProfile.currency, + dataSource: order.SymbolProfile.dataSource, + symbol: order.SymbolProfile.symbol + }) + ); + this.eventEmitter.emit( PortfolioChangedEvent.getName(), new PortfolioChangedEvent({ diff --git a/apps/api/src/events/asset-profile-changed.event.ts b/apps/api/src/events/asset-profile-changed.event.ts new file mode 100644 index 000000000..46a8c5db4 --- /dev/null +++ b/apps/api/src/events/asset-profile-changed.event.ts @@ -0,0 +1,11 @@ +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; + +export class AssetProfileChangedEvent { + public constructor( + public readonly data: AssetProfileIdentifier & { currency: string } + ) {} + + public static getName(): string { + return 'assetProfile.changed'; + } +} diff --git a/apps/api/src/events/asset-profile-changed.listener.ts b/apps/api/src/events/asset-profile-changed.listener.ts new file mode 100644 index 000000000..ad80ee4a5 --- /dev/null +++ b/apps/api/src/events/asset-profile-changed.listener.ts @@ -0,0 +1,61 @@ +import { OrderService } from '@ghostfolio/api/app/order/order.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; +import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; + +import { Injectable, Logger } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; + +import { AssetProfileChangedEvent } from './asset-profile-changed.event'; + +@Injectable() +export class AssetProfileChangedListener { + public constructor( + private readonly configurationService: ConfigurationService, + private readonly dataGatheringService: DataGatheringService, + private readonly dataProviderService: DataProviderService, + private readonly exchangeRateDataService: ExchangeRateDataService, + private readonly orderService: OrderService + ) {} + + @OnEvent(AssetProfileChangedEvent.getName()) + public async handleAssetProfileChanged(event: AssetProfileChangedEvent) { + Logger.log( + `Asset profile of ${event.data.symbol} (${event.data.dataSource}) has changed`, + 'AssetProfileChangedListener' + ); + + if ( + this.configurationService.get( + 'ENABLE_FEATURE_GATHER_NEW_EXCHANGE_RATES' + ) === false || + event.data.currency === DEFAULT_CURRENCY + ) { + return; + } + + const existingCurrencies = this.exchangeRateDataService.getCurrencies(); + + if (!existingCurrencies.includes(event.data.currency)) { + Logger.log( + `New currency ${event.data.currency} has been detected`, + 'AssetProfileChangedListener' + ); + + await this.exchangeRateDataService.initialize(); + } + + const { dateOfFirstActivity } = + await this.orderService.getStatisticsByCurrency(event.data.currency); + + if (dateOfFirstActivity) { + await this.dataGatheringService.gatherSymbol({ + dataSource: this.dataProviderService.getDataSourceForExchangeRates(), + date: dateOfFirstActivity, + symbol: `${DEFAULT_CURRENCY}${event.data.currency}` + }); + } + } +} diff --git a/apps/api/src/events/events.module.ts b/apps/api/src/events/events.module.ts index 0e6b25ba4..ece67ebe0 100644 --- a/apps/api/src/events/events.module.ts +++ b/apps/api/src/events/events.module.ts @@ -1,11 +1,24 @@ +import { OrderModule } from '@ghostfolio/api/app/order/order.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { Module } from '@nestjs/common'; +import { AssetProfileChangedListener } from './asset-profile-changed.listener'; import { PortfolioChangedListener } from './portfolio-changed.listener'; @Module({ - imports: [RedisCacheModule], - providers: [PortfolioChangedListener] + imports: [ + ConfigurationModule, + DataGatheringModule, + DataProviderModule, + ExchangeRateDataModule, + OrderModule, + RedisCacheModule + ], + providers: [AssetProfileChangedListener, PortfolioChangedListener] }) export class EventsModule {} diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts index cb9fde832..f37189569 100644 --- a/apps/api/src/services/configuration/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -43,6 +43,7 @@ export class ConfigurationService { ENABLE_FEATURE_AUTH_GOOGLE: bool({ default: false }), ENABLE_FEATURE_AUTH_TOKEN: bool({ default: true }), ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }), + ENABLE_FEATURE_GATHER_NEW_EXCHANGE_RATES: bool({ default: true }), ENABLE_FEATURE_READ_ONLY_MODE: bool({ default: false }), ENABLE_FEATURE_STATISTICS: bool({ default: false }), ENABLE_FEATURE_SUBSCRIPTION: bool({ default: false }), diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index f2ee84926..3a2ac687c 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -19,6 +19,7 @@ export interface Environment extends CleanedEnvAccessors { ENABLE_FEATURE_AUTH_GOOGLE: boolean; ENABLE_FEATURE_AUTH_TOKEN: boolean; ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean; + ENABLE_FEATURE_GATHER_NEW_EXCHANGE_RATES: boolean; ENABLE_FEATURE_READ_ONLY_MODE: boolean; ENABLE_FEATURE_STATISTICS: boolean; ENABLE_FEATURE_SUBSCRIPTION: boolean; From 6deaccfe16cd3770aaaf9334a5a23b3b17cde5e4 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 15 Nov 2025 16:59:36 +0700 Subject: [PATCH 31/31] Task/enforce module boundaries for client module (#5944) * feat(lib): move SymbolPipe to common lib * feat(lib): move CreateAccountBalanceDto to common lib * feat(lib): move IsCurrencyCode validator to common lib * feat(lib): move UpdateAssetProfileDto to common lib * feat(lib): move UpdateUserSettingDto to common lib * feat(lib): move CreateAccessDto to common lib * feat(lib): move UpdateAccessDto to common lib * feat(lib): move CreateTagDto to common lib * feat(lib): move UpdateTagDto to common lib * feat(lib): move CreatePlatformDto to common lib * feat(lib): move UpdatePlatformDto to common lib * feat(lib): move CreateOrderDto to common lib * feat(lib): move UpdateOrderDto to common lib * feat(lib): move RuleSettings interface to common lib * feat(lib): move CreateAccountDto TransferBalanceDto UpdateAccountDto to common lib * feat(lib): move CreateAccountWithBalancesDto to common lib * feat(lib): move CreateAssetProfileDto and CreateAssetProfileWithMarketDataDto to common lib * feat(lib): move AuthDeviceDto to common lib * feat(lib): move simplewebauthn interfaces to common lib This includes AssertionCredentialJSON, AttestationCredentialJSON, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON. * feat(lib): move UpdateMarketDataDto to common lib * feat(lib): move UpdateBulkMarketDataDto to common lib * feat(lib): move CreateWatchlistItemDto to common lib * feat(lib): move DeleteOwnUserDto to common lib * feat(lib): move UserItem interface to common lib * feat(lib): move UpdateOwnAccessTokenDto to common lib * feat(lib): move PropertyDto to common lib --- apps/api/src/app/access/access.controller.ts | 3 +- .../account-balance.controller.ts | 2 +- .../account-balance.service.ts | 3 +- .../api/src/app/account/account.controller.ts | 8 +-- apps/api/src/app/admin/admin.controller.ts | 8 +-- apps/api/src/app/auth/auth.controller.ts | 10 ++-- .../api/src/app/auth/interfaces/interfaces.ts | 2 +- apps/api/src/app/auth/web-auth.service.ts | 11 ++-- .../market-data/market-data.controller.ts | 3 +- .../update-bulk-market-data.dto.ts | 24 --------- .../src/app/endpoints/tags/tags.controller.ts | 4 +- .../watchlist/watchlist.controller.ts | 2 +- apps/api/src/app/import/import-data.dto.ts | 11 ++-- apps/api/src/app/import/import.service.ts | 8 +-- apps/api/src/app/order/order.controller.ts | 3 +- .../src/app/platform/platform.controller.ts | 3 +- apps/api/src/app/portfolio/rules.service.ts | 2 +- apps/api/src/app/user/user.controller.ts | 10 ++-- .../src/models/interfaces/rule.interface.ts | 3 +- apps/api/src/models/rule.ts | 2 +- .../current-investment.ts | 7 ++- .../account-cluster-risk/single-account.ts | 7 ++- .../rules/asset-class-cluster-risk/equity.ts | 7 ++- .../asset-class-cluster-risk/fixed-income.ts | 7 ++- .../base-currency-current-investment.ts | 7 ++- .../current-investment.ts | 7 ++- .../developed-markets.ts | 3 +- .../emerging-markets.ts | 3 +- .../emergency-fund/emergency-fund-setup.ts | 3 +- .../fees/fee-ratio-initial-investment.ts | 3 +- .../models/rules/liquidity/buying-power.ts | 3 +- .../interfaces/rule-settings.interface.ts | 2 +- .../market-data/market-data.service.ts | 2 +- .../account-detail-dialog.component.ts | 3 +- .../admin-market-data.component.ts | 2 +- .../asset-profile-dialog.component.ts | 3 +- .../admin-platform.component.ts | 4 +- ...ate-or-update-platform-dialog.component.ts | 4 +- .../admin-tag/admin-tag.component.ts | 4 +- .../create-or-update-tag-dialog.component.ts | 4 +- .../app/components/header/header.component.ts | 3 +- .../holding-detail-dialog.component.ts | 3 +- .../src/app/components/rule/rule.component.ts | 5 +- .../app/components/rules/rules.component.ts | 3 +- ...reate-or-update-access-dialog.component.ts | 4 +- .../user-account-access.component.ts | 3 +- .../pages/accounts/accounts-page.component.ts | 9 ++-- ...eate-or-update-account-dialog.component.ts | 4 +- .../transfer-balance-dialog.component.ts | 3 +- .../activities/activities-page.component.ts | 4 +- ...ate-or-update-activity-dialog.component.ts | 4 +- .../import-activities-dialog.component.ts | 11 ++-- .../portfolio/x-ray/x-ray-page.component.ts | 3 +- apps/client/src/app/services/admin.service.ts | 11 ++-- apps/client/src/app/services/data.service.ts | 39 +++++++------- .../app/services/import-activities.service.ts | 11 ++-- .../src/app/services/web-authn.service.ts | 7 ++- .../common/src/lib/dtos}/auth-device.dto.ts | 0 .../common/src/lib/dtos}/create-access.dto.ts | 0 .../lib/dtos}/create-account-balance.dto.ts | 0 .../dtos}/create-account-with-balances.dto.ts | 2 +- .../src/lib/dtos}/create-account.dto.ts | 2 +- ...eate-asset-profile-with-market-data.dto.ts | 2 +- .../src/lib/dtos}/create-asset-profile.dto.ts | 2 +- .../common/src/lib/dtos}/create-order.dto.ts | 2 +- .../src/lib/dtos}/create-platform.dto.ts | 0 .../common/src/lib/dtos}/create-tag.dto.ts | 0 .../lib/dtos}/create-watchlist-item.dto.ts | 0 .../src/lib/dtos}/delete-own-user.dto.ts | 0 libs/common/src/lib/dtos/index.ts | 51 +++++++++++++++++++ .../src/lib/dtos}/transfer-balance.dto.ts | 0 .../common/src/lib/dtos}/update-access.dto.ts | 0 .../src/lib/dtos}/update-account.dto.ts | 2 +- .../src/lib/dtos}/update-asset-profile.dto.ts | 2 +- .../lib/dtos}/update-bulk-market-data.dto.ts | 4 +- .../src/lib/dtos}/update-market-data.dto.ts | 0 .../common/src/lib/dtos}/update-order.dto.ts | 2 +- .../lib/dtos}/update-own-access-token.dto.ts | 0 .../src/lib/dtos}/update-platform.dto.ts | 0 .../src/lib/dtos/update-property.dto.ts | 2 +- .../common/src/lib/dtos}/update-tag.dto.ts | 0 .../src/lib/dtos}/update-user-setting.dto.ts | 2 +- libs/common/src/lib/interfaces/index.ts | 16 +++++- .../interfaces/rule-settings.interface.ts | 0 .../interfaces/simplewebauthn.interface.ts | 0 .../lib}/interfaces/user-item.interface.ts | 0 libs/common/src/lib/pipes/index.ts | 3 ++ .../common/src/lib/pipes}/symbol.pipe.ts | 0 .../src/lib}/validators/is-currency-code.ts | 0 .../account-balances.component.ts | 2 +- .../activities-filter.component.ts | 3 +- .../activities-table.component.stories.ts | 2 +- .../activities-table.component.ts | 2 +- .../assistant-list-item.component.ts | 3 +- ...historical-market-data-editor.component.ts | 2 +- .../portfolio-filter-form.component.ts | 3 +- .../symbol-autocomplete.component.ts | 2 +- .../top-holdings/top-holdings.component.ts | 3 +- 98 files changed, 241 insertions(+), 209 deletions(-) delete mode 100644 apps/api/src/app/endpoints/market-data/update-bulk-market-data.dto.ts rename {apps/api/src/app/auth-device => libs/common/src/lib/dtos}/auth-device.dto.ts (100%) rename {apps/api/src/app/access => libs/common/src/lib/dtos}/create-access.dto.ts (100%) rename {apps/api/src/app/account-balance => libs/common/src/lib/dtos}/create-account-balance.dto.ts (100%) rename {apps/api/src/app/import => libs/common/src/lib/dtos}/create-account-with-balances.dto.ts (75%) rename {apps/api/src/app/account => libs/common/src/lib/dtos}/create-account.dto.ts (89%) rename {apps/api/src/app/import => libs/common/src/lib/dtos}/create-asset-profile-with-market-data.dto.ts (85%) rename {apps/api/src/app/admin => libs/common/src/lib/dtos}/create-asset-profile.dto.ts (94%) rename {apps/api/src/app/order => libs/common/src/lib/dtos}/create-order.dto.ts (94%) rename {apps/api/src/app/platform => libs/common/src/lib/dtos}/create-platform.dto.ts (100%) rename {apps/api/src/app/endpoints/tags => libs/common/src/lib/dtos}/create-tag.dto.ts (100%) rename {apps/api/src/app/endpoints/watchlist => libs/common/src/lib/dtos}/create-watchlist-item.dto.ts (100%) rename {apps/api/src/app/user => libs/common/src/lib/dtos}/delete-own-user.dto.ts (100%) create mode 100644 libs/common/src/lib/dtos/index.ts rename {apps/api/src/app/account => libs/common/src/lib/dtos}/transfer-balance.dto.ts (100%) rename {apps/api/src/app/access => libs/common/src/lib/dtos}/update-access.dto.ts (100%) rename {apps/api/src/app/account => libs/common/src/lib/dtos}/update-account.dto.ts (89%) rename {apps/api/src/app/admin => libs/common/src/lib/dtos}/update-asset-profile.dto.ts (93%) rename {apps/api/src/app/admin => libs/common/src/lib/dtos}/update-bulk-market-data.dto.ts (79%) rename {apps/api/src/app/admin => libs/common/src/lib/dtos}/update-market-data.dto.ts (100%) rename {apps/api/src/app/order => libs/common/src/lib/dtos}/update-order.dto.ts (94%) rename {apps/api/src/app/user => libs/common/src/lib/dtos}/update-own-access-token.dto.ts (100%) rename {apps/api/src/app/platform => libs/common/src/lib/dtos}/update-platform.dto.ts (100%) rename apps/api/src/services/property/property.dto.ts => libs/common/src/lib/dtos/update-property.dto.ts (76%) rename {apps/api/src/app/endpoints/tags => libs/common/src/lib/dtos}/update-tag.dto.ts (100%) rename {apps/api/src/app/user => libs/common/src/lib/dtos}/update-user-setting.dto.ts (96%) rename {apps/api/src/models => libs/common/src/lib}/interfaces/rule-settings.interface.ts (100%) rename apps/api/src/app/auth/interfaces/simplewebauthn.ts => libs/common/src/lib/interfaces/simplewebauthn.interface.ts (100%) rename {apps/api/src/app/user => libs/common/src/lib}/interfaces/user-item.interface.ts (100%) create mode 100644 libs/common/src/lib/pipes/index.ts rename {apps/client/src/app/pipes/symbol => libs/common/src/lib/pipes}/symbol.pipe.ts (100%) rename {apps/api/src => libs/common/src/lib}/validators/is-currency-code.ts (100%) diff --git a/apps/api/src/app/access/access.controller.ts b/apps/api/src/app/access/access.controller.ts index cb1e2d4af..5056a6d71 100644 --- a/apps/api/src/app/access/access.controller.ts +++ b/apps/api/src/app/access/access.controller.ts @@ -1,6 +1,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { CreateAccessDto, UpdateAccessDto } from '@ghostfolio/common/dtos'; import { Access } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; @@ -23,8 +24,6 @@ import { Access as AccessModel } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AccessService } from './access.service'; -import { CreateAccessDto } from './create-access.dto'; -import { UpdateAccessDto } from './update-access.dto'; @Controller('access') export class AccessController { diff --git a/apps/api/src/app/account-balance/account-balance.controller.ts b/apps/api/src/app/account-balance/account-balance.controller.ts index bc454c5ab..baf002bd3 100644 --- a/apps/api/src/app/account-balance/account-balance.controller.ts +++ b/apps/api/src/app/account-balance/account-balance.controller.ts @@ -1,6 +1,7 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos'; import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; @@ -20,7 +21,6 @@ import { AccountBalance } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AccountBalanceService } from './account-balance.service'; -import { CreateAccountBalanceDto } from './create-account-balance.dto'; @Controller('account-balance') export class AccountBalanceController { diff --git a/apps/api/src/app/account-balance/account-balance.service.ts b/apps/api/src/app/account-balance/account-balance.service.ts index 10353f4ca..321624003 100644 --- a/apps/api/src/app/account-balance/account-balance.service.ts +++ b/apps/api/src/app/account-balance/account-balance.service.ts @@ -2,6 +2,7 @@ import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed. import { LogPerformance } from '@ghostfolio/api/interceptors/performance-logging/performance-logging.interceptor'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos'; import { DATE_FORMAT, getSum, resetHours } from '@ghostfolio/common/helper'; import { AccountBalancesResponse, @@ -15,8 +16,6 @@ import { AccountBalance, Prisma } from '@prisma/client'; import { Big } from 'big.js'; import { format, parseISO } from 'date-fns'; -import { CreateAccountBalanceDto } from './create-account-balance.dto'; - @Injectable() export class AccountBalanceService { public constructor( diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index cd6892ab8..542b199fd 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -7,6 +7,11 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interce import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; +import { + CreateAccountDto, + TransferBalanceDto, + UpdateAccountDto +} from '@ghostfolio/common/dtos'; import { AccountBalancesResponse, AccountResponse, @@ -36,9 +41,6 @@ import { Account as AccountModel } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AccountService } from './account.service'; -import { CreateAccountDto } from './create-account.dto'; -import { TransferBalanceDto } from './transfer-balance.dto'; -import { UpdateAccountDto } from './update-account.dto'; @Controller('account') export class AccountController { diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 7ed7f364b..8b5da4965 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -4,7 +4,6 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interce import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service'; import { DemoService } from '@ghostfolio/api/services/demo/demo.service'; -import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; import { @@ -13,6 +12,10 @@ import { GATHER_ASSET_PROFILE_PROCESS_JOB_NAME, GATHER_ASSET_PROFILE_PROCESS_JOB_OPTIONS } from '@ghostfolio/common/config'; +import { + UpdateAssetProfileDto, + UpdatePropertyDto +} from '@ghostfolio/common/dtos'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { AdminData, @@ -52,7 +55,6 @@ import { isDate, parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { AdminService } from './admin.service'; -import { UpdateAssetProfileDto } from './update-asset-profile.dto'; @Controller('admin') export class AdminController { @@ -305,7 +307,7 @@ export class AdminController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async updateProperty( @Param('key') key: string, - @Body() data: PropertyDto + @Body() data: UpdatePropertyDto ) { return this.adminService.putSetting(key, data.value); } diff --git a/apps/api/src/app/auth/auth.controller.ts b/apps/api/src/app/auth/auth.controller.ts index 57fd04bc7..b45e7b97b 100644 --- a/apps/api/src/app/auth/auth.controller.ts +++ b/apps/api/src/app/auth/auth.controller.ts @@ -2,7 +2,11 @@ import { WebAuthService } from '@ghostfolio/api/app/auth/web-auth.service'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; -import { OAuthResponse } from '@ghostfolio/common/interfaces'; +import { + AssertionCredentialJSON, + AttestationCredentialJSON, + OAuthResponse +} from '@ghostfolio/common/interfaces'; import { Body, @@ -22,10 +26,6 @@ import { Request, Response } from 'express'; import { getReasonPhrase, StatusCodes } from 'http-status-codes'; import { AuthService } from './auth.service'; -import { - AssertionCredentialJSON, - AttestationCredentialJSON -} from './interfaces/simplewebauthn'; @Controller('auth') export class AuthController { diff --git a/apps/api/src/app/auth/interfaces/interfaces.ts b/apps/api/src/app/auth/interfaces/interfaces.ts index 45415355e..4fdcc25b5 100644 --- a/apps/api/src/app/auth/interfaces/interfaces.ts +++ b/apps/api/src/app/auth/interfaces/interfaces.ts @@ -1,4 +1,4 @@ -import { AuthDeviceDto } from '@ghostfolio/api/app/auth-device/auth-device.dto'; +import { AuthDeviceDto } from '@ghostfolio/common/dtos'; import { Provider } from '@prisma/client'; diff --git a/apps/api/src/app/auth/web-auth.service.ts b/apps/api/src/app/auth/web-auth.service.ts index d14ef7798..6cffcd244 100644 --- a/apps/api/src/app/auth/web-auth.service.ts +++ b/apps/api/src/app/auth/web-auth.service.ts @@ -1,7 +1,11 @@ -import { AuthDeviceDto } from '@ghostfolio/api/app/auth-device/auth-device.dto'; import { AuthDeviceService } from '@ghostfolio/api/app/auth-device/auth-device.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { AuthDeviceDto } from '@ghostfolio/common/dtos'; +import { + AssertionCredentialJSON, + AttestationCredentialJSON +} from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; import { @@ -27,11 +31,6 @@ import { import { isoBase64URL, isoUint8Array } from '@simplewebauthn/server/helpers'; import ms from 'ms'; -import { - AssertionCredentialJSON, - AttestationCredentialJSON -} from './interfaces/simplewebauthn'; - @Injectable() export class WebAuthService { public constructor( diff --git a/apps/api/src/app/endpoints/market-data/market-data.controller.ts b/apps/api/src/app/endpoints/market-data/market-data.controller.ts index 4843536da..987d34918 100644 --- a/apps/api/src/app/endpoints/market-data/market-data.controller.ts +++ b/apps/api/src/app/endpoints/market-data/market-data.controller.ts @@ -10,6 +10,7 @@ import { ghostfolioFearAndGreedIndexSymbolCryptocurrencies, ghostfolioFearAndGreedIndexSymbolStocks } from '@ghostfolio/common/config'; +import { UpdateBulkMarketDataDto } from '@ghostfolio/common/dtos'; import { getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper'; import { MarketDataDetailsResponse, @@ -35,8 +36,6 @@ import { DataSource, Prisma } from '@prisma/client'; import { parseISO } from 'date-fns'; import { getReasonPhrase, StatusCodes } from 'http-status-codes'; -import { UpdateBulkMarketDataDto } from './update-bulk-market-data.dto'; - @Controller('market-data') export class MarketDataController { public constructor( diff --git a/apps/api/src/app/endpoints/market-data/update-bulk-market-data.dto.ts b/apps/api/src/app/endpoints/market-data/update-bulk-market-data.dto.ts deleted file mode 100644 index d07b189b2..000000000 --- a/apps/api/src/app/endpoints/market-data/update-bulk-market-data.dto.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Type } from 'class-transformer'; -import { - ArrayNotEmpty, - IsArray, - IsISO8601, - IsNumber, - IsOptional -} from 'class-validator'; - -export class UpdateBulkMarketDataDto { - @ArrayNotEmpty() - @IsArray() - @Type(() => UpdateMarketDataDto) - marketData: UpdateMarketDataDto[]; -} - -class UpdateMarketDataDto { - @IsISO8601() - @IsOptional() - date?: string; - - @IsNumber() - marketPrice: number; -} diff --git a/apps/api/src/app/endpoints/tags/tags.controller.ts b/apps/api/src/app/endpoints/tags/tags.controller.ts index bf216bb21..925e1e0ed 100644 --- a/apps/api/src/app/endpoints/tags/tags.controller.ts +++ b/apps/api/src/app/endpoints/tags/tags.controller.ts @@ -1,6 +1,7 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; +import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { RequestWithUser } from '@ghostfolio/common/types'; @@ -21,9 +22,6 @@ import { AuthGuard } from '@nestjs/passport'; import { Tag } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { CreateTagDto } from './create-tag.dto'; -import { UpdateTagDto } from './update-tag.dto'; - @Controller('tags') export class TagsController { public constructor( diff --git a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts index 2a8ea9875..78693239a 100644 --- a/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts +++ b/apps/api/src/app/endpoints/watchlist/watchlist.controller.ts @@ -4,6 +4,7 @@ import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interce import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor'; import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; +import { CreateWatchlistItemDto } from '@ghostfolio/common/dtos'; import { WatchlistResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import { RequestWithUser } from '@ghostfolio/common/types'; @@ -26,7 +27,6 @@ import { AuthGuard } from '@nestjs/passport'; import { DataSource } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { CreateWatchlistItemDto } from './create-watchlist-item.dto'; import { WatchlistService } from './watchlist.service'; @Controller('watchlist') diff --git a/apps/api/src/app/import/import-data.dto.ts b/apps/api/src/app/import/import-data.dto.ts index 330bc52f6..bf45c7cda 100644 --- a/apps/api/src/app/import/import-data.dto.ts +++ b/apps/api/src/app/import/import-data.dto.ts @@ -1,12 +1,13 @@ -import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; +import { + CreateAccountWithBalancesDto, + CreateAssetProfileWithMarketDataDto, + CreateOrderDto, + CreateTagDto +} from '@ghostfolio/common/dtos'; import { Type } from 'class-transformer'; import { IsArray, IsOptional, ValidateNested } from 'class-validator'; -import { CreateTagDto } from '../endpoints/tags/create-tag.dto'; -import { CreateAccountWithBalancesDto } from './create-account-with-balances.dto'; -import { CreateAssetProfileWithMarketDataDto } from './create-asset-profile-with-market-data.dto'; - export class ImportDataDto { @IsArray() @IsOptional() diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index cac466192..a5f3dda96 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -1,6 +1,4 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; -import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; -import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; @@ -11,6 +9,11 @@ import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathe import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { TagService } from '@ghostfolio/api/services/tag/tag.service'; import { DATA_GATHERING_QUEUE_PRIORITY_HIGH } from '@ghostfolio/common/config'; +import { + CreateAssetProfileDto, + CreateAccountDto, + CreateOrderDto +} from '@ghostfolio/common/dtos'; import { getAssetProfileIdentifier, parseDate @@ -34,7 +37,6 @@ import { endOfToday, isAfter, isSameSecond, parseISO } from 'date-fns'; import { omit, uniqBy } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; -import { CreateAssetProfileDto } from '../admin/create-asset-profile.dto'; import { ImportDataDto } from './import-data.dto'; @Injectable() diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index d6c231059..962558315 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -11,6 +11,7 @@ import { DATA_GATHERING_QUEUE_PRIORITY_HIGH, HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; +import { CreateOrderDto, UpdateOrderDto } from '@ghostfolio/common/dtos'; import { ActivitiesResponse, ActivityResponse @@ -39,9 +40,7 @@ import { Order as OrderModel, Prisma } from '@prisma/client'; import { parseISO } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { CreateOrderDto } from './create-order.dto'; import { OrderService } from './order.service'; -import { UpdateOrderDto } from './update-order.dto'; @Controller('order') export class OrderController { diff --git a/apps/api/src/app/platform/platform.controller.ts b/apps/api/src/app/platform/platform.controller.ts index c91f58cf8..2d4a1d413 100644 --- a/apps/api/src/app/platform/platform.controller.ts +++ b/apps/api/src/app/platform/platform.controller.ts @@ -1,5 +1,6 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { permissions } from '@ghostfolio/common/permissions'; import { @@ -17,9 +18,7 @@ import { AuthGuard } from '@nestjs/passport'; import { Platform } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { CreatePlatformDto } from './create-platform.dto'; import { PlatformService } from './platform.service'; -import { UpdatePlatformDto } from './update-platform.dto'; @Controller('platform') export class PlatformController { diff --git a/apps/api/src/app/portfolio/rules.service.ts b/apps/api/src/app/portfolio/rules.service.ts index 48d1658aa..5bfb116e0 100644 --- a/apps/api/src/app/portfolio/rules.service.ts +++ b/apps/api/src/app/portfolio/rules.service.ts @@ -1,7 +1,7 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { PortfolioReportRule, + RuleSettings, UserSettings } from '@ghostfolio/common/interfaces'; diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index 8704662f7..397ae016b 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -3,9 +3,15 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard' import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { + DeleteOwnUserDto, + UpdateOwnAccessTokenDto, + UpdateUserSettingDto +} from '@ghostfolio/common/dtos'; import { AccessTokenResponse, User, + UserItem, UserSettings } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -31,10 +37,6 @@ import { User as UserModel } from '@prisma/client'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { merge, size } from 'lodash'; -import { DeleteOwnUserDto } from './delete-own-user.dto'; -import { UserItem } from './interfaces/user-item.interface'; -import { UpdateOwnAccessTokenDto } from './update-own-access-token.dto'; -import { UpdateUserSettingDto } from './update-user-setting.dto'; import { UserService } from './user.service'; @Controller('user') diff --git a/apps/api/src/models/interfaces/rule.interface.ts b/apps/api/src/models/interfaces/rule.interface.ts index 5dcd42317..7c794614e 100644 --- a/apps/api/src/models/interfaces/rule.interface.ts +++ b/apps/api/src/models/interfaces/rule.interface.ts @@ -1,5 +1,4 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; -import { UserSettings } from '@ghostfolio/common/interfaces'; +import { RuleSettings, UserSettings } from '@ghostfolio/common/interfaces'; import { EvaluationResult } from './evaluation-result.interface'; diff --git a/apps/api/src/models/rule.ts b/apps/api/src/models/rule.ts index 52491a0b7..9c27e0018 100644 --- a/apps/api/src/models/rule.ts +++ b/apps/api/src/models/rule.ts @@ -1,10 +1,10 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; import { groupBy } from '@ghostfolio/common/helper'; import { PortfolioPosition, PortfolioReportRule, + RuleSettings, UserSettings } from '@ghostfolio/common/interfaces'; diff --git a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts index 51c808b25..0004d394e 100644 --- a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts @@ -1,8 +1,11 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { PortfolioDetails, UserSettings } from '@ghostfolio/common/interfaces'; +import { + PortfolioDetails, + RuleSettings, + UserSettings +} from '@ghostfolio/common/interfaces'; import { Account } from '@prisma/client'; diff --git a/apps/api/src/models/rules/account-cluster-risk/single-account.ts b/apps/api/src/models/rules/account-cluster-risk/single-account.ts index 0e07a9dc6..9988ea3cc 100644 --- a/apps/api/src/models/rules/account-cluster-risk/single-account.ts +++ b/apps/api/src/models/rules/account-cluster-risk/single-account.ts @@ -1,8 +1,11 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { PortfolioDetails, UserSettings } from '@ghostfolio/common/interfaces'; +import { + PortfolioDetails, + RuleSettings, + UserSettings +} from '@ghostfolio/common/interfaces'; export class AccountClusterRiskSingleAccount extends Rule { private accounts: PortfolioDetails['accounts']; diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts index 9a6f9dacb..f70756e91 100644 --- a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts +++ b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts @@ -1,8 +1,11 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { PortfolioPosition, UserSettings } from '@ghostfolio/common/interfaces'; +import { + PortfolioPosition, + RuleSettings, + UserSettings +} from '@ghostfolio/common/interfaces'; export class AssetClassClusterRiskEquity extends Rule { private holdings: PortfolioPosition[]; diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts index 70cdb63c8..3bd835e4d 100644 --- a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts +++ b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts @@ -1,8 +1,11 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { PortfolioPosition, UserSettings } from '@ghostfolio/common/interfaces'; +import { + PortfolioPosition, + RuleSettings, + UserSettings +} from '@ghostfolio/common/interfaces'; export class AssetClassClusterRiskFixedIncome extends Rule { private holdings: PortfolioPosition[]; 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 273c98e35..d3176582f 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,8 +1,11 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { PortfolioPosition, UserSettings } from '@ghostfolio/common/interfaces'; +import { + PortfolioPosition, + RuleSettings, + UserSettings +} from '@ghostfolio/common/interfaces'; export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule { private holdings: PortfolioPosition[]; diff --git a/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts index b09b7f3ef..c73160b52 100644 --- a/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/currency-cluster-risk/current-investment.ts @@ -1,8 +1,11 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { PortfolioPosition, UserSettings } from '@ghostfolio/common/interfaces'; +import { + PortfolioPosition, + RuleSettings, + UserSettings +} from '@ghostfolio/common/interfaces'; export class CurrencyClusterRiskCurrentInvestment extends Rule { private holdings: PortfolioPosition[]; diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts index fa4f80d40..df9b78eef 100644 --- a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts +++ b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts @@ -1,8 +1,7 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { UserSettings } from '@ghostfolio/common/interfaces'; +import { RuleSettings, UserSettings } from '@ghostfolio/common/interfaces'; export class EconomicMarketClusterRiskDevelopedMarkets extends Rule { private currentValueInBaseCurrency: number; diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts index 1414b53ed..4583dc50a 100644 --- a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts +++ b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts @@ -1,8 +1,7 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { UserSettings } from '@ghostfolio/common/interfaces'; +import { RuleSettings, UserSettings } from '@ghostfolio/common/interfaces'; export class EconomicMarketClusterRiskEmergingMarkets extends Rule { private currentValueInBaseCurrency: number; diff --git a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts index 2129f438b..b956263f8 100644 --- a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts +++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts @@ -1,8 +1,7 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { UserSettings } from '@ghostfolio/common/interfaces'; +import { RuleSettings, UserSettings } from '@ghostfolio/common/interfaces'; export class EmergencyFundSetup extends Rule { private emergencyFund: number; diff --git a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts index c5448a277..cb85a73ba 100644 --- a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts +++ b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts @@ -1,8 +1,7 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { UserSettings } from '@ghostfolio/common/interfaces'; +import { RuleSettings, UserSettings } from '@ghostfolio/common/interfaces'; export class FeeRatioInitialInvestment extends Rule { private fees: number; diff --git a/apps/api/src/models/rules/liquidity/buying-power.ts b/apps/api/src/models/rules/liquidity/buying-power.ts index 2cd4d6fee..541750d7e 100644 --- a/apps/api/src/models/rules/liquidity/buying-power.ts +++ b/apps/api/src/models/rules/liquidity/buying-power.ts @@ -1,8 +1,7 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; -import { UserSettings } from '@ghostfolio/common/interfaces'; +import { RuleSettings, UserSettings } from '@ghostfolio/common/interfaces'; export class BuyingPower extends Rule { private buyingPower: number; diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/interfaces/rule-settings.interface.ts b/apps/api/src/models/rules/regional-market-cluster-risk/interfaces/rule-settings.interface.ts index 8b9fddf3a..621b4df0b 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/interfaces/rule-settings.interface.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/interfaces/rule-settings.interface.ts @@ -1,4 +1,4 @@ -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; +import { RuleSettings } from '@ghostfolio/common/interfaces'; export interface Settings extends RuleSettings { baseCurrency: string; diff --git a/apps/api/src/services/market-data/market-data.service.ts b/apps/api/src/services/market-data/market-data.service.ts index d318b9a70..87b08e1bd 100644 --- a/apps/api/src/services/market-data/market-data.service.ts +++ b/apps/api/src/services/market-data/market-data.service.ts @@ -1,7 +1,7 @@ -import { UpdateMarketDataDto } from '@ghostfolio/api/app/admin/update-market-data.dto'; import { DateQuery } from '@ghostfolio/api/app/portfolio/interfaces/date-query.interface'; import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { UpdateMarketDataDto } from '@ghostfolio/common/dtos'; import { resetHours } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index 47ba48f4e..ceae50f01 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -1,11 +1,10 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; +import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos'; import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; import { AccountBalancesResponse, diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts index 2b96bda3b..4f1b60981 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts @@ -1,4 +1,3 @@ -import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; @@ -15,6 +14,7 @@ import { } from '@ghostfolio/common/interfaces'; import { AdminMarketDataItem } from '@ghostfolio/common/interfaces/admin-market-data.interface'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; import { translate } from '@ghostfolio/ui/i18n'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index 83b2586ce..9969a59ba 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -1,5 +1,3 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { AdminService } from '@ghostfolio/client/services/admin.service'; @@ -10,6 +8,7 @@ import { ASSET_CLASS_MAPPING, PROPERTY_IS_DATA_GATHERING_ENABLED } from '@ghostfolio/common/config'; +import { UpdateAssetProfileDto } from '@ghostfolio/common/dtos'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { AdminMarketDataDetails, diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.ts b/apps/client/src/app/components/admin-platform/admin-platform.component.ts index 76d00bb10..1dd150ac5 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.ts +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.ts @@ -1,11 +1,9 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; -import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts index 0d9e6f8bd..23e6ca271 100644 --- a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts @@ -1,7 +1,5 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; -import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; +import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.ts b/apps/client/src/app/components/admin-tag/admin-tag.component.ts index 4fd34acc0..6b79b8fe6 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.ts +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.ts @@ -1,10 +1,8 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; -import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts b/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts index 2d1babeb4..487a4d498 100644 --- a/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts +++ b/apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts @@ -1,7 +1,5 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; -import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; +import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 03d53e058..9fb9a8351 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -1,5 +1,3 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { LoginWithAccessTokenDialogParams } from '@ghostfolio/client/components/login-with-access-token-dialog/interfaces/interfaces'; import { GfLoginWithAccessTokenDialogComponent } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.component'; import { LayoutService } from '@ghostfolio/client/core/layout.service'; @@ -12,6 +10,7 @@ import { } from '@ghostfolio/client/services/settings-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { UpdateUserSettingDto } from '@ghostfolio/common/dtos'; import { Filter, InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index a6c02f7dc..caca0c2bc 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -1,5 +1,3 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { DataService } from '@ghostfolio/client/services/data.service'; @@ -9,6 +7,7 @@ import { NUMERICAL_PRECISION_THRESHOLD_5_FIGURES, NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; +import { CreateOrderDto } from '@ghostfolio/common/dtos'; import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; import { Activity, diff --git a/apps/client/src/app/components/rule/rule.component.ts b/apps/client/src/app/components/rule/rule.component.ts index 9b40f8f50..e2ffc1cf6 100644 --- a/apps/client/src/app/components/rule/rule.component.ts +++ b/apps/client/src/app/components/rule/rule.component.ts @@ -1,8 +1,7 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; -import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; +import { UpdateUserSettingDto } from '@ghostfolio/common/dtos'; import { PortfolioReportRule, + RuleSettings, XRayRulesSettings } from '@ghostfolio/common/interfaces'; diff --git a/apps/client/src/app/components/rules/rules.component.ts b/apps/client/src/app/components/rules/rules.component.ts index 7dd322c21..22e1718f8 100644 --- a/apps/client/src/app/components/rules/rules.component.ts +++ b/apps/client/src/app/components/rules/rules.component.ts @@ -1,6 +1,5 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { GfRuleComponent } from '@ghostfolio/client/components/rule/rule.component'; +import { UpdateUserSettingDto } from '@ghostfolio/common/dtos'; import { PortfolioReportRule, XRayRulesSettings diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts index 9c21c4f34..be0842467 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts @@ -1,9 +1,7 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; -import { UpdateAccessDto } from '@ghostfolio/api/app/access/update-access.dto'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; +import { CreateAccessDto, UpdateAccessDto } from '@ghostfolio/common/dtos'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/user-account-access/user-account-access.component.ts b/apps/client/src/app/components/user-account-access/user-account-access.component.ts index de2483e50..38d34a4e2 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.component.ts +++ b/apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1,11 +1,10 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; import { GfAccessTableComponent } from '@ghostfolio/client/components/access-table/access-table.component'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { CreateAccessDto } from '@ghostfolio/common/dtos'; import { Access, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index 010d727c6..2bb6457a5 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -1,13 +1,14 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; -import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; -import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto'; import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component'; import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { + CreateAccountDto, + TransferBalanceDto, + UpdateAccountDto +} from '@ghostfolio/common/dtos'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfAccountsTableComponent } from '@ghostfolio/ui/accounts-table'; diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts index 8df990d3d..08ecbf15a 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts @@ -1,8 +1,6 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; -import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto'; import { DataService } from '@ghostfolio/client/services/data.service'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; +import { CreateAccountDto, UpdateAccountDto } from '@ghostfolio/common/dtos'; import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts index 4af1dbe6f..85d2e60bf 100644 --- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts +++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts @@ -1,5 +1,4 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; +import { TransferBalanceDto } from '@ghostfolio/common/dtos'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { 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 d6a1540d0..5b5273b65 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 @@ -1,11 +1,9 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { DataService } from '@ghostfolio/client/services/data.service'; 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 { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; +import { CreateOrderDto, UpdateOrderDto } from '@ghostfolio/common/dtos'; import { downloadAsFile } from '@ghostfolio/common/helper'; import { Activity, diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index 4d2f958e7..3aedb8d73 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -1,8 +1,6 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { ASSET_CLASS_MAPPING } from '@ghostfolio/common/config'; +import { CreateOrderDto, UpdateOrderDto } from '@ghostfolio/common/dtos'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { AssetClassSelectorOption, 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 e2b1403c0..a3d7d326d 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 @@ -1,14 +1,15 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; -import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto'; -import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive'; -import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; +import { + CreateAccountWithBalancesDto, + CreateAssetProfileWithMarketDataDto, + CreateTagDto +} from '@ghostfolio/common/dtos'; import { Activity, PortfolioPosition } from '@ghostfolio/common/interfaces'; +import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { diff --git a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts index bbd50a0e1..0bf869238 100644 --- a/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts +++ b/apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts @@ -1,9 +1,8 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { GfRulesComponent } from '@ghostfolio/client/components/rules/rules.component'; import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { UpdateUserSettingDto } from '@ghostfolio/common/dtos'; import { PortfolioReportResponse, PortfolioReportRule diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index 68a02facc..10804aac9 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -1,12 +1,13 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; -import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; -import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; import { + DEFAULT_PAGE_SIZE, HEADER_KEY_SKIP_INTERCEPTOR, HEADER_KEY_TOKEN } from '@ghostfolio/common/config'; -import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; +import { + CreatePlatformDto, + UpdateAssetProfileDto, + UpdatePlatformDto +} from '@ghostfolio/common/dtos'; import { AdminData, AdminJobs, diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 60118d205..4c324fe03 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -1,21 +1,21 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; -import { UpdateAccessDto } from '@ghostfolio/api/app/access/update-access.dto'; -import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto'; -import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; -import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; -import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto'; -import { UpdateBulkMarketDataDto } from '@ghostfolio/api/app/admin/update-bulk-market-data.dto'; -import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; -import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; -import { CreateWatchlistItemDto } from '@ghostfolio/api/app/endpoints/watchlist/create-watchlist-item.dto'; -import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; -import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; -import { DeleteOwnUserDto } from '@ghostfolio/api/app/user/delete-own-user.dto'; -import { UserItem } from '@ghostfolio/api/app/user/interfaces/user-item.interface'; -import { UpdateOwnAccessTokenDto } from '@ghostfolio/api/app/user/update-own-access-token.dto'; -import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; -import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; +import { + CreateAccessDto, + CreateAccountBalanceDto, + CreateAccountDto, + CreateOrderDto, + CreateTagDto, + CreateWatchlistItemDto, + DeleteOwnUserDto, + TransferBalanceDto, + UpdateAccessDto, + UpdateAccountDto, + UpdateBulkMarketDataDto, + UpdateOrderDto, + UpdateOwnAccessTokenDto, + UpdatePropertyDto, + UpdateTagDto, + UpdateUserSettingDto +} from '@ghostfolio/common/dtos'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { Access, @@ -52,6 +52,7 @@ import { PublicPortfolioResponse, SymbolItem, User, + UserItem, WatchlistResponse } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; @@ -808,7 +809,7 @@ export class DataService { return this.http.put(`/api/v1/account/${aAccount.id}`, aAccount); } - public putAdminSetting(key: string, aData: PropertyDto) { + public putAdminSetting(key: string, aData: UpdatePropertyDto) { return this.http.put(`/api/v1/admin/settings/${key}`, aData); } diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts index 607b8a0a0..94d8470f7 100644 --- a/apps/client/src/app/services/import-activities.service.ts +++ b/apps/client/src/app/services/import-activities.service.ts @@ -1,8 +1,9 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; -import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto'; -import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto'; -import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; +import { + CreateAccountWithBalancesDto, + CreateAssetProfileWithMarketDataDto, + CreateOrderDto, + CreateTagDto +} from '@ghostfolio/common/dtos'; import { parseDate as parseDateHelper } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; diff --git a/apps/client/src/app/services/web-authn.service.ts b/apps/client/src/app/services/web-authn.service.ts index 9ace943b6..95c264310 100644 --- a/apps/client/src/app/services/web-authn.service.ts +++ b/apps/client/src/app/services/web-authn.service.ts @@ -1,10 +1,9 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { AuthDeviceDto } from '@ghostfolio/api/app/auth-device/auth-device.dto'; +import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; +import { AuthDeviceDto } from '@ghostfolio/common/dtos'; import { PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON -} from '@ghostfolio/api/app/auth/interfaces/simplewebauthn'; -import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; +} from '@ghostfolio/common/interfaces'; import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; diff --git a/apps/api/src/app/auth-device/auth-device.dto.ts b/libs/common/src/lib/dtos/auth-device.dto.ts similarity index 100% rename from apps/api/src/app/auth-device/auth-device.dto.ts rename to libs/common/src/lib/dtos/auth-device.dto.ts diff --git a/apps/api/src/app/access/create-access.dto.ts b/libs/common/src/lib/dtos/create-access.dto.ts similarity index 100% rename from apps/api/src/app/access/create-access.dto.ts rename to libs/common/src/lib/dtos/create-access.dto.ts diff --git a/apps/api/src/app/account-balance/create-account-balance.dto.ts b/libs/common/src/lib/dtos/create-account-balance.dto.ts similarity index 100% rename from apps/api/src/app/account-balance/create-account-balance.dto.ts rename to libs/common/src/lib/dtos/create-account-balance.dto.ts diff --git a/apps/api/src/app/import/create-account-with-balances.dto.ts b/libs/common/src/lib/dtos/create-account-with-balances.dto.ts similarity index 75% rename from apps/api/src/app/import/create-account-with-balances.dto.ts rename to libs/common/src/lib/dtos/create-account-with-balances.dto.ts index 6cf4057f8..53740f0f9 100644 --- a/apps/api/src/app/import/create-account-with-balances.dto.ts +++ b/libs/common/src/lib/dtos/create-account-with-balances.dto.ts @@ -1,4 +1,4 @@ -import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; +import { CreateAccountDto } from '@ghostfolio/common/dtos'; import { AccountBalance } from '@ghostfolio/common/interfaces'; import { IsArray, IsOptional } from 'class-validator'; diff --git a/apps/api/src/app/account/create-account.dto.ts b/libs/common/src/lib/dtos/create-account.dto.ts similarity index 89% rename from apps/api/src/app/account/create-account.dto.ts rename to libs/common/src/lib/dtos/create-account.dto.ts index b331d4ec7..fa88580f1 100644 --- a/apps/api/src/app/account/create-account.dto.ts +++ b/libs/common/src/lib/dtos/create-account.dto.ts @@ -1,4 +1,4 @@ -import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code'; +import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { Transform, TransformFnParams } from 'class-transformer'; import { diff --git a/apps/api/src/app/import/create-asset-profile-with-market-data.dto.ts b/libs/common/src/lib/dtos/create-asset-profile-with-market-data.dto.ts similarity index 85% rename from apps/api/src/app/import/create-asset-profile-with-market-data.dto.ts rename to libs/common/src/lib/dtos/create-asset-profile-with-market-data.dto.ts index fd90ab1af..04611371d 100644 --- a/apps/api/src/app/import/create-asset-profile-with-market-data.dto.ts +++ b/libs/common/src/lib/dtos/create-asset-profile-with-market-data.dto.ts @@ -3,7 +3,7 @@ import { MarketData } from '@ghostfolio/common/interfaces'; import { DataSource } from '@prisma/client'; import { IsArray, IsEnum, IsOptional } from 'class-validator'; -import { CreateAssetProfileDto } from '../admin/create-asset-profile.dto'; +import { CreateAssetProfileDto } from './create-asset-profile.dto'; export class CreateAssetProfileWithMarketDataDto extends CreateAssetProfileDto { @IsEnum([DataSource.MANUAL], { diff --git a/apps/api/src/app/admin/create-asset-profile.dto.ts b/libs/common/src/lib/dtos/create-asset-profile.dto.ts similarity index 94% rename from apps/api/src/app/admin/create-asset-profile.dto.ts rename to libs/common/src/lib/dtos/create-asset-profile.dto.ts index 8041b0f0e..80d45ba42 100644 --- a/apps/api/src/app/admin/create-asset-profile.dto.ts +++ b/libs/common/src/lib/dtos/create-asset-profile.dto.ts @@ -1,4 +1,4 @@ -import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code'; +import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client'; import { diff --git a/apps/api/src/app/order/create-order.dto.ts b/libs/common/src/lib/dtos/create-order.dto.ts similarity index 94% rename from apps/api/src/app/order/create-order.dto.ts rename to libs/common/src/lib/dtos/create-order.dto.ts index fb4ac32dd..dfd0d8aa5 100644 --- a/apps/api/src/app/order/create-order.dto.ts +++ b/libs/common/src/lib/dtos/create-order.dto.ts @@ -1,5 +1,5 @@ -import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code'; import { IsAfter1970Constraint } from '@ghostfolio/common/validator-constraints/is-after-1970'; +import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { AssetClass, AssetSubClass, DataSource, Type } from '@prisma/client'; import { Transform, TransformFnParams } from 'class-transformer'; diff --git a/apps/api/src/app/platform/create-platform.dto.ts b/libs/common/src/lib/dtos/create-platform.dto.ts similarity index 100% rename from apps/api/src/app/platform/create-platform.dto.ts rename to libs/common/src/lib/dtos/create-platform.dto.ts diff --git a/apps/api/src/app/endpoints/tags/create-tag.dto.ts b/libs/common/src/lib/dtos/create-tag.dto.ts similarity index 100% rename from apps/api/src/app/endpoints/tags/create-tag.dto.ts rename to libs/common/src/lib/dtos/create-tag.dto.ts diff --git a/apps/api/src/app/endpoints/watchlist/create-watchlist-item.dto.ts b/libs/common/src/lib/dtos/create-watchlist-item.dto.ts similarity index 100% rename from apps/api/src/app/endpoints/watchlist/create-watchlist-item.dto.ts rename to libs/common/src/lib/dtos/create-watchlist-item.dto.ts diff --git a/apps/api/src/app/user/delete-own-user.dto.ts b/libs/common/src/lib/dtos/delete-own-user.dto.ts similarity index 100% rename from apps/api/src/app/user/delete-own-user.dto.ts rename to libs/common/src/lib/dtos/delete-own-user.dto.ts diff --git a/libs/common/src/lib/dtos/index.ts b/libs/common/src/lib/dtos/index.ts new file mode 100644 index 000000000..3631d6eae --- /dev/null +++ b/libs/common/src/lib/dtos/index.ts @@ -0,0 +1,51 @@ +import { AuthDeviceDto } from './auth-device.dto'; +import { CreateAccessDto } from './create-access.dto'; +import { CreateAccountBalanceDto } from './create-account-balance.dto'; +import { CreateAccountWithBalancesDto } from './create-account-with-balances.dto'; +import { CreateAccountDto } from './create-account.dto'; +import { CreateAssetProfileWithMarketDataDto } from './create-asset-profile-with-market-data.dto'; +import { CreateAssetProfileDto } from './create-asset-profile.dto'; +import { CreateOrderDto } from './create-order.dto'; +import { CreatePlatformDto } from './create-platform.dto'; +import { CreateTagDto } from './create-tag.dto'; +import { CreateWatchlistItemDto } from './create-watchlist-item.dto'; +import { DeleteOwnUserDto } from './delete-own-user.dto'; +import { TransferBalanceDto } from './transfer-balance.dto'; +import { UpdateAccessDto } from './update-access.dto'; +import { UpdateAccountDto } from './update-account.dto'; +import { UpdateAssetProfileDto } from './update-asset-profile.dto'; +import { UpdateBulkMarketDataDto } from './update-bulk-market-data.dto'; +import { UpdateMarketDataDto } from './update-market-data.dto'; +import { UpdateOrderDto } from './update-order.dto'; +import { UpdateOwnAccessTokenDto } from './update-own-access-token.dto'; +import { UpdatePlatformDto } from './update-platform.dto'; +import { UpdatePropertyDto } from './update-property.dto'; +import { UpdateTagDto } from './update-tag.dto'; +import { UpdateUserSettingDto } from './update-user-setting.dto'; + +export { + AuthDeviceDto, + CreateAccessDto, + CreateAccountBalanceDto, + CreateAccountDto, + CreateAccountWithBalancesDto, + CreateAssetProfileDto, + CreateAssetProfileWithMarketDataDto, + CreateOrderDto, + CreatePlatformDto, + CreateTagDto, + CreateWatchlistItemDto, + DeleteOwnUserDto, + TransferBalanceDto, + UpdateAccessDto, + UpdateAccountDto, + UpdateAssetProfileDto, + UpdateBulkMarketDataDto, + UpdateMarketDataDto, + UpdateOrderDto, + UpdateOwnAccessTokenDto, + UpdatePlatformDto, + UpdatePropertyDto, + UpdateTagDto, + UpdateUserSettingDto +}; diff --git a/apps/api/src/app/account/transfer-balance.dto.ts b/libs/common/src/lib/dtos/transfer-balance.dto.ts similarity index 100% rename from apps/api/src/app/account/transfer-balance.dto.ts rename to libs/common/src/lib/dtos/transfer-balance.dto.ts diff --git a/apps/api/src/app/access/update-access.dto.ts b/libs/common/src/lib/dtos/update-access.dto.ts similarity index 100% rename from apps/api/src/app/access/update-access.dto.ts rename to libs/common/src/lib/dtos/update-access.dto.ts diff --git a/apps/api/src/app/account/update-account.dto.ts b/libs/common/src/lib/dtos/update-account.dto.ts similarity index 89% rename from apps/api/src/app/account/update-account.dto.ts rename to libs/common/src/lib/dtos/update-account.dto.ts index 3a721d873..066bacbfd 100644 --- a/apps/api/src/app/account/update-account.dto.ts +++ b/libs/common/src/lib/dtos/update-account.dto.ts @@ -1,4 +1,4 @@ -import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code'; +import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { Transform, TransformFnParams } from 'class-transformer'; import { diff --git a/apps/api/src/app/admin/update-asset-profile.dto.ts b/libs/common/src/lib/dtos/update-asset-profile.dto.ts similarity index 93% rename from apps/api/src/app/admin/update-asset-profile.dto.ts rename to libs/common/src/lib/dtos/update-asset-profile.dto.ts index 5056dccdb..43f5aa617 100644 --- a/apps/api/src/app/admin/update-asset-profile.dto.ts +++ b/libs/common/src/lib/dtos/update-asset-profile.dto.ts @@ -1,4 +1,4 @@ -import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code'; +import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client'; import { diff --git a/apps/api/src/app/admin/update-bulk-market-data.dto.ts b/libs/common/src/lib/dtos/update-bulk-market-data.dto.ts similarity index 79% rename from apps/api/src/app/admin/update-bulk-market-data.dto.ts rename to libs/common/src/lib/dtos/update-bulk-market-data.dto.ts index da0da1272..f92112f24 100644 --- a/apps/api/src/app/admin/update-bulk-market-data.dto.ts +++ b/libs/common/src/lib/dtos/update-bulk-market-data.dto.ts @@ -1,8 +1,8 @@ +import { UpdateMarketDataDto } from '@ghostfolio/common/dtos'; + import { Type } from 'class-transformer'; import { ArrayNotEmpty, IsArray } from 'class-validator'; -import { UpdateMarketDataDto } from './update-market-data.dto'; - export class UpdateBulkMarketDataDto { @ArrayNotEmpty() @IsArray() diff --git a/apps/api/src/app/admin/update-market-data.dto.ts b/libs/common/src/lib/dtos/update-market-data.dto.ts similarity index 100% rename from apps/api/src/app/admin/update-market-data.dto.ts rename to libs/common/src/lib/dtos/update-market-data.dto.ts diff --git a/apps/api/src/app/order/update-order.dto.ts b/libs/common/src/lib/dtos/update-order.dto.ts similarity index 94% rename from apps/api/src/app/order/update-order.dto.ts rename to libs/common/src/lib/dtos/update-order.dto.ts index 25c92532a..3656a8043 100644 --- a/apps/api/src/app/order/update-order.dto.ts +++ b/libs/common/src/lib/dtos/update-order.dto.ts @@ -1,5 +1,5 @@ -import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code'; import { IsAfter1970Constraint } from '@ghostfolio/common/validator-constraints/is-after-1970'; +import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { AssetClass, AssetSubClass, DataSource, Type } from '@prisma/client'; import { Transform, TransformFnParams } from 'class-transformer'; diff --git a/apps/api/src/app/user/update-own-access-token.dto.ts b/libs/common/src/lib/dtos/update-own-access-token.dto.ts similarity index 100% rename from apps/api/src/app/user/update-own-access-token.dto.ts rename to libs/common/src/lib/dtos/update-own-access-token.dto.ts diff --git a/apps/api/src/app/platform/update-platform.dto.ts b/libs/common/src/lib/dtos/update-platform.dto.ts similarity index 100% rename from apps/api/src/app/platform/update-platform.dto.ts rename to libs/common/src/lib/dtos/update-platform.dto.ts diff --git a/apps/api/src/services/property/property.dto.ts b/libs/common/src/lib/dtos/update-property.dto.ts similarity index 76% rename from apps/api/src/services/property/property.dto.ts rename to libs/common/src/lib/dtos/update-property.dto.ts index 037b4703c..77115759a 100644 --- a/apps/api/src/services/property/property.dto.ts +++ b/libs/common/src/lib/dtos/update-property.dto.ts @@ -1,6 +1,6 @@ import { IsOptional, IsString } from 'class-validator'; -export class PropertyDto { +export class UpdatePropertyDto { @IsOptional() @IsString() value: string; diff --git a/apps/api/src/app/endpoints/tags/update-tag.dto.ts b/libs/common/src/lib/dtos/update-tag.dto.ts similarity index 100% rename from apps/api/src/app/endpoints/tags/update-tag.dto.ts rename to libs/common/src/lib/dtos/update-tag.dto.ts diff --git a/apps/api/src/app/user/update-user-setting.dto.ts b/libs/common/src/lib/dtos/update-user-setting.dto.ts similarity index 96% rename from apps/api/src/app/user/update-user-setting.dto.ts rename to libs/common/src/lib/dtos/update-user-setting.dto.ts index 3ee59f7dd..cf7dff7e8 100644 --- a/apps/api/src/app/user/update-user-setting.dto.ts +++ b/libs/common/src/lib/dtos/update-user-setting.dto.ts @@ -1,4 +1,3 @@ -import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code'; import { XRayRulesSettings } from '@ghostfolio/common/interfaces'; import type { ColorScheme, @@ -6,6 +5,7 @@ import type { HoldingsViewMode, ViewMode } from '@ghostfolio/common/types'; +import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code'; import { IsArray, diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index c47af2d97..1d7991e40 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -68,7 +68,7 @@ import type { MarketDataDetailsResponse } from './responses/market-data-details- import type { MarketDataOfMarketsResponse } from './responses/market-data-of-markets-response.interface'; import type { OAuthResponse } from './responses/oauth-response.interface'; import type { PortfolioDividendsResponse } from './responses/portfolio-dividends-response.interface'; -import { PortfolioHoldingResponse } from './responses/portfolio-holding-response.interface'; +import type { PortfolioHoldingResponse } from './responses/portfolio-holding-response.interface'; import type { PortfolioHoldingsResponse } from './responses/portfolio-holdings-response.interface'; import type { PortfolioInvestmentsResponse } from './responses/portfolio-investments.interface'; import type { PortfolioPerformanceResponse } from './responses/portfolio-performance-response.interface'; @@ -76,7 +76,14 @@ import type { PortfolioReportResponse } from './responses/portfolio-report.inter import type { PublicPortfolioResponse } from './responses/public-portfolio-response.interface'; import type { QuotesResponse } from './responses/quotes-response.interface'; import type { WatchlistResponse } from './responses/watchlist-response.interface'; +import type { RuleSettings } from './rule-settings.interface'; import type { ScraperConfiguration } from './scraper-configuration.interface'; +import type { + AssertionCredentialJSON, + AttestationCredentialJSON, + PublicKeyCredentialCreationOptionsJSON, + PublicKeyCredentialRequestOptionsJSON +} from './simplewebauthn.interface'; import type { Statistics } from './statistics.interface'; import type { SubscriptionOffer } from './subscription-offer.interface'; import type { SymbolItem } from './symbol-item.interface'; @@ -84,6 +91,7 @@ import type { SymbolMetrics } from './symbol-metrics.interface'; import type { SystemMessage } from './system-message.interface'; import type { TabConfiguration } from './tab-configuration.interface'; import type { ToggleOption } from './toggle-option.interface'; +import type { UserItem } from './user-item.interface'; import type { UserSettings } from './user-settings.interface'; import type { User } from './user.interface'; import type { XRayRulesSettings } from './x-ray-rules-settings.interface'; @@ -109,9 +117,11 @@ export { AdminUsersResponse, AiPromptResponse, ApiKeyResponse, + AssertionCredentialJSON, AssetClassSelectorOption, AssetProfileIdentifier, AssetResponse, + AttestationCredentialJSON, Benchmark, BenchmarkMarketDataDetailsResponse, BenchmarkProperty, @@ -160,9 +170,12 @@ export { PortfolioSummary, Position, Product, + PublicKeyCredentialCreationOptionsJSON, + PublicKeyCredentialRequestOptionsJSON, PublicPortfolioResponse, QuotesResponse, ResponseError, + RuleSettings, ScraperConfiguration, Statistics, SubscriptionOffer, @@ -172,6 +185,7 @@ export { TabConfiguration, ToggleOption, User, + UserItem, UserSettings, WatchlistResponse, XRayRulesSettings diff --git a/apps/api/src/models/interfaces/rule-settings.interface.ts b/libs/common/src/lib/interfaces/rule-settings.interface.ts similarity index 100% rename from apps/api/src/models/interfaces/rule-settings.interface.ts rename to libs/common/src/lib/interfaces/rule-settings.interface.ts diff --git a/apps/api/src/app/auth/interfaces/simplewebauthn.ts b/libs/common/src/lib/interfaces/simplewebauthn.interface.ts similarity index 100% rename from apps/api/src/app/auth/interfaces/simplewebauthn.ts rename to libs/common/src/lib/interfaces/simplewebauthn.interface.ts diff --git a/apps/api/src/app/user/interfaces/user-item.interface.ts b/libs/common/src/lib/interfaces/user-item.interface.ts similarity index 100% rename from apps/api/src/app/user/interfaces/user-item.interface.ts rename to libs/common/src/lib/interfaces/user-item.interface.ts diff --git a/libs/common/src/lib/pipes/index.ts b/libs/common/src/lib/pipes/index.ts new file mode 100644 index 000000000..7b5ca4bac --- /dev/null +++ b/libs/common/src/lib/pipes/index.ts @@ -0,0 +1,3 @@ +import { GfSymbolPipe } from './symbol.pipe'; + +export { GfSymbolPipe }; diff --git a/apps/client/src/app/pipes/symbol/symbol.pipe.ts b/libs/common/src/lib/pipes/symbol.pipe.ts similarity index 100% rename from apps/client/src/app/pipes/symbol/symbol.pipe.ts rename to libs/common/src/lib/pipes/symbol.pipe.ts diff --git a/apps/api/src/validators/is-currency-code.ts b/libs/common/src/lib/validators/is-currency-code.ts similarity index 100% rename from apps/api/src/validators/is-currency-code.ts rename to libs/common/src/lib/validators/is-currency-code.ts diff --git a/libs/ui/src/lib/account-balances/account-balances.component.ts b/libs/ui/src/lib/account-balances/account-balances.component.ts index 904e7d46c..679899af9 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.ts +++ b/libs/ui/src/lib/account-balances/account-balances.component.ts @@ -1,8 +1,8 @@ /* eslint-disable @nx/enforce-module-boundaries */ -import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; +import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos'; import { DATE_FORMAT, getLocale } from '@ghostfolio/common/helper'; import { AccountBalancesResponse } from '@ghostfolio/common/interfaces'; diff --git a/libs/ui/src/lib/activities-filter/activities-filter.component.ts b/libs/ui/src/lib/activities-filter/activities-filter.component.ts index 177312490..34f883c67 100644 --- a/libs/ui/src/lib/activities-filter/activities-filter.component.ts +++ b/libs/ui/src/lib/activities-filter/activities-filter.component.ts @@ -1,6 +1,5 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { Filter, FilterGroup } from '@ghostfolio/common/interfaces'; +import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { CommonModule } from '@angular/common'; diff --git a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts index 78e712c89..a0ad690d7 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.stories.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.stories.ts @@ -1,5 +1,5 @@ -import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { Activity } from '@ghostfolio/common/interfaces'; +import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; 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 99ba2aded..d7b13a7e8 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -1,7 +1,6 @@ /* eslint-disable @nx/enforce-module-boundaries */ import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; -import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { DEFAULT_PAGE_SIZE, TAG_ID_EXCLUDE_FROM_ANALYSIS @@ -11,6 +10,7 @@ import { Activity, AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; +import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { SelectionModel } from '@angular/cdk/collections'; diff --git a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts index 059bbaf9e..c2ad2462e 100644 --- a/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts +++ b/libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts @@ -1,5 +1,4 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; +import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { FocusableOption } from '@angular/cdk/a11y'; diff --git a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts index b36a70e69..f857e6e53 100644 --- a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts +++ b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts @@ -1,6 +1,6 @@ /* eslint-disable @nx/enforce-module-boundaries */ -import { UpdateMarketDataDto } from '@ghostfolio/api/app/admin/update-market-data.dto'; import { DataService } from '@ghostfolio/client/services/data.service'; +import { UpdateMarketDataDto } from '@ghostfolio/common/dtos'; import { DATE_FORMAT, getDateFormatString, diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts index 274c3f994..afbe5af4e 100644 --- a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts +++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts @@ -1,7 +1,6 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { Filter, PortfolioPosition } from '@ghostfolio/common/interfaces'; +import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { AccountWithPlatform } from '@ghostfolio/common/types'; import { diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts index dcfcaf3f1..05a2c06c3 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -1,7 +1,7 @@ /* eslint-disable @nx/enforce-module-boundaries */ -import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { DataService } from '@ghostfolio/client/services/data.service'; import { LookupItem } from '@ghostfolio/common/interfaces'; +import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { FocusMonitor } from '@angular/cdk/a11y'; import { diff --git a/libs/ui/src/lib/top-holdings/top-holdings.component.ts b/libs/ui/src/lib/top-holdings/top-holdings.component.ts index b67cc1b80..75a96fc5c 100644 --- a/libs/ui/src/lib/top-holdings/top-holdings.component.ts +++ b/libs/ui/src/lib/top-holdings/top-holdings.component.ts @@ -1,10 +1,9 @@ -/* eslint-disable @nx/enforce-module-boundaries */ -import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { getLocale } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, HoldingWithParents } from '@ghostfolio/common/interfaces'; +import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { animate,