-
+
-
- Quick Links
+
+ Quick Links
@for (
searchResultItem of searchResults.quickLinks;
@@ -80,8 +80,8 @@
}
@if (isLoading.accounts || searchResults?.accounts?.length !== 0) {
-
- Accounts
+
+ Accounts
@for (
searchResultItem of searchResults.accounts;
@@ -106,8 +106,8 @@
}
@if (isLoading.holdings || searchResults?.holdings?.length !== 0) {
-
- Holdings
+
+ Holdings
@for (
searchResultItem of searchResults.holdings;
@@ -136,8 +136,8 @@
searchResults?.assetProfiles?.length !== 0)
) {
-
- Asset Profiles
+
+ Asset Profiles
@for (
searchResultItem of searchResults.assetProfiles;
@@ -194,7 +194,6 @@
/>
- Reset Filters
+ Reset Filters
- Apply Filters
+ Apply Filters
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 072/146] 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 073/146] 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 tú 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 gebruiken Ghostfolio 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ıl Ghostfolio ç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 074/146] 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 .
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
+
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 075/146] 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 076/146] 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 077/146] 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 078/146] 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 079/146] 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 080/146] 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 081/146] 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 082/146] 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 083/146] 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 084/146] 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 085/146] 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 086/146] 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 087/146] 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 088/146] 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 089/146] 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 090/146] 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 091/146] 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 092/146] 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 093/146] 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 094/146] 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 095/146] 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 096/146] 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 097/146] 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 098/146] 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 @@
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) {
-
- Create Account
-
- @if (hasPermissionForSocialLogin) {
+ @if (hasPermissionForAuthToken) {
+
+ Create Account
+
+ }
+ @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 099/146] 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 100/146] 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