From 7efda2f890030f36af4a79490bb24d158a865b87 Mon Sep 17 00:00:00 2001 From: BernatVM <39736637+BernatVM@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:30:08 +0200 Subject: [PATCH 01/16] Feature/improve language localization for Catalan (#3598) * Update translations * Update changelog --- CHANGELOG.md | 6 + apps/client/src/locales/messages.ca.xlf | 378 ++++++++++++------------ 2 files changed, 195 insertions(+), 189 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc7fb9408..2e261220d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Improved the language localization for Catalan (`ca`) + ## 2.99.0 - 2024-07-29 ### Changed diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index a423dde12..7ff136408 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -3,7 +3,7 @@ Features - Features + Característiques apps/client/src/app/app-routing.module.ts 65 @@ -11,7 +11,7 @@ Internationalization - Internationalization + Internacionalització apps/client/src/app/app-routing.module.ts 79 @@ -19,7 +19,7 @@ Sign in - Sign in + Iniciar sessió apps/client/src/app/app-routing.module.ts 141 @@ -31,7 +31,7 @@ You are using the Live Demo. - You are using the Live Demo. + Esteu utilitzant una demo. apps/client/src/app/app.component.html 12 @@ -39,7 +39,7 @@ Create Account - Create Account + Crea un Compte apps/client/src/app/app.component.html 13 @@ -55,7 +55,7 @@ Personal Finance - Personal Finance + Finances Personals apps/client/src/app/app.component.html 54 @@ -63,7 +63,7 @@ Markets - Markets + Mercats apps/client/src/app/app.component.html 58 @@ -83,7 +83,7 @@ Resources - Resources + Recursos apps/client/src/app/app.component.html 61 @@ -103,7 +103,7 @@ About - About + Sobre apps/client/src/app/app.component.html 67 @@ -119,7 +119,7 @@ Blog - Blog + Blog apps/client/src/app/app.component.html 70 @@ -207,7 +207,7 @@ Changelog - Changelog + Registre de canvis apps/client/src/app/app.component.html 74 @@ -219,7 +219,7 @@ Features - Features + Característiques apps/client/src/app/app.component.html 76 @@ -235,7 +235,7 @@ Frequently Asked Questions (FAQ) - Frequently Asked Questions (FAQ) + Preguntes Freqüents (FAQ) apps/client/src/app/app.component.html 80 @@ -247,7 +247,7 @@ License - License + Llicències apps/client/src/app/app.component.html 85 @@ -259,7 +259,7 @@ Pricing - Pricing + Preu apps/client/src/app/app.component.html 94 @@ -283,7 +283,7 @@ Privacy Policy - Privacy Policy + Política de privacitat apps/client/src/app/app.component.html 100 @@ -295,7 +295,7 @@ Community - Community + Comunitat apps/client/src/app/app.component.html 118 @@ -335,7 +335,7 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. - The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. + El risc d'assumir pèrdues en les inversions és substancial. No és recomanable invertir diners que pugui necessitar a curt termini. apps/client/src/app/app.component.html 199 @@ -343,7 +343,7 @@ about - about + sobre apps/client/src/app/app.component.ts 59 @@ -427,7 +427,7 @@ license - license + llicències apps/client/src/app/app.component.ts 61 @@ -443,7 +443,7 @@ privacy-policy - privacy-policy + política de privacitat apps/client/src/app/app.component.ts 64 @@ -459,7 +459,7 @@ faq - faq + faq apps/client/src/app/app.component.ts 66 @@ -491,7 +491,7 @@ features - features + característiques apps/client/src/app/app.component.ts 67 @@ -555,7 +555,7 @@ markets - markets + mercats apps/client/src/app/app.component.ts 68 @@ -587,7 +587,7 @@ pricing - pricing + preu apps/client/src/app/app.component.ts 69 @@ -655,7 +655,7 @@ register - register + registrar-se apps/client/src/app/app.component.ts 70 @@ -691,7 +691,7 @@ resources - resources + recursos apps/client/src/app/app.component.ts 71 @@ -743,7 +743,7 @@ Alias - Alias + Àlies apps/client/src/app/components/access-table/access-table.component.html 4 @@ -763,7 +763,7 @@ Permission - Permission + Permisos apps/client/src/app/components/access-table/access-table.component.html 18 @@ -775,7 +775,7 @@ View - View + Vista apps/client/src/app/components/access-table/access-table.component.html 23 @@ -787,7 +787,7 @@ Restricted view - Restricted view + Vista restringida apps/client/src/app/components/access-table/access-table.component.html 26 @@ -799,7 +799,7 @@ Details - Details + Detalls apps/client/src/app/components/access-table/access-table.component.html 33 @@ -807,7 +807,7 @@ Revoke - Revoke + Revocar apps/client/src/app/components/access-table/access-table.component.html 62 @@ -815,7 +815,7 @@ Do you really want to revoke this granted access? - Do you really want to revoke this granted access? + Realment vol revocar aquest accés? apps/client/src/app/components/access-table/access-table.component.ts 50 @@ -823,7 +823,7 @@ Cash Balance - Cash Balance + Balanç de Caixa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 45 @@ -839,7 +839,7 @@ Equity - Equity + Patrimoni apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 56 @@ -847,7 +847,7 @@ Activities - Activities + Activitats apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 61 @@ -887,7 +887,7 @@ Platform - Platform + Plataforma apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 65 @@ -903,7 +903,7 @@ Holdings - Holdings + En cartera apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 77 @@ -923,7 +923,7 @@ Cash Balances - Cash Balances + Balanç de Caixa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 115 @@ -931,7 +931,7 @@ Transfer Cash Balance - Transfer Cash Balance + Transferir Efectiu apps/client/src/app/components/accounts-table/accounts-table.component.html 10 @@ -943,7 +943,7 @@ Name - Name + Nom apps/client/src/app/components/accounts-table/accounts-table.component.html 43 @@ -995,7 +995,7 @@ Total - Total + Total apps/client/src/app/components/accounts-table/accounts-table.component.html 55 @@ -1003,7 +1003,7 @@ Currency - Currency + Divisa apps/client/src/app/components/accounts-table/accounts-table.component.html 65 @@ -1031,7 +1031,7 @@ Value - Value + Valor apps/client/src/app/components/accounts-table/accounts-table.component.html 171 @@ -1095,7 +1095,7 @@ Edit - Edit + Editar apps/client/src/app/components/accounts-table/accounts-table.component.html 278 @@ -1123,7 +1123,7 @@ Delete - Delete + Suprimir apps/client/src/app/components/accounts-table/accounts-table.component.html 288 @@ -1163,7 +1163,7 @@ Do you really want to delete this account? - Do you really want to delete this account? + Realment vol suprimir aquest compte? apps/client/src/app/components/accounts-table/accounts-table.component.ts 101 @@ -1171,7 +1171,7 @@ Type - Type + Tipus apps/client/src/app/components/admin-jobs/admin-jobs.html 31 @@ -1191,7 +1191,7 @@ Asset Profile - Asset Profile + Perfil d'Actiu apps/client/src/app/components/admin-jobs/admin-jobs.html 35 @@ -1199,7 +1199,7 @@ Historical Market Data - Historical Market Data + Dades Històriques de Mercat apps/client/src/app/components/admin-jobs/admin-jobs.html 37 @@ -1207,7 +1207,7 @@ Symbol - Symbol + Símbol apps/client/src/app/components/admin-jobs/admin-jobs.html 44 @@ -1231,7 +1231,7 @@ Data Source - Data Source + Origen de les Dades apps/client/src/app/components/admin-jobs/admin-jobs.html 53 @@ -1251,7 +1251,7 @@ Priority - Priority + Prioritat apps/client/src/app/components/admin-jobs/admin-jobs.html 62 @@ -1259,7 +1259,7 @@ Attempts - Attempts + Intents apps/client/src/app/components/admin-jobs/admin-jobs.html 81 @@ -1267,7 +1267,7 @@ Created - Created + Creat apps/client/src/app/components/admin-jobs/admin-jobs.html 90 @@ -1275,7 +1275,7 @@ Finished - Finished + Finalitzat apps/client/src/app/components/admin-jobs/admin-jobs.html 99 @@ -1283,7 +1283,7 @@ Status - Status + Estat apps/client/src/app/components/admin-jobs/admin-jobs.html 108 @@ -1291,7 +1291,7 @@ Delete Jobs - Delete Jobs + Aturar Processos apps/client/src/app/components/admin-jobs/admin-jobs.html 149 @@ -1299,7 +1299,7 @@ View Data - View Data + Veure les Dades apps/client/src/app/components/admin-jobs/admin-jobs.html 164 @@ -1315,7 +1315,7 @@ Execute Job - Execute Job + Executar Procés apps/client/src/app/components/admin-jobs/admin-jobs.html 174 @@ -1323,7 +1323,7 @@ Delete Job - Delete Job + Suprimir Procés apps/client/src/app/components/admin-jobs/admin-jobs.html 177 @@ -1331,7 +1331,7 @@ Details for - Details for + Detalls de apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 2 @@ -1339,7 +1339,7 @@ Date - Date + Data apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 6 @@ -1359,7 +1359,7 @@ Market Price - Market Price + Preu de Mercat apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 26 @@ -1371,7 +1371,7 @@ Cancel - Cancel + Cancel·lar apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 46 @@ -1415,7 +1415,7 @@ Save - Save + Guardar apps/client/src/app/components/admin-market-data-detail/market-data-detail-dialog/market-data-detail-dialog.html 48 @@ -1451,7 +1451,7 @@ Benchmarks - Benchmarks + Punts de referència apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 80 @@ -1459,7 +1459,7 @@ Currencies - Currencies + Divises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 85 @@ -1467,7 +1467,7 @@ ETFs without Countries - ETFs without Countries + ETFs sense País apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 90 @@ -1475,7 +1475,7 @@ ETFs without Sectors - ETFs without Sectors + ETFs sense Sector apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 95 @@ -1483,7 +1483,7 @@ Filter by... - Filter by... + Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 322 @@ -1491,7 +1491,7 @@ Asset Class - Asset Class + Classe d'Actiu apps/client/src/app/components/admin-market-data/admin-market-data.html 86 @@ -1515,7 +1515,7 @@ Asset Sub Class - Asset Sub Class + Subclasse d'Actiu apps/client/src/app/components/admin-market-data/admin-market-data.html 95 @@ -1539,7 +1539,7 @@ First Activity - First Activity + Primera Activitat apps/client/src/app/components/admin-market-data/admin-market-data.html 104 @@ -1559,7 +1559,7 @@ Activities Count - Activities Count + Nombre d'Activitats apps/client/src/app/components/admin-market-data/admin-market-data.html 113 @@ -1567,7 +1567,7 @@ Historical Data - Historical Data + Dades Històriques apps/client/src/app/components/admin-market-data/admin-market-data.html 122 @@ -1579,7 +1579,7 @@ Sectors Count - Sectors Count + Nombre de Sectors apps/client/src/app/components/admin-market-data/admin-market-data.html 131 @@ -1587,7 +1587,7 @@ Countries Count - Countries Count + Nombre de Països apps/client/src/app/components/admin-market-data/admin-market-data.html 140 @@ -1595,7 +1595,7 @@ Gather Recent Data - Gather Recent Data + Recopilar Dades Recents apps/client/src/app/components/admin-market-data/admin-market-data.html 177 @@ -1603,7 +1603,7 @@ Gather All Data - Gather All Data + Recopilar Totes les Dades apps/client/src/app/components/admin-market-data/admin-market-data.html 180 @@ -1611,7 +1611,7 @@ Gather Profile Data - Gather Profile Data + Recopilar Dades del Perfil apps/client/src/app/components/admin-market-data/admin-market-data.html 183 @@ -1623,7 +1623,7 @@ Delete Profiles - Delete Profiles + Eliminar Perfils apps/client/src/app/components/admin-market-data/admin-market-data.html 190 @@ -1631,7 +1631,7 @@ Do you really want to delete this asset profile? - Do you really want to delete this asset profile? + Realment vol eliminar el perfil d'aquest actiu? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 18 @@ -1639,7 +1639,7 @@ Do you really want to delete these profiles? - Do you really want to delete these profiles? + Realment vol eliminar aquests perfils? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 34 @@ -1647,7 +1647,7 @@ Oops! Could not delete profiles. - Oops! Could not delete profiles. + Oooh! No s'han pogut eliminar els perfils apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 45 @@ -1655,7 +1655,7 @@ Oops! Could not parse historical data. - Oops! Could not parse historical data. + Oooh! No s'han pogut recopilar les dades históriques. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 232 @@ -1663,7 +1663,7 @@ The current market price is - The current market price is + El preu de mercat actual és apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 336 @@ -1671,7 +1671,7 @@ Refresh - Refresh + Refrescar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 22 @@ -1679,7 +1679,7 @@ Gather Historical Data - Gather Historical Data + Recopilar Dades Històriques apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 32 @@ -1687,7 +1687,7 @@ Import - Import + Importar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 110 @@ -1703,7 +1703,7 @@ Sector - Sector + Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 187 @@ -1715,7 +1715,7 @@ Country - Country + País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 198 @@ -1731,7 +1731,7 @@ Sectors - Sectors + Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 204 @@ -1751,7 +1751,7 @@ Countries - Countries + Països apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 214 @@ -1767,7 +1767,7 @@ Benchmark - Benchmark + Referència apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 286 @@ -1775,7 +1775,7 @@ Symbol Mapping - Symbol Mapping + Mapatge de Símbols apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 292 @@ -1783,7 +1783,7 @@ Scraper Configuration - Scraper Configuration + Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 304 @@ -1791,7 +1791,7 @@ Test - Test + Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 322 @@ -1799,7 +1799,7 @@ Url - Url + Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 352 @@ -1815,7 +1815,7 @@ Note - Note + Notes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 365 @@ -1831,7 +1831,7 @@ Add Asset Profile - Add Asset Profile + Afegeix el Perfil de l'Actiu apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 @@ -1839,7 +1839,7 @@ Search - Search + Cerca apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 16 @@ -1847,7 +1847,7 @@ Add Manually - Add Manually + Afegir manualment apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 19 @@ -1855,7 +1855,7 @@ Name, symbol or ISIN - Name, symbol or ISIN + Nom, símbol o ISIN apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 26 @@ -1867,7 +1867,7 @@ Please add a currency: - Please add a currency: + Si us plau, afegiu una divisa: apps/client/src/app/components/admin-overview/admin-overview.component.ts 122 @@ -1875,7 +1875,7 @@ is an invalid currency! - is an invalid currency! + no és una divisa vàlida! apps/client/src/app/components/admin-overview/admin-overview.component.ts 129 @@ -1883,7 +1883,7 @@ Do you really want to delete this coupon? - Do you really want to delete this coupon? + Està segur qeu vol eliminar aquest cupó? apps/client/src/app/components/admin-overview/admin-overview.component.ts 140 @@ -1891,7 +1891,7 @@ Do you really want to delete this currency? - Do you really want to delete this currency? + Està segur que vol eliminar aquesta divisa? apps/client/src/app/components/admin-overview/admin-overview.component.ts 153 @@ -1899,7 +1899,7 @@ Do you really want to delete this system message? - Do you really want to delete this system message? + Està segur que vol eliminar aquest missatge del sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts 166 @@ -1907,7 +1907,7 @@ Do you really want to flush the cache? - Do you really want to flush the cache? + Està segur que vol depurar el cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts 183 @@ -1915,7 +1915,7 @@ Please set your system message: - Please set your system message: + Si us plau, afegeixi el seu missatge del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts 214 @@ -1923,7 +1923,7 @@ Version - Version + Versió apps/client/src/app/components/admin-overview/admin-overview.html 7 @@ -1931,7 +1931,7 @@ User Count - User Count + Número d'Usuaris apps/client/src/app/components/admin-overview/admin-overview.html 13 @@ -1939,7 +1939,7 @@ Activity Count - Activity Count + Número d'Activitats apps/client/src/app/components/admin-overview/admin-overview.html 23 @@ -1947,7 +1947,7 @@ per User - per User + per Usuari apps/client/src/app/components/admin-overview/admin-overview.html 33 @@ -1955,7 +1955,7 @@ Exchange Rates - Exchange Rates + Tipus de Canvi apps/client/src/app/components/admin-overview/admin-overview.html 39 @@ -1963,7 +1963,7 @@ Add Currency - Add Currency + Afegir Divisa apps/client/src/app/components/admin-overview/admin-overview.html 109 @@ -1971,7 +1971,7 @@ User Signup - User Signup + Registrar Usuari apps/client/src/app/components/admin-overview/admin-overview.html 115 @@ -1979,7 +1979,7 @@ Read-only Mode - Read-only Mode + Mode Només Lecutra apps/client/src/app/components/admin-overview/admin-overview.html 129 @@ -1987,7 +1987,7 @@ Data Gathering - Data Gathering + Recollida de Dades apps/client/src/app/components/admin-overview/admin-overview.html 141 @@ -1995,7 +1995,7 @@ System Message - System Message + Missatge del Sistema apps/client/src/app/components/admin-overview/admin-overview.html 153 @@ -2003,7 +2003,7 @@ Set Message - Set Message + Estableix el Missatge apps/client/src/app/components/admin-overview/admin-overview.html 175 @@ -2011,7 +2011,7 @@ Coupons - Coupons + Coupons apps/client/src/app/components/admin-overview/admin-overview.html 183 @@ -2019,7 +2019,7 @@ Add - Add + Afegir apps/client/src/app/components/admin-overview/admin-overview.html 243 @@ -2031,7 +2031,7 @@ Housekeeping - Housekeeping + Ordre apps/client/src/app/components/admin-overview/admin-overview.html 251 @@ -2039,7 +2039,7 @@ Flush Cache - Flush Cache + Depurar el Cache apps/client/src/app/components/admin-overview/admin-overview.html 255 @@ -2047,7 +2047,7 @@ Add Platform - Add Platform + Afegeix Plataforma apps/client/src/app/components/admin-platform/admin-platform.component.html 11 @@ -2055,7 +2055,7 @@ Accounts - Accounts + Comptes apps/client/src/app/components/admin-platform/admin-platform.component.html 65 @@ -2087,7 +2087,7 @@ Do you really want to delete this platform? - Do you really want to delete this platform? + Està segur que vol eliminar aquesta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts 79 @@ -2095,7 +2095,7 @@ Update platform - Update platform + Actualitzar plataforma apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 8 @@ -2103,7 +2103,7 @@ Add platform - Add platform + Afegeix una plataforma apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html 10 @@ -2111,7 +2111,7 @@ Platforms - Platforms + Plataformes apps/client/src/app/components/admin-settings/admin-settings.component.html 4 @@ -2119,7 +2119,7 @@ Tags - Tags + Etiquetes apps/client/src/app/components/admin-settings/admin-settings.component.html 10 @@ -2139,7 +2139,7 @@ Add Tag - Add Tag + Afegir Etiqueta apps/client/src/app/components/admin-tag/admin-tag.component.html 11 @@ -2147,7 +2147,7 @@ Do you really want to delete this tag? - Do you really want to delete this tag? + Està segur que vol eliminar aquesta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts 79 @@ -2155,7 +2155,7 @@ Update tag - Update tag + Actualitzar etiqueta apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 8 @@ -2163,7 +2163,7 @@ Add tag - Add tag + Afegir etiqueta apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 10 @@ -2171,7 +2171,7 @@ Do you really want to delete this user? - Do you really want to delete this user? + Està segur que vol eliminar aquest usuari? apps/client/src/app/components/admin-users/admin-users.component.ts 113 @@ -2179,7 +2179,7 @@ User - User + Usuari apps/client/src/app/components/admin-users/admin-users.html 29 @@ -2187,7 +2187,7 @@ Registration - Registration + Registrar-se apps/client/src/app/components/admin-users/admin-users.html 97 @@ -2195,7 +2195,7 @@ Engagement per Day - Engagement per Day + Implicació per Dia apps/client/src/app/components/admin-users/admin-users.html 157 @@ -2203,7 +2203,7 @@ Last Request - Last Request + Última Solicitut apps/client/src/app/components/admin-users/admin-users.html 181 @@ -2211,7 +2211,7 @@ Impersonate User - Impersonate User + Actuar com un altre Usuari apps/client/src/app/components/admin-users/admin-users.html 218 @@ -2219,7 +2219,7 @@ Delete User - Delete User + Eliminar Usuari apps/client/src/app/components/admin-users/admin-users.html 229 @@ -2227,7 +2227,7 @@ Performance - Performance + Rendiment apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html 6 @@ -2243,7 +2243,7 @@ Compare with... - Compare with... + Comparar amb... apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html 18 @@ -2251,7 +2251,7 @@ Manage Benchmarks - Manage Benchmarks + Gestionar els Punts de Referència apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html 35 @@ -2259,7 +2259,7 @@ Portfolio - Portfolio + Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 116 @@ -2271,7 +2271,7 @@ Benchmark - Benchmark + Punt de Referència apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 128 @@ -2279,7 +2279,7 @@ Current Market Mood - Current Market Mood + Sentiment del Mercat apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html 12 @@ -2287,7 +2287,7 @@ Overview - Overview + Visió General apps/client/src/app/components/header/header.component.html 28 @@ -2299,7 +2299,7 @@ Portfolio - Portfolio + Portfolio apps/client/src/app/components/header/header.component.html 41 @@ -2311,7 +2311,7 @@ Admin Control - Admin Control + Panell d'Administració apps/client/src/app/components/header/header.component.html 68 @@ -2323,7 +2323,7 @@ Upgrade Plan - Upgrade Plan + Millora la teva Subscripció apps/client/src/app/components/header/header.component.html 178 @@ -2343,7 +2343,7 @@ Renew Plan - Renew Plan + Renova la teva Subscripció apps/client/src/app/components/header/header.component.html 183 @@ -2359,7 +2359,7 @@ Me - Me + Tu apps/client/src/app/components/header/header.component.html 203 @@ -2367,7 +2367,7 @@ User - User + Usuari apps/client/src/app/components/header/header.component.html 221 @@ -2375,7 +2375,7 @@ My Ghostfolio - My Ghostfolio + El meu Ghostfolio apps/client/src/app/components/header/header.component.html 262 @@ -2383,7 +2383,7 @@ About Ghostfolio - About Ghostfolio + Sobre Ghostfolio apps/client/src/app/components/header/header.component.html 303 @@ -2395,7 +2395,7 @@ Sign in - Sign in + Iniciar Sessió apps/client/src/app/components/header/header.component.html 394 @@ -2407,7 +2407,7 @@ Get started - Get started + Primers Passos apps/client/src/app/components/header/header.component.html 404 @@ -2415,7 +2415,7 @@ Oops! Incorrect Security Token. - Oops! Incorrect Security Token. + Oooh! El testimoni de seguretat és incorrecte. apps/client/src/app/components/header/header.component.ts 243 @@ -2427,7 +2427,7 @@ Change with currency effect - Change with currency effect + Canvia amb els efectes de la divisa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 53 @@ -2435,7 +2435,7 @@ Change - Change + Canvia apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 65 @@ -2447,7 +2447,7 @@ Performance with currency effect - Performance with currency effect + Rendiment amb els efectes de la divisa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 81 @@ -2455,7 +2455,7 @@ Average Unit Price - Average Unit Price + Preu Mig per Unitat apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 103 @@ -2463,7 +2463,7 @@ Minimum Price - Minimum Price + Preu Mínim apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 130 @@ -2471,7 +2471,7 @@ Maximum Price - Maximum Price + Preu Màxim apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 146 @@ -2479,7 +2479,7 @@ Quantity - Quantity + Quantitat apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 156 @@ -2495,7 +2495,7 @@ Investment - Investment + Inversió apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 168 @@ -2507,7 +2507,7 @@ Dividend - Dividend + Dividend apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 181 @@ -2531,7 +2531,7 @@ Dividend Yield - Dividend Yield + Rendiment del Dividend apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 191 @@ -2539,7 +2539,7 @@ Fees - Fees + Comissions apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 203 @@ -2555,7 +2555,7 @@ Activity - Activity + Activitat apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 223 @@ -2563,7 +2563,7 @@ Report Data Glitch - Report Data Glitch + Informar d'un Problema amb les Dades apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 399 @@ -2571,7 +2571,7 @@ Active - Active + en Actiiu apps/client/src/app/components/home-holdings/home-holdings.component.ts 36 @@ -2579,7 +2579,7 @@ Closed - Closed + Finalitzat apps/client/src/app/components/home-holdings/home-holdings.component.ts 37 @@ -2587,7 +2587,7 @@ Table - Table + Taula apps/client/src/app/components/home-holdings/home-holdings.html 17 @@ -2595,7 +2595,7 @@ Chart - Chart + Gràfic apps/client/src/app/components/home-holdings/home-holdings.html 20 @@ -2603,7 +2603,7 @@ Manage Activities - Manage Activities + Gestionar Activitats apps/client/src/app/components/home-holdings/home-holdings.html 60 @@ -2611,7 +2611,7 @@ Fear - Fear + Por apps/client/src/app/components/home-market/home-market.component.ts 27 @@ -2623,7 +2623,7 @@ Greed - Greed + Cobdícia apps/client/src/app/components/home-market/home-market.component.ts 28 @@ -2635,7 +2635,7 @@ Last Days - Last Days + Últims Dies apps/client/src/app/components/home-market/home-market.html 7 @@ -2643,7 +2643,7 @@ Welcome to Ghostfolio - Welcome to Ghostfolio + Benvingut a Ghostfolio apps/client/src/app/components/home-overview/home-overview.html 7 @@ -2651,7 +2651,7 @@ Ready to take control of your personal finances? - Ready to take control of your personal finances? + Estàs preparat per controlar les teves finances personals? apps/client/src/app/components/home-overview/home-overview.html 8 @@ -2659,7 +2659,7 @@ Setup your accounts - Setup your accounts + Configura els teus comptes apps/client/src/app/components/home-overview/home-overview.html 15 @@ -6475,7 +6475,7 @@ Equity - Equity + Patrimoni libs/ui/src/lib/i18n.ts 42 @@ -6679,4 +6679,4 @@ - \ No newline at end of file + From fcc2ab1a481b7ed47a5860680e949ed31129ae03 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 31 Jul 2024 19:18:50 +0200 Subject: [PATCH 02/16] Feature/change color assignment by annualized performance in treemap chart (#3617) * Change color assignment to annualized performance * Update changelog --- CHANGELOG.md | 1 + .../app/portfolio/portfolio.service.spec.ts | 78 ------------------- .../src/app/portfolio/portfolio.service.ts | 29 ++----- .../common/src/lib/calculation-helper.spec.ts | 50 ++++++++++++ libs/common/src/lib/calculation-helper.ts | 20 +++++ .../treemap-chart/treemap-chart.component.ts | 55 ++++++++++--- 6 files changed, 121 insertions(+), 112 deletions(-) delete mode 100644 apps/api/src/app/portfolio/portfolio.service.spec.ts create mode 100644 libs/common/src/lib/calculation-helper.spec.ts create mode 100644 libs/common/src/lib/calculation-helper.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e261220d..7155cc66e 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 color assignment in the chart of the holdings tab on the home page (experimental) - Improved the language localization for Catalan (`ca`) ## 2.99.0 - 2024-07-29 diff --git a/apps/api/src/app/portfolio/portfolio.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts deleted file mode 100644 index 92970f547..000000000 --- a/apps/api/src/app/portfolio/portfolio.service.spec.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Big } from 'big.js'; - -import { PortfolioService } from './portfolio.service'; - -describe('PortfolioService', () => { - let portfolioService: PortfolioService; - - beforeAll(async () => { - portfolioService = new PortfolioService( - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ); - }); - - describe('annualized performance percentage', () => { - it('Get annualized performance', async () => { - expect( - portfolioService - .getAnnualizedPerformancePercent({ - daysInMarket: NaN, // differenceInDays of date-fns returns NaN for the same day - netPerformancePercentage: new Big(0) - }) - .toNumber() - ).toEqual(0); - - expect( - portfolioService - .getAnnualizedPerformancePercent({ - daysInMarket: 0, - netPerformancePercentage: new Big(0) - }) - .toNumber() - ).toEqual(0); - - /** - * Source: https://www.readyratios.com/reference/analysis/annualized_rate.html - */ - expect( - portfolioService - .getAnnualizedPerformancePercent({ - daysInMarket: 65, // < 1 year - netPerformancePercentage: new Big(0.1025) - }) - .toNumber() - ).toBeCloseTo(0.729705); - - expect( - portfolioService - .getAnnualizedPerformancePercent({ - daysInMarket: 365, // 1 year - netPerformancePercentage: new Big(0.05) - }) - .toNumber() - ).toBeCloseTo(0.05); - - /** - * Source: https://www.investopedia.com/terms/a/annualized-total-return.asp#annualized-return-formula-and-calculation - */ - expect( - portfolioService - .getAnnualizedPerformancePercent({ - daysInMarket: 575, // > 1 year - netPerformancePercentage: new Big(0.2374) - }) - .toNumber() - ).toBeCloseTo(0.145); - }); - }); -}); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index b5443c9cd..368c04595 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -18,6 +18,7 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; +import { getAnnualizedPerformancePercent } from '@ghostfolio/common/calculation-helper'; import { DEFAULT_CURRENCY, EMERGENCY_FUND_TAG_ID, @@ -70,7 +71,7 @@ import { parseISO, set } from 'date-fns'; -import { isEmpty, isNumber, last, uniq, uniqBy } from 'lodash'; +import { isEmpty, uniq, uniqBy } from 'lodash'; import { PortfolioCalculator } from './calculator/portfolio-calculator'; import { @@ -206,24 +207,6 @@ export class PortfolioService { }; } - public getAnnualizedPerformancePercent({ - daysInMarket, - netPerformancePercentage - }: { - daysInMarket: number; - netPerformancePercentage: Big; - }): Big { - if (isNumber(daysInMarket) && daysInMarket > 0) { - const exponent = new Big(365).div(daysInMarket).toNumber(); - - return new Big( - Math.pow(netPerformancePercentage.plus(1).toNumber(), exponent) - ).minus(1); - } - - return new Big(0); - } - public async getDividends({ activities, groupBy @@ -713,7 +696,7 @@ export class PortfolioService { return Account; }); - const dividendYieldPercent = this.getAnnualizedPerformancePercent({ + const dividendYieldPercent = getAnnualizedPerformancePercent({ daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), netPerformancePercentage: timeWeightedInvestment.eq(0) ? new Big(0) @@ -721,7 +704,7 @@ export class PortfolioService { }); const dividendYieldPercentWithCurrencyEffect = - this.getAnnualizedPerformancePercent({ + getAnnualizedPerformancePercent({ daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), netPerformancePercentage: timeWeightedInvestmentWithCurrencyEffect.eq( 0 @@ -1724,13 +1707,13 @@ export class PortfolioService { const daysInMarket = differenceInDays(new Date(), firstOrderDate); - const annualizedPerformancePercent = this.getAnnualizedPerformancePercent({ + const annualizedPerformancePercent = getAnnualizedPerformancePercent({ daysInMarket, netPerformancePercentage: new Big(netPerformancePercentage) })?.toNumber(); const annualizedPerformancePercentWithCurrencyEffect = - this.getAnnualizedPerformancePercent({ + getAnnualizedPerformancePercent({ daysInMarket, netPerformancePercentage: new Big( netPerformancePercentageWithCurrencyEffect diff --git a/libs/common/src/lib/calculation-helper.spec.ts b/libs/common/src/lib/calculation-helper.spec.ts new file mode 100644 index 000000000..69621ec0a --- /dev/null +++ b/libs/common/src/lib/calculation-helper.spec.ts @@ -0,0 +1,50 @@ +import { Big } from 'big.js'; + +import { getAnnualizedPerformancePercent } from './calculation-helper'; + +describe('CalculationHelper', () => { + describe('annualized performance percentage', () => { + it('Get annualized performance', async () => { + expect( + getAnnualizedPerformancePercent({ + daysInMarket: NaN, // differenceInDays of date-fns returns NaN for the same day + netPerformancePercentage: new Big(0) + }).toNumber() + ).toEqual(0); + + expect( + getAnnualizedPerformancePercent({ + daysInMarket: 0, + netPerformancePercentage: new Big(0) + }).toNumber() + ).toEqual(0); + + /** + * Source: https://www.readyratios.com/reference/analysis/annualized_rate.html + */ + expect( + getAnnualizedPerformancePercent({ + daysInMarket: 65, // < 1 year + netPerformancePercentage: new Big(0.1025) + }).toNumber() + ).toBeCloseTo(0.729705); + + expect( + getAnnualizedPerformancePercent({ + daysInMarket: 365, // 1 year + netPerformancePercentage: new Big(0.05) + }).toNumber() + ).toBeCloseTo(0.05); + + /** + * Source: https://www.investopedia.com/terms/a/annualized-total-return.asp#annualized-return-formula-and-calculation + */ + expect( + getAnnualizedPerformancePercent({ + daysInMarket: 575, // > 1 year + netPerformancePercentage: new Big(0.2374) + }).toNumber() + ).toBeCloseTo(0.145); + }); + }); +}); diff --git a/libs/common/src/lib/calculation-helper.ts b/libs/common/src/lib/calculation-helper.ts new file mode 100644 index 000000000..7d2ec9099 --- /dev/null +++ b/libs/common/src/lib/calculation-helper.ts @@ -0,0 +1,20 @@ +import { Big } from 'big.js'; +import { isNumber } from 'lodash'; + +export function getAnnualizedPerformancePercent({ + daysInMarket, + netPerformancePercentage +}: { + daysInMarket: number; + netPerformancePercentage: Big; +}): Big { + if (isNumber(daysInMarket) && daysInMarket > 0) { + const exponent = new Big(365).div(daysInMarket).toNumber(); + + return new Big( + Math.pow(netPerformancePercentage.plus(1).toNumber(), exponent) + ).minus(1); + } + + return new Big(0); +} diff --git a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts index 9ee6a7aeb..3c1b3d540 100644 --- a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts +++ b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -1,3 +1,4 @@ +import { getAnnualizedPerformancePercent } from '@ghostfolio/common/calculation-helper'; import { PortfolioPosition, UniqueAsset } from '@ghostfolio/common/interfaces'; import { CommonModule } from '@angular/common'; @@ -14,10 +15,12 @@ import { ViewChild } from '@angular/core'; import { DataSource } from '@prisma/client'; +import { Big } from 'big.js'; import { ChartConfiguration } from 'chart.js'; import { LinearScale } from 'chart.js'; import { Chart } from 'chart.js'; import { TreemapController, TreemapElement } from 'chartjs-chart-treemap'; +import { differenceInDays } from 'date-fns'; import { orderBy } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -41,6 +44,8 @@ export class GfTreemapChartComponent @ViewChild('chartCanvas') chartCanvas: ElementRef; + public static readonly HEAT_MULTIPLIER = 5; + public chart: Chart<'treemap'>; public isLoading = true; @@ -71,24 +76,52 @@ export class GfTreemapChartComponent datasets: [ { backgroundColor(ctx) { - const netPerformancePercentWithCurrencyEffect = - ctx.raw._data.netPerformancePercentWithCurrencyEffect; - - if (netPerformancePercentWithCurrencyEffect > 0.03) { + const annualizedNetPerformancePercentWithCurrencyEffect = + getAnnualizedPerformancePercent({ + daysInMarket: differenceInDays( + new Date(), + ctx.raw._data.dateOfFirstActivity + ), + netPerformancePercentage: new Big( + ctx.raw._data.netPerformancePercentWithCurrencyEffect + ) + }).toNumber(); + + if ( + annualizedNetPerformancePercentWithCurrencyEffect > + 0.03 * GfTreemapChartComponent.HEAT_MULTIPLIER + ) { return green[9]; - } else if (netPerformancePercentWithCurrencyEffect > 0.02) { + } else if ( + annualizedNetPerformancePercentWithCurrencyEffect > + 0.02 * GfTreemapChartComponent.HEAT_MULTIPLIER + ) { return green[7]; - } else if (netPerformancePercentWithCurrencyEffect > 0.01) { + } else if ( + annualizedNetPerformancePercentWithCurrencyEffect > + 0.01 * GfTreemapChartComponent.HEAT_MULTIPLIER + ) { return green[5]; - } else if (netPerformancePercentWithCurrencyEffect > 0) { + } else if (annualizedNetPerformancePercentWithCurrencyEffect > 0) { return green[3]; - } else if (netPerformancePercentWithCurrencyEffect === 0) { + } else if ( + annualizedNetPerformancePercentWithCurrencyEffect === 0 + ) { return gray[3]; - } else if (netPerformancePercentWithCurrencyEffect > -0.01) { + } else if ( + annualizedNetPerformancePercentWithCurrencyEffect > + -0.01 * GfTreemapChartComponent.HEAT_MULTIPLIER + ) { return red[3]; - } else if (netPerformancePercentWithCurrencyEffect > -0.02) { + } else if ( + annualizedNetPerformancePercentWithCurrencyEffect > + -0.02 * GfTreemapChartComponent.HEAT_MULTIPLIER + ) { return red[5]; - } else if (netPerformancePercentWithCurrencyEffect > -0.03) { + } else if ( + annualizedNetPerformancePercentWithCurrencyEffect > + -0.03 * GfTreemapChartComponent.HEAT_MULTIPLIER + ) { return red[7]; } else { return red[9]; From c87b08ca8b8815b3dbb698025c1f6d2f7e3ec92d Mon Sep 17 00:00:00 2001 From: David Requeno <108202767+DavidReque@users.noreply.github.com> Date: Thu, 1 Aug 2024 12:28:42 -0600 Subject: [PATCH 03/16] Feature/improve language localization for es (#3625) * Update translations * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.es.xlf | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7155cc66e..30dd1f3a5 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 - Improved the color assignment in the chart of the holdings tab on the home page (experimental) - Improved the language localization for Catalan (`ca`) +- Improved the language localization for Spanish (`es`) ## 2.99.0 - 2024-07-29 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 284876006..a2736f959 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -3652,7 +3652,7 @@ Fully managed Ghostfolio cloud offering. - Fully managed Ghostfolio cloud offering. + Oferta en la nube de Ghostfolio totalmente administrada. apps/client/src/app/pages/pricing/pricing-page.html 152 @@ -3664,7 +3664,7 @@ For ambitious investors who need the full picture of their financial assets. - For ambitious investors who need the full picture of their financial assets. + Para inversores ambiciosos que necesitan una visión completa de sus activos financieros apps/client/src/app/pages/pricing/pricing-page.html 184 @@ -3672,7 +3672,7 @@ One-time payment, no auto-renewal. - One-time payment, no auto-renewal. + Pago único, sin renovación automática. apps/client/src/app/pages/pricing/pricing-page.html 280 @@ -3780,7 +3780,7 @@ Switch to Ghostfolio Premium or Ghostfolio Open Source easily - Switch to Ghostfolio Premium or Ghostfolio Open Source easily + Cambie a Ghostfolio Premium o Ghostfolio Open Source fácilmente libs/ui/src/lib/i18n.ts 10 @@ -3788,7 +3788,7 @@ Switch to Ghostfolio Open Source or Ghostfolio Basic easily - Switch to Ghostfolio Open Source or Ghostfolio Basic easily + Cambie a Ghostfolio Open Source o Ghostfolio Basic fácilmente libs/ui/src/lib/i18n.ts 12 @@ -3796,7 +3796,7 @@ Market data provided by - Market data provided by + Datos de mercado proporcionados por libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html 2 From 02db0db733183931a8836f9a5d4f8bbeb8aa9750 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 2 Aug 2024 20:27:58 +0200 Subject: [PATCH 04/16] Feature/persist view mode of holdings tab on home page (#3624) * Persist view mode of holdings in user settings * Update changelog --- CHANGELOG.md | 1 + .../src/app/user/update-user-setting.dto.ts | 5 +++ apps/api/src/app/user/user.service.ts | 5 ++- .../home-holdings/home-holdings.component.ts | 40 ++++++++++++++++--- .../lib/interfaces/user-settings.interface.ts | 8 +++- .../src/lib/types/holding-view-mode.type.ts | 1 - .../src/lib/types/holdings-view-mode.type.ts | 1 + libs/common/src/lib/types/index.ts | 4 +- 8 files changed, 55 insertions(+), 10 deletions(-) delete mode 100644 libs/common/src/lib/types/holding-view-mode.type.ts create mode 100644 libs/common/src/lib/types/holdings-view-mode.type.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 30dd1f3a5..805821d7c 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 - Improved the color assignment in the chart of the holdings tab on the home page (experimental) +- Persisted the view mode of the holdings tab on the home page (experimental) - Improved the language localization for Catalan (`ca`) - Improved the language localization for Spanish (`es`) diff --git a/apps/api/src/app/user/update-user-setting.dto.ts b/apps/api/src/app/user/update-user-setting.dto.ts index 1fc02ff4d..78e6c27a9 100644 --- a/apps/api/src/app/user/update-user-setting.dto.ts +++ b/apps/api/src/app/user/update-user-setting.dto.ts @@ -2,6 +2,7 @@ import { IsCurrencyCode } from '@ghostfolio/api/validators/is-currency-code'; import type { ColorScheme, DateRange, + HoldingsViewMode, ViewMode } from '@ghostfolio/common/types'; @@ -66,6 +67,10 @@ export class UpdateUserSettingDto { @IsOptional() 'filters.tags'?: string[]; + @IsIn(['CHART', 'TABLE']) + @IsOptional() + holdingsViewMode?: HoldingsViewMode; + @IsBoolean() @IsOptional() isExperimentalFeatures?: boolean; diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 02a65b6a0..7aa1dbbe8 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -190,7 +190,7 @@ export class UserService { (user.Settings.settings as UserSettings).dateRange = (user.Settings.settings as UserSettings).viewMode === 'ZEN' ? 'max' - : (user.Settings.settings as UserSettings)?.dateRange ?? 'max'; + : ((user.Settings.settings as UserSettings)?.dateRange ?? 'max'); // Set default value for view mode if (!(user.Settings.settings as UserSettings).viewMode) { @@ -243,6 +243,9 @@ export class UserService { // Reset benchmark user.Settings.settings.benchmark = undefined; + + // Reset holdings view mode + user.Settings.settings.holdingsViewMode = undefined; } else if (user.subscription?.type === 'Premium') { currentPermissions.push(permissions.reportDataGlitch); diff --git a/apps/client/src/app/components/home-holdings/home-holdings.component.ts b/apps/client/src/app/components/home-holdings/home-holdings.component.ts index 3b99adb06..dca8bbe55 100644 --- a/apps/client/src/app/components/home-holdings/home-holdings.component.ts +++ b/apps/client/src/app/components/home-holdings/home-holdings.component.ts @@ -9,7 +9,7 @@ import { import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { HoldingType, - HoldingViewMode, + HoldingsViewMode, ToggleOption } from '@ghostfolio/common/types'; @@ -18,7 +18,7 @@ import { FormControl } from '@angular/forms'; import { Router } from '@angular/router'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; +import { skip, takeUntil } from 'rxjs/operators'; @Component({ selector: 'gf-home-holdings', @@ -26,6 +26,8 @@ import { takeUntil } from 'rxjs/operators'; templateUrl: './home-holdings.html' }) export class HomeHoldingsComponent implements OnDestroy, OnInit { + public static DEFAULT_HOLDINGS_VIEW_MODE: HoldingsViewMode = 'TABLE'; + public deviceType: string; public hasImpersonationId: boolean; public hasPermissionToAccessHoldingsChart: boolean; @@ -37,7 +39,9 @@ export class HomeHoldingsComponent implements OnDestroy, OnInit { { label: $localize`Closed`, value: 'CLOSED' } ]; public user: User; - public viewModeFormControl = new FormControl('TABLE'); + public viewModeFormControl = new FormControl( + HomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE + ); private unsubscribeSubject = new Subject(); @@ -81,6 +85,21 @@ export class HomeHoldingsComponent implements OnDestroy, OnInit { this.changeDetectorRef.markForCheck(); } }); + + this.viewModeFormControl.valueChanges + .pipe( + // Skip inizialization: "new FormControl" + skip(1), + takeUntil(this.unsubscribeSubject) + ) + .subscribe((holdingsViewMode) => { + this.dataService + .putUserSetting({ holdingsViewMode }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + this.userService.remove(); + }); + }); } public onChangeHoldingType(aHoldingType: HoldingType) { @@ -122,9 +141,20 @@ export class HomeHoldingsComponent implements OnDestroy, OnInit { this.hasPermissionToAccessHoldingsChart && this.holdingType === 'ACTIVE' ) { - this.viewModeFormControl.enable(); + this.viewModeFormControl.enable({ emitEvent: false }); + + this.viewModeFormControl.setValue( + this.deviceType === 'mobile' + ? HomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE + : this.user?.settings?.holdingsViewMode || + HomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE, + { emitEvent: false } + ); } else if (this.holdingType === 'CLOSED') { - this.viewModeFormControl.setValue('TABLE'); + this.viewModeFormControl.setValue( + HomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE, + { emitEvent: false } + ); } this.holdings = undefined; diff --git a/libs/common/src/lib/interfaces/user-settings.interface.ts b/libs/common/src/lib/interfaces/user-settings.interface.ts index a0599d132..5c88e3f4b 100644 --- a/libs/common/src/lib/interfaces/user-settings.interface.ts +++ b/libs/common/src/lib/interfaces/user-settings.interface.ts @@ -1,4 +1,9 @@ -import { ColorScheme, DateRange, ViewMode } from '@ghostfolio/common/types'; +import { + ColorScheme, + DateRange, + HoldingsViewMode, + ViewMode +} from '@ghostfolio/common/types'; export interface UserSettings { annualInterestRate?: number; @@ -9,6 +14,7 @@ export interface UserSettings { emergencyFund?: number; 'filters.accounts'?: string[]; 'filters.tags'?: string[]; + holdingsViewMode?: HoldingsViewMode; isExperimentalFeatures?: boolean; isRestrictedView?: boolean; language?: string; diff --git a/libs/common/src/lib/types/holding-view-mode.type.ts b/libs/common/src/lib/types/holding-view-mode.type.ts deleted file mode 100644 index 50a4e2b29..000000000 --- a/libs/common/src/lib/types/holding-view-mode.type.ts +++ /dev/null @@ -1 +0,0 @@ -export type HoldingViewMode = 'CHART' | 'TABLE'; diff --git a/libs/common/src/lib/types/holdings-view-mode.type.ts b/libs/common/src/lib/types/holdings-view-mode.type.ts new file mode 100644 index 000000000..7b5d0a09c --- /dev/null +++ b/libs/common/src/lib/types/holdings-view-mode.type.ts @@ -0,0 +1 @@ +export type HoldingsViewMode = 'CHART' | 'TABLE'; diff --git a/libs/common/src/lib/types/index.ts b/libs/common/src/lib/types/index.ts index 65fdfe5f0..68d4a2ec4 100644 --- a/libs/common/src/lib/types/index.ts +++ b/libs/common/src/lib/types/index.ts @@ -8,7 +8,7 @@ import type { DateRange } from './date-range.type'; import type { Granularity } from './granularity.type'; import type { GroupBy } from './group-by.type'; import type { HoldingType } from './holding-type.type'; -import type { HoldingViewMode } from './holding-view-mode.type'; +import type { HoldingsViewMode } from './holdings-view-mode.type'; import type { MarketAdvanced } from './market-advanced.type'; import type { MarketDataPreset } from './market-data-preset.type'; import type { MarketState } from './market-state.type'; @@ -31,7 +31,7 @@ export type { Granularity, GroupBy, HoldingType, - HoldingViewMode, + HoldingsViewMode, Market, MarketAdvanced, MarketDataPreset, From a500fb72c5e8d0e435f9c19f77cbca0761bab1dd Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 2 Aug 2024 20:57:03 +0200 Subject: [PATCH 05/16] Feature/refactor Angular Material theme (#3629) --- apps/client/src/styles/theme.scss | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/client/src/styles/theme.scss b/apps/client/src/styles/theme.scss index bc4d7b73d..40a872c72 100644 --- a/apps/client/src/styles/theme.scss +++ b/apps/client/src/styles/theme.scss @@ -73,40 +73,40 @@ $gf-secondary: ( $gf-typography: mat.m2-define-typography-config(); -@include mat.core(); - // Create default theme $gf-theme-default: mat.m2-define-light-theme( ( color: ( - primary: mat.m2-define-palette($gf-primary), - accent: mat.m2-define-palette($gf-secondary, 500, 900, A100) + accent: mat.m2-define-palette($gf-secondary, 500, 900, A100), + primary: mat.m2-define-palette($gf-primary) ), density: -3, typography: $gf-typography ) ); + @include mat.all-component-themes($gf-theme-default); -@include mat.button-density(0); -@include mat.table-density(-1); // Create dark theme $gf-theme-dark: mat.m2-define-dark-theme( ( color: ( - primary: mat.m2-define-palette($gf-primary), - accent: mat.m2-define-palette($gf-secondary, 500, 900, A100) + accent: mat.m2-define-palette($gf-secondary, 500, 900, A100), + primary: mat.m2-define-palette($gf-primary) ), density: -3, typography: $gf-typography ) ); + .is-dark-theme { @include mat.all-component-colors($gf-theme-dark); - @include mat.button-density(0); - @include mat.table-density(-1); } +@include mat.button-density(0); +@include mat.core(); +@include mat.table-density(-1); + :root { --gf-theme-alpha-hover: 0.04; --gf-theme-primary-500: #36cfcc; From 2fa723dc3cc8535fcde545758f3ba83d98e2cc22 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 3 Aug 2024 15:42:21 +0200 Subject: [PATCH 06/16] Bugfix/fix language selector of user account settings (#3613) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix value of Català --- .../user-account-settings/user-account-settings.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.html b/apps/client/src/app/components/user-account-settings/user-account-settings.html index 5ec0e75a1..8b512ce3f 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.html +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -70,16 +70,16 @@ " > + Deutsch + English @if (user?.settings?.isExperimentalFeatures) { } - Deutsch - English @if (user?.settings?.isExperimentalFeatures) { Chinese (Community Date: Sat, 3 Aug 2024 15:46:01 +0200 Subject: [PATCH 07/16] Feature/manage tags of holdings (#3630) * Manage tags of holdings * Update changelog --- CHANGELOG.md | 4 + apps/api/src/app/order/order.service.ts | 33 +++++++ .../src/app/portfolio/portfolio.controller.ts | 59 +++++++++--- .../src/app/portfolio/portfolio.service.ts | 21 +++- .../app/portfolio/update-holding-tags.dto.ts | 7 ++ apps/client/src/app/app.component.ts | 4 + .../holding-detail-dialog.component.ts | 95 ++++++++++++++++++- .../holding-detail-dialog.html | 46 ++++++++- .../interfaces/interfaces.ts | 1 + ...ate-or-update-activity-dialog.component.ts | 19 ++-- .../create-or-update-activity-dialog.html | 6 +- apps/client/src/app/services/data.service.ts | 14 ++- 12 files changed, 279 insertions(+), 30 deletions(-) create mode 100644 apps/api/src/app/portfolio/update-holding-tags.dto.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 805821d7c..d8666cb74 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 + +- Added support to manage tags of holdings in the holding detail dialog + ### Changed - Improved the color assignment in the chart of the holdings tab on the home page (experimental) diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index b743eb2b7..f7be3ba00 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -46,6 +46,39 @@ export class OrderService { private readonly symbolProfileService: SymbolProfileService ) {} + public async assignTags({ + dataSource, + symbol, + tags, + userId + }: { tags: Tag[]; userId: string } & UniqueAsset) { + const orders = await this.prismaService.order.findMany({ + where: { + userId, + SymbolProfile: { + dataSource, + symbol + } + } + }); + + return Promise.all( + orders.map(({ id }) => + this.prismaService.order.update({ + data: { + tags: { + // The set operation replaces all existing connections with the provided ones + set: tags.map(({ id }) => { + return { id }; + }) + } + }, + where: { id } + }) + ) + ); + } + public async createOrder( data: Prisma.OrderCreateInput & { accountId?: string; diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 84d4ef532..3c7993c61 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -1,6 +1,7 @@ import { AccessService } from '@ghostfolio/api/app/access/access.service'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { hasNotDefinedValuesInObject, @@ -29,7 +30,8 @@ import { } from '@ghostfolio/common/interfaces'; import { hasReadRestrictedAccessPermission, - isRestrictedView + isRestrictedView, + permissions } from '@ghostfolio/common/permissions'; import type { DateRange, @@ -38,12 +40,14 @@ import type { } from '@ghostfolio/common/types'; import { + Body, Controller, Get, Headers, HttpException, Inject, Param, + Put, Query, UseGuards, UseInterceptors, @@ -51,12 +55,13 @@ import { } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; -import { AssetClass, AssetSubClass } from '@prisma/client'; +import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; import { Big } from 'big.js'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { PortfolioHoldingDetail } from './interfaces/portfolio-holding-detail.interface'; import { PortfolioService } from './portfolio.service'; +import { UpdateHoldingTagsDto } from './update-holding-tags.dto'; @Controller('portfolio') export class PortfolioController { @@ -566,23 +571,23 @@ export class PortfolioController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getPosition( @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, - @Param('dataSource') dataSource, - @Param('symbol') symbol + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string ): Promise { - const position = await this.portfolioService.getPosition( + const holding = await this.portfolioService.getPosition( dataSource, impersonationId, symbol ); - if (position) { - return position; + if (!holding) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); } - throw new HttpException( - getReasonPhrase(StatusCodes.NOT_FOUND), - StatusCodes.NOT_FOUND - ); + return holding; } @Get('report') @@ -605,4 +610,36 @@ export class PortfolioController { return report; } + + @HasPermission(permissions.updateOrder) + @Put('position/:dataSource/:symbol/tags') + @UseInterceptors(TransformDataSourceInRequestInterceptor) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async updateHoldingTags( + @Body() data: UpdateHoldingTagsDto, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + const holding = await this.portfolioService.getPosition( + dataSource, + impersonationId, + symbol + ); + + if (!holding) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + await this.portfolioService.updateTags({ + dataSource, + impersonationId, + symbol, + tags: data.tags, + userId: this.request.user.id + }); + } } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 368c04595..67529cc67 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -59,7 +59,8 @@ import { DataSource, Order, Platform, - Prisma + Prisma, + Tag } from '@prisma/client'; import { Big } from 'big.js'; import { @@ -1304,6 +1305,24 @@ export class PortfolioService { }; } + public async updateTags({ + dataSource, + impersonationId, + symbol, + tags, + userId + }: { + dataSource: DataSource; + impersonationId: string; + symbol: string; + tags: Tag[]; + userId: string; + }) { + userId = await this.getUserId(impersonationId, userId); + + await this.orderService.assignTags({ dataSource, symbol, tags, userId }); + } + private async getCashPositions({ cashDetails, userCurrency, diff --git a/apps/api/src/app/portfolio/update-holding-tags.dto.ts b/apps/api/src/app/portfolio/update-holding-tags.dto.ts new file mode 100644 index 000000000..11efe189d --- /dev/null +++ b/apps/api/src/app/portfolio/update-holding-tags.dto.ts @@ -0,0 +1,7 @@ +import { Tag } from '@prisma/client'; +import { IsArray } from 'class-validator'; + +export class UpdateHoldingTagsDto { + @IsArray() + tags: Tag[]; +} diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 08cc915bd..4f1464408 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -259,6 +259,10 @@ export class AppComponent implements OnDestroy, OnInit { this.user?.permissions, permissions.reportDataGlitch ), + hasPermissionToUpdateOrder: + !this.hasImpersonationId && + hasPermission(this.user?.permissions, permissions.updateOrder) && + !user?.settings?.isRestrictedView, locale: this.user?.settings?.locale }, height: this.deviceType === 'mobile' ? '97.5vh' : '80vh', 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 3ed2f13a5..5673cd0c0 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 @@ -19,16 +19,24 @@ import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; import { GfValueComponent } from '@ghostfolio/ui/value'; +import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Component, + ElementRef, Inject, OnDestroy, - OnInit + OnInit, + ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { + MatAutocompleteModule, + MatAutocompleteSelectedEvent +} from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatChipsModule } from '@angular/material/chips'; import { @@ -36,14 +44,15 @@ import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { SortDirection } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { MatTabsModule } from '@angular/material/tabs'; import { Account, Tag } from '@prisma/client'; import { format, isSameMonth, isToday, parseISO } from 'date-fns'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; +import { Observable, of, Subject } from 'rxjs'; +import { map, startWith, takeUntil } from 'rxjs/operators'; import { HoldingDetailDialogParams } from './interfaces/interfaces'; @@ -60,9 +69,11 @@ import { HoldingDetailDialogParams } from './interfaces/interfaces'; GfLineChartComponent, GfPortfolioProportionChartComponent, GfValueComponent, + MatAutocompleteModule, MatButtonModule, MatChipsModule, MatDialogModule, + MatFormFieldModule, MatTabsModule, NgxSkeletonLoaderModule ], @@ -73,6 +84,9 @@ import { HoldingDetailDialogParams } from './interfaces/interfaces'; templateUrl: 'holding-detail-dialog.html' }) export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { + @ViewChild('tagInput') tagInput: ElementRef; + + public activityForm: FormGroup; public accounts: Account[]; public activities: Activity[]; public assetClass: string; @@ -88,6 +102,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { public dividendInBaseCurrencyPrecision = 2; public dividendYieldPercentWithCurrencyEffect: number; public feeInBaseCurrency: number; + public filteredTagsObservable: Observable = of([]); public firstBuyDate: string; public historicalDataItems: LineChartItem[]; public investment: number; @@ -107,10 +122,12 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { public sectors: { [name: string]: { name: string; value: number }; }; + public separatorKeysCodes: number[] = [COMMA, ENTER]; public sortColumn = 'date'; public sortDirection: SortDirection = 'desc'; public SymbolProfile: EnhancedSymbolProfile; public tags: Tag[]; + public tagsAvailable: Tag[]; public totalItems: number; public transactionCount: number; public user: User; @@ -123,10 +140,38 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { private dataService: DataService, public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: HoldingDetailDialogParams, + private formBuilder: FormBuilder, private userService: UserService ) {} public ngOnInit() { + const { tags } = this.dataService.fetchInfo(); + + this.activityForm = this.formBuilder.group({ + tags: [] + }); + + this.tagsAvailable = tags.map(({ id, name }) => { + return { + id, + name: translate(name) + }; + }); + + this.activityForm + .get('tags') + .valueChanges.pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((tags) => { + this.dataService + .putHoldingTags({ + tags, + dataSource: this.data.dataSource, + symbol: this.data.symbol + }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(); + }); + this.dataService .fetchHoldingDetail({ dataSource: this.data.dataSource, @@ -248,12 +293,27 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { this.reportDataGlitchMail = `mailto:hi@ghostfol.io?Subject=Ghostfolio Data Glitch Report&body=Hello%0D%0DI would like to report a data glitch for%0D%0DSymbol: ${SymbolProfile?.symbol}%0DData Source: ${SymbolProfile?.dataSource}%0D%0DAdditional notes:%0D%0DCan you please take a look?%0D%0DKind regards`; this.sectors = {}; this.SymbolProfile = SymbolProfile; + this.tags = tags.map(({ id, name }) => { return { id, name: translate(name) }; }); + + this.activityForm.setValue({ tags: this.tags }, { emitEvent: false }); + + this.filteredTagsObservable = this.activityForm.controls[ + 'tags' + ].valueChanges.pipe( + startWith(this.activityForm.get('tags').value), + map((aTags: Tag[] | null) => { + return aTags + ? this.filterTags(aTags) + : this.tagsAvailable.slice(); + }) + ); + this.transactionCount = transactionCount; this.totalItems = transactionCount; this.value = value; @@ -353,6 +413,17 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { }); } + public onAddTag(event: MatAutocompleteSelectedEvent) { + this.activityForm.get('tags').setValue([ + ...(this.activityForm.get('tags').value ?? []), + this.tagsAvailable.find(({ id }) => { + return id === event.option.value; + }) + ]); + + this.tagInput.nativeElement.value = ''; + } + public onClose() { this.dialogRef.close(); } @@ -377,8 +448,26 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { }); } + public onRemoveTag(aTag: Tag) { + this.activityForm.get('tags').setValue( + this.activityForm.get('tags').value.filter(({ id }) => { + return id !== aTag.id; + }) + ); + } + public ngOnDestroy() { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); } + + private filterTags(aTags: Tag[]) { + const tagIds = aTags.map(({ id }) => { + return id; + }); + + return this.tagsAvailable.filter(({ id }) => { + return !tagIds.includes(id); + }); + } } diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index 9afeef709..b7474a7a3 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -325,7 +325,7 @@ @@ -375,7 +375,49 @@ - @if (tags?.length > 0) { +
+
+ + Tags + + @for (tag of activityForm.get('tags')?.value; track tag.id) { + + {{ tag.name }} + + + } + + + + @for (tag of filteredTagsObservable | async; track tag.id) { + + {{ tag.name }} + + } + + +
+
+ + @if (!data.hasPermissionToUpdateOrder && tagsAvailable?.length > 0) {
Tags
diff --git a/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts index c6cfce1ee..8178838ab 100644 --- a/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/holding-detail-dialog/interfaces/interfaces.ts @@ -9,6 +9,7 @@ export interface HoldingDetailDialogParams { deviceType: string; hasImpersonationId: boolean; hasPermissionToReportDataGlitch: boolean; + hasPermissionToUpdateOrder: boolean; locale: string; symbol: string; } 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 dedcdd4a9..323796bef 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 @@ -53,8 +53,8 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { public isToday = isToday; public mode: 'create' | 'update'; public platforms: { id: string; name: string }[]; - public separatorKeysCodes: number[] = [ENTER, COMMA]; - public tags: Tag[] = []; + public separatorKeysCodes: number[] = [COMMA, ENTER]; + public tagsAvailable: Tag[] = []; public total = 0; public typesTranslationMap = new Map(); public Validators = Validators; @@ -81,7 +81,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.currencies = currencies; this.defaultDateFormat = getDateFormatString(this.locale); this.platforms = platforms; - this.tags = tags.map(({ id, name }) => { + this.tagsAvailable = tags.map(({ id, name }) => { return { id, name: translate(name) @@ -287,7 +287,7 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { ].valueChanges.pipe( startWith(this.activityForm.get('tags').value), map((aTags: Tag[] | null) => { - return aTags ? this.filterTags(aTags) : this.tags.slice(); + return aTags ? this.filterTags(aTags) : this.tagsAvailable.slice(); }) ); @@ -441,10 +441,11 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { public onAddTag(event: MatAutocompleteSelectedEvent) { this.activityForm.get('tags').setValue([ ...(this.activityForm.get('tags').value ?? []), - this.tags.find(({ id }) => { + this.tagsAvailable.find(({ id }) => { return id === event.option.value; }) ]); + this.tagInput.nativeElement.value = ''; } @@ -518,12 +519,12 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { } private filterTags(aTags: Tag[]) { - const tagIds = aTags.map((tag) => { - return tag.id; + const tagIds = aTags.map(({ id }) => { + return id; }); - return this.tags.filter((tag) => { - return !tagIds.includes(tag.id); + return this.tagsAvailable.filter(({ id }) => { + return !tagIds.includes(id); }); } diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html index 56cb66fcd..7795688c0 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -378,11 +378,11 @@
-
+
Tags - @for (tag of activityForm.get('tags')?.value; track tag) { + @for (tag of activityForm.get('tags')?.value; track tag.id) { - @for (tag of filteredTagsObservable | async; track tag) { + @for (tag of filteredTagsObservable | async; track tag.id) { {{ tag.name }} diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 64e498d12..4f9fd7e20 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -47,7 +47,8 @@ import { SortDirection } from '@angular/material/sort'; import { AccountBalance, DataSource, - Order as OrderModel + Order as OrderModel, + Tag } from '@prisma/client'; import { format, parseISO } from 'date-fns'; import { cloneDeep, groupBy, isNumber } from 'lodash'; @@ -649,6 +650,17 @@ export class DataService { return this.http.put(`/api/v1/admin/settings/${key}`, aData); } + public putHoldingTags({ + dataSource, + symbol, + tags + }: { tags: Tag[] } & UniqueAsset) { + return this.http.put( + `/api/v1/portfolio/position/${dataSource}/${symbol}/tags`, + { tags } + ); + } + public putOrder(aOrder: UpdateOrderDto) { return this.http.put(`/api/v1/order/${aOrder.id}`, aOrder); } From 85661884a6f991cf27125e6a2ecc2dba8b197121 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 3 Aug 2024 15:47:52 +0200 Subject: [PATCH 08/16] Release 2.100.0 (#3631) --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8666cb74..8726c4468 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.100.0 - 2024-08-03 ### Added diff --git a/package.json b/package.json index 9d4e673d9..c84514f6a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.99.0", + "version": "2.100.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From e0068c4d5dcadcf35c761960cd4a1986f8dcb163 Mon Sep 17 00:00:00 2001 From: Nuno Date: Sat, 3 Aug 2024 16:55:18 +0200 Subject: [PATCH 09/16] Feature/harden container security following OWASP best practices (#3614) * Harden container security * Update changelog --- CHANGELOG.md | 6 ++++++ Dockerfile | 8 +++++--- docker/docker-compose.build.yml | 7 ++++--- docker/docker-compose.dev.yml | 5 +++-- docker/docker-compose.yml | 29 +++++++++++++++++++++++++---- 5 files changed, 43 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8726c4468..a019343ef 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 + +- Hardened container security by switching to a non-root user, setting the filesystem to read-only, and dropping unnecessary capabilities + ## 2.100.0 - 2024-08-03 ### Added diff --git a/Dockerfile b/Dockerfile index 3f4554523..8ca86a308 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ COPY ./package.json package.json COPY ./package-lock.json package-lock.json COPY ./prisma/schema.prisma prisma/schema.prisma -RUN apt update && apt install -y \ +RUN apt-get update && apt-get install -y --no-install-suggests \ g++ \ git \ make \ @@ -50,16 +50,18 @@ RUN npm run database:generate-typings # Image to run, copy everything needed from builder FROM node:20-slim - LABEL org.opencontainers.image.source="https://github.com/ghostfolio/ghostfolio" +ENV NODE_ENV=production -RUN apt update && apt install -y \ +RUN apt-get update && apt-get install -y --no-install-suggests \ curl \ openssl \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /ghostfolio/dist/apps /ghostfolio/apps COPY ./docker/entrypoint.sh /ghostfolio/entrypoint.sh +RUN chown -R node:node /ghostfolio WORKDIR /ghostfolio/apps/api EXPOSE ${PORT:-3333} +USER node CMD [ "/ghostfolio/entrypoint.sh" ] diff --git a/docker/docker-compose.build.yml b/docker/docker-compose.build.yml index 28990692d..636d9a4e3 100644 --- a/docker/docker-compose.build.yml +++ b/docker/docker-compose.build.yml @@ -6,7 +6,6 @@ services: - ../.env environment: DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer - NODE_ENV: production REDIS_HOST: redis REDIS_PASSWORD: ${REDIS_PASSWORD} ports: @@ -21,8 +20,9 @@ services: interval: 10s timeout: 5s retries: 5 + postgres: - image: postgres:15 + image: docker.io/library/postgres:15 env_file: - ../.env healthcheck: @@ -32,8 +32,9 @@ services: retries: 5 volumes: - postgres:/var/lib/postgresql/data + redis: - image: redis:alpine + image: docker.io/library/redis:alpine env_file: - ../.env command: ['redis-server', '--requirepass', $REDIS_PASSWORD] diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 47944378c..91f8f2c09 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -1,6 +1,6 @@ services: postgres: - image: postgres:15 + image: docker.io/library/postgres:15 container_name: postgres restart: unless-stopped env_file: @@ -9,8 +9,9 @@ services: - ${POSTGRES_PORT:-5432}:5432 volumes: - postgres:/var/lib/postgresql/data + redis: - image: redis:alpine + image: docker.io/library/redis:alpine container_name: redis restart: unless-stopped env_file: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 3e708e918..23d9d6358 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,12 +1,16 @@ services: ghostfolio: - image: ghostfolio/ghostfolio:latest + image: docker.io/ghostfolio/ghostfolio:latest init: true + read_only: true + cap_drop: + - ALL + security_opt: + - no-new-privileges:true env_file: - ../.env environment: DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?connect_timeout=300&sslmode=prefer - NODE_ENV: production REDIS_HOST: redis REDIS_PASSWORD: ${REDIS_PASSWORD} ports: @@ -21,8 +25,19 @@ services: interval: 10s timeout: 5s retries: 5 + postgres: - image: postgres:15 + image: docker.io/library/postgres:15 + cap_drop: + - ALL + cap_add: + - CHOWN + - DAC_READ_SEARCH + - FOWNER + - SETGID + - SETUID + security_opt: + - no-new-privileges:true env_file: - ../.env healthcheck: @@ -32,8 +47,14 @@ services: retries: 5 volumes: - postgres:/var/lib/postgresql/data + redis: - image: redis:alpine + image: docker.io/library/redis:alpine + user: '999:1000' + cap_drop: + - ALL + security_opt: + - no-new-privileges:true env_file: - ../.env command: ['redis-server', '--requirepass', $REDIS_PASSWORD] From 420f331be9550b6342234f171612698dc304b45f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 3 Aug 2024 16:58:08 +0200 Subject: [PATCH 10/16] Release 2.101.0 (#3632) --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a019343ef..7101d9440 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.101.0 - 2024-08-03 ### Changed diff --git a/package.json b/package.json index c84514f6a..3f555a43b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.100.0", + "version": "2.101.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From aef650753e17669338c4172f11f452d33e9b0842 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 Aug 2024 08:18:54 +0200 Subject: [PATCH 11/16] Feature/clean up activities page (#3635) * Clean up --- .../portfolio/activities/activities-page.component.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) 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 c96921c30..d6209cdf8 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 @@ -33,7 +33,6 @@ import { ImportActivitiesDialogParams } from './import-activities-dialog/interfa templateUrl: './activities-page.html' }) export class ActivitiesPageComponent implements OnDestroy, OnInit { - public activities: Activity[]; public dataSource: MatTableDataSource; public deviceType: string; public hasImpersonationId: boolean; @@ -66,13 +65,7 @@ export class ActivitiesPageComponent implements OnDestroy, OnInit { if (params['createDialog']) { this.openCreateActivityDialog(); } else if (params['editDialog']) { - if (this.activities) { - const activity = this.activities.find(({ id }) => { - return id === params['activityId']; - }); - - this.openUpdateActivityDialog(activity); - } else if (this.dataSource) { + if (this.dataSource && params['activityId']) { const activity = this.dataSource.data.find(({ id }) => { return id === params['activityId']; }); From 4c7657a90e59d5a7199b7065e70300fcabd7a67f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 Aug 2024 08:22:32 +0200 Subject: [PATCH 12/16] Feature/upgrade nx to version 19.5.6 (#3633) * Upgrade Nx to version 19.5.6 * Update changelog --- CHANGELOG.md | 6 + package-lock.json | 882 ++++++++++++++++++++++++++++++++-------------- package.json | 22 +- 3 files changed, 634 insertions(+), 276 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7101d9440..a6e3b0ca5 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 `Nx` from version `19.5.1` to `19.5.6` + ## 2.101.0 - 2024-08-03 ### Changed diff --git a/package-lock.json b/package-lock.json index 23fb87fa4..1a9b0ce52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.98.0", + "version": "2.101.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.98.0", + "version": "2.101.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -108,16 +108,16 @@ "@angular/pwa": "18.1.1", "@nestjs/schematics": "10.0.1", "@nestjs/testing": "10.1.3", - "@nx/angular": "19.5.1", - "@nx/cypress": "19.5.1", - "@nx/eslint-plugin": "19.5.1", - "@nx/jest": "19.5.1", - "@nx/js": "19.5.1", - "@nx/nest": "19.5.1", - "@nx/node": "19.5.1", - "@nx/storybook": "19.5.1", - "@nx/web": "19.5.1", - "@nx/workspace": "19.5.1", + "@nx/angular": "19.5.6", + "@nx/cypress": "19.5.6", + "@nx/eslint-plugin": "19.5.6", + "@nx/jest": "19.5.6", + "@nx/js": "19.5.6", + "@nx/nest": "19.5.6", + "@nx/node": "19.5.6", + "@nx/storybook": "19.5.6", + "@nx/web": "19.5.6", + "@nx/workspace": "19.5.6", "@schematics/angular": "18.1.1", "@simplewebauthn/types": "9.0.1", "@storybook/addon-essentials": "8.2.6", @@ -146,7 +146,7 @@ "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-preset-angular": "14.1.0", - "nx": "19.5.1", + "nx": "19.5.6", "prettier": "3.3.3", "prettier-plugin-organize-attributes": "1.0.0", "react": "18.2.0", @@ -3893,6 +3893,7 @@ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", "integrity": "sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==", "dev": true, + "license": "MIT", "dependencies": { "@emnapi/wasi-threads": "1.0.1", "tslib": "^2.4.0" @@ -3903,6 +3904,7 @@ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } @@ -3912,6 +3914,7 @@ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } @@ -6409,6 +6412,7 @@ "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.2.8.tgz", "integrity": "sha512-qY1Wbqo0yu9nh6KR8K19t5T4tYtlUbmcNdcaCweISCyAbH99TrhpQkJ89NY0TLtnxQ6uayIYayqAWS7vzyDXVw==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/managers": "0.2.8", "@module-federation/sdk": "0.2.8", @@ -6441,6 +6445,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6456,6 +6461,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6469,6 +6475,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6478,6 +6485,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6490,6 +6498,7 @@ "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.2.8.tgz", "integrity": "sha512-6fGM/GiKw6LZiBe6DF8Petz6ih/Yyf3q2htLrx+hrWoDWfWEoWlLvoCUsVkY2UgMCLKid7Fm3Auc4w8A4aRjvQ==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.2.8", "@module-federation/dts-plugin": "0.2.8", @@ -6523,6 +6532,7 @@ "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.2.8.tgz", "integrity": "sha512-S5GXqt2Vrs1+uNXHw7UzZ7m3fs8H3nxNsNGQ0j5+HiT5yA7uRTY1AZJZCGAHzG6XImJ1DzL/SW1acM2Hwj0aAw==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/sdk": "0.2.8", "find-pkg": "2.0.0", @@ -6534,6 +6544,7 @@ "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.2.8.tgz", "integrity": "sha512-kw4PeAldkOuGCWfCnDzZwPHUx5qv9+WztY5+TEbsgXc5E+/e2NDA6Gg3eT8zUGeexeGdab3f+DuN9ZClZJYVGA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/dts-plugin": "0.2.8", "@module-federation/managers": "0.2.8", @@ -6547,6 +6558,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6562,6 +6574,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6575,6 +6588,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6584,6 +6598,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6596,6 +6611,7 @@ "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.2.8.tgz", "integrity": "sha512-5Bofm3cY7OOwO2DT5TevITd+HAA03zsY1wwsMb1BP6NkS/ukUtsjuRo2Anua0RkHBEIx+Dv5rpqOn7qSlOm1Fg==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.2.8", "@module-federation/dts-plugin": "0.2.8", @@ -6622,6 +6638,7 @@ "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.2.8.tgz", "integrity": "sha512-8xmA/+z1zD09F5qU8VnSWLExqTCVWoHOguXsCX79kkqp7i0c+D2YaebWzlQ2kku+DU+0VIzXpQ3BBcumZ3v3wQ==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/sdk": "0.2.8" } @@ -6631,6 +6648,7 @@ "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.2.8.tgz", "integrity": "sha512-RSNtyhcNvnTQIdzRUIOGue6WQA/9mL9cY/n0dEd357L/lmLCvfHiZbowlkacckDzyApariUHxzkHrU2Q6kzoew==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime": "0.2.8", "@module-federation/webpack-bundler-runtime": "0.2.8" @@ -6640,13 +6658,15 @@ "version": "0.2.8", "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.2.8.tgz", "integrity": "sha512-eGMnJxdRDgt6dtMv8gkAlzEbTPWVHb3AHUNUG0w56wcbIF0RHC6kmvpHpSQyq4DVGWv3U4g/ZiH5BvBlqEelDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@module-federation/third-party-dts-extractor": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.2.8.tgz", "integrity": "sha512-VGXvdsRlljbFUfGeA448CxR7i6fLWJN07ViRuNXYYXc19e4bQVhBHzrf7eCv9ahcf/tA/8YYCS2h11ixbD691A==", "dev": true, + "license": "MIT", "dependencies": { "find-pkg": "2.0.0", "fs-extra": "9.1.0", @@ -6658,6 +6678,7 @@ "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.2.8.tgz", "integrity": "sha512-tiW1kD/V3QNul1/O3Y3lwQv/r4sUU4jvWZykrLvHYt2vuoGe1d4tHnSIFEVEAi9FSpuDwdRK2+NaWBr92gIS7Q==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/runtime": "0.2.8", "@module-federation/sdk": "0.2.8" @@ -6740,6 +6761,7 @@ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", "dev": true, + "license": "MIT", "dependencies": { "@emnapi/core": "^1.1.0", "@emnapi/runtime": "^1.1.0", @@ -7460,94 +7482,104 @@ } }, "node_modules/@nrwl/angular": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/angular/-/angular-19.5.1.tgz", - "integrity": "sha512-p2Mr8G8uQYvkgFthyDUPrTYccCu8tGyJXMLg+N+myestNDTntJ34buwX3yvAeLMzhe89S+wjYY/FMZnue4zXiw==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/angular/-/angular-19.5.6.tgz", + "integrity": "sha512-ilS6ZjsEOToeTiKHixd9+wLvslUZ1cdvNIgvsUZ3VHK4OmGxTzGJXaV+1+CSgYDpSp4+MC/Di8EfzUteCn9mFw==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/angular": "19.5.1", + "@nx/angular": "19.5.6", "tslib": "^2.3.0" } }, "node_modules/@nrwl/cypress": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/cypress/-/cypress-19.5.1.tgz", - "integrity": "sha512-wBT7IQfqCZuj0Oa/2+2RAn73W0o4f+3iKdDBUF85/XFyemNGekVpFBpseQgZs4HPfukKJBjmdAg584s2hEAl9Q==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/cypress/-/cypress-19.5.6.tgz", + "integrity": "sha512-yVMSVjDcOdqiiJjHaHme/3FtyFgT4mK7+GZExoJzGevHDrReeN22a2+3W7Rr/cEi/qTDdnNfODn5QdSpWfbuLQ==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/cypress": "19.5.1" + "@nx/cypress": "19.5.6" } }, "node_modules/@nrwl/devkit": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.5.1.tgz", - "integrity": "sha512-ZsckDZszLTv3oshNsY5fZ86g8a/VcGvgDpdiP/z/A/krtOHL8iUjdT/72Eo5DIult5WcSFjnifyWcyWIGe1PeA==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.5.6.tgz", + "integrity": "sha512-H7LGlwAktfL2GR4scwCfehuppmzcHJJt4C2PpiGEsfA74MKBw2/VGX15b29Mf36XbGS+Bx9vjvooZEt5HPCusw==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/devkit": "19.5.1" + "@nx/devkit": "19.5.6" } }, "node_modules/@nrwl/eslint-plugin-nx": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-19.5.1.tgz", - "integrity": "sha512-zCLLe4sbnV5U9yIi7MMFKpyW+KtQ3tTRra+7Lhyz/yrpu//3a0PrRz3o3LPuKSXxbqQryL5kQJzpqjOthF582Q==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-19.5.6.tgz", + "integrity": "sha512-pHIJHXOVJRC+wBI9zK0RnwKAh7NC9TKCdIm5KsYNFHTLswUxHnxzmP86hKTVcZO7o10NeYzBWD7QAQvqYgIQoA==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/eslint-plugin": "19.5.1" + "@nx/eslint-plugin": "19.5.6" } }, "node_modules/@nrwl/jest": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-19.5.1.tgz", - "integrity": "sha512-Bnwoq1PaWP2fxeCSEt9ME0tPaHPlXKvaZQiEFO2FfsBDuXCbdlAmusLnHe+QK8jJE5rwDZfCh73ERg5PSFR2tQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-19.5.6.tgz", + "integrity": "sha512-/redyU+er4f0xjLgWttdyOZw0yOozGzwDuUWYu0vR9SCmKXyhQf3kUHw6yR3/qOLiN32VbzAmiq67NvGhoRgFw==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/jest": "19.5.1" + "@nx/jest": "19.5.6" } }, "node_modules/@nrwl/js": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-19.5.1.tgz", - "integrity": "sha512-t3EBizfpsT2n2x/oISqs2/JyCpwl1EqjvNDyXgMavLvIMnjLd1vsvmHwoblMJdRJFWropHlHBtp+6u2PRs/Gjw==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-19.5.6.tgz", + "integrity": "sha512-mfTBvon1v/Ts1Crvv25raXGxpQe3cgPTNCP+D5SG6Vpe/vbLOYiBi90UhHIKXKZOQ73RRx+Wojgn+Zv5pDo13A==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/js": "19.5.1" + "@nx/js": "19.5.6" } }, "node_modules/@nrwl/nest": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/nest/-/nest-19.5.1.tgz", - "integrity": "sha512-dLVcOUivzETCiB5em6dPhySPh4cUUgQcIvnk6S3o+3e9IgKOmjClsUNgzxo+nmugk9VFtFTTwxJnWj/juTGpSQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/nest/-/nest-19.5.6.tgz", + "integrity": "sha512-TPI2eD0JotnAvd3ynnrNiToVRTabjjqabU+JDnH2qrI2GnDwotbazJLxDQTlI62ev2sqs9lw3iMbn1jwJDy5UQ==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/nest": "19.5.1" + "@nx/nest": "19.5.6" } }, "node_modules/@nrwl/node": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/node/-/node-19.5.1.tgz", - "integrity": "sha512-pkYhkV5ua+rw/EX9Cuvn20HjGechYIMgXCmz5YT8oq/UU6CaVszTqypjfak5eUjhHCAQklnrKHpxf/RQ5r4XHQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/node/-/node-19.5.6.tgz", + "integrity": "sha512-eiQqeHNtR40cdD0WX33ZUwom3Malt7C7zq+iU5DTLlbeC6ciZGz9pYkeNZ6JJZOEPEUGM5O+7gtWUb+Ig7ZyMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/node": "19.5.1" + "@nx/node": "19.5.6" } }, "node_modules/@nrwl/storybook": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/storybook/-/storybook-19.5.1.tgz", - "integrity": "sha512-3ZBsPF+vVHmiPFAUSHPrKOxFGJzDSq9aiibZT98knx0rCACfNvaCh+BfrciXfDXIjJ7DMQfRsuydhc+9+Bylfw==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/storybook/-/storybook-19.5.6.tgz", + "integrity": "sha512-xEAnwp16NKBXZ8nqXFiFjJFFc8SzWY+oRoXQTkR7mUV7kKnaeFK2mBq2JXygyRonRdrBjZIvsM7YzRRl3brlJQ==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/storybook": "19.5.1" + "@nx/storybook": "19.5.6" } }, "node_modules/@nrwl/tao": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.5.1.tgz", - "integrity": "sha512-gAitJkexzI36jCNIHru1PAqNcFe17KlSwb3F4VoCArcZSJmSh5cTbxaAAWup8aavxHT6nF6G1Zm1+N0RmzRMRQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.5.6.tgz", + "integrity": "sha512-p1bxEjW32bIHAiTp+PVdJpa2V9En2s9FigepHXyvmT2Aipisz96CKiDjexhPTjOZHUKtqA9FgmOIuVl3sBME3g==", "dev": true, + "license": "MIT", "dependencies": { - "nx": "19.5.1", + "nx": "19.5.6", "tslib": "^2.3.0" }, "bin": { @@ -7555,30 +7587,33 @@ } }, "node_modules/@nrwl/web": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/web/-/web-19.5.1.tgz", - "integrity": "sha512-UIf3CN9mYUzsLCvKQlETyYMiMp1sL0GL4yGVQJIMz9RqoND2NLNSM5+vcp7rs/UyD8YuACgs3Ii3C2yyTPH6aQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/web/-/web-19.5.6.tgz", + "integrity": "sha512-2TJB0zSBjDtl2AaZToTvSLej4ed5YO5nJ9iFsv764WDLI0D/WsciUiZHNdXSIhU0lf2yrs7CmIYZFWAdnXzxKA==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/web": "19.5.1" + "@nx/web": "19.5.6" } }, "node_modules/@nrwl/webpack": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/webpack/-/webpack-19.5.1.tgz", - "integrity": "sha512-+vSDWUnXh6y0jB6ZNvAB84KyIpTfrxzwh5bx7OtqQPQ8eh5i8PD6uXrXcc/PsxIRw2qQs1e+wu/qhdQszgFo6Q==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/webpack/-/webpack-19.5.6.tgz", + "integrity": "sha512-2tHi4QKDAjs9f7lzoELmzh5D1aT+XOn6PTK47V4n+Y878HgRQuv9NMRd7WhH5nAAlOKQYonsTc9e4doEJ6T9aQ==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/webpack": "19.5.1" + "@nx/webpack": "19.5.6" } }, "node_modules/@nrwl/workspace": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-19.5.1.tgz", - "integrity": "sha512-lqX0bgqCv/qc35tqea16uMWbkMN2dxEOCCc81BxKwDf0roSlO0Jnb0vWMCBUrITWbginSe7vovvjfpGbS1QboA==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-19.5.6.tgz", + "integrity": "sha512-k0Pria840szB3dIDCXOMbD4jbnaLCeGRYthE5duG5nPxTCbeMMu7pU1t0sv9IgpQZ/JrHeWliknWgaTlIguPug==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/workspace": "19.5.1" + "@nx/workspace": "19.5.6" } }, "node_modules/@nuxtjs/opencollective": { @@ -7647,24 +7682,24 @@ } }, "node_modules/@nx/angular": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-19.5.1.tgz", - "integrity": "sha512-ECut6FDXm44EgV5t90ckafDQVNPZsgwnameY3AMKhn5hs7XAtSDb1XTKuSZtAugFJGGrvXpT0auYq8etrVePyA==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-19.5.6.tgz", + "integrity": "sha512-86fZmTx7Omo7FJuRyuNvEiUHUSuwEaGFeh/UkWt3Crf5C0pAlPYzpcm3B7B7e0RwGiWII9Mc9ZLwnPTv4jgZdA==", "dev": true, + "license": "MIT", "dependencies": { "@module-federation/enhanced": "~0.2.3", - "@nrwl/angular": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/eslint": "19.5.1", - "@nx/js": "19.5.1", - "@nx/web": "19.5.1", - "@nx/webpack": "19.5.1", - "@nx/workspace": "19.5.1", + "@nrwl/angular": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/eslint": "19.5.6", + "@nx/js": "19.5.6", + "@nx/web": "19.5.6", + "@nx/webpack": "19.5.6", + "@nx/workspace": "19.5.6", "@phenomnomnominal/tsquery": "~5.0.1", "@typescript-eslint/type-utils": "^7.16.0", "chalk": "^4.1.0", "find-cache-dir": "^3.3.2", - "ignore": "^5.0.4", "magic-string": "~0.30.2", "minimatch": "9.0.3", "piscina": "^4.4.0", @@ -7678,13 +7713,7 @@ "@angular-devkit/core": ">= 16.0.0 < 19.0.0", "@angular-devkit/schematics": ">= 16.0.0 < 19.0.0", "@schematics/angular": ">= 16.0.0 < 19.0.0", - "esbuild": "^0.19.2", "rxjs": "^6.5.3 || ^7.5.0" - }, - "peerDependenciesMeta": { - "esbuild": { - "optional": true - } } }, "node_modules/@nx/angular/node_modules/ansi-styles": { @@ -7740,15 +7769,16 @@ } }, "node_modules/@nx/cypress": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-19.5.1.tgz", - "integrity": "sha512-Yxgsqq4MRLmIRRATQq2L9jgOP/g1ex/cgbruKSkqUkB7WmmNfFJCA93ZiuMPtEOGPsfJLdjVfs6BqBLfw9GO0w==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-19.5.6.tgz", + "integrity": "sha512-3yUZ0AR5e9Ea7vk/6Zjje1QHyPXGycdnWOzOZuOJ6Wloeqj/EWWGoIEsSt+XAfzCiK/oWnlXpsbkrGJZYYgbdQ==", "dev": true, + "license": "MIT", "dependencies": { - "@nrwl/cypress": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/eslint": "19.5.1", - "@nx/js": "19.5.1", + "@nrwl/cypress": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/eslint": "19.5.6", + "@nx/js": "19.5.6", "@phenomnomnominal/tsquery": "~5.0.1", "detect-port": "^1.5.1", "tslib": "^2.3.0" @@ -7763,12 +7793,13 @@ } }, "node_modules/@nx/devkit": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.5.1.tgz", - "integrity": "sha512-Vj8wwzNIR5VIWmuLHhOi4aUVq7eVV5YTbctnEewKT+V/O4LZj+hClGyVNyT8s6b8JIjNWoIO4HXStLnH8rDOlw==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.5.6.tgz", + "integrity": "sha512-zSToXLkhbAOQmqVTgUNHdLO0uOZz/iGwqEK4tuAhU5hhqTcpN1TZUI9BlINvtFJBLvbNroGrnIh0gTq9CPzVHw==", "dev": true, + "license": "MIT", "dependencies": { - "@nrwl/devkit": "19.5.1", + "@nrwl/devkit": "19.5.6", "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", @@ -7783,14 +7814,15 @@ } }, "node_modules/@nx/eslint": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-19.5.1.tgz", - "integrity": "sha512-PlWi2hmado+rSkbHi1a+VM+h1IOxLe9dIhLKC5t6p7Z8cG5QKjsn28okkuytKAq0wiVAyHRO3i/V415QM2lc1g==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-19.5.6.tgz", + "integrity": "sha512-WLUo4f+ndMVWZ5QqqZiZNCmbLCqEqPBopvGWJg6uUJyrm5HiFsks+1nRp7BxFzj0SwmdmSRzQFvMgorw7lAgCQ==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/devkit": "19.5.1", - "@nx/js": "19.5.1", - "@nx/linter": "19.5.1", + "@nx/devkit": "19.5.6", + "@nx/js": "19.5.6", + "@nx/linter": "19.5.6", "semver": "^7.5.3", "tslib": "^2.3.0", "typescript": "~5.4.2" @@ -7806,14 +7838,15 @@ } }, "node_modules/@nx/eslint-plugin": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-19.5.1.tgz", - "integrity": "sha512-wLroRSUC2/KJv2+VupBVKQ6A2zfub8CCsThJO4UFJvO+KM/Heuvb9kxpPdDie+tyCQQqJpkgTwpWC7uhpDLAMw==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-19.5.6.tgz", + "integrity": "sha512-5yZJbAoS35blBvY1riAxzemBGJJJW36FVm304ccPyJXvXA7Wa7yMbtwuVagJ9E7w4fodmCcWOAvrCDUTSakBug==", "dev": true, + "license": "MIT", "dependencies": { - "@nrwl/eslint-plugin-nx": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/js": "19.5.1", + "@nrwl/eslint-plugin-nx": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/js": "19.5.6", "@typescript-eslint/type-utils": "^7.16.0", "@typescript-eslint/utils": "^7.16.0", "chalk": "^4.1.0", @@ -7889,6 +7922,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7898,16 +7932,17 @@ } }, "node_modules/@nx/jest": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-19.5.1.tgz", - "integrity": "sha512-KWPFS7z9stQPQZgNYmm8b2+ZOUI64o95OAnStB73HEREuk+sXtFVEtHcLOZsCjAmSL/wYTgw135+EdZeMrGX4A==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-19.5.6.tgz", + "integrity": "sha512-UkGEl7iAt3MEz+BB4Xp3u641LrMeOytTcbljjyYtR84YtJaYgc8CFmornnw8KVqfavQS+v/nrv8lMbbYQHkWpQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", - "@nrwl/jest": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/js": "19.5.1", + "@nrwl/jest": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/js": "19.5.6", "@phenomnomnominal/tsquery": "~5.0.1", "chalk": "^4.1.0", "identity-obj-proxy": "3.0.0", @@ -7973,10 +8008,11 @@ } }, "node_modules/@nx/js": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-19.5.1.tgz", - "integrity": "sha512-Kp61s0cB3yk3RCyvSprakNL0VmXv7uqfsglqvxUDG6DXof9pj8jhTNn1Gms79DmUR5jxTeT+XNHcpl1y3QhTzg==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-19.5.6.tgz", + "integrity": "sha512-NNf6Zh4Z8k3dmkXkCUYrReH9ZpdAhvUQjwrWUHtmc5MnWTsQL12a01MwbMi4ReMzDLDjffDXjJFxYmbNYKaRzw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", "@babel/plugin-proposal-decorators": "^7.22.7", @@ -7985,9 +8021,9 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nrwl/js": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/workspace": "19.5.1", + "@nrwl/js": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/workspace": "19.5.6", "babel-plugin-const-enum": "^1.0.1", "babel-plugin-macros": "^2.8.0", "babel-plugin-transform-typescript-metadata": "^0.3.1", @@ -8239,26 +8275,28 @@ } }, "node_modules/@nx/linter": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/linter/-/linter-19.5.1.tgz", - "integrity": "sha512-UamWirRf0hmJCpJev1kCdeNPDmsyavuV8r0Ha8t9hPX3dJravjT4IzHL3bJy1ctu8AJrYhJqdTvNKCjqO7Uopw==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/linter/-/linter-19.5.6.tgz", + "integrity": "sha512-OS0DZ1TDTvWaZe7ijLT6jkQZCCBg4OseFmP2Y6bqE/oRdyoRv95gCT2MGmyJQXkLoX5j9DMfc4nYXS0VHFYqdg==", "dev": true, + "license": "MIT", "dependencies": { - "@nx/eslint": "19.5.1" + "@nx/eslint": "19.5.6" } }, "node_modules/@nx/nest": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-19.5.1.tgz", - "integrity": "sha512-QAFd/JFj9szQ+prnq0AquC1YIGaUk/FYlLwoj1FmkvtFBOtyHd6qKpOViPo7lWaLNbNy2cDuHGPmRzvUpejvyA==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-19.5.6.tgz", + "integrity": "sha512-cIr27QlF3RBb0NhCxJGipQt2uwgERLMJ0nqJhlkbBFlmZsZiFEQ33V89hgGAdPTB3ntEKmubKws0ZySn2hdrCQ==", "dev": true, + "license": "MIT", "dependencies": { "@nestjs/schematics": "^9.1.0", - "@nrwl/nest": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/eslint": "19.5.1", - "@nx/js": "19.5.1", - "@nx/node": "19.5.1", + "@nrwl/nest": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/eslint": "19.5.6", + "@nx/js": "19.5.6", + "@nx/node": "19.5.6", "@phenomnomnominal/tsquery": "~5.0.1", "tslib": "^2.3.0" } @@ -8383,27 +8421,29 @@ } }, "node_modules/@nx/node": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-19.5.1.tgz", - "integrity": "sha512-EVZt+oIzCzpU2hnnn92KUa8ncksFl8eZceSr7qQVnYN+A++aISQQAAiGnNm+9i097kM70C9zcGr4yo74r3UkZw==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-19.5.6.tgz", + "integrity": "sha512-nWWoZCdomYOo0JmJMiP1UWlAnCdrvqLxXgWS6MNbQTT0rhJSn6em5S9N4TuHA7+aCDInvzNEL8YcVTm1xCbtug==", "dev": true, + "license": "MIT", "dependencies": { - "@nrwl/node": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/eslint": "19.5.1", - "@nx/jest": "19.5.1", - "@nx/js": "19.5.1", + "@nrwl/node": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/eslint": "19.5.6", + "@nx/jest": "19.5.6", + "@nx/js": "19.5.6", "tslib": "^2.3.0" } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.5.1.tgz", - "integrity": "sha512-mdFSnwf+cEGZQ0HDJIzHBOWmho66VUN44qsDRPVSwpaEqlHSlcbiqKzM0+oVx9CRDLNQoYtYs1Y3hGlnag1sCQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.5.6.tgz", + "integrity": "sha512-evEpUq571PQkhaLBR7ul5iqE2l97QS7Q37/rxoBuwJzyQ/QKHfNu5t032bR3KLyEOrv7golT10jMeoQlNeF7eQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -8413,13 +8453,14 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.5.1.tgz", - "integrity": "sha512-ficF0T6vN0LkkYoPyEgdXEOfIR9ss0hXeG2s32SwqfjNZlbisO4fvrHM8f8WPujEJ+5nCIJ9o4jJiWBHkfUTBg==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.5.6.tgz", + "integrity": "sha512-o1tu0dOW7TZ80VN9N11FQL/3gHd1+t6NqtEmRClN0/sAh2MZyiBdbXv7UeN5HoKE7HAusiVFIxK3c1lxOvFtsQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -8429,13 +8470,14 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.5.1.tgz", - "integrity": "sha512-UjquUf8N06DlAyhpvEm1D57WXWQnvvVq6vIxq6rTmK+alWjMyOUs90sPYrqvV3TARAsdkos763S8T5rAOB/xYQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.5.6.tgz", + "integrity": "sha512-IUL0ROGpLUol9cuVJ7VeUvaB/ptxg7DOjMef1+LJeOgxl/SFNa0bj0kKpA/AQwujz6cLI7Ei7xLTVQOboNh1DA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -8445,13 +8487,14 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.5.1.tgz", - "integrity": "sha512-UXBXiLEZVgHlz/iO634JQwQU/MP0Kx0tKwEzucjAryIUFTBRAZos76wTF8glBQaH4dTwWtQQObxaEVGGu+J4dA==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.5.6.tgz", + "integrity": "sha512-TGf1+cpWg5QiPEGW5kgxa1fVNyASMuqu+LvQ9CKhNYNz5EPD15yr/k6C0tOjgSXro3wi8TikTeG0Ln2hpmn6pw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -8461,13 +8504,14 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.5.1.tgz", - "integrity": "sha512-UlBq3ImnFHMsI6jLxQA97ntgBvMvtnVmL/eluGOcUres9q0IqzTOWmBDccpR3ZLbI3NBrmDRrS79aid3SuBKwA==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.5.6.tgz", + "integrity": "sha512-4hZI5NmnBEAzr3NV/BtlPjbSVffLWGGCJ5tB/JB/NpW/vMtzOPCZ4RvsHuJMPprqHcXOdUnBgZFEcLbEMUXz0A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -8477,13 +8521,14 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.5.1.tgz", - "integrity": "sha512-sw0zdO9CLjDY9qiweZm5p5zrkOeRPagimHCtHw/YIuPfkBrtoazi9adD+f8OXou/jrL/f1UE2/CA3gQKDOT35Q==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.5.6.tgz", + "integrity": "sha512-n0oIBblMN+nlcBUbrFUkRSyzKZVR+G1lzdZ3PuHVwLC664hkbijEBAdF2E321yRfv5ohQVY0UIYDZVFN2XhFUg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -8493,13 +8538,14 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.5.1.tgz", - "integrity": "sha512-tHPcBgsyyLNRfJLWnDQLcWZZ69xn4Ocfnquxs30Q5gk5CZTNSVm/yA4ibYn9JGvSu0dNjzM+nJwmtEaudhtgSg==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.5.6.tgz", + "integrity": "sha512-IuoNo1bDHyJEeHom/n2m4+AA+UQ+Rlryvt9+bTdADclSFjmBLYCgbJwQRy7q9+vQk2mpQm0pQJv4d3XKCpDH+g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -8509,13 +8555,14 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.5.1.tgz", - "integrity": "sha512-dHP8GrqK05gHwq6kSjuZqaN0CQrID2OspuJ4vKd+WoelioFNmdRAQWkOyqXA5dlrJfWs/IqV+WvnexYlxG1quw==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.5.6.tgz", + "integrity": "sha512-FXtB8m/CSRkXLtDOAGfImO9OCUDIwYBssnvCVqX6PyPTBaVWo/GvX1O9WRbXSqSVIaJJTPn1aY/p6vptlGbDFw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -8525,13 +8572,14 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.5.1.tgz", - "integrity": "sha512-YNhVje0gSmt7bLWDCR1Ea3vbvqF+iIeDhtpJuK7kXMbWAujZrA5sGW/xdPPShV8omlQuu1Ggms0BUCwr8Aiyig==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.5.6.tgz", + "integrity": "sha512-aIDU84rjvxoqyUDIdN4VwS91Yec8bAtXOxjOFlF2acY2tXh0RjzmM+mkEP44nVAzFy0V1/cjzBKb6643FsEqdA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -8541,13 +8589,14 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.5.1.tgz", - "integrity": "sha512-bxj12iAuyEwBCV6A+C8nXQ55KNji4L0VrL3y2KeH0wOeBMgTeKQxoMNk0/Ty2O6354YkAgwaKRHJMnM/LfO+og==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.5.6.tgz", + "integrity": "sha512-zWB/2TjhNYKHbuPh++5hYitno3EpSFXrPND0I0VLec27WW7voRY9XQFFznA3omForU4FfmVhITcKCqzIb3EtpA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -8557,30 +8606,32 @@ } }, "node_modules/@nx/storybook": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-19.5.1.tgz", - "integrity": "sha512-D5ltyQaOvQlGctQEy3t6ATNP1ddAIEAq1QMfzWxeXqhJPUKkPxV8vZUr6A+eKfm7z202pZ3UqInu6CQ5ydG/VQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-19.5.6.tgz", + "integrity": "sha512-9lfGxk/Wl6yVXWJZrOgcgYP1QmdxH6GG+VmOB+ofvQWapfH962jadmNlgxDzQW9uYoNI50WHibVq1eCfll68Uw==", "dev": true, + "license": "MIT", "dependencies": { - "@nrwl/storybook": "19.5.1", - "@nx/cypress": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/eslint": "19.5.1", - "@nx/js": "19.5.1", + "@nrwl/storybook": "19.5.6", + "@nx/cypress": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/eslint": "19.5.6", + "@nx/js": "19.5.6", "@phenomnomnominal/tsquery": "~5.0.1", "semver": "^7.5.3", "tslib": "^2.3.0" } }, "node_modules/@nx/web": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-19.5.1.tgz", - "integrity": "sha512-9R5KvFpmKlo6NHfswlxz2fBnnjj3Y/RX4o1RPwPDFUa9xPB+Ct1dbOESWSRSa6tJTa2UbyOfmiGdLnYdz0Gi+w==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-19.5.6.tgz", + "integrity": "sha512-mCw2KpVj8FPieRFn98bMJxF4s1RCMTciC78NKFiC0Dmg0KFmhFUw6geWe8anhhjbTxqFvLENMJQIn9K4dlaL1A==", "dev": true, + "license": "MIT", "dependencies": { - "@nrwl/web": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/js": "19.5.1", + "@nrwl/web": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/js": "19.5.6", "chalk": "^4.1.0", "detect-port": "^1.5.1", "http-server": "^14.1.0", @@ -8592,6 +8643,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8607,6 +8659,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8623,6 +8676,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8632,6 +8686,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8640,17 +8695,18 @@ } }, "node_modules/@nx/webpack": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-19.5.1.tgz", - "integrity": "sha512-9oIVBQWcvUBVLfK+9tVK2741EOYJRwq/gJmo7jYolRg8UlTumHoAg4nzPU9ZQ4Uq3y5+6nb8m5jfEzqI6GsSVQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-19.5.6.tgz", + "integrity": "sha512-7xMYx0MIxf4kuhiIyF7QEee7AgK1wzroO2wl+9fU8sjKhvDgW9k8huMCNkOcScptB3SP4CiM9b7S5c/pwr75hQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", "@module-federation/enhanced": "^0.2.3", "@module-federation/sdk": "^0.2.3", - "@nrwl/webpack": "19.5.1", - "@nx/devkit": "19.5.1", - "@nx/js": "19.5.1", + "@nrwl/webpack": "19.5.6", + "@nx/devkit": "19.5.6", + "@nx/js": "19.5.6", "@phenomnomnominal/tsquery": "~5.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", @@ -8660,7 +8716,9 @@ "copy-webpack-plugin": "^10.2.4", "css-loader": "^6.4.0", "css-minimizer-webpack-plugin": "^5.0.0", + "express": "^4.19.2", "fork-ts-checker-webpack-plugin": "7.2.13", + "http-proxy-middleware": "^3.0.0", "less": "4.1.3", "less-loader": "11.1.0", "license-webpack-plugin": "^4.0.2", @@ -8691,13 +8749,15 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nx/webpack/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8713,6 +8773,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8725,6 +8786,7 @@ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -8734,6 +8796,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8745,11 +8808,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@nx/webpack/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@nx/webpack/node_modules/copy-webpack-plugin": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.7", "glob-parent": "^6.0.1", @@ -8774,6 +8848,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -8790,6 +8865,7 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -8820,20 +8896,75 @@ } } }, + "node_modules/@nx/webpack/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/@nx/webpack/node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/@nx/webpack/node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/@nx/webpack/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -8846,6 +8977,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^3.0.1", "dir-glob": "^3.0.1", @@ -8866,39 +8998,17 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@nx/webpack/node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, "node_modules/@nx/webpack/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -8914,6 +9024,7 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -8926,6 +9037,7 @@ "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -8952,6 +9064,7 @@ "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, + "license": "MIT", "dependencies": { "klona": "^2.0.4" }, @@ -8972,6 +9085,7 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -8986,6 +9100,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "pify": "^4.0.1", @@ -9000,6 +9115,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "optional": true, "bin": { "semver": "bin/semver" @@ -9010,6 +9126,7 @@ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", "integrity": "sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==", "dev": true, + "license": "MIT", "dependencies": { "schema-utils": "^4.0.0" }, @@ -9024,11 +9141,19 @@ "webpack": "^5.0.0" } }, + "node_modules/@nx/webpack/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/@nx/webpack/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -9046,6 +9171,7 @@ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -9058,13 +9184,22 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/webpack/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true, + "license": "MIT" }, "node_modules/@nx/webpack/node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=6" @@ -9075,6 +9210,7 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, + "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -9097,6 +9233,7 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -9106,6 +9243,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } @@ -9115,6 +9253,7 @@ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", "dev": true, + "license": "MIT", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -9153,6 +9292,7 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -9165,6 +9305,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -9175,6 +9316,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9187,6 +9329,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -9210,6 +9353,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -9264,17 +9408,43 @@ } } }, + "node_modules/@nx/webpack/node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, "node_modules/@nx/workspace": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.5.1.tgz", - "integrity": "sha512-I/O+kDxaLzVXITmddijffNzllioe84oGSQ3q8s3nW7RP2/T1LkmOS7Prnd80sEVteQowHe0kOnvAh+p82kAUjQ==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-19.5.6.tgz", + "integrity": "sha512-VkyHzSPI+++kLgftE6HA/jXcbn3zZwDYjhsrmSqwutj8BTuKhxs1YIL2gkzYVoTytF1wpWl3nk5MzqMGclptjA==", "dev": true, + "license": "MIT", "dependencies": { - "@nrwl/workspace": "19.5.1", - "@nx/devkit": "19.5.1", + "@nrwl/workspace": "19.5.6", + "@nx/devkit": "19.5.6", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "19.5.1", + "nx": "19.5.6", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } @@ -9284,6 +9454,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9299,6 +9470,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9315,6 +9487,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9324,6 +9497,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11151,6 +11325,7 @@ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10.13.0" } @@ -11217,6 +11392,7 @@ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } @@ -12436,6 +12612,7 @@ "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "js-yaml": "^3.10.0", "tslib": "^2.4.0" @@ -12449,6 +12626,7 @@ "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -12460,7 +12638,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/abab": { "version": "2.0.6", @@ -12597,6 +12776,7 @@ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.14.tgz", "integrity": "sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0" } @@ -12784,7 +12964,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", @@ -13150,10 +13331,11 @@ "dev": true }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", + "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", "dev": true, + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -13590,6 +13772,7 @@ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.1.2" }, @@ -13601,7 +13784,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/batch": { "version": "0.6.1", @@ -13838,6 +14022,7 @@ "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "dev": true, + "license": "(MIT OR Apache-2.0)", "bin": { "btoa": "bin/btoa.js" }, @@ -14040,6 +14225,7 @@ "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "dev": true, + "license": "MIT", "dependencies": { "mime-types": "^2.1.18", "ylru": "^1.2.0" @@ -14169,6 +14355,7 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", @@ -14817,7 +15004,8 @@ "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", @@ -15069,6 +15257,7 @@ "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~2.0.0", "keygrip": "~1.1.0" @@ -15197,6 +15386,7 @@ "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -15457,6 +15647,7 @@ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "dev": true, + "license": "ISC", "engines": { "node": "^14 || ^16 || >=18" }, @@ -15503,6 +15694,7 @@ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "cssnano": "^6.0.1", @@ -15572,6 +15764,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" @@ -15616,6 +15809,7 @@ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "dev": true, + "license": "MIT", "dependencies": { "cssnano-preset-default": "^6.1.2", "lilconfig": "^3.1.1" @@ -15636,6 +15830,7 @@ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "css-declaration-sorter": "^7.2.0", @@ -15680,6 +15875,7 @@ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -15692,6 +15888,7 @@ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, + "license": "MIT", "dependencies": { "css-tree": "~2.2.0" }, @@ -15705,6 +15902,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" @@ -15718,7 +15916,8 @@ "version": "2.0.28", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/cssom": { "version": "0.5.0", @@ -16457,6 +16656,7 @@ "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0" } @@ -16551,7 +16751,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deep-is": { "version": "0.1.4", @@ -16747,7 +16948,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/delimit-stream": { "version": "0.1.0", @@ -17041,6 +17243,7 @@ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -17156,6 +17359,7 @@ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -17252,7 +17456,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", "integrity": "sha512-JM8N6PytDbmIYm1IhPWlo8vr3NtfjhDY/1MhD/a5b/aad/USE8a0+NsqE9d5n+GVGmuNkPQWm4bFQWv18d8tMg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-abstract": { "version": "1.23.3", @@ -18334,6 +18539,7 @@ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, + "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.1" }, @@ -18651,6 +18857,7 @@ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -18660,6 +18867,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -18730,6 +18938,7 @@ "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve-dir": "^1.0.1" }, @@ -18742,6 +18951,7 @@ "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", "dev": true, + "license": "MIT", "dependencies": { "find-file-up": "^2.0.1" }, @@ -18859,6 +19069,7 @@ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", @@ -18893,6 +19104,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -18909,6 +19121,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -18918,6 +19131,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -18933,6 +19147,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -18943,6 +19158,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18959,6 +19175,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -18975,6 +19192,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -18989,6 +19207,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18997,13 +19216,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -19016,6 +19237,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -19034,6 +19256,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19088,6 +19311,7 @@ "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", "dev": true, + "license": "MIT", "dependencies": { "js-yaml": "^3.13.1" } @@ -19096,7 +19320,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fs-extra": { "version": "9.1.0", @@ -19469,6 +19694,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -19483,6 +19709,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -19498,13 +19725,15 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -19888,6 +20117,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, + "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" }, @@ -20074,6 +20304,7 @@ "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dev": true, + "license": "MIT", "dependencies": { "deep-equal": "~1.0.1", "http-errors": "~1.8.0" @@ -20087,6 +20318,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -20096,6 +20328,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -20112,6 +20345,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -20206,6 +20440,7 @@ "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, + "license": "MIT", "dependencies": { "basic-auth": "^2.0.1", "chalk": "^4.1.2", @@ -20233,6 +20468,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -20248,6 +20484,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20264,6 +20501,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -20273,6 +20511,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -21108,6 +21347,7 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -21158,6 +21398,7 @@ "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", "dev": true, + "license": "MIT", "peerDependencies": { "ws": "*" } @@ -21304,6 +21545,7 @@ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -21322,6 +21564,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -21336,13 +21579,15 @@ "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jake/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -21353,6 +21598,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -21369,6 +21615,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -21378,6 +21625,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -21390,6 +21638,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -23392,6 +23641,7 @@ "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "dev": true, + "license": "MIT", "dependencies": { "tsscmp": "1.0.6" }, @@ -23435,6 +23685,7 @@ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -23444,6 +23695,7 @@ "resolved": "https://registry.npmjs.org/koa/-/koa-2.11.0.tgz", "integrity": "sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -23478,13 +23730,15 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/koa-convert": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", "integrity": "sha512-K9XqjmEDStGX09v3oxR7t5uPRy0jqJdvodHa6wxWTHrTfDq0WUNnYTOOUZN6g8OM8oZQXprQASbiIXG2Ez8ehA==", "dev": true, + "license": "MIT", "dependencies": { "co": "^4.6.0", "koa-compose": "^3.0.0" @@ -23498,6 +23752,7 @@ "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", "integrity": "sha512-8gen2cvKHIZ35eDEik5WOo8zbVp9t4cP8p4hW4uE55waxolLRexKKrqfCpwhGVppnB40jWeF8bZeTVg99eZgPw==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.1.0" } @@ -23507,6 +23762,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -23516,6 +23772,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -23525,6 +23782,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -23540,13 +23798,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/koa/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -23713,6 +23973,7 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -23725,6 +23986,7 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -24291,7 +24553,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -24330,7 +24593,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -24531,6 +24795,7 @@ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -24546,7 +24811,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -24732,7 +24998,8 @@ "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/media-typer": { "version": "0.3.0", @@ -26118,7 +26385,8 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.18", @@ -26130,6 +26398,7 @@ "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", "dev": true, + "license": "MIT", "dependencies": { "cron-parser": "^4.2.0", "long-timeout": "0.1.1", @@ -26333,18 +26602,19 @@ "devOptional": true }, "node_modules/nx": { - "version": "19.5.1", - "resolved": "https://registry.npmjs.org/nx/-/nx-19.5.1.tgz", - "integrity": "sha512-aKctNLiK2hXl2536/qwnAqvSzNlIGwJdTBl2ajOnSyNrGWuLDMllTNTdp0/lU0QBJ2NSod3JbBQFV7cc9ILs4w==", + "version": "19.5.6", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.5.6.tgz", + "integrity": "sha512-qjP17aa5ViXSpo0bDgJ7O3b8EY/0+PbX7ZIKvG1g6qasohtfM1y4Sx2bbSow0zCKU0+r1LnR53Q0lyX4OOgtUg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", - "@nrwl/tao": "19.5.1", + "@nrwl/tao": "19.5.6", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.7", - "axios": "^1.6.0", + "axios": "^1.7.2", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", @@ -26380,16 +26650,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.5.1", - "@nx/nx-darwin-x64": "19.5.1", - "@nx/nx-freebsd-x64": "19.5.1", - "@nx/nx-linux-arm-gnueabihf": "19.5.1", - "@nx/nx-linux-arm64-gnu": "19.5.1", - "@nx/nx-linux-arm64-musl": "19.5.1", - "@nx/nx-linux-x64-gnu": "19.5.1", - "@nx/nx-linux-x64-musl": "19.5.1", - "@nx/nx-win32-arm64-msvc": "19.5.1", - "@nx/nx-win32-x64-msvc": "19.5.1" + "@nx/nx-darwin-arm64": "19.5.6", + "@nx/nx-darwin-x64": "19.5.6", + "@nx/nx-freebsd-x64": "19.5.6", + "@nx/nx-linux-arm-gnueabihf": "19.5.6", + "@nx/nx-linux-arm64-gnu": "19.5.6", + "@nx/nx-linux-arm64-musl": "19.5.6", + "@nx/nx-linux-x64-gnu": "19.5.6", + "@nx/nx-linux-x64-musl": "19.5.6", + "@nx/nx-win32-arm64-msvc": "19.5.6", + "@nx/nx-win32-x64-msvc": "19.5.6" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -26409,6 +26679,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -26424,6 +26695,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -26440,6 +26712,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -26452,6 +26725,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -26464,6 +26738,7 @@ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -26473,6 +26748,7 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -26485,6 +26761,7 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dotenv": "^16.4.4" }, @@ -26500,6 +26777,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -26515,6 +26793,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -26529,6 +26808,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -26538,6 +26818,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -26553,6 +26834,7 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -26564,13 +26846,15 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nx/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -26588,6 +26872,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "chalk": "^4.1.0", @@ -26610,6 +26895,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -26622,13 +26908,15 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/nx/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -27293,6 +27581,7 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -27685,6 +27974,7 @@ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, + "license": "MIT", "dependencies": { "async": "^2.6.4", "debug": "^3.2.7", @@ -27699,6 +27989,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.14" } @@ -27708,6 +27999,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -27716,7 +28008,8 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/possible-typed-array-names": { "version": "1.0.0", @@ -27759,6 +28052,7 @@ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" @@ -27775,6 +28069,7 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -27793,6 +28088,7 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -27809,6 +28105,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -27821,6 +28118,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -27833,6 +28131,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -27845,6 +28144,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -27857,6 +28157,7 @@ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -27950,6 +28251,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^6.1.1" @@ -27966,6 +28268,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", @@ -27984,6 +28287,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -27999,6 +28303,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", "dev": true, + "license": "MIT", "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^4.0.2", @@ -28016,6 +28321,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "cssnano-utils": "^4.0.2", @@ -28033,6 +28339,7 @@ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -28103,6 +28410,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14 || ^16 || >=18.0" }, @@ -28115,6 +28423,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -28130,6 +28439,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -28145,6 +28455,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -28160,6 +28471,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -28175,6 +28487,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -28190,6 +28503,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" @@ -28206,6 +28520,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -28221,6 +28536,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -28236,6 +28552,7 @@ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", "dev": true, + "license": "MIT", "dependencies": { "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" @@ -28252,6 +28569,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0" @@ -28268,6 +28586,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -28295,6 +28614,7 @@ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^3.2.0" @@ -28311,6 +28631,7 @@ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.16" }, @@ -28513,7 +28834,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/prr": { "version": "1.0.1", @@ -28633,7 +28955,8 @@ "version": "9.2.1", "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.2.1.tgz", "integrity": "sha512-6Dp+QQVQuAuhwBlbIvL2FjJVHCKF29W+n9ca/BMTVDqpj+Q7KKqUh7UAINEna8aaB2/oRvPuL5hViCTQARa70Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ramda": { "version": "0.26.1", @@ -28717,6 +29040,7 @@ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -29266,6 +29590,7 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -29691,7 +30016,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/select": { "version": "1.1.2", @@ -30146,7 +30472,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/source-map": { "version": "0.7.4", @@ -30682,6 +31009,7 @@ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, + "license": "MIT", "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", @@ -30696,6 +31024,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -30710,6 +31039,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -30719,6 +31049,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -30897,6 +31228,7 @@ "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "duplexer": "^0.1.1", "minimist": "^1.2.0", @@ -30930,6 +31262,7 @@ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.0", "postcss-selector-parser": "^6.0.16" @@ -30974,6 +31307,7 @@ "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.1.3.tgz", "integrity": "sha512-TY0SKwiY7D2kMd3UxaWKSf3xHF0FFN/FAfsSqfrhxRT/koXTwffq2cgEWDkLQz7VojMu7qEEHt5TlMjkPx9UDw==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.12", "normalize-path": "^3.0.0" @@ -31036,6 +31370,7 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, + "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -31061,6 +31396,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -31110,6 +31446,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -31648,6 +31985,7 @@ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -31668,6 +32006,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -31683,6 +32022,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31699,6 +32039,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -31708,6 +32049,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -31776,6 +32118,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz", "integrity": "sha512-fw/7265mIWukrSHd0i+wSwx64kYUSAKPfxRDksjKIYTxSAp9W9/xcZVBF4Kl0eqQd5eBpAQ/oQrc5RyM/0c1GQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", @@ -31790,6 +32133,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -31805,6 +32149,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -31821,6 +32166,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -31830,6 +32176,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -31929,6 +32276,7 @@ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.x" } @@ -32401,6 +32749,7 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4", "yarn": "*" @@ -32460,7 +32809,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/url-parse": { "version": "1.5.10", @@ -33512,6 +33862,7 @@ "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -33994,6 +34345,7 @@ "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } diff --git a/package.json b/package.json index 3f555a43b..ab9b5b812 100644 --- a/package.json +++ b/package.json @@ -152,16 +152,16 @@ "@angular/pwa": "18.1.1", "@nestjs/schematics": "10.0.1", "@nestjs/testing": "10.1.3", - "@nx/angular": "19.5.1", - "@nx/cypress": "19.5.1", - "@nx/eslint-plugin": "19.5.1", - "@nx/jest": "19.5.1", - "@nx/js": "19.5.1", - "@nx/nest": "19.5.1", - "@nx/node": "19.5.1", - "@nx/storybook": "19.5.1", - "@nx/web": "19.5.1", - "@nx/workspace": "19.5.1", + "@nx/angular": "19.5.6", + "@nx/cypress": "19.5.6", + "@nx/eslint-plugin": "19.5.6", + "@nx/jest": "19.5.6", + "@nx/js": "19.5.6", + "@nx/nest": "19.5.6", + "@nx/node": "19.5.6", + "@nx/storybook": "19.5.6", + "@nx/web": "19.5.6", + "@nx/workspace": "19.5.6", "@schematics/angular": "18.1.1", "@simplewebauthn/types": "9.0.1", "@storybook/addon-essentials": "8.2.6", @@ -190,7 +190,7 @@ "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-preset-angular": "14.1.0", - "nx": "19.5.1", + "nx": "19.5.6", "prettier": "3.3.3", "prettier-plugin-organize-attributes": "1.0.0", "react": "18.2.0", From 41f5801b5e27923e9ca3eb4e9ed001eda274507c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 Aug 2024 08:27:05 +0200 Subject: [PATCH 13/16] Feature/refactor unique asset type to asset profile identifier (#3636) * Refactoring --- apps/api/src/app/admin/admin.service.ts | 59 ++++++++++--------- .../src/app/benchmark/benchmark.controller.ts | 8 ++- .../src/app/benchmark/benchmark.service.ts | 15 +++-- apps/api/src/app/import/import.service.ts | 4 +- apps/api/src/app/logo/logo.service.ts | 4 +- apps/api/src/app/order/order.service.ts | 15 ++--- .../calculator/mwr/portfolio-calculator.ts | 7 ++- .../calculator/portfolio-calculator.ts | 22 +++---- .../calculator/twr/portfolio-calculator.ts | 7 ++- .../portfolio/current-rate.service.spec.ts | 16 ++--- .../src/app/portfolio/current-rate.service.ts | 15 +++-- .../interfaces/get-value-object.interface.ts | 4 +- .../app/redis-cache/redis-cache.service.ts | 4 +- .../interfaces/symbol-item.interface.ts | 7 ++- apps/api/src/app/symbol/symbol.service.ts | 6 +- .../data-gathering.processor.ts | 4 +- .../data-gathering/data-gathering.service.ts | 43 +++++++++----- .../data-provider/data-provider.service.ts | 14 ++--- .../exchange-rate-data.service.ts | 24 ++++---- .../api/src/services/interfaces/interfaces.ts | 7 ++- .../market-data/market-data.service.ts | 16 ++--- .../symbol-profile/symbol-profile.service.ts | 12 ++-- .../admin-market-data.component.ts | 16 +++-- .../admin-market-data.service.ts | 18 +++--- .../asset-profile-dialog.component.ts | 15 +++-- .../home-holdings/home-holdings.component.ts | 4 +- .../home-overview/home-overview.component.ts | 4 +- .../import-activities-dialog.component.ts | 19 +++--- .../import-activities-dialog.html | 8 +-- .../allocations/allocations-page.component.ts | 6 +- apps/client/src/app/services/admin.service.ts | 19 +++--- apps/client/src/app/services/data.service.ts | 14 ++--- libs/common/src/lib/helper.ts | 9 ++- .../lib/interfaces/admin-data.interface.ts | 6 +- ... => asset-profile-identifier.interface.ts} | 2 +- libs/common/src/lib/interfaces/index.ts | 4 +- .../interfaces/responses/errors.interface.ts | 4 +- .../src/lib/models/portfolio-snapshot.ts | 4 +- .../activities-table.component.ts | 6 +- .../lib/assistant/interfaces/interfaces.ts | 4 +- .../src/lib/benchmark/benchmark.component.ts | 13 +++- .../holdings-table.component.ts | 7 ++- .../portfolio-proportion-chart.component.ts | 7 ++- .../treemap-chart/treemap-chart.component.ts | 7 ++- 44 files changed, 289 insertions(+), 220 deletions(-) rename libs/common/src/lib/interfaces/{unique-asset.interface.ts => asset-profile-identifier.interface.ts} (68%) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index b15c3efc3..50b781f54 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -21,9 +21,9 @@ import { AdminMarketData, AdminMarketDataDetails, AdminMarketDataItem, + AssetProfileIdentifier, EnhancedSymbolProfile, - Filter, - UniqueAsset + Filter } from '@ghostfolio/common/interfaces'; import { MarketDataPreset } from '@ghostfolio/common/types'; @@ -59,7 +59,9 @@ export class AdminService { currency, dataSource, symbol - }: UniqueAsset & { currency?: string }): Promise { + }: AssetProfileIdentifier & { currency?: string }): Promise< + SymbolProfile | never + > { try { if (dataSource === 'MANUAL') { return this.symbolProfileService.add({ @@ -96,7 +98,10 @@ export class AdminService { } } - public async deleteProfileData({ dataSource, symbol }: UniqueAsset) { + public async deleteProfileData({ + dataSource, + symbol + }: AssetProfileIdentifier) { await this.marketDataService.deleteMany({ dataSource, symbol }); await this.symbolProfileService.delete({ dataSource, symbol }); } @@ -325,7 +330,7 @@ export class AdminService { public async getMarketDataBySymbol({ dataSource, symbol - }: UniqueAsset): Promise { + }: AssetProfileIdentifier): Promise { let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0; let currency: EnhancedSymbolProfile['currency'] = '-'; let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; @@ -386,7 +391,7 @@ export class AdminService { symbol, symbolMapping, url - }: Prisma.SymbolProfileUpdateInput & UniqueAsset) { + }: AssetProfileIdentifier & Prisma.SymbolProfileUpdateInput) { const symbolProfileOverrides = { assetClass: assetClass as AssetClass, assetSubClass: assetSubClass as AssetSubClass, @@ -394,28 +399,28 @@ export class AdminService { url: url as string }; - const updatedSymbolProfile: Prisma.SymbolProfileUpdateInput & UniqueAsset = - { - comment, - countries, - currency, - dataSource, - holdings, - scraperConfiguration, - sectors, - symbol, - symbolMapping, - ...(dataSource === 'MANUAL' - ? { assetClass, assetSubClass, name, url } - : { - SymbolProfileOverrides: { - upsert: { - create: symbolProfileOverrides, - update: symbolProfileOverrides - } + const updatedSymbolProfile: AssetProfileIdentifier & + Prisma.SymbolProfileUpdateInput = { + comment, + countries, + currency, + dataSource, + holdings, + scraperConfiguration, + sectors, + symbol, + symbolMapping, + ...(dataSource === 'MANUAL' + ? { assetClass, assetSubClass, name, url } + : { + SymbolProfileOverrides: { + upsert: { + create: symbolProfileOverrides, + update: symbolProfileOverrides } - }) - }; + } + }) + }; await this.symbolProfileService.updateSymbolProfile(updatedSymbolProfile); diff --git a/apps/api/src/app/benchmark/benchmark.controller.ts b/apps/api/src/app/benchmark/benchmark.controller.ts index 9c6331498..ea9ba8025 100644 --- a/apps/api/src/app/benchmark/benchmark.controller.ts +++ b/apps/api/src/app/benchmark/benchmark.controller.ts @@ -4,9 +4,9 @@ import { getInterval } from '@ghostfolio/api/helper/portfolio.helper'; 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 type { + AssetProfileIdentifier, BenchmarkMarketDataDetails, - BenchmarkResponse, - UniqueAsset + BenchmarkResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import type { DateRange, RequestWithUser } from '@ghostfolio/common/types'; @@ -41,7 +41,9 @@ export class BenchmarkController { @HasPermission(permissions.accessAdminControl) @Post() @UseGuards(AuthGuard('jwt'), HasPermissionGuard) - public async addBenchmark(@Body() { dataSource, symbol }: UniqueAsset) { + public async addBenchmark( + @Body() { dataSource, symbol }: AssetProfileIdentifier + ) { try { const benchmark = await this.benchmarkService.addBenchmark({ dataSource, diff --git a/apps/api/src/app/benchmark/benchmark.service.ts b/apps/api/src/app/benchmark/benchmark.service.ts index 27d91fd7d..e9495b44b 100644 --- a/apps/api/src/app/benchmark/benchmark.service.ts +++ b/apps/api/src/app/benchmark/benchmark.service.ts @@ -17,11 +17,11 @@ import { resetHours } from '@ghostfolio/common/helper'; import { + AssetProfileIdentifier, Benchmark, BenchmarkMarketDataDetails, BenchmarkProperty, - BenchmarkResponse, - UniqueAsset + BenchmarkResponse } from '@ghostfolio/common/interfaces'; import { BenchmarkTrend } from '@ghostfolio/common/types'; @@ -61,7 +61,10 @@ export class BenchmarkService { return 0; } - public async getBenchmarkTrends({ dataSource, symbol }: UniqueAsset) { + public async getBenchmarkTrends({ + dataSource, + symbol + }: AssetProfileIdentifier) { const historicalData = await this.marketDataService.marketDataItems({ orderBy: { date: 'desc' @@ -228,7 +231,7 @@ export class BenchmarkService { endDate?: Date; startDate: Date; userCurrency: string; - } & UniqueAsset): Promise { + } & AssetProfileIdentifier): Promise { const marketData: { date: string; value: number }[] = []; const days = differenceInDays(endDate, startDate) + 1; @@ -348,7 +351,7 @@ export class BenchmarkService { public async addBenchmark({ dataSource, symbol - }: UniqueAsset): Promise> { + }: AssetProfileIdentifier): Promise> { const assetProfile = await this.prismaService.symbolProfile.findFirst({ where: { dataSource, @@ -385,7 +388,7 @@ export class BenchmarkService { public async deleteBenchmark({ dataSource, symbol - }: UniqueAsset): Promise> { + }: AssetProfileIdentifier): Promise> { const assetProfile = await this.prismaService.symbolProfile.findFirst({ where: { dataSource, diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index c5809096e..69e64387d 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -19,7 +19,7 @@ import { getAssetProfileIdentifier, parseDate } from '@ghostfolio/common/helper'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { AccountWithPlatform, OrderWithAccount, @@ -51,7 +51,7 @@ export class ImportService { dataSource, symbol, userCurrency - }: UniqueAsset & { userCurrency: string }): Promise { + }: AssetProfileIdentifier & { userCurrency: string }): Promise { try { const { firstBuyDate, historicalData, orders } = await this.portfolioService.getPosition(dataSource, undefined, symbol); diff --git a/apps/api/src/app/logo/logo.service.ts b/apps/api/src/app/logo/logo.service.ts index a944900a0..908921a19 100644 --- a/apps/api/src/app/logo/logo.service.ts +++ b/apps/api/src/app/logo/logo.service.ts @@ -1,6 +1,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { HttpException, Injectable } from '@nestjs/common'; import { DataSource } from '@prisma/client'; @@ -17,7 +17,7 @@ export class LogoService { public async getLogoByDataSourceAndSymbol({ dataSource, symbol - }: UniqueAsset) { + }: AssetProfileIdentifier) { if (!DataSource[dataSource]) { throw new HttpException( getReasonPhrase(StatusCodes.NOT_FOUND), diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index f7be3ba00..3b95211f0 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -11,9 +11,9 @@ import { } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { + AssetProfileIdentifier, EnhancedSymbolProfile, - Filter, - UniqueAsset + Filter } from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; @@ -51,7 +51,7 @@ export class OrderService { symbol, tags, userId - }: { tags: Tag[]; userId: string } & UniqueAsset) { + }: { tags: Tag[]; userId: string } & AssetProfileIdentifier) { const orders = await this.prismaService.order.findMany({ where: { userId, @@ -285,7 +285,7 @@ export class OrderService { return count; } - public async getLatestOrder({ dataSource, symbol }: UniqueAsset) { + public async getLatestOrder({ dataSource, symbol }: AssetProfileIdentifier) { return this.prismaService.order.findFirst({ orderBy: { date: 'desc' @@ -464,7 +464,7 @@ export class OrderService { this.prismaService.order.count({ where }) ]); - const uniqueAssets = uniqBy( + const assetProfileIdentifiers = uniqBy( orders.map(({ SymbolProfile }) => { return { dataSource: SymbolProfile.dataSource, @@ -479,8 +479,9 @@ export class OrderService { } ); - const assetProfiles = - await this.symbolProfileService.getSymbolProfiles(uniqueAssets); + const assetProfiles = await this.symbolProfileService.getSymbolProfiles( + assetProfileIdentifiers + ); const activities = orders.map((order) => { const assetProfile = assetProfiles.find(({ dataSource, symbol }) => { diff --git a/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts index 5d168b619..1b142d8b3 100644 --- a/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/mwr/portfolio-calculator.ts @@ -1,5 +1,8 @@ import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator'; -import { SymbolMetrics, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + SymbolMetrics +} from '@ghostfolio/common/interfaces'; import { PortfolioSnapshot, TimelinePosition } from '@ghostfolio/common/models'; export class MWRPortfolioCalculator extends PortfolioCalculator { @@ -27,7 +30,7 @@ export class MWRPortfolioCalculator extends PortfolioCalculator { }; start: Date; step?: number; - } & UniqueAsset): SymbolMetrics { + } & AssetProfileIdentifier): SymbolMetrics { throw new Error('Method not implemented.'); } } diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index ec56a247c..8c9342e39 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -19,12 +19,12 @@ import { resetHours } from '@ghostfolio/common/helper'; import { + AssetProfileIdentifier, DataProviderInfo, HistoricalDataItem, InvestmentItem, ResponseError, - SymbolMetrics, - UniqueAsset + SymbolMetrics } from '@ghostfolio/common/interfaces'; import { PortfolioSnapshot, TimelinePosition } from '@ghostfolio/common/models'; import { DateRange, GroupBy } from '@ghostfolio/common/types'; @@ -356,15 +356,15 @@ export abstract class PortfolioCalculator { dataSource: item.dataSource, fee: item.fee, firstBuyDate: item.firstBuyDate, - grossPerformance: !hasErrors ? grossPerformance ?? null : null, + grossPerformance: !hasErrors ? (grossPerformance ?? null) : null, grossPerformancePercentage: !hasErrors - ? grossPerformancePercentage ?? null + ? (grossPerformancePercentage ?? null) : null, grossPerformancePercentageWithCurrencyEffect: !hasErrors - ? grossPerformancePercentageWithCurrencyEffect ?? null + ? (grossPerformancePercentageWithCurrencyEffect ?? null) : null, grossPerformanceWithCurrencyEffect: !hasErrors - ? grossPerformanceWithCurrencyEffect ?? null + ? (grossPerformanceWithCurrencyEffect ?? null) : null, investment: totalInvestment, investmentWithCurrencyEffect: totalInvestmentWithCurrencyEffect, @@ -372,15 +372,15 @@ export abstract class PortfolioCalculator { marketSymbolMap[endDateString]?.[item.symbol]?.toNumber() ?? null, marketPriceInBaseCurrency: marketPriceInBaseCurrency?.toNumber() ?? null, - netPerformance: !hasErrors ? netPerformance ?? null : null, + netPerformance: !hasErrors ? (netPerformance ?? null) : null, netPerformancePercentage: !hasErrors - ? netPerformancePercentage ?? null + ? (netPerformancePercentage ?? null) : null, netPerformancePercentageWithCurrencyEffect: !hasErrors - ? netPerformancePercentageWithCurrencyEffect ?? null + ? (netPerformancePercentageWithCurrencyEffect ?? null) : null, netPerformanceWithCurrencyEffect: !hasErrors - ? netPerformanceWithCurrencyEffect ?? null + ? (netPerformanceWithCurrencyEffect ?? null) : null, quantity: item.quantity, symbol: item.symbol, @@ -905,7 +905,7 @@ export abstract class PortfolioCalculator { }; start: Date; step?: number; - } & UniqueAsset): SymbolMetrics; + } & AssetProfileIdentifier): SymbolMetrics; public getTransactionPoints() { return this.transactionPoints; diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index e9f1f3fda..50550eec5 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -2,7 +2,10 @@ import { PortfolioCalculator } from '@ghostfolio/api/app/portfolio/calculator/po import { PortfolioOrderItem } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order-item.interface'; import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; -import { SymbolMetrics, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + SymbolMetrics +} from '@ghostfolio/common/interfaces'; import { PortfolioSnapshot, TimelinePosition } from '@ghostfolio/common/models'; import { Logger } from '@nestjs/common'; @@ -151,7 +154,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { }; start: Date; step?: number; - } & UniqueAsset): SymbolMetrics { + } & AssetProfileIdentifier): SymbolMetrics { const currentExchangeRate = exchangeRates[format(new Date(), DATE_FORMAT)]; const currentValues: { [date: string]: Big } = {}; const currentValuesWithCurrencyEffect: { [date: string]: Big } = {}; diff --git a/apps/api/src/app/portfolio/current-rate.service.spec.ts b/apps/api/src/app/portfolio/current-rate.service.spec.ts index 9b0548522..c86dde448 100644 --- a/apps/api/src/app/portfolio/current-rate.service.spec.ts +++ b/apps/api/src/app/portfolio/current-rate.service.spec.ts @@ -1,7 +1,7 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { DataSource, MarketData } from '@prisma/client'; @@ -24,32 +24,32 @@ jest.mock('@ghostfolio/api/services/market-data/market-data.service', () => { }); }, getRange: ({ + assetProfileIdentifiers, dateRangeEnd, - dateRangeStart, - uniqueAssets + dateRangeStart }: { + assetProfileIdentifiers: AssetProfileIdentifier[]; dateRangeEnd: Date; dateRangeStart: Date; - uniqueAssets: UniqueAsset[]; }) => { return Promise.resolve([ { createdAt: dateRangeStart, - dataSource: uniqueAssets[0].dataSource, + dataSource: assetProfileIdentifiers[0].dataSource, date: dateRangeStart, id: '8fa48fde-f397-4b0d-adbc-fb940e830e6d', marketPrice: 1841.823902, state: 'CLOSE', - symbol: uniqueAssets[0].symbol + symbol: assetProfileIdentifiers[0].symbol }, { createdAt: dateRangeEnd, - dataSource: uniqueAssets[0].dataSource, + dataSource: assetProfileIdentifiers[0].dataSource, date: dateRangeEnd, id: '082d6893-df27-4c91-8a5d-092e84315b56', marketPrice: 1847.839966, state: 'CLOSE', - symbol: uniqueAssets[0].symbol + symbol: assetProfileIdentifiers[0].symbol } ]); } diff --git a/apps/api/src/app/portfolio/current-rate.service.ts b/apps/api/src/app/portfolio/current-rate.service.ts index 712d07e7a..24119162d 100644 --- a/apps/api/src/app/portfolio/current-rate.service.ts +++ b/apps/api/src/app/portfolio/current-rate.service.ts @@ -3,9 +3,9 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { resetHours } from '@ghostfolio/common/helper'; import { + AssetProfileIdentifier, DataProviderInfo, - ResponseError, - UniqueAsset + ResponseError } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; @@ -80,17 +80,16 @@ export class CurrentRateService { ); } - const uniqueAssets: UniqueAsset[] = dataGatheringItems.map( - ({ dataSource, symbol }) => { + const assetProfileIdentifiers: AssetProfileIdentifier[] = + dataGatheringItems.map(({ dataSource, symbol }) => { return { dataSource, symbol }; - } - ); + }); promises.push( this.marketDataService .getRange({ - dateQuery, - uniqueAssets + assetProfileIdentifiers, + dateQuery }) .then((data) => { return data.map(({ dataSource, date, marketPrice, symbol }) => { diff --git a/apps/api/src/app/portfolio/interfaces/get-value-object.interface.ts b/apps/api/src/app/portfolio/interfaces/get-value-object.interface.ts index 6c42d260c..34b426693 100644 --- a/apps/api/src/app/portfolio/interfaces/get-value-object.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/get-value-object.interface.ts @@ -1,6 +1,6 @@ -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; -export interface GetValueObject extends UniqueAsset { +export interface GetValueObject extends AssetProfileIdentifier { date: Date; marketPrice: number; } diff --git a/apps/api/src/app/redis-cache/redis-cache.service.ts b/apps/api/src/app/redis-cache/redis-cache.service.ts index 53b177b4f..de41220b9 100644 --- a/apps/api/src/app/redis-cache/redis-cache.service.ts +++ b/apps/api/src/app/redis-cache/redis-cache.service.ts @@ -1,6 +1,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { Inject, Injectable, Logger } from '@nestjs/common'; @@ -28,7 +28,7 @@ export class RedisCacheService { return `portfolio-snapshot-${userId}`; } - public getQuoteKey({ dataSource, symbol }: UniqueAsset) { + public getQuoteKey({ dataSource, symbol }: AssetProfileIdentifier) { return `quote-${getAssetProfileIdentifier({ dataSource, symbol })}`; } diff --git a/apps/api/src/app/symbol/interfaces/symbol-item.interface.ts b/apps/api/src/app/symbol/interfaces/symbol-item.interface.ts index 358658672..710a84144 100644 --- a/apps/api/src/app/symbol/interfaces/symbol-item.interface.ts +++ b/apps/api/src/app/symbol/interfaces/symbol-item.interface.ts @@ -1,6 +1,9 @@ -import { HistoricalDataItem, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + HistoricalDataItem +} from '@ghostfolio/common/interfaces'; -export interface SymbolItem extends UniqueAsset { +export interface SymbolItem extends AssetProfileIdentifier { currency: string; historicalData: HistoricalDataItem[]; marketPrice: number; diff --git a/apps/api/src/app/symbol/symbol.service.ts b/apps/api/src/app/symbol/symbol.service.ts index 90259a776..2baca18dd 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -40,13 +40,13 @@ export class SymbolService { const days = includeHistoricalData; const marketData = await this.marketDataService.getRange({ - dateQuery: { gte: subDays(new Date(), days) }, - uniqueAssets: [ + assetProfileIdentifiers: [ { dataSource: dataGatheringItem.dataSource, symbol: dataGatheringItem.symbol } - ] + ], + dateQuery: { gte: subDays(new Date(), days) } }); historicalData = marketData.map(({ date, marketPrice: value }) => { diff --git a/apps/api/src/services/data-gathering/data-gathering.processor.ts b/apps/api/src/services/data-gathering/data-gathering.processor.ts index 11eda2e7a..d8a6a7644 100644 --- a/apps/api/src/services/data-gathering/data-gathering.processor.ts +++ b/apps/api/src/services/data-gathering/data-gathering.processor.ts @@ -7,7 +7,7 @@ import { GATHER_HISTORICAL_MARKET_DATA_PROCESS } from '@ghostfolio/common/config'; import { DATE_FORMAT, getStartOfUtcDate } from '@ghostfolio/common/helper'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { Process, Processor } from '@nestjs/bull'; import { Injectable, Logger } from '@nestjs/common'; @@ -35,7 +35,7 @@ export class DataGatheringProcessor { ) {} @Process({ concurrency: 1, name: GATHER_ASSET_PROFILE_PROCESS }) - public async gatherAssetProfile(job: Job) { + public async gatherAssetProfile(job: Job) { try { Logger.log( `Asset profile data gathering has been started for ${job.data.symbol} (${job.data.dataSource})`, diff --git a/apps/api/src/services/data-gathering/data-gathering.service.ts b/apps/api/src/services/data-gathering/data-gathering.service.ts index 2bf6cc1b2..8b8c65a21 100644 --- a/apps/api/src/services/data-gathering/data-gathering.service.ts +++ b/apps/api/src/services/data-gathering/data-gathering.service.ts @@ -20,7 +20,10 @@ import { getAssetProfileIdentifier, resetHours } from '@ghostfolio/common/helper'; -import { BenchmarkProperty, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + BenchmarkProperty +} from '@ghostfolio/common/interfaces'; import { InjectQueue } from '@nestjs/bull'; import { Inject, Injectable, Logger } from '@nestjs/common'; @@ -91,7 +94,7 @@ export class DataGatheringService { }); } - public async gatherSymbol({ dataSource, symbol }: UniqueAsset) { + public async gatherSymbol({ dataSource, symbol }: AssetProfileIdentifier) { await this.marketDataService.deleteMany({ dataSource, symbol }); const dataGatheringItems = (await this.getSymbolsMax()).filter( @@ -146,23 +149,29 @@ export class DataGatheringService { } } - public async gatherAssetProfiles(aUniqueAssets?: UniqueAsset[]) { - let uniqueAssets = aUniqueAssets?.filter((dataGatheringItem) => { - return dataGatheringItem.dataSource !== 'MANUAL'; - }); + public async gatherAssetProfiles( + aAssetProfileIdentifiers?: AssetProfileIdentifier[] + ) { + let assetProfileIdentifiers = aAssetProfileIdentifiers?.filter( + (dataGatheringItem) => { + return dataGatheringItem.dataSource !== 'MANUAL'; + } + ); - if (!uniqueAssets) { - uniqueAssets = await this.getAllAssetProfileIdentifiers(); + if (!assetProfileIdentifiers) { + assetProfileIdentifiers = await this.getAllAssetProfileIdentifiers(); } - if (uniqueAssets.length <= 0) { + if (assetProfileIdentifiers.length <= 0) { return; } - const assetProfiles = - await this.dataProviderService.getAssetProfiles(uniqueAssets); - const symbolProfiles = - await this.symbolProfileService.getSymbolProfiles(uniqueAssets); + const assetProfiles = await this.dataProviderService.getAssetProfiles( + assetProfileIdentifiers + ); + const symbolProfiles = await this.symbolProfileService.getSymbolProfiles( + assetProfileIdentifiers + ); for (const [symbol, assetProfile] of Object.entries(assetProfiles)) { const symbolMapping = symbolProfiles.find((symbolProfile) => { @@ -248,7 +257,7 @@ export class DataGatheringService { 'DataGatheringService' ); - if (uniqueAssets.length === 1) { + if (assetProfileIdentifiers.length === 1) { throw error; } } @@ -284,7 +293,9 @@ export class DataGatheringService { ); } - public async getAllAssetProfileIdentifiers(): Promise { + public async getAllAssetProfileIdentifiers(): Promise< + AssetProfileIdentifier[] + > { const symbolProfiles = await this.prismaService.symbolProfile.findMany({ orderBy: [{ symbol: 'asc' }] }); @@ -305,7 +316,7 @@ export class DataGatheringService { } private async getAssetProfileIdentifiersWithCompleteMarketData(): Promise< - UniqueAsset[] + AssetProfileIdentifier[] > { return ( await this.prismaService.marketData.groupBy({ 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 58574a3b5..e5eda2d7e 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -20,7 +20,7 @@ import { getStartOfUtcDate, isDerivedCurrency } from '@ghostfolio/common/helper'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import type { Granularity, UserWithSettings } from '@ghostfolio/common/types'; import { Inject, Injectable, Logger } from '@nestjs/common'; @@ -75,7 +75,7 @@ export class DataProviderService { return false; } - public async getAssetProfiles(items: UniqueAsset[]): Promise<{ + public async getAssetProfiles(items: AssetProfileIdentifier[]): Promise<{ [symbol: string]: Partial; }> { const response: { @@ -173,7 +173,7 @@ export class DataProviderService { } public async getHistorical( - aItems: UniqueAsset[], + aItems: AssetProfileIdentifier[], aGranularity: Granularity = 'month', from: Date, to: Date @@ -243,7 +243,7 @@ export class DataProviderService { from, to }: { - dataGatheringItems: UniqueAsset[]; + dataGatheringItems: AssetProfileIdentifier[]; from: Date; to: Date; }): Promise<{ @@ -350,7 +350,7 @@ export class DataProviderService { useCache = true, user }: { - items: UniqueAsset[]; + items: AssetProfileIdentifier[]; requestTimeout?: number; useCache?: boolean; user?: UserWithSettings; @@ -376,7 +376,7 @@ export class DataProviderService { } // Get items from cache - const itemsToFetch: UniqueAsset[] = []; + const itemsToFetch: AssetProfileIdentifier[] = []; for (const { dataSource, symbol } of items) { if (useCache) { @@ -633,7 +633,7 @@ export class DataProviderService { dataGatheringItems }: { currency: string; - dataGatheringItems: UniqueAsset[]; + dataGatheringItems: AssetProfileIdentifier[]; }) { return dataGatheringItems.some(({ dataSource, symbol }) => { return ( diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 29d199ed7..1f08034cd 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -361,13 +361,13 @@ export class ExchangeRateDataService { const symbol = `${currencyFrom}${currencyTo}`; const marketData = await this.marketDataService.getRange({ - dateQuery: { gte: startDate, lt: endDate }, - uniqueAssets: [ + assetProfileIdentifiers: [ { dataSource, symbol } - ] + ], + dateQuery: { gte: startDate, lt: endDate } }); if (marketData?.length > 0) { @@ -392,13 +392,13 @@ export class ExchangeRateDataService { } } else { const marketData = await this.marketDataService.getRange({ - dateQuery: { gte: startDate, lt: endDate }, - uniqueAssets: [ + assetProfileIdentifiers: [ { dataSource, symbol: `${DEFAULT_CURRENCY}${currencyFrom}` } - ] + ], + dateQuery: { gte: startDate, lt: endDate } }); for (const { date, marketPrice } of marketData) { @@ -415,16 +415,16 @@ export class ExchangeRateDataService { } } else { const marketData = await this.marketDataService.getRange({ - dateQuery: { - gte: startDate, - lt: endDate - }, - uniqueAssets: [ + assetProfileIdentifiers: [ { dataSource, symbol: `${DEFAULT_CURRENCY}${currencyTo}` } - ] + ], + dateQuery: { + gte: startDate, + lt: endDate + } }); for (const { date, marketPrice } of marketData) { diff --git a/apps/api/src/services/interfaces/interfaces.ts b/apps/api/src/services/interfaces/interfaces.ts index b945d0945..fa7fc4d09 100644 --- a/apps/api/src/services/interfaces/interfaces.ts +++ b/apps/api/src/services/interfaces/interfaces.ts @@ -1,4 +1,7 @@ -import { DataProviderInfo, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + DataProviderInfo +} from '@ghostfolio/common/interfaces'; import { MarketState } from '@ghostfolio/common/types'; import { @@ -34,6 +37,6 @@ export interface IDataProviderResponse { marketState: MarketState; } -export interface IDataGatheringItem extends UniqueAsset { +export interface IDataGatheringItem extends AssetProfileIdentifier { date?: Date; } diff --git a/apps/api/src/services/market-data/market-data.service.ts b/apps/api/src/services/market-data/market-data.service.ts index faf429955..09f591b9e 100644 --- a/apps/api/src/services/market-data/market-data.service.ts +++ b/apps/api/src/services/market-data/market-data.service.ts @@ -3,7 +3,7 @@ import { DateQuery } from '@ghostfolio/api/app/portfolio/interfaces/date-query.i import { IDataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { resetHours } from '@ghostfolio/common/helper'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { Injectable } from '@nestjs/common'; import { @@ -17,7 +17,7 @@ import { export class MarketDataService { public constructor(private readonly prismaService: PrismaService) {} - public async deleteMany({ dataSource, symbol }: UniqueAsset) { + public async deleteMany({ dataSource, symbol }: AssetProfileIdentifier) { return this.prismaService.marketData.deleteMany({ where: { dataSource, @@ -40,7 +40,7 @@ export class MarketDataService { }); } - public async getMax({ dataSource, symbol }: UniqueAsset) { + public async getMax({ dataSource, symbol }: AssetProfileIdentifier) { return this.prismaService.marketData.findFirst({ select: { date: true, @@ -59,11 +59,11 @@ export class MarketDataService { } public async getRange({ - dateQuery, - uniqueAssets + assetProfileIdentifiers, + dateQuery }: { + assetProfileIdentifiers: AssetProfileIdentifier[]; dateQuery: DateQuery; - uniqueAssets: UniqueAsset[]; }): Promise { return this.prismaService.marketData.findMany({ orderBy: [ @@ -76,13 +76,13 @@ export class MarketDataService { ], where: { dataSource: { - in: uniqueAssets.map(({ dataSource }) => { + in: assetProfileIdentifiers.map(({ dataSource }) => { return dataSource; }) }, date: dateQuery, symbol: { - in: uniqueAssets.map(({ symbol }) => { + in: assetProfileIdentifiers.map(({ symbol }) => { return symbol; }) } diff --git a/apps/api/src/services/symbol-profile/symbol-profile.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts index e0cfed292..50cb25000 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -1,10 +1,10 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { + AssetProfileIdentifier, EnhancedSymbolProfile, Holding, - ScraperConfiguration, - UniqueAsset + ScraperConfiguration } from '@ghostfolio/common/interfaces'; import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; @@ -23,7 +23,7 @@ export class SymbolProfileService { return this.prismaService.symbolProfile.create({ data: assetProfile }); } - public async delete({ dataSource, symbol }: UniqueAsset) { + public async delete({ dataSource, symbol }: AssetProfileIdentifier) { return this.prismaService.symbolProfile.delete({ where: { dataSource_symbol: { dataSource, symbol } } }); @@ -36,7 +36,7 @@ export class SymbolProfileService { } public async getSymbolProfiles( - aUniqueAssets: UniqueAsset[] + aAssetProfileIdentifiers: AssetProfileIdentifier[] ): Promise { return this.prismaService.symbolProfile .findMany({ @@ -54,7 +54,7 @@ export class SymbolProfileService { SymbolProfileOverrides: true }, where: { - OR: aUniqueAssets.map(({ dataSource, symbol }) => { + OR: aAssetProfileIdentifiers.map(({ dataSource, symbol }) => { return { dataSource, symbol @@ -140,7 +140,7 @@ export class SymbolProfileService { symbolMapping, SymbolProfileOverrides, url - }: Prisma.SymbolProfileUpdateInput & UniqueAsset) { + }: AssetProfileIdentifier & Prisma.SymbolProfileUpdateInput) { return this.prismaService.symbolProfile.update({ data: { assetClass, diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts index e27283517..98a1d0480 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts @@ -7,9 +7,9 @@ import { } from '@ghostfolio/common/config'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { + AssetProfileIdentifier, Filter, InfoItem, - UniqueAsset, User } from '@ghostfolio/common/interfaces'; import { AdminMarketDataItem } from '@ghostfolio/common/interfaces/admin-market-data.interface'; @@ -225,7 +225,7 @@ export class AdminMarketDataComponent }); } - public onDeleteAssetProfile({ dataSource, symbol }: UniqueAsset) { + public onDeleteAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) { this.adminMarketDataService.deleteAssetProfile({ dataSource, symbol }); } @@ -266,21 +266,27 @@ export class AdminMarketDataComponent .subscribe(() => {}); } - public onGatherProfileDataBySymbol({ dataSource, symbol }: UniqueAsset) { + public onGatherProfileDataBySymbol({ + dataSource, + symbol + }: AssetProfileIdentifier) { this.adminService .gatherProfileDataBySymbol({ dataSource, symbol }) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => {}); } - public onGatherSymbol({ dataSource, symbol }: UniqueAsset) { + public onGatherSymbol({ dataSource, symbol }: AssetProfileIdentifier) { this.adminService .gatherSymbol({ dataSource, symbol }) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => {}); } - public onOpenAssetProfileDialog({ dataSource, symbol }: UniqueAsset) { + public onOpenAssetProfileDialog({ + dataSource, + symbol + }: AssetProfileIdentifier) { this.router.navigate([], { queryParams: { dataSource, diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts index 8f3084cd8..799606293 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts @@ -2,8 +2,8 @@ import { AdminService } from '@ghostfolio/client/services/admin.service'; import { ghostfolioScraperApiSymbolPrefix } from '@ghostfolio/common/config'; import { getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper'; import { - AdminMarketDataItem, - UniqueAsset + AssetProfileIdentifier, + AdminMarketDataItem } from '@ghostfolio/common/interfaces'; import { Injectable } from '@angular/core'; @@ -13,7 +13,7 @@ import { EMPTY, catchError, finalize, forkJoin, takeUntil } from 'rxjs'; export class AdminMarketDataService { public constructor(private adminService: AdminService) {} - public deleteAssetProfile({ dataSource, symbol }: UniqueAsset) { + public deleteAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) { const confirmation = confirm( $localize`Do you really want to delete this asset profile?` ); @@ -29,15 +29,19 @@ export class AdminMarketDataService { } } - public deleteAssetProfiles(uniqueAssets: UniqueAsset[]) { + public deleteAssetProfiles( + aAssetProfileIdentifiers: AssetProfileIdentifier[] + ) { const confirmation = confirm( $localize`Do you really want to delete these profiles?` ); if (confirmation) { - const deleteRequests = uniqueAssets.map(({ dataSource, symbol }) => { - return this.adminService.deleteProfileData({ dataSource, symbol }); - }); + const deleteRequests = aAssetProfileIdentifiers.map( + ({ dataSource, symbol }) => { + return this.adminService.deleteProfileData({ dataSource, symbol }); + } + ); forkJoin(deleteRequests) .pipe( 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 18b73a0cb..a24d6dc30 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 @@ -8,7 +8,7 @@ import { ghostfolioScraperApiSymbolPrefix } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { AdminMarketDataDetails, - UniqueAsset + AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { translate } from '@ghostfolio/ui/i18n'; @@ -175,20 +175,23 @@ export class AssetProfileDialog implements OnDestroy, OnInit { this.dialogRef.close(); } - public onDeleteProfileData({ dataSource, symbol }: UniqueAsset) { + public onDeleteProfileData({ dataSource, symbol }: AssetProfileIdentifier) { this.adminMarketDataService.deleteAssetProfile({ dataSource, symbol }); this.dialogRef.close(); } - public onGatherProfileDataBySymbol({ dataSource, symbol }: UniqueAsset) { + public onGatherProfileDataBySymbol({ + dataSource, + symbol + }: AssetProfileIdentifier) { this.adminService .gatherProfileDataBySymbol({ dataSource, symbol }) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => {}); } - public onGatherSymbol({ dataSource, symbol }: UniqueAsset) { + public onGatherSymbol({ dataSource, symbol }: AssetProfileIdentifier) { this.adminService .gatherSymbol({ dataSource, symbol }) .pipe(takeUntil(this.unsubscribeSubject)) @@ -242,7 +245,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit { } } - public onSetBenchmark({ dataSource, symbol }: UniqueAsset) { + public onSetBenchmark({ dataSource, symbol }: AssetProfileIdentifier) { this.dataService .postBenchmark({ dataSource, symbol }) .pipe(takeUntil(this.unsubscribeSubject)) @@ -342,7 +345,7 @@ export class AssetProfileDialog implements OnDestroy, OnInit { }); } - public onUnsetBenchmark({ dataSource, symbol }: UniqueAsset) { + public onUnsetBenchmark({ dataSource, symbol }: AssetProfileIdentifier) { this.dataService .deleteBenchmark({ dataSource, symbol }) .pipe(takeUntil(this.unsubscribeSubject)) diff --git a/apps/client/src/app/components/home-holdings/home-holdings.component.ts b/apps/client/src/app/components/home-holdings/home-holdings.component.ts index dca8bbe55..fc51796d6 100644 --- a/apps/client/src/app/components/home-holdings/home-holdings.component.ts +++ b/apps/client/src/app/components/home-holdings/home-holdings.component.ts @@ -2,8 +2,8 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { + AssetProfileIdentifier, PortfolioPosition, - UniqueAsset, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -108,7 +108,7 @@ export class HomeHoldingsComponent implements OnDestroy, OnInit { this.initialize(); } - public onSymbolClicked({ dataSource, symbol }: UniqueAsset) { + public onSymbolClicked({ dataSource, symbol }: AssetProfileIdentifier) { if (dataSource && symbol) { this.router.navigate([], { queryParams: { dataSource, symbol, holdingDetailDialog: true } diff --git a/apps/client/src/app/components/home-overview/home-overview.component.ts b/apps/client/src/app/components/home-overview/home-overview.component.ts index d07ca91ce..9addc24b7 100644 --- a/apps/client/src/app/components/home-overview/home-overview.component.ts +++ b/apps/client/src/app/components/home-overview/home-overview.component.ts @@ -5,9 +5,9 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/imperso import { UserService } from '@ghostfolio/client/services/user/user.service'; import { NUMERICAL_PRECISION_THRESHOLD } from '@ghostfolio/common/config'; import { + AssetProfileIdentifier, LineChartItem, PortfolioPerformance, - UniqueAsset, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -26,7 +26,7 @@ import { takeUntil } from 'rxjs/operators'; export class HomeOverviewComponent implements OnDestroy, OnInit { public dateRangeOptions = ToggleComponent.DEFAULT_DATE_RANGE_OPTIONS; public deviceType: string; - public errors: UniqueAsset[]; + public errors: AssetProfileIdentifier[]; public hasError: boolean; public hasImpersonationId: boolean; public hasPermissionToCreateOrder: boolean; 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 b59994811..1848c5306 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 @@ -38,6 +38,7 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces'; export class ImportActivitiesDialog implements OnDestroy { public accounts: CreateAccountDto[] = []; public activities: Activity[] = []; + public assetProfileForm: FormGroup; public dataSource: MatTableDataSource; public details: any[] = []; public deviceType: string; @@ -53,7 +54,6 @@ export class ImportActivitiesDialog implements OnDestroy { public sortDirection: SortDirection = 'desc'; public stepperOrientation: StepperOrientation; public totalItems: number; - public uniqueAssetForm: FormGroup; private unsubscribeSubject = new Subject(); @@ -73,8 +73,8 @@ export class ImportActivitiesDialog implements OnDestroy { this.stepperOrientation = this.deviceType === 'mobile' ? 'vertical' : 'horizontal'; - this.uniqueAssetForm = this.formBuilder.group({ - uniqueAsset: [undefined, Validators.required] + this.assetProfileForm = this.formBuilder.group({ + assetProfileIdentifier: [undefined, Validators.required] }); if ( @@ -85,7 +85,7 @@ export class ImportActivitiesDialog implements OnDestroy { this.dialogTitle = $localize`Import Dividends`; this.mode = 'DIVIDEND'; - this.uniqueAssetForm.get('uniqueAsset').disable(); + this.assetProfileForm.get('assetProfileIdentifier').disable(); this.dataService .fetchPortfolioHoldings({ @@ -102,7 +102,7 @@ export class ImportActivitiesDialog implements OnDestroy { this.holdings = sortBy(holdings, ({ name }) => { return name.toLowerCase(); }); - this.uniqueAssetForm.get('uniqueAsset').enable(); + this.assetProfileForm.get('assetProfileIdentifier').enable(); this.isLoading = false; @@ -167,10 +167,11 @@ export class ImportActivitiesDialog implements OnDestroy { } public onLoadDividends(aStepper: MatStepper) { - this.uniqueAssetForm.get('uniqueAsset').disable(); + this.assetProfileForm.get('assetProfileIdentifier').disable(); - const { dataSource, symbol } = - this.uniqueAssetForm.get('uniqueAsset').value; + const { dataSource, symbol } = this.assetProfileForm.get( + 'assetProfileIdentifier' + ).value; this.dataService .fetchDividendsImport({ @@ -193,7 +194,7 @@ export class ImportActivitiesDialog implements OnDestroy { this.details = []; this.errorMessages = []; this.importStep = ImportStep.SELECT_ACTIVITIES; - this.uniqueAssetForm.get('uniqueAsset').enable(); + this.assetProfileForm.get('assetProfileIdentifier').enable(); aStepper.reset(); } diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html index d8c2201f9..3bffe8aee 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html @@ -25,14 +25,14 @@
@if (mode === 'DIVIDEND') {
Holding - + {{ - uniqueAssetForm.get('uniqueAsset')?.value?.name + assetProfileForm.get('assetProfileIdentifier')?.value?.name }} @for (holding of holdings; track holding) { Load Dividends diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index 27c6326e9..5af3a3099 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -6,10 +6,10 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { MAX_TOP_HOLDINGS, UNKNOWN_KEY } from '@ghostfolio/common/config'; import { prettifySymbol } from '@ghostfolio/common/helper'; import { + AssetProfileIdentifier, Holding, PortfolioDetails, PortfolioPosition, - UniqueAsset, User } from '@ghostfolio/common/interfaces'; import { Market, MarketAdvanced } from '@ghostfolio/common/types'; @@ -161,7 +161,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { this.initialize(); } - public onAccountChartClicked({ symbol }: UniqueAsset) { + public onAccountChartClicked({ symbol }: AssetProfileIdentifier) { if (symbol && symbol !== UNKNOWN_KEY) { this.router.navigate([], { queryParams: { accountId: symbol, accountDetailDialog: true } @@ -169,7 +169,7 @@ export class AllocationsPageComponent implements OnDestroy, OnInit { } } - public onSymbolChartClicked({ dataSource, symbol }: UniqueAsset) { + public onSymbolChartClicked({ dataSource, symbol }: AssetProfileIdentifier) { if (dataSource && symbol) { this.router.navigate([], { queryParams: { dataSource, symbol, holdingDetailDialog: true } diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index 5bc281900..e5ea176d1 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -7,13 +7,13 @@ import { UpdateTagDto } from '@ghostfolio/api/app/tag/update-tag.dto'; import { IDataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { + AssetProfileIdentifier, AdminData, AdminJobs, AdminMarketData, AdminMarketDataDetails, EnhancedSymbolProfile, - Filter, - UniqueAsset + Filter } from '@ghostfolio/common/interfaces'; import { HttpClient, HttpParams } from '@angular/common/http'; @@ -35,7 +35,7 @@ export class AdminService { private http: HttpClient ) {} - public addAssetProfile({ dataSource, symbol }: UniqueAsset) { + public addAssetProfile({ dataSource, symbol }: AssetProfileIdentifier) { return this.http.post( `/api/v1/admin/profile-data/${dataSource}/${symbol}`, null @@ -62,7 +62,7 @@ export class AdminService { return this.http.delete(`/api/v1/platform/${aId}`); } - public deleteProfileData({ dataSource, symbol }: UniqueAsset) { + public deleteProfileData({ dataSource, symbol }: AssetProfileIdentifier) { return this.http.delete( `/api/v1/admin/profile-data/${dataSource}/${symbol}` ); @@ -167,7 +167,10 @@ export class AdminService { return this.http.post('/api/v1/admin/gather/profile-data', {}); } - public gatherProfileDataBySymbol({ dataSource, symbol }: UniqueAsset) { + public gatherProfileDataBySymbol({ + dataSource, + symbol + }: AssetProfileIdentifier) { return this.http.post( `/api/v1/admin/gather/profile-data/${dataSource}/${symbol}`, {} @@ -178,7 +181,7 @@ export class AdminService { dataSource, date, symbol - }: UniqueAsset & { + }: AssetProfileIdentifier & { date?: Date; }) { let url = `/api/v1/admin/gather/${dataSource}/${symbol}`; @@ -217,7 +220,7 @@ export class AdminService { symbol, symbolMapping, url - }: UniqueAsset & UpdateAssetProfileDto) { + }: AssetProfileIdentifier & UpdateAssetProfileDto) { return this.http.patch( `/api/v1/admin/profile-data/${dataSource}/${symbol}`, { @@ -272,7 +275,7 @@ export class AdminService { dataSource, scraperConfiguration, symbol - }: UniqueAsset & UpdateAssetProfileDto['scraperConfiguration']) { + }: AssetProfileIdentifier & UpdateAssetProfileDto['scraperConfiguration']) { return this.http.post( `/api/v1/admin/market-data/${dataSource}/${symbol}/test`, { diff --git a/apps/client/src/app/services/data.service.ts b/apps/client/src/app/services/data.service.ts index 4f9fd7e20..e74c3f74e 100644 --- a/apps/client/src/app/services/data.service.ts +++ b/apps/client/src/app/services/data.service.ts @@ -20,6 +20,7 @@ import { AccountBalancesResponse, Accounts, AdminMarketDataDetails, + AssetProfileIdentifier, BenchmarkMarketDataDetails, BenchmarkResponse, Export, @@ -34,7 +35,6 @@ import { PortfolioPerformanceResponse, PortfolioPublicDetails, PortfolioReport, - UniqueAsset, User } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; @@ -230,7 +230,7 @@ export class DataService { }); } - public fetchDividendsImport({ dataSource, symbol }: UniqueAsset) { + public fetchDividendsImport({ dataSource, symbol }: AssetProfileIdentifier) { return this.http.get( `/api/v1/import/dividends/${dataSource}/${symbol}` ); @@ -270,7 +270,7 @@ export class DataService { return this.http.delete(`/api/v1/order/${aId}`); } - public deleteBenchmark({ dataSource, symbol }: UniqueAsset) { + public deleteBenchmark({ dataSource, symbol }: AssetProfileIdentifier) { return this.http.delete(`/api/v1/benchmark/${dataSource}/${symbol}`); } @@ -289,7 +289,7 @@ export class DataService { public fetchAsset({ dataSource, symbol - }: UniqueAsset): Observable { + }: AssetProfileIdentifier): Observable { return this.http.get(`/api/v1/asset/${dataSource}/${symbol}`).pipe( map((data) => { for (const item of data.marketData) { @@ -308,7 +308,7 @@ export class DataService { }: { range: DateRange; startDate: Date; - } & UniqueAsset): Observable { + } & AssetProfileIdentifier): Observable { let params = new HttpParams(); if (range) { @@ -630,7 +630,7 @@ export class DataService { ); } - public postBenchmark(benchmark: UniqueAsset) { + public postBenchmark(benchmark: AssetProfileIdentifier) { return this.http.post(`/api/v1/benchmark`, benchmark); } @@ -654,7 +654,7 @@ export class DataService { dataSource, symbol, tags - }: { tags: Tag[] } & UniqueAsset) { + }: { tags: Tag[] } & AssetProfileIdentifier) { return this.http.put( `/api/v1/portfolio/position/${dataSource}/${symbol}/tags`, { tags } diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 7b25b62bc..eb0fce202 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -19,7 +19,7 @@ import { ghostfolioScraperApiSymbolPrefix, locale } from './config'; -import { Benchmark, UniqueAsset } from './interfaces'; +import { AssetProfileIdentifier, Benchmark } from './interfaces'; import { BenchmarkTrend, ColorScheme } from './types'; export const DATE_FORMAT = 'yyyy-MM-dd'; @@ -147,7 +147,10 @@ export function getAllActivityTypes(): ActivityType[] { return Object.values(ActivityType); } -export function getAssetProfileIdentifier({ dataSource, symbol }: UniqueAsset) { +export function getAssetProfileIdentifier({ + dataSource, + symbol +}: AssetProfileIdentifier) { return `${dataSource}-${symbol}`; } @@ -377,7 +380,7 @@ export function parseDate(date: string): Date | null { return parseISO(date); } -export function parseSymbol({ dataSource, symbol }: UniqueAsset) { +export function parseSymbol({ dataSource, symbol }: AssetProfileIdentifier) { const [ticker, exchange] = symbol.split('.'); return { diff --git a/libs/common/src/lib/interfaces/admin-data.interface.ts b/libs/common/src/lib/interfaces/admin-data.interface.ts index 2c6a5c501..6b139026b 100644 --- a/libs/common/src/lib/interfaces/admin-data.interface.ts +++ b/libs/common/src/lib/interfaces/admin-data.interface.ts @@ -1,13 +1,13 @@ -import { Role } from '@prisma/client'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; -import { UniqueAsset } from './unique-asset.interface'; +import { Role } from '@prisma/client'; export interface AdminData { exchangeRates: ({ label1: string; label2: string; value: number; - } & UniqueAsset)[]; + } & AssetProfileIdentifier)[]; settings: { [key: string]: boolean | object | string | string[] }; transactionCount: number; userCount: number; diff --git a/libs/common/src/lib/interfaces/unique-asset.interface.ts b/libs/common/src/lib/interfaces/asset-profile-identifier.interface.ts similarity index 68% rename from libs/common/src/lib/interfaces/unique-asset.interface.ts rename to libs/common/src/lib/interfaces/asset-profile-identifier.interface.ts index 745a0d9a7..48fc18c2f 100644 --- a/libs/common/src/lib/interfaces/unique-asset.interface.ts +++ b/libs/common/src/lib/interfaces/asset-profile-identifier.interface.ts @@ -1,6 +1,6 @@ import { DataSource } from '@prisma/client'; -export interface UniqueAsset { +export interface AssetProfileIdentifier { dataSource: DataSource; symbol: string; } diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index bf3f6fd19..f7224407b 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 { AssetProfileIdentifier } from './asset-profile-identifier.interface'; import type { BenchmarkMarketDataDetails } from './benchmark-market-data-details.interface'; import type { BenchmarkProperty } from './benchmark-property.interface'; import type { Benchmark } from './benchmark.interface'; @@ -48,7 +49,6 @@ import type { Subscription } from './subscription.interface'; import type { SymbolMetrics } from './symbol-metrics.interface'; import type { SystemMessage } from './system-message.interface'; import type { TabConfiguration } from './tab-configuration.interface'; -import type { UniqueAsset } from './unique-asset.interface'; import type { UserSettings } from './user-settings.interface'; import type { User } from './user.interface'; @@ -61,6 +61,7 @@ export { AdminMarketData, AdminMarketDataDetails, AdminMarketDataItem, + AssetProfileIdentifier, Benchmark, BenchmarkMarketDataDetails, BenchmarkProperty, @@ -101,7 +102,6 @@ export { Subscription, SymbolMetrics, TabConfiguration, - UniqueAsset, User, UserSettings }; diff --git a/libs/common/src/lib/interfaces/responses/errors.interface.ts b/libs/common/src/lib/interfaces/responses/errors.interface.ts index 0b43592be..b830a9e30 100644 --- a/libs/common/src/lib/interfaces/responses/errors.interface.ts +++ b/libs/common/src/lib/interfaces/responses/errors.interface.ts @@ -1,6 +1,6 @@ -import { UniqueAsset } from '../unique-asset.interface'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; export interface ResponseError { - errors?: UniqueAsset[]; + errors?: AssetProfileIdentifier[]; hasErrors: boolean; } diff --git a/libs/common/src/lib/models/portfolio-snapshot.ts b/libs/common/src/lib/models/portfolio-snapshot.ts index 909f44f2a..12235015a 100644 --- a/libs/common/src/lib/models/portfolio-snapshot.ts +++ b/libs/common/src/lib/models/portfolio-snapshot.ts @@ -1,5 +1,5 @@ import { transformToBig } from '@ghostfolio/common/class-transformer'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { TimelinePosition } from '@ghostfolio/common/models'; import { Big } from 'big.js'; @@ -9,7 +9,7 @@ export class PortfolioSnapshot { @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) currentValueInBaseCurrency: Big; - errors?: UniqueAsset[]; + errors?: AssetProfileIdentifier[]; @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) 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 204cba0c2..a3caf5e1d 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -3,7 +3,7 @@ import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { getDateFormatString, getLocale } from '@ghostfolio/common/helper'; -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { GfActivityTypeComponent } from '@ghostfolio/ui/activity-type'; import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info'; @@ -99,7 +99,7 @@ export class GfActivitiesTableComponent @Output() export = new EventEmitter(); @Output() exportDrafts = new EventEmitter(); @Output() import = new EventEmitter(); - @Output() importDividends = new EventEmitter(); + @Output() importDividends = new EventEmitter(); @Output() pageChanged = new EventEmitter(); @Output() selectedActivities = new EventEmitter(); @Output() sortChanged = new EventEmitter(); @@ -263,7 +263,7 @@ export class GfActivitiesTableComponent alert(aComment); } - public onOpenPositionDialog({ dataSource, symbol }: UniqueAsset) { + public onOpenPositionDialog({ dataSource, symbol }: AssetProfileIdentifier) { this.router.navigate([], { queryParams: { dataSource, symbol, holdingDetailDialog: true } }); diff --git a/libs/ui/src/lib/assistant/interfaces/interfaces.ts b/libs/ui/src/lib/assistant/interfaces/interfaces.ts index 2597ccef0..3481b37cf 100644 --- a/libs/ui/src/lib/assistant/interfaces/interfaces.ts +++ b/libs/ui/src/lib/assistant/interfaces/interfaces.ts @@ -1,4 +1,4 @@ -import { UniqueAsset } from '@ghostfolio/common/interfaces'; +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { DateRange } from '@ghostfolio/common/types'; export interface IDateRangeOption { @@ -6,7 +6,7 @@ export interface IDateRangeOption { value: DateRange; } -export interface ISearchResultItem extends UniqueAsset { +export interface ISearchResultItem extends AssetProfileIdentifier { assetSubClassString: string; currency: string; name: string; diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index 4dd4aa079..764d65c2c 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -1,5 +1,9 @@ import { getLocale, resolveMarketCondition } from '@ghostfolio/common/helper'; -import { Benchmark, UniqueAsset, User } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + Benchmark, + User +} from '@ghostfolio/common/interfaces'; import { translate } from '@ghostfolio/ui/i18n'; import { GfTrendIndicatorComponent } from '@ghostfolio/ui/trend-indicator'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -84,7 +88,7 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { } } - public onOpenBenchmarkDialog({ dataSource, symbol }: UniqueAsset) { + public onOpenBenchmarkDialog({ dataSource, symbol }: AssetProfileIdentifier) { this.router.navigate([], { queryParams: { dataSource, symbol, benchmarkDetailDialog: true } }); @@ -95,7 +99,10 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { this.unsubscribeSubject.complete(); } - private openBenchmarkDetailDialog({ dataSource, symbol }: UniqueAsset) { + private openBenchmarkDetailDialog({ + dataSource, + symbol + }: AssetProfileIdentifier) { const dialogRef = this.dialog.open(GfBenchmarkDetailDialogComponent, { data: { dataSource, diff --git a/libs/ui/src/lib/holdings-table/holdings-table.component.ts b/libs/ui/src/lib/holdings-table/holdings-table.component.ts index 12f071ef1..39a9baf5c 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.ts +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts @@ -2,7 +2,10 @@ import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset import { GfHoldingDetailDialogComponent } from '@ghostfolio/client/components/holding-detail-dialog/holding-detail-dialog.component'; import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { getLocale } from '@ghostfolio/common/helper'; -import { PortfolioPosition, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + PortfolioPosition +} from '@ghostfolio/common/interfaces'; import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -102,7 +105,7 @@ export class GfHoldingsTableComponent implements OnChanges, OnDestroy, OnInit { } } - public onOpenHoldingDialog({ dataSource, symbol }: UniqueAsset) { + public onOpenHoldingDialog({ dataSource, symbol }: AssetProfileIdentifier) { if (this.hasPermissionToOpenDetails) { this.router.navigate([], { queryParams: { dataSource, symbol, holdingDetailDialog: true } diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index 8c9c29282..ad11c54f3 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -1,7 +1,10 @@ import { getTooltipOptions } from '@ghostfolio/common/chart-helper'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { getLocale, getTextColor } from '@ghostfolio/common/helper'; -import { PortfolioPosition, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + PortfolioPosition +} from '@ghostfolio/common/interfaces'; import { ColorScheme } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; @@ -71,7 +74,7 @@ export class GfPortfolioProportionChartComponent }; } = {}; - @Output() proportionChartClicked = new EventEmitter(); + @Output() proportionChartClicked = new EventEmitter(); @ViewChild('chartCanvas') chartCanvas: ElementRef; diff --git a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts index 3c1b3d540..f65894da3 100644 --- a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts +++ b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -1,5 +1,8 @@ import { getAnnualizedPerformancePercent } from '@ghostfolio/common/calculation-helper'; -import { PortfolioPosition, UniqueAsset } from '@ghostfolio/common/interfaces'; +import { + AssetProfileIdentifier, + PortfolioPosition +} from '@ghostfolio/common/interfaces'; import { CommonModule } from '@angular/common'; import { @@ -40,7 +43,7 @@ export class GfTreemapChartComponent @Input() cursor: string; @Input() holdings: PortfolioPosition[]; - @Output() treemapChartClicked = new EventEmitter(); + @Output() treemapChartClicked = new EventEmitter(); @ViewChild('chartCanvas') chartCanvas: ElementRef; From 757ff527d01427fd129fe598b568cc6c431af775 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 Aug 2024 08:35:01 +0200 Subject: [PATCH 14/16] Feature/extend personal finance tools 20240803 (#3634) * Add Capitalyse --- libs/common/src/lib/personal-finance-tools.ts | 133 ++++++++++-------- 1 file changed, 72 insertions(+), 61 deletions(-) diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index 760629c8f..52ac20e49 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -15,7 +15,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'allvue-systems', name: 'Allvue Systems', - origin: `United States`, + origin: 'United States', slogan: 'Investment Software Suite' }, { @@ -30,7 +30,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'altoo', name: 'Altoo Wealth Platform', - origin: `Switzerland`, + origin: 'Switzerland', slogan: 'Simplicity for Complex Wealth' }, { @@ -40,7 +40,7 @@ export const personalFinanceTools: Product[] = [ key: 'anlage.app', languages: ['English'], name: 'Anlage.App', - origin: `Austria`, + origin: 'Austria', pricingPerYear: '$120', slogan: 'Analyze and track your portfolio.' }, @@ -58,16 +58,27 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'beanvest', name: 'Beanvest', - origin: `France`, + origin: 'France', pricingPerYear: '$100', slogan: 'Stock Portfolio Tracker for Smart Investors' }, + { + founded: 2022, + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'degiro-portfolio-tracker-by-capitalyse', + languages: ['English'], + name: 'DEGIRO Portfolio Tracker by Capitalyse', + origin: 'Netherlands', + pricingPerYear: '€24', + slogan: 'Democratizing Data Analytics' + }, { hasFreePlan: true, hasSelfHostingAbility: false, key: 'capitally', name: 'Capitally', - origin: `Poland`, + origin: 'Poland', pricingPerYear: '€50', slogan: 'Optimize your investments performance' }, @@ -75,7 +86,7 @@ export const personalFinanceTools: Product[] = [ founded: 2022, key: 'capmon', name: 'CapMon.org', - origin: `Germany`, + origin: 'Germany', note: 'CapMon.org was discontinued in 2023', slogan: 'Next Generation Assets Tracking' }, @@ -83,7 +94,7 @@ export const personalFinanceTools: Product[] = [ founded: 2019, key: 'compound-planning', name: 'Compound Planning', - origin: `United States`, + origin: 'United States', slogan: 'Modern Wealth & Investment Management' }, { @@ -92,7 +103,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'copilot-money', name: 'Copilot Money', - origin: `United States`, + origin: 'United States', pricingPerYear: '$70', slogan: 'Do money better with Copilot' }, @@ -110,7 +121,7 @@ export const personalFinanceTools: Product[] = [ key: 'delta', name: 'Delta Investment Tracker', note: 'Acquired by eToro', - origin: `Belgium`, + origin: 'Belgium', slogan: 'The app to track all your investments. Make smart moves only.' }, { @@ -120,7 +131,7 @@ export const personalFinanceTools: Product[] = [ key: 'divvydiary', languages: ['Deutsch', 'English'], name: 'DivvyDiary', - origin: `Germany`, + origin: 'Germany', pricingPerYear: '€65', slogan: 'Your personal Dividend Calendar' }, @@ -130,7 +141,7 @@ export const personalFinanceTools: Product[] = [ key: 'empower', name: 'Empower', note: 'Originally named as Personal Capital', - origin: `United States`, + origin: 'United States', slogan: 'Get answers to your money questions' }, { @@ -138,7 +149,7 @@ export const personalFinanceTools: Product[] = [ founded: 2022, key: 'eightfigures', name: '8FIGURES', - origin: `United States`, + origin: 'United States', slogan: 'Portfolio Tracker Designed by Professional Investors' }, { @@ -147,7 +158,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'exirio', name: 'Exirio', - origin: `United States`, + origin: 'United States', pricingPerYear: '$100', slogan: 'All your wealth, in one place.' }, @@ -158,7 +169,7 @@ export const personalFinanceTools: Product[] = [ key: 'fina', languages: ['English'], name: 'Fina', - origin: `United States`, + origin: 'United States', pricingPerYear: '$115', slogan: 'Flexible Financial Management' }, @@ -167,7 +178,7 @@ export const personalFinanceTools: Product[] = [ key: 'finary', languages: ['Deutsch', 'English', 'Français'], name: 'Finary', - origin: `United States`, + origin: 'United States', slogan: 'Real-Time Portfolio Tracker & Stock Tracker' }, { @@ -175,7 +186,7 @@ export const personalFinanceTools: Product[] = [ hasFreePlan: true, key: 'finwise', name: 'FinWise', - origin: `South Africa`, + origin: 'South Africa', pricingPerYear: '€69.99', slogan: 'Personal finances, simplified' }, @@ -185,7 +196,7 @@ export const personalFinanceTools: Product[] = [ key: 'folishare', languages: ['Deutsch', 'English'], name: 'folishare', - origin: `Austria`, + origin: 'Austria', pricingPerYear: '$65', slogan: 'Take control over your investments' }, @@ -196,7 +207,7 @@ export const personalFinanceTools: Product[] = [ key: 'getquin', languages: ['Deutsch', 'English'], name: 'getquin', - origin: `Germany`, + origin: 'Germany', pricingPerYear: '€48', slogan: 'Portfolio Tracker, Analysis & Community' }, @@ -205,7 +216,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'gospatz', name: 'goSPATZ', - origin: `Germany`, + origin: 'Germany', slogan: 'Volle Kontrolle über deine Investitionen' }, { @@ -214,7 +225,7 @@ export const personalFinanceTools: Product[] = [ key: 'holistic-capital', languages: ['Deutsch'], name: 'Holistic', - origin: `Germany`, + origin: 'Germany', slogan: 'Die All-in-One Lösung für dein Vermögen.', useAnonymously: true }, @@ -224,7 +235,7 @@ export const personalFinanceTools: Product[] = [ key: 'intuit-mint', name: 'Intuit Mint', note: 'Intuit Mint was discontinued in 2023', - origin: `United States`, + origin: 'United States', pricingPerYear: '$60', slogan: 'Managing money, made simple' }, @@ -234,7 +245,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'justetf', name: 'justETF', - origin: `Germany`, + origin: 'Germany', pricingPerYear: '€119', slogan: 'ETF portfolios made simple' }, @@ -244,7 +255,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'koyfin', name: 'Koyfin', - origin: `United States`, + origin: 'United States', pricingPerYear: '$468', slogan: 'Comprehensive financial data analysis' }, @@ -254,7 +265,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'kubera', name: 'Kubera®', - origin: `United States`, + origin: 'United States', pricingPerYear: '$150', slogan: 'The Time Machine for your Net Worth' }, @@ -264,7 +275,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'magnifi', name: 'Magnifi', - origin: `United States`, + origin: 'United States', pricingPerYear: '$132', slogan: 'AI Investing Assistant' }, @@ -275,9 +286,9 @@ export const personalFinanceTools: Product[] = [ key: 'markets.sh', languages: ['English'], name: 'markets.sh', - origin: `Germany`, + origin: 'Germany', pricingPerYear: '€168', - regions: [`Global`], + regions: ['Global'], slogan: 'Track your investments' }, { @@ -287,9 +298,9 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'Maybe Finance', note: 'Maybe Finance was discontinued in 2023', - origin: `United States`, + origin: 'United States', pricingPerYear: '$145', - regions: [`United States`], + regions: ['United States'], slogan: 'Your financial future, in your control' }, { @@ -298,7 +309,7 @@ export const personalFinanceTools: Product[] = [ key: 'merlincrypto', languages: ['English'], name: 'Merlin', - origin: `United States`, + origin: 'United States', pricingPerYear: '$204', regions: ['Canada', 'United States'], slogan: 'The smartest way to track your crypto' @@ -309,7 +320,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'monarch-money', name: 'Monarch Money', - origin: `United States`, + origin: 'United States', pricingPerYear: '$99.99', slogan: 'The modern way to manage your money' }, @@ -327,7 +338,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'navexa', name: 'Navexa', - origin: `Australia`, + origin: 'Australia', pricingPerYear: '$90', slogan: 'The Intelligent Portfolio Tracker' }, @@ -338,7 +349,7 @@ export const personalFinanceTools: Product[] = [ key: 'parqet', name: 'Parqet', note: 'Originally named as Tresor One', - origin: `Germany`, + origin: 'Germany', pricingPerYear: '€88', regions: ['Austria', 'Germany', 'Switzerland'], slogan: 'Dein Vermögen immer im Blick' @@ -348,7 +359,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'plannix', name: 'Plannix', - origin: `Italy`, + origin: 'Italy', slogan: 'Your Personal Finance Hub' }, { @@ -358,9 +369,9 @@ export const personalFinanceTools: Product[] = [ key: 'pocketsmith', languages: ['English'], name: 'PocketSmith', - origin: `New Zealand`, + origin: 'New Zealand', pricingPerYear: '$120', - regions: [`Global`], + regions: ['Global'], slogan: 'Know where your money is going' }, { @@ -369,7 +380,7 @@ export const personalFinanceTools: Product[] = [ key: 'portfolio-dividend-tracker', languages: ['English', 'Nederlands'], name: 'Portfolio Dividend Tracker', - origin: `Netherlands`, + origin: 'Netherlands', pricingPerYear: '€60', slogan: 'Manage all your portfolios' }, @@ -397,7 +408,7 @@ export const personalFinanceTools: Product[] = [ key: 'portseido', languages: ['Deutsch', 'English', 'Français', 'Nederlands'], name: 'Portseido', - origin: `Thailand`, + origin: 'Thailand', pricingPerYear: '$96', slogan: 'Portfolio Performance and Dividend Tracker' }, @@ -407,7 +418,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: true, key: 'projectionlab', name: 'ProjectionLab', - origin: `United States`, + origin: 'United States', pricingPerYear: '$108', slogan: 'Build Financial Plans You Love.' }, @@ -416,7 +427,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'rocket-money', name: 'Rocket Money', - origin: `United States`, + origin: 'United States', slogan: 'Track your net worth' }, { @@ -425,7 +436,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'seeking-alpha', name: 'Seeking Alpha', - origin: `United States`, + origin: 'United States', pricingPerYear: '$239', slogan: 'Stock Market Analysis & Tools for Investors' }, @@ -433,7 +444,7 @@ export const personalFinanceTools: Product[] = [ founded: 2022, key: 'segmio', name: 'Segmio', - origin: `Romania`, + origin: 'Romania', slogan: 'Wealth Management and Net Worth Tracking' }, { @@ -442,9 +453,9 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'sharesight', name: 'Sharesight', - origin: `New Zealand`, + origin: 'New Zealand', pricingPerYear: '$135', - regions: [`Global`], + regions: ['Global'], slogan: 'Stock Portfolio Tracker' }, { @@ -459,7 +470,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'simple-portfolio', name: 'Simple Portfolio', - origin: `Czech Republic`, + origin: 'Czech Republic', pricingPerYear: '€80', slogan: 'Stock Portfolio Tracker' }, @@ -469,7 +480,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'snowball-analytics', name: 'Snowball Analytics', - origin: `France`, + origin: 'France', pricingPerYear: '$80', slogan: 'Simple and powerful portfolio tracker' }, @@ -478,20 +489,20 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'stock-events', name: 'Stock Events', - origin: `Germany`, + origin: 'Germany', slogan: 'Track all your Investments' }, { key: 'stockle', name: 'Stockle', - origin: `Finland`, + origin: 'Finland', slogan: 'Supercharge your investments tracking experience' }, { founded: 2008, key: 'stockmarketeye', name: 'StockMarketEye', - origin: `France`, + origin: 'France', note: 'StockMarketEye was discontinued in 2023', slogan: 'A Powerful Portfolio & Investment Tracking App' }, @@ -501,7 +512,7 @@ export const personalFinanceTools: Product[] = [ key: 'stonksfolio', languages: ['English'], name: 'Stonksfolio', - origin: `Bulgaria`, + origin: 'Bulgaria', pricingPerYear: '€49.90', slogan: 'Visualize all of your portfolios' }, @@ -510,7 +521,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'sumio', name: 'Sumio', - origin: `Czech Republic`, + origin: 'Czech Republic', pricingPerYear: '$20', slogan: 'Sum up and build your wealth.' }, @@ -519,7 +530,7 @@ export const personalFinanceTools: Product[] = [ hasFreePlan: false, key: 'tiller', name: 'Tiller', - origin: `United States`, + origin: 'United States', pricingPerYear: '$79', slogan: 'Your financial life in a spreadsheet, automatically updated each day' @@ -530,7 +541,7 @@ export const personalFinanceTools: Product[] = [ key: 'utluna', languages: ['Deutsch', 'English', 'Français'], name: 'Utluna', - origin: `Switzerland`, + origin: 'Switzerland', pricingPerYear: '$300', slogan: 'Your Portfolio. Revealed.', useAnonymously: true @@ -540,7 +551,7 @@ export const personalFinanceTools: Product[] = [ hasFreePlan: true, key: 'vyzer', name: 'Vyzer', - origin: `United States`, + origin: 'United States', pricingPerYear: '$348', slogan: 'Virtual Family Office for Smart Wealth Management' }, @@ -549,7 +560,7 @@ export const personalFinanceTools: Product[] = [ key: 'wallmine', languages: ['English'], name: 'wallmine', - origin: `Czech Republic`, + origin: 'Czech Republic', pricingPerYear: '$600', slogan: 'Make Smarter Investments' }, @@ -567,7 +578,7 @@ export const personalFinanceTools: Product[] = [ key: 'wealthica', languages: ['English', 'Français'], name: 'Wealthica', - origin: `Canada`, + origin: 'Canada', pricingPerYear: '$50', slogan: 'See all your investments in one place' }, @@ -577,13 +588,13 @@ export const personalFinanceTools: Product[] = [ key: 'wealthy-tracker', languages: ['English'], name: 'Wealthy Tracker', - origin: `India`, + origin: 'India', slogan: 'One app to manage all your investments' }, { key: 'whal', name: 'Whal', - origin: `United States`, + origin: 'United States', slogan: 'Manage your investments in one place' }, { @@ -594,8 +605,8 @@ export const personalFinanceTools: Product[] = [ languages: ['Deutsch', 'English', 'Español', 'Français', 'Italiano'], name: 'yeekatee', note: 'yeekatee was discontinued in 2024', - origin: `Switzerland`, - regions: [`Global`], + origin: 'Switzerland', + regions: ['Global'], slogan: 'Connect. Share. Invest.' }, { @@ -604,7 +615,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'ynab', name: 'YNAB (You Need a Budget)', - origin: `United States`, + origin: 'United States', pricingPerYear: '$99', slogan: 'Change Your Relationship With Money' } From 202e27fe25842734b3634d217fd9841cae65be76 Mon Sep 17 00:00:00 2001 From: Paulina <71526180+paulinek13@users.noreply.github.com> Date: Sun, 4 Aug 2024 08:56:55 +0200 Subject: [PATCH 15/16] Feature/improve language localization for polish (#3637) * Improve language localization for Polish * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.pl.xlf | 64 ++++++++++++------------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6e3b0ca5..4b0ed6df9 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 Polish (`pl`) - Upgraded `Nx` from version `19.5.1` to `19.5.6` ## 2.101.0 - 2024-08-03 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 60c134d02..e79f06166 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -607,7 +607,7 @@ Frequently Asked Questions (FAQ) - Frequently Asked Questions (FAQ) + Często Zadawane Pytania (FAQ) apps/client/src/app/app.component.html 80 @@ -655,7 +655,7 @@ Privacy Policy - Privacy Policy + Polityka Prywatności apps/client/src/app/app.component.html 100 @@ -3279,7 +3279,7 @@ Privacy Policy - Privacy Policy + Polityka Prywatności apps/client/src/app/pages/about/about-page.component.ts 62 @@ -4671,7 +4671,7 @@ 4% Rule - 4% Rule + Zasada 4% apps/client/src/app/pages/portfolio/fire/fire-page.html 40 @@ -5939,7 +5939,7 @@ Africa - Africa + Afryka libs/ui/src/lib/i18n.ts 61 @@ -5947,7 +5947,7 @@ Asia - Asia + Azja libs/ui/src/lib/i18n.ts 62 @@ -5955,7 +5955,7 @@ Europe - Europe + Europa libs/ui/src/lib/i18n.ts 63 @@ -5963,7 +5963,7 @@ North America - North America + Ameryka Północna libs/ui/src/lib/i18n.ts 64 @@ -5971,7 +5971,7 @@ Oceania - Oceania + Oceania libs/ui/src/lib/i18n.ts 65 @@ -5979,7 +5979,7 @@ South America - South America + Ameryka Południowa libs/ui/src/lib/i18n.ts 66 @@ -6035,7 +6035,7 @@ No data available - No data available + Brak danych libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts 402 @@ -6095,7 +6095,7 @@ Do you really want to delete this account balance? - Do you really want to delete this account balance? + Czy na pewno chcesz usunąć saldo tego konta? libs/ui/src/lib/account-balances/account-balances.component.ts 101 @@ -6111,7 +6111,7 @@ If a translation is missing, kindly support us in extending it here. - If a translation is missing, kindly support us in extending it here. + Jeżeli brakuje jakiegoś tłumaczenia, uprzejmie prosimy o wsparcie w jego uzupełnieniu tutaj. apps/client/src/app/components/user-account-settings/user-account-settings.html 50 @@ -6167,7 +6167,7 @@ Oops! Could not grant access. - Oops! Could not grant access. + Ups! Nie udało się przyznać dostępu. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts 88 @@ -6331,7 +6331,7 @@ Reset Filters - Reset Filters + Resetuj Filtry libs/ui/src/lib/assistant/assistant.html 155 @@ -6363,7 +6363,7 @@ Apply Filters - Apply Filters + Zastosuj Filtry libs/ui/src/lib/assistant/assistant.html 165 @@ -6371,7 +6371,7 @@ Data Gathering - Data Gathering + Gromadzenie Danych apps/client/src/app/components/admin-overview/admin-overview.html 141 @@ -6419,7 +6419,7 @@ FAQ - FAQ + FAQ apps/client/src/app/pages/faq/saas/saas-page-routing.module.ts 13 @@ -6431,7 +6431,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. - Oops! It looks like you’re making too many requests. Please slow down a bit. + Ups! Wygląda na to, że wykonujesz zbyt wiele zapytań. Proszę, zwolnij trochę. apps/client/src/app/core/http-response.interceptor.ts 96 @@ -6471,7 +6471,7 @@ Dividend Yield - Dividend Yield + Dochód z Dywidendy apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 191 @@ -6487,7 +6487,7 @@ Priority - Priority + Priorytet apps/client/src/app/components/admin-jobs/admin-jobs.html 62 @@ -6495,7 +6495,7 @@ This action is not allowed. - This action is not allowed. + To działanie jest niedozwolone. apps/client/src/app/core/http-response.interceptor.ts 61 @@ -6503,7 +6503,7 @@ Liquidity - Liquidity + Płynność środków finansowych libs/ui/src/lib/i18n.ts 44 @@ -6551,7 +6551,7 @@ Internationalization - Internationalization + Internacjonalizacja apps/client/src/app/app-routing.module.ts 79 @@ -6559,7 +6559,7 @@ Do you really want to close your Ghostfolio account? - Do you really want to close your Ghostfolio account? + Czy na pewno chcesz zamknąć swoje konto Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 148 @@ -6599,7 +6599,7 @@ Join now or check out the example account - Join now or check out the example account + Dołącz teraz lub sprawdź przykładowe konto apps/client/src/app/pages/landing/landing-page.html 434 @@ -6607,7 +6607,7 @@ Oops! There was an error setting up biometric authentication. - Oops! There was an error setting up biometric authentication. + Ups! Wystąpił błąd podczas konfigurowania uwierzytelniania biometrycznego. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts 302 @@ -6615,7 +6615,7 @@ Show more - Show more + Pokaż więcej libs/ui/src/lib/top-holdings/top-holdings.component.html 81 @@ -6631,7 +6631,7 @@ Delete Profiles - Delete Profiles + Usuń Profile apps/client/src/app/components/admin-market-data/admin-market-data.html 190 @@ -6639,7 +6639,7 @@ Do you really want to delete these profiles? - Do you really want to delete these profiles? + Czy na pewno chcesz usunąć te profile? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 34 @@ -6647,7 +6647,7 @@ Oops! Could not delete profiles. - Oops! Could not delete profiles. + Ups! Nie udało się usunąć profili. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 45 @@ -6671,7 +6671,7 @@ Would you like to refine your personal investment strategy? - Would you like to refine your personal investment strategy? + Chcesz udoskonalić swoją osobistą strategię inwestycyjną? apps/client/src/app/pages/public/public-page.html 155 From 98f3fa9d7c836dec9db66f27ef985bbeccbb695f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 4 Aug 2024 09:24:48 +0200 Subject: [PATCH 16/16] Feature/improve language localization for de 20240804 (#3639) * Update translations * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.ca.xlf | 512 ++++++++++++++++------ apps/client/src/locales/messages.de.xlf | 488 ++++++++++++++++----- apps/client/src/locales/messages.es.xlf | 486 ++++++++++++++++----- apps/client/src/locales/messages.fr.xlf | 488 ++++++++++++++++----- apps/client/src/locales/messages.it.xlf | 542 ++++++++++++++++++------ apps/client/src/locales/messages.nl.xlf | 502 +++++++++++++++++----- apps/client/src/locales/messages.pl.xlf | 488 ++++++++++++++++----- apps/client/src/locales/messages.pt.xlf | 488 ++++++++++++++++----- apps/client/src/locales/messages.tr.xlf | 526 +++++++++++++++++------ apps/client/src/locales/messages.xlf | 456 +++++++++++++++----- apps/client/src/locales/messages.zh.xlf | 488 ++++++++++++++++----- 12 files changed, 4235 insertions(+), 1230 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b0ed6df9..9582d735e 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 German (`de`) - Improved the language localization for Polish (`pl`) - Upgraded `Nx` from version `19.5.1` to `19.5.6` diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 7ff136408..46c4eecf8 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -278,7 +278,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -335,7 +335,7 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. - El risc d'assumir pèrdues en les inversions és substancial. No és recomanable invertir diners que pugui necessitar a curt termini. + El risc d’assumir pèrdues en les inversions és substancial. No és recomanable invertir diners que pugui necessitar a curt termini. apps/client/src/app/app.component.html 199 @@ -422,7 +422,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -550,7 +550,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -734,7 +734,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -978,7 +978,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1022,7 +1022,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1046,31 +1046,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1106,7 +1106,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1138,11 +1138,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1191,7 +1191,7 @@ Asset Profile - Perfil d'Actiu + Perfil d’Actiu apps/client/src/app/components/admin-jobs/admin-jobs.html 35 @@ -1246,7 +1246,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -1346,7 +1346,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1406,7 +1406,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1446,7 +1446,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -1486,12 +1486,12 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 Asset Class - Classe d'Actiu + Classe d’Actiu apps/client/src/app/components/admin-market-data/admin-market-data.html 86 @@ -1510,12 +1510,12 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 Asset Sub Class - Subclasse d'Actiu + Subclasse d’Actiu apps/client/src/app/components/admin-market-data/admin-market-data.html 95 @@ -1534,7 +1534,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -1559,7 +1559,7 @@ Activities Count - Nombre d'Activitats + Nombre d’Activitats apps/client/src/app/components/admin-market-data/admin-market-data.html 113 @@ -1631,7 +1631,7 @@ Do you really want to delete this asset profile? - Realment vol eliminar el perfil d'aquest actiu? + Realment vol eliminar el perfil d’aquest actiu? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 18 @@ -1642,23 +1642,23 @@ Realment vol eliminar aquests perfils? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 Oops! Could not delete profiles. - Oooh! No s'han pogut eliminar els perfils + Oooh! No s’han pogut eliminar els perfils apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 Oops! Could not parse historical data. - Oooh! No s'han pogut recopilar les dades históriques. + Oooh! No s’han pogut recopilar les dades históriques. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -1666,7 +1666,7 @@ El preu de mercat actual és apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -1826,12 +1826,12 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 Add Asset Profile - Afegeix el Perfil de l'Actiu + Afegeix el Perfil de l’Actiu apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 @@ -1862,7 +1862,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -1931,7 +1931,7 @@ User Count - Número d'Usuaris + Número d’Usuaris apps/client/src/app/components/admin-overview/admin-overview.html 13 @@ -1939,10 +1939,10 @@ Activity Count - Número d'Activitats + Número d’Activitats apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -1950,7 +1950,7 @@ per Usuari apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -1958,7 +1958,7 @@ Tipus de Canvi apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -1966,7 +1966,7 @@ Afegir Divisa apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -1974,7 +1974,7 @@ Registrar Usuari apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -1982,7 +1982,7 @@ Mode Només Lecutra apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -1990,7 +1990,7 @@ Recollida de Dades apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -1998,7 +1998,7 @@ Missatge del Sistema apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -2006,7 +2006,7 @@ Estableix el Missatge apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -2014,7 +2014,7 @@ Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -2022,7 +2022,7 @@ Afegir apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -2034,7 +2034,7 @@ Ordre apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -2042,7 +2042,7 @@ Depurar el Cache apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -2126,11 +2126,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -2268,6 +2272,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Benchmark @@ -2311,7 +2319,7 @@ Admin Control - Panell d'Administració + Panell d’Administració apps/client/src/app/components/header/header.component.html 68 @@ -2486,7 +2494,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2522,11 +2530,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -2563,10 +2571,10 @@ Report Data Glitch - Informar d'un Problema amb les Dades + Informar d’un Problema amb les Dades apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -2574,7 +2582,7 @@ en Actiiu apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -2582,7 +2590,7 @@ Finalitzat apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -2618,7 +2626,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -2630,7 +2638,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -2722,7 +2730,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -4530,7 +4538,7 @@ Update activity apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 @@ -4602,7 +4610,7 @@ Update Cash Balance apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -4610,11 +4618,11 @@ Unit Price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4626,7 +4634,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -4634,11 +4642,11 @@ Fee apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4650,7 +4658,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -4658,7 +4666,7 @@ Import Activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -4690,7 +4698,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -4992,6 +5000,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Monthly @@ -5522,7 +5534,11 @@ Switzerland apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -5530,7 +5546,11 @@ Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5602,7 +5622,7 @@ Available in apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -5610,35 +5630,35 @@ ✅ Yes apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -5646,31 +5666,31 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -5678,7 +5698,7 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -5686,7 +5706,7 @@ Self-Hosting apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -5694,7 +5714,7 @@ Use anonymously apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -5702,7 +5722,7 @@ Free Plan apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -5710,11 +5730,11 @@ Starting from apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -5722,11 +5742,11 @@ year apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -5734,7 +5754,7 @@ Notes apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -5742,7 +5762,7 @@ Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -5750,7 +5770,7 @@ Ready to take your investments to the next level? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -5758,7 +5778,7 @@ Effortlessly track, analyze, and visualize your wealth with Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -5766,7 +5786,7 @@ Get Started apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -5774,7 +5794,7 @@ Personal Finance Tools apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -6298,7 +6318,7 @@ Grant libs/ui/src/lib/i18n.ts - 14 + 15 @@ -6306,7 +6326,7 @@ Higher Risk libs/ui/src/lib/i18n.ts - 15 + 16 @@ -6314,7 +6334,7 @@ This activity already exists. libs/ui/src/lib/i18n.ts - 16 + 17 @@ -6322,7 +6342,7 @@ Japan libs/ui/src/lib/i18n.ts - 17 + 80 @@ -6358,7 +6378,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -6614,7 +6634,7 @@ Extreme Fear libs/ui/src/lib/i18n.ts - 69 + 91 @@ -6622,7 +6642,7 @@ Extreme Greed libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6630,7 +6650,7 @@ Neutral libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6662,11 +6682,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -6677,6 +6697,262 @@ 81 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + France + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + India + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + United States + + libs/ui/src/lib/i18n.ts + 88 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 129541d8b..ff8a46aa6 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -154,7 +154,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -194,31 +194,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -254,7 +254,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -286,11 +286,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -366,7 +366,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -458,7 +458,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -518,7 +518,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -558,7 +558,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -586,7 +586,7 @@ Anzahl Aktivitäten apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -654,7 +654,7 @@ pro Benutzer apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -690,7 +690,7 @@ Wechselkurse apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -698,7 +698,7 @@ Währung hinzufügen apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -706,7 +706,7 @@ Systemmeldung apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -714,7 +714,7 @@ Systemmeldung setzen apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -722,7 +722,7 @@ Lese-Modus apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -730,7 +730,7 @@ Gutscheincodes apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -738,7 +738,7 @@ Hinzufügen apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -750,7 +750,7 @@ Verwaltung apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -758,7 +758,7 @@ Cache leeren apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -918,7 +918,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -1282,11 +1282,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -1342,11 +1342,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -1358,7 +1362,7 @@ Datenfehler melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -1858,7 +1862,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2194,7 +2198,7 @@ Aktivität bearbeiten apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 @@ -2206,7 +2210,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2226,7 +2230,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -2238,7 +2242,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2250,11 +2254,11 @@ Stückpreis apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2266,11 +2270,11 @@ Gebühr apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2290,7 +2294,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -2314,7 +2318,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -2364,6 +2368,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Currencies @@ -2482,7 +2490,7 @@ Aktivitäten importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -2682,7 +2690,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -2818,7 +2826,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -2830,7 +2838,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -2838,7 +2846,7 @@ Filtern nach... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -3110,7 +3118,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -3118,11 +3126,11 @@ Keine Daten verfügbar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -3290,7 +3298,7 @@ Benutzer Registrierung apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -3298,7 +3306,7 @@ Daten validieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -3406,7 +3414,7 @@ Zuwendung libs/ui/src/lib/i18n.ts - 14 + 15 @@ -3414,7 +3422,7 @@ Höheres Risiko libs/ui/src/lib/i18n.ts - 15 + 16 @@ -3806,7 +3814,7 @@ Ups! Der historische Wechselkurs konnte nicht abgerufen werden vom apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -3954,7 +3962,7 @@ Cash-Bestand aktualisieren apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -4022,7 +4030,7 @@ Diese Aktivität existiert bereits. libs/ui/src/lib/i18n.ts - 16 + 17 @@ -4366,7 +4374,7 @@ Verfügbar in apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -4374,35 +4382,35 @@ ✅ Ja apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -4410,31 +4418,31 @@ ❌ Nein apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -4442,7 +4450,7 @@ ❌ Nein apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -4450,7 +4458,7 @@ Self-Hosting apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -4458,7 +4466,7 @@ Anonyme Nutzung apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -4466,7 +4474,7 @@ Kostenlose Nutzung apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -4474,7 +4482,7 @@ Hinweise apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -4482,7 +4490,7 @@ Mit Ghostfolio kannst du dein Vermögen einfach überwachen, analysieren und visualisieren. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -4490,7 +4498,7 @@ Tools für persönliche Finanzen apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -4606,7 +4614,7 @@ Japan libs/ui/src/lib/i18n.ts - 17 + 80 @@ -5242,7 +5250,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -5326,7 +5334,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -5542,7 +5550,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -5630,7 +5638,7 @@ Bitte beachte, dass die bereitgestellten Ghostfolio vs Informationen auf unserer unabhängigen Recherche und Analyse beruhen. Diese Webseite steht in keiner Verbindung zu oder einem anderen im Vergleich erwähnten Produkt. Da sich die Landschaft der Personal Finance Tools ständig weiterentwickelt, ist es wichtig, alle spezifischen Details oder Änderungen direkt auf der jeweiligen Produktseite zu überprüfen. Brauchen die Daten eine Auffrischung? Unterstütze uns bei der Pflege der aktuellen Daten auf GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -5638,7 +5646,7 @@ Bereit, deine Investitionen auf ein neues Levelzu bringen? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -5646,7 +5654,7 @@ Jetzt loslegen apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -5654,7 +5662,11 @@ Schweiz apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -5662,7 +5674,11 @@ Weltweit apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5730,7 +5746,7 @@ Ups! Der historische Wechselkurs konnte nicht abgerufen werden vom apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -6010,7 +6026,7 @@ Extreme Angst libs/ui/src/lib/i18n.ts - 69 + 91 @@ -6018,7 +6034,7 @@ Extreme Gier libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6026,7 +6042,7 @@ Neutral libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6034,7 +6050,7 @@ Ups! Die historischen Daten konnten nicht geparsed werden. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -6074,11 +6090,11 @@ Ab apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -6086,11 +6102,11 @@ Jahr apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -6122,7 +6138,7 @@ Der aktuelle Marktpreis ist apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -6212,6 +6228,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Absolute Asset Performance @@ -6374,7 +6394,7 @@ Daten einholen apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -6450,7 +6470,7 @@ Aktiv apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6458,7 +6478,7 @@ Abgeschlossen apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -6642,7 +6662,7 @@ Möchtest du diese Profile wirklich löschen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6650,7 +6670,7 @@ Ups! Die Profile konnten nicht gelöscht werden. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6677,6 +6697,262 @@ 155 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgetierung + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Persönliche Finanzen + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Datenschutz + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Vermögen + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Vermögensverwaltung + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australien + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Österreich + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgien + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgarien + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Kanada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Tschechien + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finnland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + Frankreich + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Deutschland + + libs/ui/src/lib/i18n.ts + 77 + + + + India + Indien + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italien + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Niederlande + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + Neuseeland + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Polen + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Rumänien + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + Südafrika + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + USA + + libs/ui/src/lib/i18n.ts + 88 + + - \ No newline at end of file + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index a2736f959..4fb3cfe8c 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -155,7 +155,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -195,31 +195,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -255,7 +255,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -287,11 +287,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -367,7 +367,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -459,7 +459,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -519,7 +519,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -559,7 +559,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -587,7 +587,7 @@ Recuento de actividad apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -655,7 +655,7 @@ por usario apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -691,7 +691,7 @@ Tipos de cambio apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -699,7 +699,7 @@ Añadir divisa apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -707,7 +707,7 @@ Mensaje del sistema apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -715,7 +715,7 @@ Establecer mensaje apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -723,7 +723,7 @@ Modo de solo lectura apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -731,7 +731,7 @@ Cupones apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -739,7 +739,7 @@ Añadir apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -751,7 +751,7 @@ Tareas domésticas apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -759,7 +759,7 @@ Limpiar caché apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -919,7 +919,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -1283,11 +1283,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -1343,11 +1343,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -1359,7 +1363,7 @@ Reporta un anomalía de los datos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -1859,7 +1863,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2195,7 +2199,7 @@ Actualizar opereación apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 @@ -2207,7 +2211,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2227,7 +2231,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -2239,7 +2243,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2251,11 +2255,11 @@ Precio unitario apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2267,11 +2271,11 @@ Comisión apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2291,7 +2295,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -2315,7 +2319,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -2365,6 +2369,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Currencies @@ -2483,7 +2491,7 @@ Importar operaciones apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -2671,7 +2679,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -2819,7 +2827,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -2831,7 +2839,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -2839,7 +2847,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -3111,7 +3119,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -3119,11 +3127,11 @@ Sin datos disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -3291,7 +3299,7 @@ Registro de usuario apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -3299,7 +3307,7 @@ Validando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -3407,7 +3415,7 @@ Conceder libs/ui/src/lib/i18n.ts - 14 + 15 @@ -3415,7 +3423,7 @@ Riesgo mayor libs/ui/src/lib/i18n.ts - 15 + 16 @@ -3807,7 +3815,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -3955,7 +3963,7 @@ Update Cash Balance apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -4023,7 +4031,7 @@ This activity already exists. libs/ui/src/lib/i18n.ts - 16 + 17 @@ -4367,7 +4375,7 @@ Disponible en apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -4375,35 +4383,35 @@ ✅ Sí apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -4411,31 +4419,31 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -4443,7 +4451,7 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -4451,7 +4459,7 @@ Self-Hosting apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -4459,7 +4467,7 @@ Uso anónimo apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -4467,7 +4475,7 @@ Plan gratuito apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -4475,7 +4483,7 @@ Notas apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -4483,7 +4491,7 @@ Siga, analice y visualice su patrimonio sin esfuerzo con Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -4491,7 +4499,7 @@ Personal Finance Tools apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -4607,7 +4615,7 @@ Japan libs/ui/src/lib/i18n.ts - 17 + 80 @@ -5243,7 +5251,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -5327,7 +5335,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -5543,7 +5551,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -5631,7 +5639,7 @@ Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -5639,7 +5647,7 @@ ¿Listo para llevar sus inversiones al siguiente nivel? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -5647,7 +5655,7 @@ Get Started apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -5655,7 +5663,11 @@ Switzerland apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -5663,7 +5675,11 @@ Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5731,7 +5747,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -6011,7 +6027,7 @@ Extreme Fear libs/ui/src/lib/i18n.ts - 69 + 91 @@ -6019,7 +6035,7 @@ Extreme Greed libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6027,7 +6043,7 @@ Neutral libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6035,7 +6051,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -6075,11 +6091,11 @@ Starting from apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -6087,11 +6103,11 @@ year apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -6123,7 +6139,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -6213,6 +6229,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Absolute Asset Performance @@ -6375,7 +6395,7 @@ Data Gathering apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -6451,7 +6471,7 @@ Activo apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6459,7 +6479,7 @@ Closed apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -6643,7 +6663,7 @@ Estas seguro de borrar estos perfiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6651,7 +6671,7 @@ Oops! Could not delete profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6678,6 +6698,262 @@ 155 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + France + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + India + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + United States + + libs/ui/src/lib/i18n.ts + 88 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 91380c302..74be9e7a6 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -166,7 +166,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -210,7 +210,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -250,31 +250,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -310,7 +310,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -342,11 +342,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -414,7 +414,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -514,7 +514,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -574,7 +574,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -614,7 +614,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -622,7 +622,7 @@ Filtrer par... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -646,7 +646,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -670,7 +670,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -850,7 +850,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -906,7 +906,7 @@ Nombre d’Activités apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -914,7 +914,7 @@ par Utilisateur apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -922,7 +922,7 @@ Taux de Conversion apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -930,7 +930,7 @@ Ajouter Devise apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -942,11 +942,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -958,7 +962,7 @@ Inscription de Nouveaux Utilisateurs apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -966,7 +970,7 @@ Mode Lecture Seule apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -974,7 +978,7 @@ Message Système apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -982,7 +986,7 @@ Définir Message apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -990,7 +994,7 @@ Codes promotionnels apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -998,7 +1002,7 @@ Ajouter apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1010,7 +1014,7 @@ Maintenance apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -1018,7 +1022,7 @@ Vider le Cache apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -1128,6 +1132,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Benchmark @@ -1222,7 +1230,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -1366,7 +1374,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -1378,7 +1386,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -1630,11 +1638,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -1690,7 +1698,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1702,7 +1710,7 @@ Signaler une Erreur de Données apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -2418,7 +2426,7 @@ Mettre à jour Activité apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 @@ -2430,7 +2438,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2450,7 +2458,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -2458,11 +2466,11 @@ Prix Unitaire apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2474,11 +2482,11 @@ Frais apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2506,7 +2514,7 @@ Validation des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -2998,7 +3006,7 @@ Importer Activités apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -3170,7 +3178,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -3346,11 +3354,11 @@ Pas de données disponibles libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -3406,7 +3414,7 @@ Donner libs/ui/src/lib/i18n.ts - 14 + 15 @@ -3414,7 +3422,7 @@ Risque élevé libs/ui/src/lib/i18n.ts - 15 + 16 @@ -3806,7 +3814,7 @@ Oups ! Nous n’avons pas pu obtenir le taux de change historique à partir de apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -3954,7 +3962,7 @@ Mettre à jour le Solde apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -4022,7 +4030,7 @@ Cette activité existe déjà. libs/ui/src/lib/i18n.ts - 16 + 17 @@ -4366,7 +4374,7 @@ Disponible en apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -4374,35 +4382,35 @@ ✅ Oui apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -4410,31 +4418,31 @@ ❌ Non apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -4442,7 +4450,7 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -4450,7 +4458,7 @@ Self-Hosting apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -4458,7 +4466,7 @@ Utilisation anonyme apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -4466,7 +4474,7 @@ Plan gratuit apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -4474,7 +4482,7 @@ Notes apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -4482,7 +4490,7 @@ Effortlessly track, analyze, and visualize your wealth with Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -4490,7 +4498,7 @@ Personal Finance Tools apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -4606,7 +4614,7 @@ Japan libs/ui/src/lib/i18n.ts - 17 + 80 @@ -5242,7 +5250,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -5326,7 +5334,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -5542,7 +5550,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -5630,7 +5638,7 @@ Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -5638,7 +5646,7 @@ Ready to take your investments to the next level? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -5646,7 +5654,7 @@ Démarrer apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -5654,7 +5662,11 @@ Switzerland apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -5662,7 +5674,11 @@ Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5730,7 +5746,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -6010,7 +6026,7 @@ Extreme Fear libs/ui/src/lib/i18n.ts - 69 + 91 @@ -6018,7 +6034,7 @@ Extreme Greed libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6026,7 +6042,7 @@ Neutral libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6034,7 +6050,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -6074,11 +6090,11 @@ Starting from apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -6086,11 +6102,11 @@ year apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -6122,7 +6138,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -6212,6 +6228,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Absolute Asset Performance @@ -6374,7 +6394,7 @@ Data Gathering apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -6450,7 +6470,7 @@ Active apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6458,7 +6478,7 @@ Closed apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -6642,7 +6662,7 @@ Do you really want to delete these profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6650,7 +6670,7 @@ Oops! Could not delete profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6677,6 +6697,262 @@ 155 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + France + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + India + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + United States + + libs/ui/src/lib/i18n.ts + 88 + + - \ No newline at end of file + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 4d1089cf6..f910e7d90 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -72,7 +72,7 @@ Do you really want to revoke this granted access? - Vuoi davvero revocare l'accesso concesso? + Vuoi davvero revocare l’accesso concesso? apps/client/src/app/components/access-table/access-table.component.ts 50 @@ -155,7 +155,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -195,31 +195,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -255,7 +255,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -287,11 +287,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -367,7 +367,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -404,7 +404,7 @@ Asset Profiles - Profilo dell'asset + Profilo dell’asset libs/ui/src/lib/assistant/assistant.html 67 @@ -459,7 +459,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -519,7 +519,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -559,7 +559,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -587,7 +587,7 @@ Conteggio attività apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -655,7 +655,7 @@ per utente apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -691,7 +691,7 @@ Tassi di cambio apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -699,7 +699,7 @@ Aggiungi valuta apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -707,7 +707,7 @@ Messaggio di sistema apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -715,7 +715,7 @@ Imposta messaggio apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -723,7 +723,7 @@ Modalità di sola lettura apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -731,7 +731,7 @@ Buoni sconto apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -739,7 +739,7 @@ Aggiungi apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -751,7 +751,7 @@ Bilancio domestico apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -759,7 +759,7 @@ Svuota la cache apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -804,7 +804,7 @@ Current Market Mood - Stato d'animo attuale del mercato + Stato d’animo attuale del mercato apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html 12 @@ -919,7 +919,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -1244,7 +1244,7 @@ Buying Power - Potere d'acquisto + Potere d’acquisto apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 252 @@ -1283,16 +1283,16 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 Please enter the amount of your emergency fund: - Inserisci l'importo del tuo fondo di emergenza: + Inserisci l’importo del tuo fondo di emergenza: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts 58 @@ -1343,11 +1343,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -1356,10 +1360,10 @@ Report Data Glitch - Segnala un'anomalia dei dati + Segnala un’anomalia dei dati apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -1600,7 +1604,7 @@ License - Licenza d'uso + Licenza d’uso apps/client/src/app/app.component.html 85 @@ -1792,7 +1796,7 @@ Grant access - Concedi l'accesso + Concedi l’accesso apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 7 @@ -1859,7 +1863,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1924,7 +1928,7 @@ As you are already logged in, you cannot access the demo account. - Poiché hai già effettuato l'accesso, non puoi accedere all'account demo. + Poiché hai già effettuato l’accesso, non puoi accedere all’account demo. apps/client/src/app/pages/demo/demo-page.component.ts 33 @@ -2192,22 +2196,22 @@ Update activity - Aggiorna l'attività + Aggiorna l’attività apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 Add activity - Aggiungi un'attività + Aggiungi un’attività apps/client/src/app/components/home-overview/home-overview.html 52 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2227,7 +2231,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -2239,7 +2243,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2251,11 +2255,11 @@ Prezzo unitario apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2267,11 +2271,11 @@ Commissione apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2291,7 +2295,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -2315,7 +2319,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -2340,7 +2344,7 @@ Import has been completed - L'importazione è stata completata + L’importazione è stata completata apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 128 @@ -2365,6 +2369,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Currencies @@ -2448,7 +2456,7 @@ Oops, authentication has failed. - Ops, l'autenticazione non è riuscita. + Ops, l’autenticazione non è riuscita. apps/client/src/app/pages/webauthn/webauthn-page.html 19 @@ -2483,7 +2491,7 @@ Importa le attività apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -2671,7 +2679,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -2819,7 +2827,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -2831,7 +2839,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -2839,7 +2847,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -2896,7 +2904,7 @@ Excluded from Analysis - Escluso dall'analisi + Escluso dall’analisi apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 264 @@ -3111,7 +3119,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -3119,11 +3127,11 @@ Nessun dato disponibile libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -3291,7 +3299,7 @@ Registrazione utente apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -3299,7 +3307,7 @@ Convalida dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -3407,7 +3415,7 @@ Sovvenzione libs/ui/src/lib/i18n.ts - 14 + 15 @@ -3415,7 +3423,7 @@ Rischio più elevato libs/ui/src/lib/i18n.ts - 15 + 16 @@ -3460,7 +3468,7 @@ Sneak peek at upcoming functionality - Un'anteprima delle funzionalità in arrivo + Un’anteprima delle funzionalità in arrivo apps/client/src/app/components/user-account-settings/user-account-settings.html 212 @@ -3807,7 +3815,7 @@ Ops! Impossibile ottenere il tasso di cambio storico da apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -3864,7 +3872,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 the costs of the hosting infrastructure and to fund ongoing development. - La nostra offerta cloud ufficiale Ghostfolio Premium è il modo più semplice per iniziare. Grazie al risparmio di tempo, questa è l'opzione migliore per la maggior parte delle persone. I ricavi vengono utilizzati per coprire l'infrastruttura di hosting e per finanziare lo sviluppo continuo di Ghostfolio. + La nostra offerta cloud ufficiale Ghostfolio Premium è il modo più semplice per iniziare. Grazie al risparmio di tempo, questa è l’opzione migliore per la maggior parte delle persone. I ricavi vengono utilizzati per coprire l’infrastruttura di hosting e per finanziare lo sviluppo continuo di Ghostfolio. apps/client/src/app/pages/pricing/pricing-page.html 6 @@ -3872,7 +3880,7 @@ Impersonate User - Imita l'utente + Imita l’utente apps/client/src/app/components/admin-users/admin-users.html 218 @@ -3880,7 +3888,7 @@ Delete User - Elimina l'utente + Elimina l’utente apps/client/src/app/components/admin-users/admin-users.html 229 @@ -3955,7 +3963,7 @@ Aggiornamento del saldo di cassa apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -3968,7 +3976,7 @@ Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience: - Effettua oggi stesso l'aggiornamento a Ghostfolio Premium e ottieni l'accesso a funzionalità esclusive per migliorare la tua esperienza di investimento: + Effettua oggi stesso l’aggiornamento a Ghostfolio Premium e ottieni l’accesso a funzionalità esclusive per migliorare la tua esperienza di investimento: apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 15 @@ -4023,7 +4031,7 @@ Questa attività esiste già. libs/ui/src/lib/i18n.ts - 16 + 17 @@ -4316,7 +4324,7 @@ Add Asset Profile - Aggiungi il profilo dell'asset + Aggiungi il profilo dell’asset apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 7 @@ -4367,7 +4375,7 @@ Disponibile in apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -4375,35 +4383,35 @@ ✅ Si apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -4411,31 +4419,31 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -4443,7 +4451,7 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -4451,7 +4459,7 @@ Self-hosting apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -4459,7 +4467,7 @@ Usalo in modo anonimo apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -4467,7 +4475,7 @@ Piano gratuito apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -4475,7 +4483,7 @@ Note apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -4483,7 +4491,7 @@ Monitora, analizza e visualizza facilmente la tua ricchezza con Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -4491,7 +4499,7 @@ Strumenti di finanza personale apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -4607,7 +4615,7 @@ Giappone libs/ui/src/lib/i18n.ts - 17 + 80 @@ -5028,7 +5036,7 @@ interested in financial independence - sei interessato all'indipendenza finanziaria + sei interessato all’indipendenza finanziaria apps/client/src/app/pages/landing/landing-page.html 307 @@ -5243,7 +5251,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -5327,7 +5335,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -5543,7 +5551,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -5552,7 +5560,7 @@ This overview page features a curated collection of personal finance tools compared to the open source alternative Ghostfolio. If you value transparency, data privacy, and community collaboration, Ghostfolio provides an excellent opportunity to take control of your financial management. - Questa pagina panoramica presenta una raccolta curata di strumenti di finanza personale confrontati con l'alternativa open source Ghostfolio. Se apprezzi la trasparenza, la privacy dei dati e la collaborazione con la comunità, Ghostfolio ti offre un'ottima opportunità per prendere il controllo della tua gestione finanziaria. + Questa pagina panoramica presenta una raccolta curata di strumenti di finanza personale confrontati con l’alternativa open source Ghostfolio. Se apprezzi la trasparenza, la privacy dei dati e la collaborazione con la comunità, Ghostfolio ti offre un’ottima opportunità per prendere il controllo della tua gestione finanziaria. apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 8 @@ -5568,7 +5576,7 @@ Open Source Alternative to - L'alternativa open source a + L’alternativa open source a apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 42 @@ -5576,7 +5584,7 @@ Open Source Alternative to - L'alternativa open source a + L’alternativa open source a apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts 27 @@ -5584,7 +5592,7 @@ The Open Source Alternative to - L'alternativa open source a + L’alternativa open source a apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 8 @@ -5592,7 +5600,7 @@ Are you looking for an open source alternative to ? Ghostfolio is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a wide range of functionalities to help you make informed decisions and take control of your financial future. - Stai cercando un'alternativa open source a ? Ghostfolio è un potente strumento di gestione del portafoglio che fornisce alle persone una piattaforma completa per monitorare, analizzare e ottimizzare i propri investimenti. Che tu sia un investitore esperto o alle prime armi, Ghostfolio offre un'interfaccia utente intuitiva e un'ampia gamma di funzionalità per aiutarti a prendere decisioni informate e il controllo del tuo futuro finanziario. + Stai cercando un’alternativa open source a ? Ghostfolio è un potente strumento di gestione del portafoglio che fornisce alle persone una piattaforma completa per monitorare, analizzare e ottimizzare i propri investimenti. Che tu sia un investitore esperto o alle prime armi, Ghostfolio offre un’interfaccia utente intuitiva e un’ampia gamma di funzionalità per aiutarti a prendere decisioni informate e il controllo del tuo futuro finanziario. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 13 @@ -5600,7 +5608,7 @@ Ghostfolio is an open source software (OSS), providing a cost-effective alternative to making it particularly suitable for individuals on a tight budget, such as those pursuing Financial Independence, Retire Early (FIRE). By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience. - Ghostfolio è un software open source (OSS) che offre un'alternativa economicamente vantaggiosa a particolarmente adatta a persone con un budget limitato, come quelle che perseguono l'indipendenza finanziaria e il pensionamento anticipato (FIRE). Grazie agli sforzi collettivi di una comunità di sviluppatori e di appassionati di finanza personale, Ghostfolio migliora continuamente le sue capacità, la sua sicurezza e la sua esperienza utente. + Ghostfolio è un software open source (OSS) che offre un’alternativa economicamente vantaggiosa a particolarmente adatta a persone con un budget limitato, come quelle che perseguono l’indipendenza finanziaria e il pensionamento anticipato (FIRE). Grazie agli sforzi collettivi di una comunità di sviluppatori e di appassionati di finanza personale, Ghostfolio migliora continuamente le sue capacità, la sua sicurezza e la sua esperienza utente. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 27 @@ -5631,7 +5639,7 @@ Nota bene: le informazioni fornite si basano sulle nostre ricerche e analisi indipendenti. Questo sito web non è affiliato con o a qualsiasi altro prodotto citato nel confronto. Poiché il panorama degli strumenti di finanza personale si evolve, è essenziale verificare qualsiasi dettaglio o modifica specifica direttamente nella pagina del prodotto in questione. I dati hanno bisogno di essere aggiornati? Aiutaci a mantenere i dati accurati su GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -5639,7 +5647,7 @@ Sei pronto a portare il tuo investimento al livello successivo? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -5647,7 +5655,7 @@ Inizia apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -5655,7 +5663,11 @@ Svizzera apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -5663,7 +5675,11 @@ Globale apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5731,7 +5747,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -6011,7 +6027,7 @@ Extreme Fear libs/ui/src/lib/i18n.ts - 69 + 91 @@ -6019,7 +6035,7 @@ Extreme Greed libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6027,7 +6043,7 @@ Neutral libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6035,7 +6051,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -6075,11 +6091,11 @@ Starting from apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -6087,11 +6103,11 @@ year apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -6123,7 +6139,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -6213,6 +6229,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Absolute Asset Performance @@ -6375,7 +6395,7 @@ Data Gathering apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -6451,7 +6471,7 @@ Active apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6459,7 +6479,7 @@ Closed apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -6643,7 +6663,7 @@ Do you really want to delete these profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6651,7 +6671,7 @@ Oops! Could not delete profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6678,6 +6698,262 @@ 155 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + France + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + India + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + United States + + libs/ui/src/lib/i18n.ts + 88 + + - \ No newline at end of file + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 7d237f713..a5e623efa 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -154,7 +154,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -194,31 +194,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -254,7 +254,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -286,11 +286,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -366,7 +366,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -458,7 +458,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -518,7 +518,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -558,7 +558,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -586,7 +586,7 @@ Aantal activiteiten apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -654,7 +654,7 @@ per gebruiker apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -690,7 +690,7 @@ Wisselkoersen apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -698,7 +698,7 @@ Valuta toevoegen apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -706,7 +706,7 @@ Systeembericht apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -714,7 +714,7 @@ Bericht instellen apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -722,7 +722,7 @@ Alleen lezen apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -730,7 +730,7 @@ Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -738,7 +738,7 @@ Toevoegen apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -750,7 +750,7 @@ Huishouding apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -758,7 +758,7 @@ Cache legen apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -918,7 +918,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -1282,11 +1282,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -1342,11 +1342,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -1358,7 +1362,7 @@ Gegevensstoring melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -1858,7 +1862,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2063,7 +2067,7 @@ Regions - Regio's + Regio’s apps/client/src/app/pages/portfolio/allocations/allocations-page.html 198 @@ -2194,7 +2198,7 @@ Activiteit bijwerken apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 @@ -2206,7 +2210,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2226,7 +2230,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -2238,7 +2242,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2250,11 +2254,11 @@ Prijs per eenheid apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2266,11 +2270,11 @@ Transactiekosten apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2290,7 +2294,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -2314,7 +2318,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -2364,6 +2368,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Currencies @@ -2482,7 +2490,7 @@ Activiteiten importeren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -2670,7 +2678,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -2818,7 +2826,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -2830,7 +2838,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -2838,7 +2846,7 @@ Filter op... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -3110,7 +3118,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -3118,11 +3126,11 @@ Geen gegevens beschikbaar libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -3290,7 +3298,7 @@ Account aanmaken apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -3298,7 +3306,7 @@ Gegevens valideren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -3406,7 +3414,7 @@ Toelage libs/ui/src/lib/i18n.ts - 14 + 15 @@ -3414,7 +3422,7 @@ Hoger risico libs/ui/src/lib/i18n.ts - 15 + 16 @@ -3806,7 +3814,7 @@ Oeps! Kon de historische wisselkoers niet krijgen van apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -3954,7 +3962,7 @@ Saldo bijwerken apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -4022,7 +4030,7 @@ Deze activiteit bestaat al. libs/ui/src/lib/i18n.ts - 16 + 17 @@ -4203,7 +4211,7 @@ ETFs - ETF's + ETF’s apps/client/src/app/pages/features/features-page.html 25 @@ -4366,7 +4374,7 @@ Beschikbaar in apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -4374,35 +4382,35 @@ ✅ Wel apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -4410,31 +4418,31 @@ ❌ Geen apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -4442,7 +4450,7 @@ ❌ Geen apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -4450,7 +4458,7 @@ Zelf hosten apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -4458,7 +4466,7 @@ Gebruik anoniem apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -4466,7 +4474,7 @@ Gratis abonnement apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -4474,7 +4482,7 @@ Notities apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -4482,7 +4490,7 @@ Volg, analyseer en visualiseer moeiteloos je vermogen met Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -4490,7 +4498,7 @@ Tools voor persoonlijke financiën apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -4511,7 +4519,7 @@ Stocks, ETFs, bonds, cryptocurrencies, commodities - Aandelen, ETF's, obligaties, cryptocurrencies, grondstoffen + Aandelen, ETF’s, obligaties, cryptocurrencies, grondstoffen apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 25 @@ -4555,7 +4563,7 @@ ETFs without Countries - ETF's zonder Landen + ETF’s zonder Landen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 90 @@ -4563,7 +4571,7 @@ ETFs without Sectors - ETF's zonder Sectoren + ETF’s zonder Sectoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 95 @@ -4606,7 +4614,7 @@ Japan libs/ui/src/lib/i18n.ts - 17 + 80 @@ -4915,7 +4923,7 @@ Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. - Ghostfolio stelt drukbezette mensen in staat om aandelen, ETF's of cryptocurrencies bij te houden zonder gevolgd te worden. + 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 229 @@ -4979,7 +4987,7 @@ trading stocks, ETFs or cryptocurrencies on multiple platforms - handelt in aandelen, ETF's of cryptocurrencies op meerdere platforms + handelt in aandelen, ETF’s of cryptocurrencies op meerdere platforms apps/client/src/app/pages/landing/landing-page.html 280 @@ -5242,7 +5250,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -5326,7 +5334,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -5542,7 +5550,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -5630,7 +5638,7 @@ Houd er rekening mee dat de verstrekte informatie gebaseerd is op ons onafhankelijk onderzoek en analyse. Deze website is niet gelieerd aan of een ander product dat in de vergelijking wordt genoemd. Aangezien het landschap van tools voor persoonlijke financiën evolueert, is het essentieel om specifieke details of wijzigingen rechtstreeks op de betreffende productpagina te controleren. Hebben je gegevens een opfrisbeurt nodig? Help ons nauwkeurige gegevens te onderhouden over GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -5638,7 +5646,7 @@ Klaar om je investeringen naar een hoger niveau te brengen? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -5646,7 +5654,7 @@ Aan de slag apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -5654,7 +5662,11 @@ Zwitserland apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -5662,7 +5674,11 @@ Wereldwijd apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5730,7 +5746,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -6010,7 +6026,7 @@ Extreme Fear libs/ui/src/lib/i18n.ts - 69 + 91 @@ -6018,7 +6034,7 @@ Extreme Greed libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6026,7 +6042,7 @@ Neutral libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6034,7 +6050,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -6074,11 +6090,11 @@ Starting from apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -6086,11 +6102,11 @@ year apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -6122,7 +6138,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -6212,6 +6228,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Absolute Asset Performance @@ -6374,7 +6394,7 @@ Data Gathering apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -6450,7 +6470,7 @@ Active apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6458,7 +6478,7 @@ Closed apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -6642,7 +6662,7 @@ Do you really want to delete these profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6650,7 +6670,7 @@ Oops! Could not delete profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6677,6 +6697,262 @@ 155 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + France + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + India + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + United States + + libs/ui/src/lib/i18n.ts + 88 + + - \ No newline at end of file + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index e79f06166..6d3e7f2ee 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -82,7 +82,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -178,7 +178,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -394,7 +394,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -650,7 +650,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -906,7 +906,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -950,7 +950,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -974,31 +974,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1034,7 +1034,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1066,11 +1066,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1154,7 +1154,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -1238,7 +1238,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1298,7 +1298,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1338,7 +1338,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -1378,7 +1378,7 @@ Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -1402,7 +1402,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -1426,7 +1426,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -1518,7 +1518,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -1654,7 +1654,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -1690,7 +1690,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -1762,7 +1762,7 @@ Activity Count apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -1770,7 +1770,7 @@ per User apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -1778,7 +1778,7 @@ Exchange Rates apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -1786,7 +1786,7 @@ Add Currency apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -1794,7 +1794,7 @@ User Signup apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -1802,7 +1802,7 @@ Read-only Mode apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -1810,7 +1810,7 @@ System Message apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -1818,7 +1818,7 @@ Set Message apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -1826,7 +1826,7 @@ Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -1834,7 +1834,7 @@ Add apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1846,7 +1846,7 @@ Housekeeping apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -1854,7 +1854,7 @@ Flush Cache apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -1954,11 +1954,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -2096,6 +2100,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Benchmark @@ -2246,7 +2254,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -2258,7 +2266,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -2350,7 +2358,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2646,11 +2654,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -2706,7 +2714,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2718,7 +2726,7 @@ Report Data Glitch apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -4122,7 +4130,7 @@ Update activity apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 @@ -4194,7 +4202,7 @@ Update Cash Balance apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -4202,11 +4210,11 @@ Unit Price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4218,7 +4226,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -4226,11 +4234,11 @@ Fee apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4242,7 +4250,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -4250,7 +4258,7 @@ Import Activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -4282,7 +4290,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -5138,7 +5146,7 @@ Available in apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -5146,35 +5154,35 @@ ✅ Yes apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -5182,31 +5190,31 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -5214,7 +5222,7 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -5222,7 +5230,7 @@ Self-Hosting apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -5230,7 +5238,7 @@ Use anonymously apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -5238,7 +5246,7 @@ Free Plan apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -5246,7 +5254,7 @@ Notes apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -5254,7 +5262,7 @@ Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -5262,7 +5270,7 @@ Ready to take your investments to the next level? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -5270,7 +5278,7 @@ Effortlessly track, analyze, and visualize your wealth with Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -5278,7 +5286,7 @@ Get Started apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -5286,7 +5294,7 @@ Personal Finance Tools apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -5294,7 +5302,11 @@ Switzerland apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -5302,7 +5314,11 @@ Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5682,7 +5698,7 @@ Grant libs/ui/src/lib/i18n.ts - 14 + 15 @@ -5690,7 +5706,7 @@ Higher Risk libs/ui/src/lib/i18n.ts - 15 + 16 @@ -5698,7 +5714,7 @@ This activity already exists. libs/ui/src/lib/i18n.ts - 16 + 17 @@ -5706,7 +5722,7 @@ Japan libs/ui/src/lib/i18n.ts - 17 + 80 @@ -5742,7 +5758,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -5990,7 +6006,7 @@ Extreme Fear libs/ui/src/lib/i18n.ts - 69 + 91 @@ -5998,7 +6014,7 @@ Extreme Greed libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6006,7 +6022,7 @@ Neutral libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6038,11 +6054,11 @@ Brak danych libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -6074,11 +6090,11 @@ Starting from apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -6086,11 +6102,11 @@ year apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -6122,7 +6138,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -6212,6 +6228,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Absolute Asset Performance @@ -6374,7 +6394,7 @@ Gromadzenie Danych apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -6450,7 +6470,7 @@ Active apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6458,7 +6478,7 @@ Closed apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -6642,7 +6662,7 @@ Czy na pewno chcesz usunąć te profile? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6650,7 +6670,7 @@ Ups! Nie udało się usunąć profili. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6677,6 +6697,262 @@ 155 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + France + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + India + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + United States + + libs/ui/src/lib/i18n.ts + 88 + + - \ No newline at end of file + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index ac3b53dfb..90ebd02fd 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -166,7 +166,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -210,7 +210,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -250,31 +250,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -310,7 +310,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -342,11 +342,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -414,7 +414,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -514,7 +514,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -574,7 +574,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -614,7 +614,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -622,7 +622,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -646,7 +646,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -670,7 +670,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -698,7 +698,7 @@ Número de Atividades apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -810,7 +810,7 @@ por Utilizador apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -818,7 +818,7 @@ Taxas de Câmbio apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -826,7 +826,7 @@ Adicionar Moeda apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -834,7 +834,7 @@ Mensagem de Sistema apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -842,7 +842,7 @@ Definir Mensagem apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -850,7 +850,7 @@ Modo Somente Leitura apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -858,7 +858,7 @@ Cupões apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -866,7 +866,7 @@ Adicionar apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -878,7 +878,7 @@ Manutenção apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -886,7 +886,7 @@ Limpar Cache apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -996,6 +996,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Benchmark @@ -1090,7 +1094,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -1234,7 +1238,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -1246,7 +1250,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -1506,11 +1510,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -1566,7 +1570,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1646,11 +1650,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -1662,7 +1670,7 @@ Dados do Relatório com Problema apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -2334,7 +2342,7 @@ Atualizar atividade apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 @@ -2346,7 +2354,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2366,7 +2374,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -2374,11 +2382,11 @@ Preço por Unidade apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2390,11 +2398,11 @@ Comissão apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2414,7 +2422,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -2878,7 +2886,7 @@ Importar Atividades apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -3022,7 +3030,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -3198,11 +3206,11 @@ Sem dados disponíveis libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -3234,7 +3242,7 @@ Registo do Utilizador apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -3306,7 +3314,7 @@ A validar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -3406,7 +3414,7 @@ Conceder libs/ui/src/lib/i18n.ts - 14 + 15 @@ -3414,7 +3422,7 @@ Risco mais Elevado libs/ui/src/lib/i18n.ts - 15 + 16 @@ -3806,7 +3814,7 @@ Oops! Não foi possível obter a taxa de câmbio histórica de apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -3954,7 +3962,7 @@ Atualizar saldo em Dinheiro apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -4022,7 +4030,7 @@ Essa atividade já existe. libs/ui/src/lib/i18n.ts - 16 + 17 @@ -4366,7 +4374,7 @@ Disponível em apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -4374,35 +4382,35 @@ ✅ Sim apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -4410,31 +4418,31 @@ ❌ Não apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -4442,7 +4450,7 @@ ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -4450,7 +4458,7 @@ Self-Hosting apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -4458,7 +4466,7 @@ Utilizar anonimamente apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -4466,7 +4474,7 @@ Plano gratuito apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -4474,7 +4482,7 @@ Notas apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -4482,7 +4490,7 @@ Effortlessly track, analyze, and visualize your wealth with Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -4490,7 +4498,7 @@ Personal Finance Tools apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -4606,7 +4614,7 @@ Japan libs/ui/src/lib/i18n.ts - 17 + 80 @@ -5242,7 +5250,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -5326,7 +5334,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -5542,7 +5550,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -5630,7 +5638,7 @@ Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -5638,7 +5646,7 @@ Ready to take your investments to the next level? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -5646,7 +5654,7 @@ Começar apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -5654,7 +5662,11 @@ Switzerland apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -5662,7 +5674,11 @@ Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5730,7 +5746,7 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -6010,7 +6026,7 @@ Extreme Fear libs/ui/src/lib/i18n.ts - 69 + 91 @@ -6018,7 +6034,7 @@ Extreme Greed libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6026,7 +6042,7 @@ Neutral libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6034,7 +6050,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -6074,11 +6090,11 @@ Starting from apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -6086,11 +6102,11 @@ year apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -6122,7 +6138,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -6212,6 +6228,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Absolute Asset Performance @@ -6374,7 +6394,7 @@ Data Gathering apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -6450,7 +6470,7 @@ Active apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6458,7 +6478,7 @@ Closed apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -6642,7 +6662,7 @@ Do you really want to delete these profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6650,7 +6670,7 @@ Oops! Could not delete profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6677,6 +6697,262 @@ 155 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + France + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + India + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + United States + + libs/ui/src/lib/i18n.ts + 88 + + - \ No newline at end of file + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 9da55aac3..3e9fd38ac 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -82,7 +82,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -178,7 +178,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -394,7 +394,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -626,7 +626,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -870,7 +870,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -914,7 +914,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -938,31 +938,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -998,7 +998,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1030,11 +1030,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1102,7 +1102,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -1202,7 +1202,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1262,7 +1262,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1302,7 +1302,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -1315,7 +1315,7 @@ ETFs without Countries - Ülkesi Olmayan ETF'ler + Ülkesi Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 90 @@ -1323,7 +1323,7 @@ ETFs without Sectors - Sektörü Olmayan ETF'ler + Sektörü Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 95 @@ -1334,7 +1334,7 @@ Filtrele... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -1358,7 +1358,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -1382,7 +1382,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -1578,7 +1578,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -1598,7 +1598,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -1654,7 +1654,7 @@ İşlem Sayısı apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -1662,7 +1662,7 @@ Kullanıcı başına apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -1670,7 +1670,7 @@ Döviz Kurları apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -1678,7 +1678,7 @@ Para Birimi Ekle apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -1690,11 +1690,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -1706,7 +1710,7 @@ Kullanıcı Kaydı apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -1714,7 +1718,7 @@ Salt okunur mod apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -1722,7 +1726,7 @@ Sistem Mesajı apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -1730,7 +1734,7 @@ Mesaj Belirle apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -1738,7 +1742,7 @@ Kupon apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -1746,7 +1750,7 @@ Ekle apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1758,7 +1762,7 @@ Genel Ayarlar apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -1766,7 +1770,7 @@ Önbelleği temizle apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -1956,6 +1960,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Benchmark @@ -2019,7 +2027,7 @@ My Ghostfolio - Ghostfolio'm + Ghostfolio’m apps/client/src/app/components/header/header.component.html 262 @@ -2098,7 +2106,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -2110,7 +2118,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -2123,7 +2131,7 @@ Welcome to Ghostfolio - Ghostfolio'ya Hoşgeldiniz. + Ghostfolio’ya Hoşgeldiniz. apps/client/src/app/components/home-overview/home-overview.html 7 @@ -2202,7 +2210,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2474,11 +2482,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -2534,7 +2542,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2562,7 +2570,7 @@ Rapor Veri Sorunu apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -2575,7 +2583,7 @@ Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience: - Bugün Ghostfolio Premium'a yükseltin ve yatırım deneyiminizi geliştirmek için ayrıcalıklı özelliklere erişim kazanın: + Bugün Ghostfolio Premium’a yükseltin ve yatırım deneyiminizi geliştirmek için ayrıcalıklı özelliklere erişim kazanın: apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 15 @@ -3063,7 +3071,7 @@ Check out the numerous features of Ghostfolio to manage your wealth - Varlıklarınızı yönetmek için Ghostfolio'nun özelliklerini keşfedin + Varlıklarınızı yönetmek için Ghostfolio’nun özelliklerini keşfedin apps/client/src/app/pages/features/features-page.html 6 @@ -3079,7 +3087,7 @@ ETFs - ETF'ler + ETF’ler apps/client/src/app/pages/features/features-page.html 25 @@ -3295,7 +3303,7 @@ Stars on GitHub - GitHub'daki Beğeniler + GitHub’daki Beğeniler apps/client/src/app/pages/landing/landing-page.html 88 @@ -3307,7 +3315,7 @@ Pulls on Docker Hub - Docker Hub'ta Çekmeler + Docker Hub’ta Çekmeler apps/client/src/app/pages/landing/landing-page.html 106 @@ -3335,7 +3343,7 @@ Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. - Ghostfolio, takip edilmeden hisse senetleri, ETF'ler veya kripto paraları izlemek isteyen yoğun insanlara güç verir. + 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 229 @@ -3367,7 +3375,7 @@ Use Ghostfolio anonymously and own your financial data. - Ghostfolio'yu anonim olarak kullanın ve finansal verilerinize sahip çıkın. + Ghostfolio’yu anonim olarak kullanın ve finansal verilerinize sahip çıkın. apps/client/src/app/pages/landing/landing-page.html 253 @@ -3559,7 +3567,7 @@ At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. - Ghostfolio'da şeffaflık, değerlerimizin temelinde yer alır. Kaynak kodunu açık kaynak yazılım (OSS) olarak AGPL-3.0 lisansı altında yayınlıyoruz ve platformun işletme durumunun toplu anahtar metriklerini açıkça paylaşıyoruz. + Ghostfolio’da şeffaflık, değerlerimizin temelinde yer alır. Kaynak kodunu açık kaynak yazılım (OSS) olarak AGPL-3.0 lisansı altında yayınlıyoruz ve platformun işletme durumunun toplu anahtar metriklerini açıkça paylaşıyoruz. apps/client/src/app/pages/open/open-page.html 6 @@ -3595,7 +3603,7 @@ Contributors on GitHub - GitHub'da Katkıda Bulunanlar + GitHub’da Katkıda Bulunanlar apps/client/src/app/pages/open/open-page.html 89 @@ -3634,12 +3642,12 @@ İşlemi Güncelle apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 Stocks, ETFs, bonds, cryptocurrencies, commodities - Hisse senetleri, ETF'ler, tahviller, kripto paralar, emtialar + Hisse senetleri, ETF’ler, tahviller, kripto paralar, emtialar apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 25 @@ -3682,7 +3690,7 @@ Nakit Bakiyesini Güncelle apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -3690,11 +3698,11 @@ Birim Fiyat apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3706,7 +3714,7 @@ Hay Allah! Geçmiş döviz kuru alınamadı: apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -3714,11 +3722,11 @@ Komisyon apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3730,7 +3738,7 @@ İşlemleri İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -3762,7 +3770,7 @@ Veri doğrulanıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -4211,7 +4219,7 @@ If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. - Ghostfolio'yu kendi altyapınızda çalıştırmayı tercih ederseniz, lütfen kaynak kodunu ve daha fazla talimatı GitHub adresinde bulun. + Ghostfolio’yu kendi altyapınızda çalıştırmayı tercih ederseniz, lütfen kaynak kodunu ve daha fazla talimatı GitHub adresinde bulun. apps/client/src/app/pages/pricing/pricing-page.html 26 @@ -4219,7 +4227,7 @@ For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. - Kendi altyapılarında Ghostfolio'yu çalıştırmayı tercih eden teknolojiye hakim yatırımcılar için. + Kendi altyapılarında Ghostfolio’yu çalıştırmayı tercih eden teknolojiye hakim yatırımcılar için. apps/client/src/app/pages/pricing/pricing-page.html 38 @@ -4575,7 +4583,7 @@ Let’s dive deeper into the detailed Ghostfolio vs comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to . We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements. - Ghostfolio ve arasındaki ayrıntılı karşılaştırmanın yer aldığı aşağıdaki tabloya daha yakından bakarak Ghostfolio'nun karşısında kendisini nasıl konumlandırdığını kapsamlı bir şekilde değerlendirelim. Bu kapsamda özellikler, veri güvenliği, fiyat vb. hususları inceleyerek kişisel gereksinimleriniz için bilgiye dayalı bir seçim yapmanızı sağlayabileceği. + Ghostfolio ve arasındaki ayrıntılı karşılaştırmanın yer aldığı aşağıdaki tabloya daha yakından bakarak Ghostfolio’nun karşısında kendisini nasıl konumlandırdığını kapsamlı bir şekilde değerlendirelim. Bu kapsamda özellikler, veri güvenliği, fiyat vb. hususları inceleyerek kişisel gereksinimleriniz için bilgiye dayalı bir seçim yapmanızı sağlayabileceği. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 38 @@ -4610,7 +4618,7 @@ Mevcut apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -4618,35 +4626,35 @@ ✅ Evet apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -4654,31 +4662,31 @@ ❌ Hayır apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -4686,7 +4694,7 @@ ❌ Hayır apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -4694,7 +4702,7 @@ Tarafınızca Barındırma apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -4702,7 +4710,7 @@ Anonim olarak kullan apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -4710,7 +4718,7 @@ Ücretsiz Plan apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -4718,7 +4726,7 @@ Notlar apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -4726,7 +4734,7 @@ Lütfen dikkat, Ghostfolio ve arasındaki karşılaştırmanın yer aldığı tablodaki bilgiler bağımsız araştırmalarımıza dayanmaktadır. Websitemizin ile ya da bu karşılaştırmada adı geçen herhangi bir ürün ve hizmet ile ilişkisi bulunmamaktadır. Kişisel finans araçlarının kapsamı geliştikçe, belirli ayrıntıların veya değişikliklerin doğrudan ilgili ürün sayfasından doğrulanması önemlidir. Verilerin yenilenmesi mi gerekiyor? Doğru verileri sağlamamıza yardımcı olmak için sayfamızı ziyaret edin. GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -4734,7 +4742,7 @@ Ready to take your investments to the next level? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -4742,7 +4750,7 @@ Ghostfolio ile varlıklarınızı kolaylıkla takip edin, analiz edin ve görselleştirin. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -4750,7 +4758,7 @@ Başlayın apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -4758,7 +4766,7 @@ Kişisel Finans Araçları apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -4766,7 +4774,11 @@ İsviçre apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -4774,7 +4786,11 @@ Küresel apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -4819,7 +4835,7 @@ My Ghostfolio - Benim Ghostfolio'm + Benim Ghostfolio’m apps/client/src/app/pages/user-account/user-account-page-routing.module.ts 33 @@ -4903,7 +4919,7 @@ Try Premium - Premium'u Deneyin + Premium’u Deneyin apps/client/src/app/components/user-account-membership/user-account-membership.html 40 @@ -5350,7 +5366,7 @@ Grant libs/ui/src/lib/i18n.ts - 14 + 15 @@ -5358,7 +5374,7 @@ Higher Risk libs/ui/src/lib/i18n.ts - 15 + 16 @@ -5366,7 +5382,7 @@ This activity already exists. libs/ui/src/lib/i18n.ts - 16 + 17 @@ -5374,7 +5390,7 @@ Japan libs/ui/src/lib/i18n.ts - 17 + 80 @@ -5410,7 +5426,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -5658,11 +5674,11 @@ Veri mevcut değil libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -5738,7 +5754,7 @@ Hay Allah! Tarihsel kur verisi elde edilemedi apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -6010,7 +6026,7 @@ Aşırı Korku libs/ui/src/lib/i18n.ts - 69 + 91 @@ -6018,7 +6034,7 @@ Aşırı Açgözlülük libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6026,7 +6042,7 @@ Nötr libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6034,7 +6050,7 @@ Hay Allah! Geçmiş veriler ayrıştırılamadı. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -6074,11 +6090,11 @@ Başlangıç apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -6086,11 +6102,11 @@ Yıl apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -6122,7 +6138,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -6212,6 +6228,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Absolute Asset Performance @@ -6374,7 +6394,7 @@ Data Gathering apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -6450,7 +6470,7 @@ Active apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6458,7 +6478,7 @@ Closed apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -6642,7 +6662,7 @@ Do you really want to delete these profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6650,7 +6670,7 @@ Oops! Could not delete profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6677,6 +6697,262 @@ 155 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + France + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + India + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + United States + + libs/ui/src/lib/i18n.ts + 88 + + - \ No newline at end of file + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 613e3e24b..24253d03d 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -82,7 +82,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -176,7 +176,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -386,7 +386,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -630,7 +630,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -878,7 +878,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -920,7 +920,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -943,31 +943,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1002,7 +1002,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1033,11 +1033,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1116,7 +1116,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -1190,7 +1190,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1248,7 +1248,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1287,7 +1287,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -1322,7 +1322,7 @@ Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -1345,7 +1345,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -1368,7 +1368,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -1451,7 +1451,7 @@ Oops! Could not parse historical data. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -1576,7 +1576,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -1608,7 +1608,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -1678,70 +1678,70 @@ Activity Count apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 per User apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 Exchange Rates apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 Add Currency apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 User Signup apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 Read-only Mode apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 System Message apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 Set Message apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 Coupons apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 Add apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1752,14 +1752,14 @@ Housekeeping apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 Flush Cache apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -1851,11 +1851,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -1978,6 +1982,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Benchmark @@ -2113,7 +2121,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -2124,7 +2132,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -2205,7 +2213,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2472,11 +2480,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -2526,7 +2534,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2537,7 +2545,7 @@ Report Data Glitch apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -3794,7 +3802,7 @@ Update activity apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 @@ -3858,18 +3866,18 @@ Update Cash Balance apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 Unit Price apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3880,18 +3888,18 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 Fee apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3902,14 +3910,14 @@ Oops! Could not get the historical exchange rate from apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 Import Activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -3937,7 +3945,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -4699,179 +4707,187 @@ Available in apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 ✅ Yes apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 ❌ No apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 Self-Hosting apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 Use anonymously apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 Free Plan apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 Starting from apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 year apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 Notes apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 Ready to take your investments to the next level? apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 Effortlessly track, analyze, and visualize your wealth with Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 Get Started apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 Personal Finance Tools apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 Switzerland apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5229,28 +5245,28 @@ Grant libs/ui/src/lib/i18n.ts - 14 + 15 Higher Risk libs/ui/src/lib/i18n.ts - 15 + 16 This activity already exists. libs/ui/src/lib/i18n.ts - 16 + 17 Japan libs/ui/src/lib/i18n.ts - 17 + 80 @@ -5282,7 +5298,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -5499,21 +5515,21 @@ Extreme Fear libs/ui/src/lib/i18n.ts - 69 + 91 Extreme Greed libs/ui/src/lib/i18n.ts - 70 + 92 Neutral libs/ui/src/lib/i18n.ts - 73 + 95 @@ -5541,11 +5557,11 @@ No data available libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -5566,7 +5582,7 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -5661,6 +5677,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Asset Performance @@ -5811,7 +5831,7 @@ Data Gathering apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -5850,14 +5870,14 @@ Closed apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 Active apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6004,7 +6024,7 @@ Do you really want to delete these profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6018,7 +6038,7 @@ Oops! Could not delete profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6049,6 +6069,230 @@ 155 + + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + United States + + libs/ui/src/lib/i18n.ts + 88 + + + + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + + libs/ui/src/lib/i18n.ts + 76 + + - \ No newline at end of file + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 16cb8d78c..3092e362e 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -83,7 +83,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 23 + 24 @@ -179,7 +179,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 24 + 25 @@ -395,7 +395,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 26 + 27 apps/client/src/app/pages/resources/resources-page.component.ts @@ -651,7 +651,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 186 + 202 @@ -915,7 +915,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 137 + 138 libs/ui/src/lib/activities-table/activities-table.component.html @@ -959,7 +959,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 143 + 144 libs/ui/src/lib/activities-table/activities-table.component.html @@ -983,31 +983,31 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 203 + 204 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 206 + 207 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 209 + 210 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 273 + 274 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 276 + 277 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 279 + 280 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 282 + 283 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1043,7 +1043,7 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 83 + 78 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1075,11 +1075,11 @@ apps/client/src/app/components/admin-overview/admin-overview.html - 93 + 88 apps/client/src/app/components/admin-overview/admin-overview.html - 210 + 205 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1163,7 +1163,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 153 + 154 @@ -1247,7 +1247,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 159 + 160 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1307,7 +1307,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 426 + 427 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1347,7 +1347,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 433 + 434 @@ -1387,7 +1387,7 @@ 过滤... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 322 + 328 @@ -1411,7 +1411,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 353 + 354 @@ -1435,7 +1435,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 369 + 370 @@ -1527,7 +1527,7 @@ 哎呀!无法解析历史数据。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 232 + 235 @@ -1663,7 +1663,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 338 + 339 @@ -1699,7 +1699,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 123 + 124 @@ -1779,7 +1779,7 @@ 活动计数 apps/client/src/app/components/admin-overview/admin-overview.html - 23 + 19 @@ -1787,7 +1787,7 @@ 每位用户 apps/client/src/app/components/admin-overview/admin-overview.html - 33 + 28 @@ -1795,7 +1795,7 @@ 汇率 apps/client/src/app/components/admin-overview/admin-overview.html - 39 + 34 @@ -1803,7 +1803,7 @@ 添加货币 apps/client/src/app/components/admin-overview/admin-overview.html - 109 + 104 @@ -1811,7 +1811,7 @@ 用户注册 apps/client/src/app/components/admin-overview/admin-overview.html - 115 + 110 @@ -1819,7 +1819,7 @@ 只读模式 apps/client/src/app/components/admin-overview/admin-overview.html - 129 + 124 @@ -1827,7 +1827,7 @@ 系统信息 apps/client/src/app/components/admin-overview/admin-overview.html - 153 + 148 @@ -1835,7 +1835,7 @@ 设置留言 apps/client/src/app/components/admin-overview/admin-overview.html - 175 + 170 @@ -1843,7 +1843,7 @@ 优惠券 apps/client/src/app/components/admin-overview/admin-overview.html - 183 + 178 @@ -1851,7 +1851,7 @@ 添加 apps/client/src/app/components/admin-overview/admin-overview.html - 243 + 238 libs/ui/src/lib/account-balances/account-balances.component.html @@ -1863,7 +1863,7 @@ 家政 apps/client/src/app/components/admin-overview/admin-overview.html - 251 + 246 @@ -1871,7 +1871,7 @@ 刷新缓存 apps/client/src/app/components/admin-overview/admin-overview.html - 255 + 250 @@ -1971,11 +1971,15 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 381 + 386 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 423 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 382 + 383 libs/ui/src/lib/assistant/assistant.html @@ -2113,6 +2117,10 @@ apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts 41 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + Benchmark @@ -2263,7 +2271,7 @@ libs/ui/src/lib/i18n.ts - 71 + 93 @@ -2275,7 +2283,7 @@ libs/ui/src/lib/i18n.ts - 72 + 94 @@ -2367,7 +2375,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 10 + 8 @@ -2663,11 +2671,11 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 200 + 201 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 270 + 271 @@ -2723,7 +2731,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 187 + 188 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2735,7 +2743,7 @@ 报告数据故障 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 399 + 441 @@ -4139,7 +4147,7 @@ 更新活动 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 8 + 10 @@ -4211,7 +4219,7 @@ 更新现金余额 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 111 + 112 @@ -4219,11 +4227,11 @@ 单价 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 212 + 213 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 285 + 286 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4235,7 +4243,7 @@ 哎呀!无法从以下来源获取历史汇率 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 317 + 318 @@ -4243,11 +4251,11 @@ 费用 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 305 + 306 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 329 + 330 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4259,7 +4267,7 @@ 哎呀!无法获取历史汇率 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 239 + 240 @@ -4267,7 +4275,7 @@ 导入活动 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 44 + 45 @@ -4299,7 +4307,7 @@ 验证数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 233 + 234 @@ -5155,7 +5163,7 @@ 可用于 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 87 + 103 @@ -5163,35 +5171,35 @@ ✅ 是的 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 115 + 131 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 122 + 138 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 134 + 150 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 141 + 157 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 153 + 169 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 160 + 176 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 172 + 188 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 179 + 195 @@ -5199,31 +5207,31 @@ ❌ 没有 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 117 + 133 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 136 + 152 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 143 + 159 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 155 + 171 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 162 + 178 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 174 + 190 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 181 + 197 @@ -5231,7 +5239,7 @@ ❌ 没有 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 124 + 140 @@ -5239,7 +5247,7 @@ 自托管 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 129 + 145 @@ -5247,7 +5255,7 @@ 匿名使用 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 148 + 164 @@ -5255,7 +5263,7 @@ 免费计划 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 167 + 183 @@ -5263,11 +5271,11 @@ 从...开始 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 188 + 204 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 193 + 209 @@ -5275,11 +5283,11 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 189 + 205 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 195 + 211 @@ -5287,7 +5295,7 @@ 笔记 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 201 + 217 @@ -5295,7 +5303,7 @@ 请注意,Ghostfolio 与 Ghostfolio 中提供的信息比较表基于我们的独立研究和分析。该网站不隶属于或比较中提到的任何其他产品。随着个人理财工具格局的不断发展,直接从相应的产品页面验证任何具体的细节或变化至关重要。数据需要刷新吗?帮助我们维护准确的数据GitHub apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 210 + 226 @@ -5303,7 +5311,7 @@ 准备好带走你的投资下一级 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 223 + 239 @@ -5311,7 +5319,7 @@ 使用 Ghostfolio 轻松跟踪、分析和可视化您的财富。 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 227 + 243 @@ -5319,7 +5327,7 @@ 开始使用 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 232 + 248 @@ -5327,7 +5335,7 @@ 个人理财工具 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html - 308 + 266 @@ -5335,7 +5343,11 @@ 瑞士 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 60 + + + libs/ui/src/lib/i18n.ts + 86 @@ -5343,7 +5355,11 @@ 全球的 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 61 + + + libs/ui/src/lib/i18n.ts + 14 @@ -5747,7 +5763,7 @@ 授予 libs/ui/src/lib/i18n.ts - 14 + 15 @@ -5755,7 +5771,7 @@ 风险较高 libs/ui/src/lib/i18n.ts - 15 + 16 @@ -5763,7 +5779,7 @@ 这项活动已经存在。 libs/ui/src/lib/i18n.ts - 16 + 17 @@ -5771,7 +5787,7 @@ 日本 libs/ui/src/lib/i18n.ts - 17 + 80 @@ -5807,7 +5823,7 @@ libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 400 + 403 @@ -6055,7 +6071,7 @@ 极度恐惧 libs/ui/src/lib/i18n.ts - 69 + 91 @@ -6063,7 +6079,7 @@ 极度贪婪 libs/ui/src/lib/i18n.ts - 70 + 92 @@ -6071,7 +6087,7 @@ 中性的 libs/ui/src/lib/i18n.ts - 73 + 95 @@ -6103,11 +6119,11 @@ 无可用数据 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 402 + 405 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 415 + 418 @@ -6131,7 +6147,7 @@ 当前市场价格为 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 336 + 339 @@ -6237,6 +6253,10 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts 56 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + Asset Performance @@ -6407,7 +6427,7 @@ 数据收集 apps/client/src/app/components/admin-overview/admin-overview.html - 141 + 136 @@ -6451,7 +6471,7 @@ 关闭 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 37 + 39 @@ -6459,7 +6479,7 @@ 积极的 apps/client/src/app/components/home-holdings/home-holdings.component.ts - 36 + 38 @@ -6643,7 +6663,7 @@ Do you really want to delete these profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 34 + 36 @@ -6651,7 +6671,7 @@ Oops! Could not delete profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 45 + 49 @@ -6678,6 +6698,262 @@ 155 + + Alternative + Alternative + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + App + App + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Budgeting + Budgeting + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Community + Community + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Family Office + Family Office + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Investor + Investor + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Open Source + Open Source + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Personal Finance + Personal Finance + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Privacy + Privacy + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Software + Software + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Tool + Tool + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + User Experience + User Experience + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + Wealth + Wealth + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Wealth Management + Wealth Management + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + Australia + Australia + + libs/ui/src/lib/i18n.ts + 69 + + + + Austria + Austria + + libs/ui/src/lib/i18n.ts + 70 + + + + Belgium + Belgium + + libs/ui/src/lib/i18n.ts + 71 + + + + Bulgaria + Bulgaria + + libs/ui/src/lib/i18n.ts + 72 + + + + Canada + Canada + + libs/ui/src/lib/i18n.ts + 73 + + + + Czech Republic + Czech Republic + + libs/ui/src/lib/i18n.ts + 74 + + + + Finland + Finland + + libs/ui/src/lib/i18n.ts + 75 + + + + France + France + + libs/ui/src/lib/i18n.ts + 76 + + + + Germany + Germany + + libs/ui/src/lib/i18n.ts + 77 + + + + India + India + + libs/ui/src/lib/i18n.ts + 78 + + + + Italy + Italy + + libs/ui/src/lib/i18n.ts + 79 + + + + Netherlands + Netherlands + + libs/ui/src/lib/i18n.ts + 81 + + + + New Zealand + New Zealand + + libs/ui/src/lib/i18n.ts + 82 + + + + Poland + Poland + + libs/ui/src/lib/i18n.ts + 83 + + + + Romania + Romania + + libs/ui/src/lib/i18n.ts + 84 + + + + South Africa + South Africa + + libs/ui/src/lib/i18n.ts + 85 + + + + Thailand + Thailand + + libs/ui/src/lib/i18n.ts + 87 + + + + United States + United States + + libs/ui/src/lib/i18n.ts + 88 + + - \ No newline at end of file +