From 8c2f8033d7a169542dcdd35632912ed0ea05d604 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 27 May 2025 07:38:34 +0200 Subject: [PATCH 01/81] Feature/upgrade Node.js from version 20 to 22 (#4680) * Upgrade to Node.js 22 * Update changelog --- .github/workflows/build-code.yml | 2 +- .nvmrc | 2 +- CHANGELOG.md | 6 ++++++ DEVELOPMENT.md | 2 +- Dockerfile | 4 ++-- package-lock.json | 18 +++++++++--------- package.json | 4 ++-- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build-code.yml b/.github/workflows/build-code.yml index 18240ebc4..7a8f72ac4 100644 --- a/.github/workflows/build-code.yml +++ b/.github/workflows/build-code.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: node_version: - - 20 + - 22 steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/.nvmrc b/.nvmrc index 9a2a0e219..53d1c14db 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20 +v22 diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ebd488dc..a4669bbe9 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 `Node.js` from version `20` to `22` (`Dockerfile`) + ## 2.163.0 - 2025-05-26 ### Changed diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 1c45aeca1..51de2ad25 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -5,7 +5,7 @@ ### Prerequisites - [Docker](https://www.docker.com/products/docker-desktop) -- [Node.js](https://nodejs.org/en/download) (version 20+) +- [Node.js](https://nodejs.org/en/download) (version 22+) - Create a local copy of this Git repository (clone) - Copy the file `.env.dev` to `.env` and populate it with your data (`cp .env.dev .env`) diff --git a/Dockerfile b/Dockerfile index 103dc3b9e..922b880e3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM node:20-slim AS builder +FROM --platform=$BUILDPLATFORM node:22-slim AS builder # Build application and add additional files WORKDIR /ghostfolio @@ -50,7 +50,7 @@ COPY package.json /ghostfolio/dist/apps/api RUN npm run database:generate-typings # Image to run, copy everything needed from builder -FROM node:20-slim +FROM node:22-slim LABEL org.opencontainers.image.source="https://github.com/ghostfolio/ghostfolio" ENV NODE_ENV=production diff --git a/package-lock.json b/package-lock.json index 484ce76d1..9ba1a72a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -129,7 +129,7 @@ "@types/google-spreadsheet": "3.1.5", "@types/jest": "29.5.13", "@types/lodash": "4.17.16", - "@types/node": "20.14.10", + "@types/node": "22.15.17", "@types/papaparse": "5.3.7", "@types/passport-google-oauth20": "2.0.16", "@typescript-eslint/eslint-plugin": "8.29.0", @@ -161,7 +161,7 @@ "webpack-bundle-analyzer": "4.10.2" }, "engines": { - "node": ">=20" + "node": ">=22" } }, "node_modules/@adobe/css-tools": { @@ -13002,12 +13002,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/node-forge": { @@ -34266,9 +34266,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { diff --git a/package.json b/package.json index 3e203fbc9..e1877d2ef 100644 --- a/package.json +++ b/package.json @@ -175,7 +175,7 @@ "@types/google-spreadsheet": "3.1.5", "@types/jest": "29.5.13", "@types/lodash": "4.17.16", - "@types/node": "20.14.10", + "@types/node": "22.15.17", "@types/papaparse": "5.3.7", "@types/passport-google-oauth20": "2.0.16", "@typescript-eslint/eslint-plugin": "8.29.0", @@ -207,7 +207,7 @@ "webpack-bundle-analyzer": "4.10.2" }, "engines": { - "node": ">=20" + "node": ">=22" }, "prisma": { "seed": "npx ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts" From 59abe473f0fbe4999d1e701b9ee590a18e8a4737 Mon Sep 17 00:00:00 2001 From: Aris Hadrian Date: Tue, 27 May 2025 12:25:18 +0600 Subject: [PATCH 02/81] Feature/improve language localization PL 20250527 (#4767) * Improve language localization PL * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.pl.xlf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4669bbe9..f0f5effeb 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 `Node.js` from version `20` to `22` (`Dockerfile`) ## 2.163.0 - 2025-05-26 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 6d46d32df..9cb23c914 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -6898,7 +6898,7 @@ Get access to 80’000+ tickers from over 50 exchanges - Uzyskaj dostęp do ponad 100 000 pasków notowań giełdowych z ponad 50 giełd + Uzyskaj dostęp do ponad 80 000 pasków notowań giełdowych z ponad 50 giełd libs/ui/src/lib/i18n.ts 24 From a594b58d61d7f22f7335eeaed81fb0b0ec90ae9f Mon Sep 17 00:00:00 2001 From: Kalida Tony Date: Tue, 27 May 2025 14:31:36 -0500 Subject: [PATCH 03/81] Feature/improve language localization for ES 20250526 (#4763) * Improve language localization for ES * Update changelog --- CHANGELOG.md | 9 +-- apps/client/src/locales/messages.es.xlf | 86 ++++++++++++------------- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0f5effeb..a20c6b660 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 language localization for Polish (`pl`) +- Improved the language localization for Spanish (`es`) - Upgraded `Node.js` from version `20` to `22` (`Dockerfile`) ## 2.163.0 - 2025-05-26 @@ -41,12 +42,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Catalan (`ca`) - Improved the language localization for Chinese (`zh`) - Improved the language localization for Dutch (`nl`) -- Improved the language localization for Español (`es`) - Improved the language localization for French (`fr`) - Improved the language localization for German (`de`) - Improved the language localization for Italian (`it`) - Improved the language localization for Polish (`pl`) - Improved the language localization for Portuguese (`pt`) +- Improved the language localization for Spanish (`es`) - Upgraded `countup.js` from version `2.8.0` to `2.8.2` - Upgraded `nestjs` from version `10.4.15` to `11.0.12` - Upgraded `prisma` from version `6.7.0` to `6.8.2` @@ -3837,7 +3838,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the value redaction interceptor (including `comment`) -- Improved the language localization for Español (`es`) +- Improved the language localization for Spanish (`es`) - Upgraded `cheerio` from version `1.0.0-rc.6` to `1.0.0-rc.12` - Upgraded `prisma` from version `4.6.1` to `4.7.1` @@ -4066,7 +4067,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the usage of the value component in the admin control panel -- Improved the language localization for Español (`es`) +- Improved the language localization for Spanish (`es`) ### Fixed @@ -4088,7 +4089,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Set up the language localization for Español (`es`) +- Set up the language localization for Spanish (`es`) - Added support for sectors in mutual funds ## 1.198.0 - 25.09.2022 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 8235b386f..490d06519 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -4620,7 +4620,7 @@ Get a comprehensive financial overview by adding your bank and brokerage accounts. - Get a comprehensive financial overview by adding your bank and brokerage accounts. + Obtén una visión financiera completa agregando tus cuentas bancarias y de corretaje. apps/client/src/app/components/home-overview/home-overview.html 17 @@ -4628,7 +4628,7 @@ Capture your activities - Capture your activities + Captura tus actividades apps/client/src/app/components/home-overview/home-overview.html 24 @@ -4636,7 +4636,7 @@ Record your investment activities to keep your portfolio up to date. - Record your investment activities to keep your portfolio up to date. + Registra tus actividades de inversión para mantener tu portafolio actualizado. apps/client/src/app/components/home-overview/home-overview.html 26 @@ -4644,7 +4644,7 @@ Monitor and analyze your portfolio - Monitor and analyze your portfolio + Monitorea y analiza tu portafolio apps/client/src/app/components/home-overview/home-overview.html 33 @@ -4652,7 +4652,7 @@ Track your progress in real-time with comprehensive analysis and insights. - Track your progress in real-time with comprehensive analysis and insights. + Sigue tu progreso en tiempo real con análisis e información detallada. apps/client/src/app/components/home-overview/home-overview.html 35 @@ -4660,7 +4660,7 @@ No data available - No data available + No hay datos disponibles. apps/client/src/app/pages/portfolio/allocations/allocations-page.html 250 @@ -4680,7 +4680,7 @@ Ready to take control of your personal finances? - Ready to take control of your personal finances? + ¿Listo para tomar el control de tus finanzas personales? apps/client/src/app/components/home-overview/home-overview.html 8 @@ -4688,7 +4688,7 @@ Setup accounts - Setup accounts + Configura tus cuentas apps/client/src/app/components/home-overview/home-overview.html 48 @@ -4696,7 +4696,7 @@ Biometric Authentication - Biometric Authentication + Autenticación biométrica apps/client/src/app/components/user-account-settings/user-account-settings.html 218 @@ -4704,7 +4704,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. - 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. + En Ghostfolio, la transparencia está en el centro de nuestros valores. Publicamos el código fuente como software de código abierto (OSS) bajo la licencia Licencia AGPL-3.0 y compartimos abiertamente métricas clave agregadas sobre el estado operativo de la plataforma. apps/client/src/app/pages/open/open-page.html 6 @@ -4712,7 +4712,7 @@ Active Users - Active Users + Usuarios activos apps/client/src/app/pages/open/open-page.html 40 @@ -4724,7 +4724,7 @@ New Users - New Users + Nuevos usuarios apps/client/src/app/pages/open/open-page.html 51 @@ -4732,7 +4732,7 @@ Users in Slack community - Users in Slack community + Usuarios en la comunidad de Slack apps/client/src/app/pages/open/open-page.html 75 @@ -4740,7 +4740,7 @@ Contributors on GitHub - Contributors on GitHub + Colaboradores en GitHub apps/client/src/app/pages/open/open-page.html 89 @@ -4748,7 +4748,7 @@ Stars on GitHub - Stars on GitHub + Estrellas en GitHub apps/client/src/app/pages/landing/landing-page.html 88 @@ -4760,7 +4760,7 @@ Pulls on Docker Hub - Pulls on Docker Hub + Descargas en Docker Hub apps/client/src/app/pages/landing/landing-page.html 106 @@ -4772,7 +4772,7 @@ Uptime - Uptime + Tiempo de actividad apps/client/src/app/pages/open/open-page.html 132 @@ -4780,7 +4780,7 @@ Export Data - Export Data + Exportar datos apps/client/src/app/components/user-account-settings/user-account-settings.html 260 @@ -4788,7 +4788,7 @@ Currencies - Currencies + Monedas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts 86 @@ -4796,7 +4796,7 @@ Our - Our + Nuestro apps/client/src/app/pages/about/oss-friends/oss-friends-page.html 6 @@ -4804,7 +4804,7 @@ Visit - Visit + Visitar apps/client/src/app/pages/about/oss-friends/oss-friends-page.html 28 @@ -4812,7 +4812,7 @@ Discover other exciting Open Source Software projects - Discover other exciting Open Source Software projects + Descubre otros proyectos emocionantes de software de código abierto apps/client/src/app/pages/about/oss-friends/oss-friends-page.html 9 @@ -4820,7 +4820,7 @@ Frequently Asked Questions (FAQ) - Frequently Asked Questions (FAQ) + Preguntas Frecuentes (FAQ) apps/client/src/app/pages/faq/overview/faq-overview-page.html 4 @@ -4836,7 +4836,7 @@ Check out the numerous features of Ghostfolio to manage your wealth - Check out the numerous features of Ghostfolio to manage your wealth + Descubra las numerosas funciones de Ghostfolio para gestionar su patrimonio apps/client/src/app/pages/features/features-page.html 6 @@ -4844,7 +4844,7 @@ Discover the latest Ghostfolio updates and insights on personal finance - Discover the latest Ghostfolio updates and insights on personal finance + Conoce las últimas actualizaciones de Ghostfolio y obtén información sobre finanzas personales apps/client/src/app/pages/blog/blog-page.html 7 @@ -4852,7 +4852,7 @@ If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. - If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. + Si prefieres ejecutar Ghostfolio en tu propia infraestructura, puedes encontrar el código fuente e instrucciones adicionales en GitHub. apps/client/src/app/pages/pricing/pricing-page.html 26 @@ -4860,7 +4860,7 @@ Manage your wealth like a boss - Manage your wealth like a boss + Gestiona tu patrimonio como un jefe apps/client/src/app/pages/landing/landing-page.html 5 @@ -4868,7 +4868,7 @@ Ghostfolio is a privacy-first, open source dashboard for your personal finances. Break down your asset allocation, know your net worth and make solid, data-driven investment decisions. - Ghostfolio is a privacy-first, open source dashboard for your personal finances. Break down your asset allocation, know your net worth and make solid, data-driven investment decisions. + Ghostfolio es un panel de control de código abierto y centrado en la privacidad para tus finanzas personales. Analiza la asignación de tus activos, conoce tu patrimonio neto y toma decisiones de inversión sólidas basadas en datos. apps/client/src/app/pages/landing/landing-page.html 9 @@ -4888,7 +4888,7 @@ Monthly Active Users - Monthly Active Users + Usuarios activos mensuales apps/client/src/app/pages/landing/landing-page.html 70 @@ -4896,7 +4896,7 @@ As seen in - As seen in + Visto en apps/client/src/app/pages/landing/landing-page.html 115 @@ -4904,7 +4904,7 @@ Protect your assets. Refine your personal investment strategy. - Protect your assets. Refine your personal investment strategy. + Protege tus assets. Mejora tu estrategia de inversión personal. apps/client/src/app/pages/landing/landing-page.html 225 @@ -4912,7 +4912,7 @@ Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. - Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. + Ghostfolio permite a las personas ocupadas hacer un seguimiento de acciones, ETFs o criptomonedas sin ser rastreadas. apps/client/src/app/pages/landing/landing-page.html 229 @@ -4920,7 +4920,7 @@ 360° View - 360° View + Vista 360° apps/client/src/app/pages/landing/landing-page.html 240 @@ -4928,7 +4928,7 @@ Web3 Ready - Web3 Ready + Preparado para Web3 apps/client/src/app/pages/landing/landing-page.html 251 @@ -4936,7 +4936,7 @@ Use Ghostfolio anonymously and own your financial data. - Use Ghostfolio anonymously and own your financial data. + Usa Ghostfolio de forma anónima y sé dueño de tus datos financieros. apps/client/src/app/pages/landing/landing-page.html 253 @@ -4944,7 +4944,7 @@ Open Source - Open Source + Código Abierto apps/client/src/app/pages/landing/landing-page.html 261 @@ -4952,7 +4952,7 @@ Benefit from continuous improvements through a strong community. - Benefit from continuous improvements through a strong community. + Disfruta de mejoras continuas gracias a una comunidad sólida. apps/client/src/app/pages/landing/landing-page.html 263 @@ -4960,7 +4960,7 @@ Why Ghostfolio? - Why Ghostfolio? + ¿Por qué Ghostfolio? apps/client/src/app/pages/landing/landing-page.html 272 @@ -4968,7 +4968,7 @@ Ghostfolio is for you if you are... - Ghostfolio is for you if you are... + Ghostfolio es para ti si estás... apps/client/src/app/pages/landing/landing-page.html 273 @@ -4976,7 +4976,7 @@ trading stocks, ETFs or cryptocurrencies on multiple platforms - trading stocks, ETFs or cryptocurrencies on multiple platforms + operando con acciones, ETFs o criptomonedas en múltiples plataformas apps/client/src/app/pages/landing/landing-page.html 280 @@ -4984,7 +4984,7 @@ pursuing a buy & hold strategy - pursuing a buy & hold strategy + persiguiendo una compra & mantener estrategia apps/client/src/app/pages/landing/landing-page.html 286 @@ -4992,7 +4992,7 @@ interested in getting insights of your portfolio composition - interested in getting insights of your portfolio composition + interesado en obtener información sobre la composición de tu portafolio apps/client/src/app/pages/landing/landing-page.html 291 @@ -5000,7 +5000,7 @@ valuing privacy and data ownership - valuing privacy and data ownership + valorando la privacidad y la propiedad de tus datos apps/client/src/app/pages/landing/landing-page.html 296 From 6c1273dc8a8d599838c7c7136a50d0cb08550a6a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 21:36:11 +0200 Subject: [PATCH 04/81] Feature/update locales (#4774) * Update locales Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.es.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 490d06519..984574473 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -4704,7 +4704,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. - En Ghostfolio, la transparencia está en el centro de nuestros valores. Publicamos el código fuente como software de código abierto (OSS) bajo la licencia Licencia AGPL-3.0 y compartimos abiertamente métricas clave agregadas sobre el estado operativo de la plataforma. + En Ghostfolio, la transparencia está en el centro de nuestros valores. Publicamos el código fuente como software de código abierto (OSS) bajo la licencia Licencia AGPL-3.0 y compartimos abiertamente métricas clave agregadas sobre el estado operativo de la plataforma. apps/client/src/app/pages/open/open-page.html 6 From 316d118111c47b60c6be8bf61a6d483707849029 Mon Sep 17 00:00:00 2001 From: Scott Rose Date: Wed, 28 May 2025 01:55:24 +0600 Subject: [PATCH 05/81] Feature/improve language localization for FR 20250527 (#4766) * Improve language localization for FR * Update sitemap.xml * Update changelog --- CHANGELOG.md | 11 ++++++----- apps/api/src/assets/sitemap.xml | 2 +- apps/client/src/locales/messages.fr.xlf | 8 ++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a20c6b660..745d792af 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 French (`fr`) - Improved the language localization for Polish (`pl`) - Improved the language localization for Spanish (`es`) - Upgraded `Node.js` from version `20` to `22` (`Dockerfile`) @@ -104,7 +105,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Improved the language localization for Français (`fr`) +- Improved the language localization for French (`fr`) - Upgraded `bootstrap` from version `4.6.0` to `4.6.2` ### Fixed @@ -145,7 +146,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the error message of the currency code validation - Tightened the currency code validation by requiring uppercase letters - Respected the watcher count for the delete asset profiles checkbox in the historical market data table of the admin control panel -- Improved the language localization for Français (`fr`) +- Improved the language localization for French (`fr`) - Upgraded `ngx-skeleton-loader` from version `10.0.0` to `11.0.0` - Upgraded `Nx` from version `20.8.0` to `20.8.1` @@ -245,7 +246,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the check for duplicates in the preview step of the activities import (allow different comments) -- Improved the language localization for Français (`fr`) +- Improved the language localization for French (`fr`) - Improved the language localization for German (`de`) - Improved the language localization for Polish (`pl`) - Upgraded `ng-extract-i18n-merge` from version `2.14.1` to `2.14.3` @@ -3700,7 +3701,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Added the language localization for Français (`fr`) +- Added the language localization for French (`fr`) - Extended the landing page by a global heat map of subscribers - Added support for the thousand separator in the global heat map component @@ -3729,7 +3730,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support for the dividend timeline grouped by year - Added support for the investment timeline grouped by year -- Set up the language localization for Français (`fr`) +- Set up the language localization for French (`fr`) ### Changed diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml index 73dc8a7fc..d121c179c 100644 --- a/apps/api/src/assets/sitemap.xml +++ b/apps/api/src/assets/sitemap.xml @@ -317,7 +317,7 @@ ${currentDate}T00:00:00+00:00 - https://ghostfol.io/fr/a-propos/changelog + https://ghostfol.io/fr/a-propos/journal-des-modifications ${currentDate}T00:00:00+00:00 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 6de915283..4700a7e86 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -7589,7 +7589,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. - Calculations are based on delayed market data and may not be displayed in real-time. + Les calculs sont basés sur des données de marché retardées et peuvent ne pas être affichés en temps réel. apps/client/src/app/components/home-market/home-market.html 41 @@ -7597,7 +7597,7 @@ changelog - changelog + journal-des-modifications kebab-case libs/common/src/lib/paths.ts @@ -7606,7 +7606,7 @@ oss-friends - oss-friends + oss-amis kebab-case libs/common/src/lib/paths.ts @@ -7615,7 +7615,7 @@ open - open + ouvert kebab-case libs/common/src/lib/paths.ts From 0ab7b98077bc9cbea12a9bec9bcb1941e2c0c8df Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 28 May 2025 12:01:54 +0200 Subject: [PATCH 06/81] Feature/refactor publicly accessible page paths (#4768) * Refactoring --- apps/api/src/assets/sitemap.xml | 4 ++-- apps/client/src/locales/messages.ca.xlf | 18 ------------------ apps/client/src/locales/messages.de.xlf | 18 ------------------ apps/client/src/locales/messages.es.xlf | 18 ------------------ apps/client/src/locales/messages.fr.xlf | 18 ------------------ apps/client/src/locales/messages.it.xlf | 18 ------------------ apps/client/src/locales/messages.nl.xlf | 18 ------------------ apps/client/src/locales/messages.pl.xlf | 18 ------------------ apps/client/src/locales/messages.pt.xlf | 18 ------------------ apps/client/src/locales/messages.tr.xlf | 18 ------------------ apps/client/src/locales/messages.uk.xlf | 18 ------------------ apps/client/src/locales/messages.xlf | 16 ---------------- apps/client/src/locales/messages.zh.xlf | 18 ------------------ libs/common/src/lib/paths.ts | 6 +++--- 14 files changed, 5 insertions(+), 219 deletions(-) diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml index d121c179c..a2876c696 100644 --- a/apps/api/src/assets/sitemap.xml +++ b/apps/api/src/assets/sitemap.xml @@ -89,7 +89,7 @@ ${currentDate}T00:00:00+00:00 - https://ghostfol.io/de/ueber-uns/oss-freunde + https://ghostfol.io/de/ueber-uns/oss-friends ${currentDate}T00:00:00+00:00 @@ -395,7 +395,7 @@ ${currentDate}T00:00:00+00:00 - https://ghostfol.io/it/informazioni-su/oss-amici + https://ghostfol.io/it/informazioni-su/oss-friends ${currentDate}T00:00:00+00:00 diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 8a4062e55..5ce42fe53 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -7604,24 +7604,6 @@ 37 - - oss-friends - oss-friends - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 9c6b24ba3..86c156192 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -7604,24 +7604,6 @@ 37 - - oss-friends - oss-freunde - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 984574473..01b51e793 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -7605,24 +7605,6 @@ 37 - - oss-friends - oss-friends - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 4700a7e86..202082270 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -7604,24 +7604,6 @@ 37 - - oss-friends - oss-amis - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - ouvert - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index cbbe11d88..005af3ea5 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -7605,24 +7605,6 @@ 37 - - oss-friends - oss-amici - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 0b8f7c8f7..7a7dd735f 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -7604,24 +7604,6 @@ 37 - - oss-friends - oss-friends - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 9cb23c914..3d5c28be9 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -7604,24 +7604,6 @@ 37 - - oss-friends - oss-friends - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 14065a5e0..9cba3c1bb 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -7604,24 +7604,6 @@ 37 - - oss-friends - oss-friends - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 7aca7e0b0..cab998274 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -7604,24 +7604,6 @@ 37 - - oss-friends - oss-arkadaslar - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 168e50bfb..4113fc335 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -7604,24 +7604,6 @@ 37 - - oss-friends - oss-friends - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 720902ba2..e9a6a6c08 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -6830,14 +6830,6 @@ 41 - - oss-friends - kebab-case - - libs/common/src/lib/paths.ts - 46 - - changelog kebab-case @@ -6846,14 +6838,6 @@ 37 - - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 7c90eb7d9..01f2342fa 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -7605,24 +7605,6 @@ 37 - - oss-friends - 开源朋友 - kebab-case - - libs/common/src/lib/paths.ts - 46 - - - - open - open - kebab-case - - libs/common/src/lib/paths.ts - 45 - - diff --git a/libs/common/src/lib/paths.ts b/libs/common/src/lib/paths.ts index 06633ca95..c63457afc 100644 --- a/libs/common/src/lib/paths.ts +++ b/libs/common/src/lib/paths.ts @@ -32,7 +32,7 @@ export const paths = { xRay: 'x-ray', zen: 'zen', - // Localized paths (public-facing pages) + // Publicly accessible pages about: $localize`:kebab-case:about`, changelog: $localize`:kebab-case:changelog`, faq: $localize`:kebab-case:faq`, @@ -42,8 +42,8 @@ export const paths = { license: $localize`:kebab-case:license`, markets: $localize`:kebab-case:markets`, openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`, - openStartup: $localize`:kebab-case:open`, - ossFriends: $localize`:kebab-case:oss-friends`, + openStartup: 'open', + ossFriends: 'oss-friends', pricing: $localize`:kebab-case:pricing`, privacyPolicy: $localize`:kebab-case:privacy-policy`, register: $localize`:kebab-case:register`, From bbb55dbec99920e5a0e03bfc94873c583de8563f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 28 May 2025 15:21:39 +0200 Subject: [PATCH 07/81] Feature/upgrade yahoo-finance2 to version 3.3.5 (#4777) * Upgrade yahoo-finance2 to version 3.3.5 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 745d792af..ffe4537db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Polish (`pl`) - Improved the language localization for Spanish (`es`) - Upgraded `Node.js` from version `20` to `22` (`Dockerfile`) +- Upgraded `yahoo-finance2` from version `3.3.4` to `3.3.5` ## 2.163.0 - 2025-05-26 diff --git a/package-lock.json b/package-lock.json index 9ba1a72a0..59af7cc6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,7 +89,7 @@ "svgmap": "2.12.2", "twitter-api-v2": "1.23.0", "uuid": "11.1.0", - "yahoo-finance2": "3.3.4", + "yahoo-finance2": "3.3.5", "zone.js": "0.15.0" }, "devDependencies": { @@ -36101,9 +36101,9 @@ } }, "node_modules/yahoo-finance2": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.3.4.tgz", - "integrity": "sha512-LusAnc5R/5t0x/uhXdwLMzC/Q15Ekc2VGRpS21mL8XpTsrgnKEYmx12UlammXjna9S2Y+pFkST7TYZTDH7gn0w==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.3.5.tgz", + "integrity": "sha512-rLsoKpxOGD5x2aT62mfF89yFBKBUNM3RMttvW4JuLH1K0JgADwyOfBm3zJzl4zLFoSOnqeOjRvlhhF59R6X3HA==", "license": "MIT", "dependencies": { "@deno/shim-deno": "~0.18.0", diff --git a/package.json b/package.json index e1877d2ef..2c5334f86 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "svgmap": "2.12.2", "twitter-api-v2": "1.23.0", "uuid": "11.1.0", - "yahoo-finance2": "3.3.4", + "yahoo-finance2": "3.3.5", "zone.js": "0.15.0" }, "devDependencies": { From a8e48be9dae72cb0be88058165dfa169b8fc17c4 Mon Sep 17 00:00:00 2001 From: Tasin Williamson <125305287+tasin2610@users.noreply.github.com> Date: Wed, 28 May 2025 19:25:05 +0600 Subject: [PATCH 08/81] Feature/improve language localization for NL 20250528 (#4775) * Improve language localization for NL * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.nl.xlf | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffe4537db..13f55bbe4 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 Dutch (`nl`) - Improved the language localization for French (`fr`) - Improved the language localization for Polish (`pl`) - Improved the language localization for Spanish (`es`) diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 7a7dd735f..142082d28 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -5481,7 +5481,7 @@ Transfer Cash Balance - Transfer Cash Balance + Contant saldo overboeken apps/client/src/app/components/accounts-table/accounts-table.component.html 10 @@ -5933,7 +5933,7 @@ WTD - WTD + Week tot nu toe libs/ui/src/lib/assistant/assistant.component.ts 222 @@ -5965,7 +5965,7 @@ View - View + Weergave apps/client/src/app/components/access-table/access-table.component.html 23 @@ -7188,7 +7188,7 @@ Lazy - Lazy + Lui apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7196,7 +7196,7 @@ Instant - Instant + Direct apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 From bd2a8e2444243797094e1eb2a1cffec53353bb35 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 28 May 2025 15:28:30 +0200 Subject: [PATCH 09/81] Release 2.164.0 (#4778) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13f55bbe4..73bf118d1 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.164.0 - 2025-05-28 ### Changed diff --git a/package-lock.json b/package-lock.json index 59af7cc6b..6dedf1606 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.163.0", + "version": "2.164.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.163.0", + "version": "2.164.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 2c5334f86..7b07b4c00 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.163.0", + "version": "2.164.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 9f3079716b6c5375b32619e5a898800343110087 Mon Sep 17 00:00:00 2001 From: Turka Turki Date: Thu, 29 May 2025 11:35:17 +0600 Subject: [PATCH 10/81] Feature/improve language localization for NL 20250528 (#4776) * Improve language localization for NL * Update sitemap.xml * Update changelog --- CHANGELOG.md | 6 ++++++ apps/api/src/assets/sitemap.xml | 8 ++++---- apps/client/src/locales/messages.nl.xlf | 6 +++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73bf118d1..4406ba060 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 Dutch (`nl`) + ## 2.164.0 - 2025-05-28 ### Changed diff --git a/apps/api/src/assets/sitemap.xml b/apps/api/src/assets/sitemap.xml index a2876c696..776ee3c6b 100644 --- a/apps/api/src/assets/sitemap.xml +++ b/apps/api/src/assets/sitemap.xml @@ -454,10 +454,6 @@ https://ghostfol.io/nl/over ${currentDate}T00:00:00+00:00 - - https://ghostfol.io/nl/over/changelog - ${currentDate}T00:00:00+00:00 - https://ghostfol.io/nl/over/licentie ${currentDate}T00:00:00+00:00 @@ -470,6 +466,10 @@ https://ghostfol.io/nl/over/privacybeleid ${currentDate}T00:00:00+00:00 + + https://ghostfol.io/nl/over/wijzigingslogboek + ${currentDate}T00:00:00+00:00 + https://ghostfol.io/nl/prijzen ${currentDate}T00:00:00+00:00 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 142082d28..f285a759b 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -7220,7 +7220,7 @@ Selector - Selector + Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 439 @@ -7589,7 +7589,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. - Calculations are based on delayed market data and may not be displayed in real-time. + Berekeningen zijn gebaseerd op vertraagde marktgegevens en worden mogelijk niet in realtime weergegeven. apps/client/src/app/components/home-market/home-market.html 41 @@ -7597,7 +7597,7 @@ changelog - changelog + wijzigingslogboek kebab-case libs/common/src/lib/paths.ts From 9e74eec04d53675af43a6a62344562d94ff5cd89 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 29 May 2025 17:44:50 +0200 Subject: [PATCH 11/81] Feature/rename orders to activities in Tag database schema (#4783) * Rename orders to activities in Tag database schema * Update changelog --- CHANGELOG.md | 1 + apps/api/src/services/tag/tag.service.ts | 8 ++++---- prisma/schema.prisma | 10 +++++----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4406ba060..f9b081a08 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 +- Renamed `orders` to `activities` in the `Tag` database schema - Improved the language localization for Dutch (`nl`) ## 2.164.0 - 2025-05-28 diff --git a/apps/api/src/services/tag/tag.service.ts b/apps/api/src/services/tag/tag.service.ts index 3d6bd3907..eb2d7bfef 100644 --- a/apps/api/src/services/tag/tag.service.ts +++ b/apps/api/src/services/tag/tag.service.ts @@ -52,7 +52,7 @@ export class TagService { include: { _count: { select: { - orders: { + activities: { where: { userId } @@ -79,7 +79,7 @@ export class TagService { id, name, userId, - isUsed: _count.orders > 0 + isUsed: _count.activities > 0 })); } @@ -87,7 +87,7 @@ export class TagService { const tagsWithOrderCount = await this.prismaService.tag.findMany({ include: { _count: { - select: { orders: true } + select: { activities: true } } } }); @@ -97,7 +97,7 @@ export class TagService { id, name, userId, - activityCount: _count.orders + activityCount: _count.activities }; }); } diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6182ebfe4..dd3be8cef 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -233,11 +233,11 @@ model Subscription { } model Tag { - id String @id @default(uuid()) - name String - orders Order[] - userId String? - User User? @relation(fields: [userId], onDelete: Cascade, references: [id]) + activities Order[] + id String @id @default(uuid()) + name String + userId String? + User User? @relation(fields: [userId], onDelete: Cascade, references: [id]) @@unique([name, userId]) @@index([name]) From 5db5fd903e49c078251c9d6ed1aa9841b542a1af Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 29 May 2025 17:45:32 +0200 Subject: [PATCH 12/81] Feature/extend FAQ section by performance calculation method (#4773) * Extend FAQ by performance calculation method * Update changelog --- CHANGELOG.md | 4 ++++ .../app/pages/faq/overview/faq-overview-page.html | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9b081a08..6c3b428c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Extended the content of the _General_ section by the performance calculation method on the Frequently Asked Questions (FAQ) page + ### Changed - Renamed `orders` to `activities` in the `Tag` database schema diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.html b/apps/client/src/app/pages/faq/overview/faq-overview-page.html index f8fd62eb0..bc7f6ba37 100644 --- a/apps/client/src/app/pages/faq/overview/faq-overview-page.html +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.html @@ -40,6 +40,21 @@ here. + + + Which calculation method does Ghostfolio use for + performance? + + Ghostfolio uses the Return on Average Investment (ROAI) + calculation method based on the average amount of capital invested + over time. ROAI aims to provide a more insightful view of investment + performance than simpler approaches, especially when contributions are + made over time. + Can I use Ghostfolio anonymously? From 5fa97a9a4005761a1e44e0a7404de37ee18b324e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 29 May 2025 17:45:59 +0200 Subject: [PATCH 13/81] Feature/upgrade big.js to version 7.0.1 (#4784) * Upgrade big.js to version 7.0.1 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c3b428c5..9babd5a6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Renamed `orders` to `activities` in the `Tag` database schema - Improved the language localization for Dutch (`nl`) +- Upgraded `big.js` from version `6.2.2` to `7.0.1` ## 2.164.0 - 2025-05-28 diff --git a/package-lock.json b/package-lock.json index 6dedf1606..38be1e11f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "5.4.0", "alphavantage": "2.2.0", - "big.js": "6.2.2", + "big.js": "7.0.1", "bootstrap": "4.6.2", "bull": "4.16.5", "chart.js": "4.4.9", @@ -15220,9 +15220,9 @@ } }, "node_modules/big.js": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", - "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-7.0.1.tgz", + "integrity": "sha512-iFgV784tD8kq4ccF1xtNMZnXeZzVuXWWM+ERFzKQjv+A5G9HC8CY3DuV45vgzFFcW+u2tIvmF95+AzWgs6BjCg==", "license": "MIT", "engines": { "node": "*" diff --git a/package.json b/package.json index 7b07b4c00..03fd45f35 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "@simplewebauthn/server": "13.1.1", "@stripe/stripe-js": "5.4.0", "alphavantage": "2.2.0", - "big.js": "6.2.2", + "big.js": "7.0.1", "bootstrap": "4.6.2", "bull": "4.16.5", "chart.js": "4.4.9", From 62e304490d2e60ed9c1f57be580e8320be50e411 Mon Sep 17 00:00:00 2001 From: Jakub Nowak Date: Thu, 29 May 2025 12:27:09 -0500 Subject: [PATCH 14/81] Feature/improve language localization for ES 20250529 (#4785) * Improve language localization for ES * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.es.xlf | 40 ++++++++++++------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9babd5a6a..d54cb3f89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Renamed `orders` to `activities` in the `Tag` database schema - Improved the language localization for Dutch (`nl`) +- Improved the language localization for Spanish (`es`) - Upgraded `big.js` from version `6.2.2` to `7.0.1` ## 2.164.0 - 2025-05-28 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 01b51e793..95c2af93f 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -5008,7 +5008,7 @@ into minimalism - into minimalism + en el minimalismo apps/client/src/app/pages/landing/landing-page.html 299 @@ -5016,7 +5016,7 @@ caring about diversifying your financial resources - caring about diversifying your financial resources + preocuparse por diversificar tus recursos financieros apps/client/src/app/pages/landing/landing-page.html 303 @@ -5024,7 +5024,7 @@ interested in financial independence - interested in financial independence + interesado en la independencia financiera apps/client/src/app/pages/landing/landing-page.html 307 @@ -5032,7 +5032,7 @@ saying no to spreadsheets in - saying no to spreadsheets in + diciendo no a las hojas de cálculo en apps/client/src/app/pages/landing/landing-page.html 311 @@ -5040,7 +5040,7 @@ still reading this list - still reading this list + todavía leyendo esta lista apps/client/src/app/pages/landing/landing-page.html 314 @@ -5048,7 +5048,7 @@ Learn more about Ghostfolio - Learn more about Ghostfolio + Más información sobre Ghostfolio apps/client/src/app/pages/landing/landing-page.html 319 @@ -5056,7 +5056,7 @@ What our users are saying - What our users are saying + Lo que nuestros usuarios están diciendo apps/client/src/app/pages/landing/landing-page.html 327 @@ -5064,7 +5064,7 @@ Members from around the globe are using Ghostfolio Premium - Members from around the globe are using Ghostfolio Premium + Miembros de todo el mundo están usando Ghostfolio Premium apps/client/src/app/pages/landing/landing-page.html 366 @@ -5072,7 +5072,7 @@ How does Ghostfolio work? - How does Ghostfolio work? + ¿Cómo Ghostfolio work? apps/client/src/app/pages/landing/landing-page.html 383 @@ -5080,7 +5080,7 @@ Sign up anonymously* - Sign up anonymously* + Regístrate de forma anónima* apps/client/src/app/pages/landing/landing-page.html 392 @@ -5088,7 +5088,7 @@ * no e-mail address nor credit card required - * no e-mail address nor credit card required + * no se requiere dirección de correo electrónico ni tarjeta de crédito apps/client/src/app/pages/landing/landing-page.html 394 @@ -5096,7 +5096,7 @@ Add any of your historical transactions - Add any of your historical transactions + Agrega cualquiera de tus transacciones históricas apps/client/src/app/pages/landing/landing-page.html 405 @@ -5104,7 +5104,7 @@ Get valuable insights of your portfolio composition - Get valuable insights of your portfolio composition + Obtén información valiosa sobre la composición de tu portafolio apps/client/src/app/pages/landing/landing-page.html 417 @@ -5112,7 +5112,7 @@ Are you ready? - Are you ready? + ¿Estás listo? apps/client/src/app/pages/landing/landing-page.html 431 @@ -5120,7 +5120,7 @@ Live Demo - Live Demo + Demostración en vivo apps/client/src/app/pages/landing/landing-page.html 49 @@ -5132,7 +5132,7 @@ Get the full picture of your personal finances across multiple platforms. - Get the full picture of your personal finances across multiple platforms. + Obtén una visión completa de tus finanzas personales en múltiples plataformas. apps/client/src/app/pages/landing/landing-page.html 242 @@ -5140,7 +5140,7 @@ Get started in only 3 steps - Get started in only 3 steps + Comienza en solo 3 pasos apps/client/src/app/pages/landing/landing-page.html 386 @@ -5229,7 +5229,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. - 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. + Esta página de resumen presenta una colección seleccionada de herramientas de finanzas personales, comparadas con la alternativa de código abierto Ghostfolio. Si valoras la transparencia, la privacidad de los datos y la colaboración comunitaria, Ghostfolio ofrece una excelente oportunidad para tomar el control de tu gestión financiera. apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 8 @@ -5237,7 +5237,7 @@ Explore the links below to compare a variety of personal finance tools with Ghostfolio. - Explore the links below to compare a variety of personal finance tools with Ghostfolio. + Explora los siguientes enlaces para comparar una variedad de herramientas de finanzas personales con Ghostfolio. apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 16 @@ -5245,7 +5245,7 @@ Open Source Alternative to - Alternativa de software libre a + Alternativa de software libre a apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html 42 From 824985b4645e343a486b3fd2468a9d5b6c3478ea Mon Sep 17 00:00:00 2001 From: Hala Jeet Date: Fri, 30 May 2025 12:24:29 +0600 Subject: [PATCH 15/81] Feature/improve language localization for PL 20250529 (#4786) * Improve language localization for PL * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.pl.xlf | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d54cb3f89..770c3d8bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Renamed `orders` to `activities` in the `Tag` database schema - Improved the language localization for Dutch (`nl`) +- Improved the language localization for Polish (`pl`) - Improved the language localization for Spanish (`es`) - Upgraded `big.js` from version `6.2.2` to `7.0.1` diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 3d5c28be9..df975a108 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -6170,7 +6170,7 @@ {VAR_PLURAL, plural, =1 {activity} other {activities}} - {VAR_PLURAL, plural, =1 {activity} other {activities}} + {VAR_PLURAL, plural, =1 {działalność} other {działalność}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 14 @@ -7204,7 +7204,7 @@ Default Market Price - Default Market Price + Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 386 @@ -7212,7 +7212,7 @@ Mode - Mode + Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 423 @@ -7220,7 +7220,7 @@ Selector - Selector + Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 439 @@ -7228,7 +7228,7 @@ HTTP Request Headers - HTTP Request Headers + Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 399 @@ -7236,7 +7236,7 @@ end of day - end of day + koniec dnia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 138 @@ -7244,7 +7244,7 @@ real-time - real-time + w czasie rzeczywistym apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 142 @@ -7268,7 +7268,7 @@ Market Data - Market Data + Dane rynkowe apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 374 @@ -7485,7 +7485,7 @@ Gather Recent Historical Market Data - Gather Recent Historical Market Data + Zbierz najnowsze historyczne dane rynkowe apps/client/src/app/components/admin-market-data/admin-market-data.html 226 From 3bfbb3119115cd4386cdb8744052a94a11f185f5 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 30 May 2025 14:25:00 +0200 Subject: [PATCH 16/81] Feature/upgrade ng-extract-i18n-merge to version 2.15.0 (#4787) * Upgrade ng-extract-i18n-merge to version 2.15.0 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 18 +++++++++--------- package.json | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 770c3d8bb..ab89a5aad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for Polish (`pl`) - Improved the language localization for Spanish (`es`) - Upgraded `big.js` from version `6.2.2` to `7.0.1` +- Upgraded `ng-extract-i18n-merge` from version `2.14.3` to `2.15.0` ## 2.164.0 - 2025-05-28 diff --git a/package-lock.json b/package-lock.json index 38be1e11f..3a920234a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,7 +72,7 @@ "lodash": "4.17.21", "marked": "15.0.4", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "2.14.3", + "ng-extract-i18n-merge": "2.15.0", "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", @@ -27037,22 +27037,22 @@ "license": "MIT" }, "node_modules/ng-extract-i18n-merge": { - "version": "2.14.3", - "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.14.3.tgz", - "integrity": "sha512-5zYuS/divhP2Tk0fizk7D8q5TyhwRjyj/DgaEgurrRwkWfIZFDUGc98eTziR3vIMsb9/sgbUSyeA+8LllCkKyA==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.15.0.tgz", + "integrity": "sha512-43ew7btSrRJ34BHfRkjvvW8wXxfyFiM5rbFU22f/ZuEK1wpClV8lNaF09CYixY1+ycMpKLLyW+olj1Nj3kvs4g==", "license": "MIT", "dependencies": { - "@angular-devkit/architect": "^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0 || ^0.1800.0 || ^0.1900.0", - "@angular-devkit/core": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "@angular-devkit/schematics": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "@schematics/angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "@angular-devkit/architect": "^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0 || ^0.1800.0 || ^0.1900.0 || ^0.2000.0 || 0.2000.0-rc.2", + "@angular-devkit/core": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || 20.0.0-rc.2", + "@angular-devkit/schematics": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || 20.0.0-rc.2", + "@schematics/angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || 20.0.0-rc.2", "xmldoc": "^1.1.3" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "@angular-devkit/build-angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "@angular-devkit/build-angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || 20.0.0-rc.2" } }, "node_modules/ng-extract-i18n-merge/node_modules/@angular-devkit/architect": { diff --git a/package.json b/package.json index 03fd45f35..84c12ab76 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "lodash": "4.17.21", "marked": "15.0.4", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "2.14.3", + "ng-extract-i18n-merge": "2.15.0", "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", From daedfd6ad63f2c7b4b3339180bd28cf913338264 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 30 May 2025 19:01:06 +0200 Subject: [PATCH 17/81] Feature/various style improvements (#4788) * Various style improvements --- .../src/app/components/home-market/home-market.html | 6 ++++-- apps/client/src/app/pages/webauthn/webauthn-page.html | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/client/src/app/components/home-market/home-market.html b/apps/client/src/app/components/home-market/home-market.html index 189c87c8f..a9bdf4e68 100644 --- a/apps/client/src/app/components/home-market/home-market.html +++ b/apps/client/src/app/components/home-market/home-market.html @@ -37,8 +37,10 @@ [user]="user" /> @if (benchmarks?.length > 0) { -
- +
+ Calculations are based on delayed market data and may not be displayed in real-time. diff --git a/apps/client/src/app/pages/webauthn/webauthn-page.html b/apps/client/src/app/pages/webauthn/webauthn-page.html index e2b0cdd3a..308a7096b 100644 --- a/apps/client/src/app/pages/webauthn/webauthn-page.html +++ b/apps/client/src/app/pages/webauthn/webauthn-page.html @@ -19,15 +19,17 @@ Oops, authentication has failed. -
or
-
From c6e38cd4ac176fc29442228dadf5196c7a287e6e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 30 May 2025 19:03:51 +0200 Subject: [PATCH 18/81] Feature/refresh cryptocurrencies list 20250529 (#4790) * Update cryptocurrencies.json * Update changelog --- CHANGELOG.md | 1 + .../cryptocurrencies/cryptocurrencies.json | 736 +++++++++++++----- 2 files changed, 562 insertions(+), 175 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab89a5aad..119541163 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Renamed `orders` to `activities` in the `Tag` database schema +- Refreshed the cryptocurrencies list - Improved the language localization for Dutch (`nl`) - Improved the language localization for Polish (`pl`) - Improved the language localization for Spanish (`es`) diff --git a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json index 475cc6217..d7dce485a 100644 --- a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json +++ b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json @@ -1,4 +1,5 @@ { + "1": "just buy $1 worth of this coin", "3": "The Three Musketeers", "7": "Lucky7", "32": "Project 32", @@ -64,6 +65,7 @@ "1MIL": "1MillionNFTs", "1MT": "1Move", "1NFT": "1NFT", + "1ON8": "Little Dragon", "1OZT": "Tala", "1PECO": "1peco", "1SG": "1SG", @@ -73,6 +75,7 @@ "1UP": "Uptrennd", "1WO": "1World", "2022M": "2022MOON", + "20EX": "20ex", "21BTC": "21.co Wrapped BTC", "21X": "21X", "2BACCO": "2BACCO Coin", @@ -114,6 +117,7 @@ "4CHAN": "4Chan", "4CZ": "FourCZ", "4DOGE": "4DOGE", + "4EVER": "4EVERLAND", "4JNET": "4JNET", "4MW": "For Meta World", "4P": "4P FOUR", @@ -138,7 +142,7 @@ "9DOGS": "NINE DOGS", "9GAG": "9GAG", "9MM": "Shigure UI", - "A": "Alpha Token", + "A": "Vaulta", "A1INCH": "1inch (Arbitrum Bridge)", "A2A": "A2A", "A2I": "Arcana AI", @@ -168,6 +172,7 @@ "AAVEGOTCHIFOMO": "Aavegotchi FOMO", "AAX": "Academic Labs", "AAZ": "ATLAZ", + "AB": "Newton", "AB1INCH": "1inch (Avalanche Bride)", "ABA": "EcoBall", "ABBC": "ABBC Coin", @@ -200,6 +205,7 @@ "ABUSDC": "USD Coin (Arbitrum Bridge)", "ABX": "Arbidex", "ABY": "ArtByte", + "ABYS": "Trinity Of The Fabled", "ABYSS": "Abyss Finance", "AC": "Asia Coin", "AC3": "AC3", @@ -228,7 +234,7 @@ "ACN": "AvonCoin", "ACOIN": "ACoin", "ACOLYT": "Acolyte by Virtuals", - "ACP": "Anarchists Prime", + "ACP": "Arena Of Faith", "ACPT": "Crypto Accept", "ACQ": "Acquire.Fi", "ACRE": "Arable Protocol", @@ -306,6 +312,7 @@ "AERO": "Aerodrome Finance", "AEROBUD": "Aerobud", "AEROCOIN": "Aero Coin", + "AEROME": "AeroMe", "AEROT": "AEROTYME", "AES": "Artis Aes Evolution", "AET": "AfterEther", @@ -338,8 +345,9 @@ "AFYON": "Afyonspor Fan Token", "AG": "AGAME", "AG8": "ATROMG8", - "AGA": "AGA Token", + "AGA": "Agora DEX Token", "AGATA": "Agatech", + "AGATOKEN": "AGA Token", "AGB": "Apes Go Bananas", "AGC": "Argocoin", "AGEN": "Agent Krasnov", @@ -357,6 +365,7 @@ "AGIV1": "SingularityNET v1", "AGIX": "SingularityNET", "AGIXBT": "AGIXBT by Virtuals", + "AGIXT": "AGiXT", "AGLA": "Angola", "AGLD": "Adventure Gold", "AGM": "Argoneum", @@ -366,6 +375,7 @@ "AGON": "Arabian Dragon", "AGOV": "Answer Governance", "AGPC": "AGPC", + "AGRI": "AgriDex Token", "AGRO": "Bit Agro", "AGRS": "Agoras Token", "AGS": "Aegis", @@ -383,7 +393,8 @@ "AI23T": "23 Turtles", "AI69SAKURA": "Sakura", "AIA": "AIA Chain", - "AIAGENT": "Aiagent.app", + "AIAGENT": "AI Agents", + "AIAGENTAPP": "Aiagent.app", "AIAI": "All In AI", "AIAKITA": "AiAkita", "AIAT": "AI Analysis Token", @@ -433,8 +444,9 @@ "AIMONICA": "Aimonica Brands", "AIMR": "MeromAI", "AIMS": "HighCastle Token", - "AIMX": "Aimedis", + "AIMX": "MindMatrix", "AIMXV1": "Aimedis v1", + "AIMXV2": "Aimedis", "AIN": "AI Network", "AINA": "Ainastasia", "AINN": "AINN", @@ -452,6 +464,7 @@ "AIPG": "AI Power Grid", "AIPIN": "AI PIN", "AIPO": "Aipocalypto", + "AIPUMP": "aiPump", "AIR": "Altair", "AIRB": "BillionAir", "AIRBTC": "AIRBTC", @@ -465,10 +478,11 @@ "AIRTNT": "Tenti", "AIRTOKEN": "AirToken", "AIRX": "Aircoins", - "AIS": "AISwap", + "AIS": "AISociety", "AISCII": "AISCII", "AISHIB": "ARBSHIB", "AIST": "Artificial intelligence staking token", + "AISW": "AISwap", "AIT": "AIT Protocol", "AITECH": "Artificial Intelligence Utility Token", "AITEK": "AI Technology", @@ -487,6 +501,7 @@ "AIWALLET": "AiWallet Token", "AIWS": "AIWS", "AIX": "Aigang", + "AIX9": "AthenaX9", "AIXBT": "aixbt by Virtuals", "AIXERC": "AI-X", "AIXT": "AIXTerminal", @@ -497,6 +512,7 @@ "AKAL": "AKA Liberty", "AKASHA": "Akasha by Bloomverse", "AKI": "Aki Network", + "AKIO": "Akio", "AKIT": "Akita Inu", "AKITA": "Akita Inu", "AKITAI": "AKITA INU", @@ -509,6 +525,7 @@ "AKT": "Akash Network", "AKTIO": "AKTIO Coin", "AKUMA": "Akuma Inu", + "AKV": "Akiverse Governance", "AL": "ArchLoot", "ALA": "Alanyaspor Fan Token", "ALAN": "Alan the Alien", @@ -558,6 +575,7 @@ "ALIS": "ALISmedia", "ALIT": "Alitas", "ALITA": "Alita Network", + "ALITATOKEN": "Alita Token", "ALIX": "AlinX", "ALKI": "Alkimi", "ALLBI": "ALL BEST ICO", @@ -586,6 +604,7 @@ "ALPHAF": "Alpha Fi", "ALPHAG": "Alpha Gardeners", "ALPHAPETTO": "Alpha Petto Shells", + "ALPHAPLATFORM": "Alpha Token", "ALPHAS": "Alpha Shards", "ALPHR": "Alphr", "ALPINE": "Alpine F1 Team Fan Token", @@ -608,7 +627,7 @@ "ALWAYS": "Always Evolving", "ALX": "ALAX", "ALY": "Ally", - "AM": "AeroMe", + "AM": "Aston Martin Cognizant", "AMA": "MrWeb", "AMADEUS": "AMADEUS", "AMAL": "AMAL", @@ -620,6 +639,7 @@ "AMBO": "Sheertopia", "AMBR": "Ambra", "AMBT": "AMBT Token", + "AMC": "AI Meta Coin", "AMDC": "Allmedi Coin", "AMDG": "AMDG", "AME": "Amepay", @@ -659,10 +679,12 @@ "ANAL": "AnalCoin", "ANALOS": "analoS", "ANALY": "Analysoor", + "ANARCHISTS": "Anarchists Prime", "ANAT": "Anatolia Token", "ANB": "Angryb", "ANC": "Anchor Protocol", "ANCHOR": "AnchorSwap", + "ANCIENTKING": "Ancient Kingdom", "ANCP": "Anacrypt", "ANCT": "Anchor", "AND": "AndromedaCoin", @@ -717,6 +739,7 @@ "ANTEX": "Antex", "ANTI": "Anti Bitcoin", "ANTIS": "Antis Inu", + "ANTMONS": "Antmons", "ANTS": "ANTS Reloaded", "ANTT": "Antara Token", "ANUS": "URANUS", @@ -740,7 +763,7 @@ "APCG": "ALLPAYCOIN", "APD": "Aptopad", "APE": "ApeCoin", - "APED": "Baddest Alpha Ape Bundle", + "APED": "Aped", "APEDEV": "The dev is an Ape", "APEFUN": "Ape", "APEMAN": "APEMAN", @@ -793,6 +816,7 @@ "APYS": "APYSwap", "APZ": "Alprockz", "AQA": " AQA Token", + "AQDC": "AQDC", "AQT": "Alpha Quark Token", "AQTIS": "AQTIS", "AQU": "aQuest", @@ -809,7 +833,7 @@ "ARATA": "Arata", "ARAW": "Araw", "ARB": "Arbitrum", - "ARBI": "Arbi", + "ARBI": "Arbipad", "ARBIT": "Arbit Coin", "ARBP": "ARB Protocol", "ARBS": "Arbswap", @@ -827,6 +851,7 @@ "ARCAS": "Arcas", "ARCH": "Archway", "ARCHA": "ArchAngel Token", + "ARCHAI": "ArchAI", "ARCHCOIN": "ArchCoin", "ARCHE": "Archean", "ARCHIVE": "Chainback", @@ -883,11 +908,13 @@ "ARQ": "ArQmA", "ARQX": "ARQx AI", "ARR": "ARROUND", + "ARRI": "Arris", "ARRO": "Arro Social", + "ARROW": "Arrow Token", "ARRR": "Pirate Chain", "ARSL": "Aquarius Loan", "ARSW": "ArthSwap", - "ART": "Maecenas", + "ART": "Genify ART", "ARTC": "Artcoin", "ARTDECO": "ARTDECO", "ARTDRAW": "ArtDraw", @@ -939,6 +966,7 @@ "ASKAI": "ASKAI", "ASKO": "Asko", "ASM": "Assemble Protocol", + "ASMAT": "AsMatch", "ASMO": "AS Monaco Fan Token", "ASN": "Ascension Coin", "ASNT": "Assent Protocol", @@ -957,6 +985,7 @@ "ASTA": "ASTA", "ASTO": "Altered State Token", "ASTON": "Aston", + "ASTONV": "Aston Villa Fan Token", "ASTR": "Astar", "ASTRA": "Astra Protocol", "ASTRADAO": "Astra DAO", @@ -1003,6 +1032,7 @@ "ATL": "ATLANT", "ATLA": "Atleta Network", "ATLAS": "Star Atlas", + "ATLASD": "Atlas DEX", "ATLX": "Atlantis Loans Polygon", "ATM": "Atletico de Madrid Fan Token", "ATMA": "ATMA", @@ -1030,7 +1060,7 @@ "ATROFA": "Atrofarm", "ATRS": "Attarius Network", "ATRV1": "Artrade v1", - "ATS": "Atlas DEX", + "ATS": "Alltoscan", "ATT": "Attila", "ATTR": "Attrace", "ATX": "ArtexCoin", @@ -1066,10 +1096,12 @@ "AUSDT": "aUSDT", "AUT": "Autoria", "AUTHORSHIP": "Authorship", - "AUTISM": "AUTISM", + "AUTISM": "autism", + "AUTISMTOKEN": "AUTISM", "AUTO": "Auto", "AUTOMATIC": "Automatic Treasury Machine", "AUTONO": "Autonomi", + "AUTOS": "CryptoAutos", "AUTUMN": "Autumn", "AUVERSE": "AuroraVerse", "AUX": "Auxilium", @@ -1092,6 +1124,7 @@ "AVAXAI": "AIvalanche DeFAI Agents", "AVAXIOU": "Avalanche IOU", "AVB": "Autonomous Virtual Beings", + "AVC": "AVC", "AVDO": "AvocadoCoin", "AVE": "Avesta", "AVEN": "Aventis AI", @@ -1102,7 +1135,7 @@ "AVI": "Aviator", "AVINOC": "AVINOC", "AVIVE": "Avive World", - "AVL": "Aston Villa Fan Token", + "AVL": "AVL", "AVM": "AVM (Atomicals)", "AVME": "AVME", "AVN": "AVNRich", @@ -1114,6 +1147,7 @@ "AVTM": "Aventis Metaverse", "AVXL": "Avaxlauncher", "AVXT": "Avaxtars Token", + "AWARDCOIN": "Award", "AWARE": "ChainAware.ai", "AWAX": "AWAX", "AWC": "Atomic Wallet Coin", @@ -1123,9 +1157,9 @@ "AWO": "AiWork", "AWORK": "Aworker", "AWP": "Ansem Wif Photographer", - "AWR": "Award", + "AWR": "All Will Retire", "AWS": "AurusSILVER", - "AWT": "Airdrop World", + "AWT": "Abyss World", "AWX": "AurusX", "AX": "AlphaX", "AXC": "AXIA Coin", @@ -1189,13 +1223,14 @@ "BAB": "Babacoin", "BABI": "Babylons", "BABL": "Babylon Finance", - "BABY": "BabySwap", + "BABY": "Babylon", "BABYANDY": "Baby Andy", "BABYB": "Baby Bali", "BABYBI": "Baby Bitcoin", "BABYBINANCE": "BABYBINANCE", "BABYBITC": "BabyBitcoin", "BABYBNB": "BabyBNB", + "BABYBNBBABY": "BabyBNB", "BABYBNBTIGER": "BabyBNBTiger", "BABYBO": "BabyBonk", "BABYBOB": "Baby Bob", @@ -1242,7 +1277,6 @@ "BABYKEKIUS": "Baby Kekius Maximus", "BABYKITTY": "BabyKitty", "BABYKOMA": "Baby Koma", - "BABYLON": "Babylon", "BABYLONG": "Baby Long", "BABYM": "BabyMAGA", "BABYMAGA": "Baby Maga", @@ -1268,7 +1302,8 @@ "BABYRWA": "BabyRWA", "BABYS": "Baby Slerf", "BABYSAITAMA": "Baby Saitama", - "BABYSHARK": "Baby Shark", + "BABYSHARK": "Baby Shark Meme", + "BABYSHARKBSC": "Baby Shark", "BABYSHIB": "Baby Shiba Inu", "BABYSHIBAINU": "Baby Shiba Inu", "BABYSHIRO": "Baby Shiro Neko", @@ -1277,6 +1312,7 @@ "BABYSNAKE": "Baby Snake BSC", "BABYSOL": "Baby Solana", "BABYSORA": "Baby Sora", + "BABYSWAP": "BabySwap", "BABYSWEEP": "BabySweep", "BABYT": "BABYTRUMP", "BABYTK": "Baby Tiger King", @@ -1297,7 +1333,9 @@ "BADAI": "BAD Coin", "BADC": "BADCAT", "BADCAT": "Andy’s Alter Ego", + "BADDEST": "Baddest Alpha Ape Bundle", "BADGER": "Badger DAO", + "BADM": "Badmad Robots", "BAFC": "BabyApeFunClub", "BAG": "Bag", "BAGS": "Basis Gold Share", @@ -1320,7 +1358,8 @@ "BALANCE": "Balance AI", "BALD": "Bald", "BALIN": "Balin Bank", - "BALL": "Game 5 BALL", + "BALKANCOIN": "Balkancoin", + "BALL": "BitBall", "BALLZ": "Wolf Wif", "BALN": "Balanced", "BALPHA": "bAlpha", @@ -1343,10 +1382,12 @@ "BAND": "Band Protocol", "BANDEX": "Banana Index", "BANDIT": "Bandit on Base", + "BANDO": "Bandot", "BANG": "BANG", "BANGY": "BANGY", "BANK": "Float Protocol", "BANKA": "Bank AI", + "BANKBRC": "BANK Ordinals", "BANKC": "Bankcoin", "BANKER": "BankerCoinAda", "BANKETH": "BankEth", @@ -1374,6 +1415,7 @@ "BARY": "Bary", "BAS": "Basis Share", "BASEAI": "BaseAI", + "BASEBEAR": "BBQ", "BASECAT": "BASE CAT", "BASECOIN": "BASECOIN", "BASED": "Based Money", @@ -1398,11 +1440,13 @@ "BASHOS": "Bashoswap", "BASIC": "BASIC", "BASID": "Basid Coin", + "BASIL": "Basilisk", "BASIS": "Basis", "BASK": "BasketDAO", "BAST": "Bast", "BASTET": "Bastet Goddess", "BAT": "Basic Attention Token", + "BATCH": "BATCH Token", "BATH": "Battle Hero", "BATMAN": "BATMAN", "BATO": "Batonex Token", @@ -1445,7 +1489,7 @@ "BBROCCOLI": "Baby Broccoli", "BBS": "BBSCoin", "BBSOL": "Bybit Staked SOL", - "BBT": "BitBook", + "BBT": "BabyBoomToken", "BBTC": "Binance Wrapped BTC", "BBTF": "Block Buster Tech Inc", "BBUSD": "BounceBit USD", @@ -1487,6 +1531,7 @@ "BCOINM": "Bomb Crypto (MATIC)", "BCOQ": "BLACK COQINU", "BCP": "BitcashPay", + "BCPAY": "Bitcashpay", "BCPT": "BlockMason Credit Protocol", "BCR": "BitCredit", "BCRO": "Bonded Cronos", @@ -1508,8 +1553,9 @@ "BDCA": "BitDCA", "BDCC": "BDCC COIN", "BDCLBSC": "BorderCollieBSC", - "BDG": "BitDegree", + "BDG": "Beyond Gaming", "BDID": "BDID", + "BDIN": "BendDAO BDIN", "BDL": "Bitdeal", "BDOG": "Bulldog Token", "BDOGITO": "BullDogito", @@ -1529,7 +1575,8 @@ "BEAM": "Beam", "BEAMMW": "Beam", "BEAN": "Bean", - "BEANS": "Moonbeans", + "BEANS": "SUNBEANS (BEANS)", + "BEAR": "Bear Inu", "BEARIN": "Bear in Bathrobe", "BEAST": "MrBeast", "BEAT": "BEAT Token", @@ -1537,19 +1584,24 @@ "BEATLES": "JohnLennonC0IN", "BEATS": "Sol Beats", "BEBE": "BEBE", + "BEBEETH": "BEBE", + "BEBEV1": "BEBE v1", "BEC": "Betherchip", "BECH": "Beauty Chain", "BECN": "Beacon", "BECO": "BecoSwap Token", "BECX": "BETHEL", "BED": "Bankless BED Index", + "BEDROCK": "Bedrock", "BEE": "Herbee", "BEEF": "PepeBull", "BEEG": "Beeg Blue Whale", "BEENZ": "BEENZ", "BEEP": "BEEP", + "BEEPBOOP": "Boop", "BEER": "BEERCOIN", "BEERUSCAT": "BeerusCat", + "BEES": "BEEs", "BEET": "BEETroot", "BEETLE": "Beetle Coin", "BEETOKEN": "Bee Token", @@ -1673,7 +1725,8 @@ "BHO": "Bholdus Token", "BHP": "Blockchain of Hash Power", "BHPC": "BHPCash", - "BIAO": "Biaocoin", + "BIAO": "BIAO", + "BIAOCOIN": "Biaocoin", "BIB": "BIB Token", "BIBI": "BIBI", "BIBI2025": "Bibi", @@ -1746,10 +1799,11 @@ "BIPX": "Bispex", "BIR": "Birake", "BIRB": "Birb", - "BIRD": "Bird.Money", + "BIRD": "BIRD", "BIRDCHAIN": "Birdchain", "BIRDD": "BIRD DOG", "BIRDDOG": "Bird Dog", + "BIRDMONEY": "Bird.Money", "BIRDO": "Bird Dog", "BIS": "Bismuth", "BISKIT": "Biskit Protocol", @@ -1761,12 +1815,15 @@ "BITASEAN": "BitAsean", "BITB": "BeanCash", "BITBEDR": "Bitcoin EDenRich", + "BITBO": "BitBook", + "BITBOARD": "Bitboard", "BITBOOST": "BitBoost", "BITBULL": "Bitbull", "BITBURN": "Bitburn", "BITC": "BitCash", "BITCAR": "BitCar", "BITCAT": "Bitcat", + "BITCATONSOL": "Bitcat", "BITCCA": "Bitcci Cash", "BITCI": "Bitcicoin", "BITCM": "Bitcomo", @@ -1778,6 +1835,7 @@ "BITCOINV": "BitcoinV", "BITCONNECT": "BitConnect Coin", "BITCRATIC": "Bitcratic Token", + "BITDEGREE": "BitDegree", "BITE": "Bitether", "BITF": "Bit Financial", "BITFLIP": "BitFlip", @@ -1799,6 +1857,7 @@ "BITRUE": "Bitrue Coin", "BITS": "BitstarCoin", "BITSD": "Bits Digit", + "BITSEEDS": "BitSeeds", "BITSERIAL": "BitSerial", "BITSILVER": "bitSilver", "BITSPACE": "Bitspace", @@ -1826,7 +1885,7 @@ "BJ": "Blocjerk", "BJK": "Beşiktaş", "BKBT": "BeeKan", - "BKC": "Balkancoin", + "BKC": "BKC Token", "BKING": "King Arthur", "BKK": "BKEX Token", "BKN": "Brickken", @@ -1843,12 +1902,14 @@ "BLACK": "BLACKHOLE PROTOCOL", "BLACKD": "Blackder AI", "BLACKDRAGON": "Black Dragon", + "BLACKP": "BlackPool Token", "BLACKR": "BLACK ROCK", "BLACKROCK": "BlackRock", "BLACKSALE": "Black Sale", "BLACKST": "Black Stallion", "BLACKSWAN": "BlackSwan AI", - "BLADE": "BladeWarrior", + "BLADE": "BladeGames", + "BLADEW": "BladeWarrior", "BLAKEBTC": "BlakeBitcoin", "BLANK": "Blank Token", "BLAS": "BlakeStar", @@ -1856,7 +1917,8 @@ "BLASTA": "BlastAI", "BLASTUP": "BlastUP", "BLAUNCH": "B-LAUNCH", - "BLAZE": "Blaze", + "BLAZE": "StoryFire", + "BLAZECOIN": "Blaze", "BLAZEX": "BlazeX", "BLAZR": "BlazerCoin", "BLBY": "Badluckbaby", @@ -1892,10 +1954,13 @@ "BLOCK": "Blockasset", "BLOCKB": "Block Browser", "BLOCKF": "Block Farm Club", + "BLOCKG": "BlockGames", "BLOCKIFY": "Blockify.Games", + "BLOCKMAX": "BLOCKMAX", "BLOCKN": "BlockNet", "BLOCKPAY": "BlockPay", "BLOCKS": "BLOCKS", + "BLOCKSSPACE": "Blocks Space", "BLOCKSTAMP": "BlockStamp", "BLOCKT": "Blocktools", "BLOCKW": "Blockwise", @@ -1912,7 +1977,7 @@ "BLOXT": "Blox Token", "BLP": "BullPerks", "BLRY": "BillaryCoin", - "BLS": "Blocks Space", + "BLS": "BloodLoop", "BLST": "Crypto Legions Bloodstone", "BLT": "Blocto Token", "BLTC": "BABYLTC", @@ -2092,12 +2157,13 @@ "BOLTT": "BolttCoin", "BOM": "Book Of Matt Furie", "BOMA": "Book of Maga", - "BOMB": "BOMB", + "BOMB": "LollyBomb", "BOMBC": "BombCoin", "BOMBLOONG": "Bombloong", "BOMBM": "Bomb Money", "BOMBO": "BOMBO", "BOMBS": "Bomb Shelter Inu", + "BOMBTOKEN": "BOMB", "BOME": "BOOK OF MEME", "BOME2": "Book of Meme 2.0", "BOMEDOGE": "BOOK OF DOGE MEMES", @@ -2114,6 +2180,7 @@ "BONDLYV1": "Bondly Finance", "BONDX": "BondX", "BONE": "Bone ShibaSwap", + "BONEBONE": "Bone", "BONES": "Moonshots Farm", "BONESCOIN": "BonesCoin", "BONESV1": "Squirrel Finance", @@ -2155,7 +2222,7 @@ "BOOMDAO": "BOOM DAO", "BOOMER": "Boomer", "BOONS": "BOONSCoin", - "BOOP": "Boop", + "BOOP": "BOOP", "BOOS": "Boost Trump Campaign", "BOOST": "PodFast", "BOOSTCO": "Boost", @@ -2236,7 +2303,7 @@ "BPRO": "BitCloud Pro", "BPS": "BitcoinPoS", "BPSHIB": "Binance-Peg Shiba Inu (Binance Bridge)", - "BPT": "BlackPool Token", + "BPT": "Best Patent Token", "BPTC": "Business Platform Tomato Coin", "BPUNI": "Binance-Peg Uniswap Protocol Token (Binance Bridge)", "BPUSDC": "Binance-Peg USD Coin (Binance Bridge)", @@ -2397,7 +2464,7 @@ "BSW": "Biswap", "BSWAP": "BaseSwap", "BSWT": "BaySwap", - "BSX": "Basilisk", + "BSX": "BSX", "BSY": "Bestay", "BSYS": "BSYS", "BT": "BT.Finance", @@ -2524,6 +2591,7 @@ "BUBV1": "BUBCAT v1", "BUC": "Beau Cat", "BUCK": "Coinbuck", + "BUCKAZOIDS": "Buckazoids", "BUCKS": "SwagBucks", "BUCKY": "Bucky", "BUD": "Buddy", @@ -2606,7 +2674,8 @@ "BUY": "Burency", "BUYI": "Buying.com", "BUYT": "Buy the DIP", - "BUZZ": "BuzzCoin", + "BUZZ": "Hive AI", + "BUZZCOIN": "BuzzCoin", "BV3A": "Buccaneer V3 Arbitrum", "BVC": "BeaverCoin", "BVM": "BVM", @@ -2644,6 +2713,7 @@ "BYB": "BiorBank", "BYC": "ByteCent", "BYG": "Black Eye Galaxy", + "BYIN": "BYIN", "BYT": "ByteAI", "BYTE": "Byte", "BYTES": "Neo Tokyo", @@ -2701,8 +2771,9 @@ "CAKEMOON": "CakeMoon", "CAKESWAP": "CakeSwap", "CAKEW": "CakeWSwap", - "CAL": "Calcium", + "CAL": "FitBurn", "CALC": "CaliphCoin", + "CALCI": "Calcium", "CALI": "CaliCoin", "CALL": "Global Crypto Alliance", "CALLS": "OnlyCalls by Virtuals", @@ -2717,7 +2788,8 @@ "CAN": "Channels", "CANCER": "Cancer", "CAND": "Canary Dollar", - "CANDLE": "Candle Cat", + "CANDLE": "Candle TV", + "CANDLECAT": "Candle Cat", "CANDY": "UnicornGo Candy", "CANDYLAD": "Candylad", "CANN": "CannabisCoin", @@ -2738,15 +2810,17 @@ "CAPTAINPLANET": "Captain Planet", "CAPY": "Capybara", "CAPYBARA": "Capybara", - "CAR": "CarBlock", + "CAR": "Central African Republic Meme", "CARAT": "Carats Token", + "CARBLOCK": "CarBlock", "CARBO": "CleanCarbon", "CARBON": "Carboncoin", "CARBONGEMS": "Carbon GEMS", "CARD": "Cardstack", "CARDS": "Cardstarter", "CARDSWAP": "CardSwap", - "CARE": "Carebit", + "CARE": "CareCoin", + "CAREBIT": "Carebit", "CARES": "CareCoin", "CARL": "Carl", "CARLO": "Carlo", @@ -2767,6 +2841,7 @@ "CASINU": "Casinu Inu", "CASIO": "CasinoXMetaverse", "CASPER": "Casper DeFi", + "CASPERTOKEN": "Casper Token", "CAST": "Castello Coin", "CASTLE": "bitCastle", "CAT": "Simon's Cat", @@ -2787,6 +2862,7 @@ "CATCOINV2": "CatCoin Cash", "CATDOG": "Cat-Dog", "CATDOGE": "CAT DOGE", + "CATE": "Cate on ETH", "CATEC": "Cate Coin", "CATECOIN": "CateCoin", "CATELON": "CatElonMars", @@ -2796,6 +2872,7 @@ "CATGAME": "Cookie Cat Game", "CATGIRL": "Catgirl", "CATGOKU": "Catgoku", + "CATGOLD": "Cat Gold Miner", "CATGPT": "CatGPT", "CATHAT": "catwifhat", "CATHEON": "Catheon Gaming", @@ -2809,12 +2886,13 @@ "CATO": "CATO", "CATPAY": "CATpay", "CATPEPE": "CAT PEPE", - "CATS": "CatCoin Token", + "CATS": "Cats", "CATSC": "Catscoin", "CATSHIRA": "Shira Cat", "CATSO": "Cats Of Sol", "CATSON": "Catson", "CATSV1": "CatCoin Token v1", + "CATSV2": "CatCoin Token", "CATSY": "CAT SYLVESTER", "CATT": "Catex", "CATTO": "Cat Token", @@ -2904,6 +2982,7 @@ "CDAI": "Compound Dai", "CDBIO": "CDbio", "CDCETH": "Crypto.com Staked ETH", + "CDCSOL": "Crypto.com Staked SOL", "CDEX": "Cryptodex", "CDL": "CoinDeal Token", "CDN": "Canada eCoin", @@ -2922,6 +3001,7 @@ "CEICAT": "CEILING CAT", "CEJI": "Ceji", "CEL": "Celsius Network", + "CELA": "Cellula Token", "CELEB": "CELEBPLUS", "CELL": "Cellframe", "CELO": "Celo", @@ -3151,6 +3231,7 @@ "CIRRUS": "Cirrus", "CIRUS": "Cirus", "CIRX": "Circular Protocol", + "CITADAIL": "Griffain New Hedge Fund", "CITI": "CITI Fediverse", "CITY": "Manchester City Fan Token", "CIV": "Civilization", @@ -3206,6 +3287,7 @@ "CLM": "CoinClaim", "CLMRS": "Crolon Mars", "CLN": "Colu Local Network", + "CLND": "COLEND", "CLNX": "Coloniume Network", "CLNY": "Colony", "CLO": "Callisto Network", @@ -3303,6 +3385,7 @@ "COCONUT": "Coconut", "COCOR": "Cocoro", "COCORO": "Cocoro", + "COCOROBNB": "Cocoro", "COCOROERC": "COCORO", "COD": "Chief of Deswamp", "CODA": "CODA", @@ -3406,7 +3489,8 @@ "COQ": "Coq Inu", "COR": "Coreto", "CORA": "Cora by Virtuals", - "CORAL": "CoralPay", + "CORAL": "Coral Protocol", + "CORALPAY": "CoralPay", "CORE": "Core", "COREC": "CoreConnect", "COREDAO": "coreDAO", @@ -3583,6 +3667,7 @@ "CRONA": "CronaSwap", "CRONK": "CRONK", "CROPPER": "CropperFinance", + "CROS": "Cros Token", "CROW": "cr0w by Virtuals", "CROWD": "CrowdCoin", "CROWDWIZ": "Crowdwiz", @@ -3631,6 +3716,7 @@ "CRYPTOE": "Cryptoenter", "CRYPTOEM": "Crypto Emperor Trump", "CRYPTOF": "CryptoFarmers", + "CRYPTOFIGHT": "Crypto Fight Club", "CRYPTOH": "CryptoHunterTrading", "CRYPTOJ": "Crypto Journey", "CRYPTOJESUS": "Crypto Jesus Trump", @@ -3643,6 +3729,7 @@ "CRYPTOS": "CryptoSoul", "CRYPTOSDG": "Crypto SDG", "CRYPTOT": "Crypto Trump", + "CRYPTOTANKS": "CryptoTanks", "CRYPTOU": "CryptoUnity", "CRYSTAL": "Crystal", "CRYSTALCLEAR": "Crystal Clear Token", @@ -3667,6 +3754,7 @@ "CSQ": "cosquare", "CSR": "Cashera", "CSS": "CoinSwap Token", + "CST": "Crypto Samurai", "CSTC": "CryptosTribe", "CSTL": "Castle", "CSTR": "CoreStarter", @@ -3727,7 +3815,8 @@ "CUFF": "Jail Cat", "CULO": "CULO", "CULOETH": "CULO", - "CULT": "Cult DAO", + "CULT": "Milady Cult Coin", + "CULTDAO": "Cult DAO", "CULTUR": "Cultur", "CUM": "Cumbackbears", "CUMINU": "CumInu", @@ -3812,6 +3901,7 @@ "CYBERWAY": "CyberWay", "CYBONK": "CYBONK", "CYBR": "CYBR", + "CYBRO": "Cybro Token", "CYC": "Cyclone Protocol", "CYCAT": "Chi Yamada Cat", "CYCE": "Crypto Carbon Energy", @@ -3910,6 +4000,7 @@ "DAO1": "DAO1", "DAOACT": "ACT", "DAOB": "DAOBet", + "DAOLITY": "Daolity", "DAOP": "Dao Space", "DAOSOL": "MonkeDAO", "DAOVC": "DAO.VC", @@ -4050,6 +4141,7 @@ "DEBT": "The Debt Box", "DEC": "Decentr", "DECENTRALG": "Decentral Games ICE", + "DECENTRALIZED": "DECENTRALIZED", "DECHAT": "Dechat", "DECI": "Maximus DECI", "DECL": "Decimal token", @@ -4074,9 +4166,11 @@ "DEEPSEEKR1": "DeepSeek R1", "DEER": "ToxicDeer Finance", "DEERSEIZED": "Deer Seized by US Government", + "DEESSE": "Deesse", "DEEX": "DEEX", "DEEZ": "DEEZ NUTS", - "DEFAI": "DeFAI", + "DEFAI": "DEFAI", + "DEFAIDAO": "DeFAI", "DEFC": "Defi Coin", "DEFEND": "Blockdefend AI", "DEFI": "DeFi", @@ -4140,7 +4234,8 @@ "DERO": "Dero", "DERP": "Derp", "DES": "DeSpace Protocol", - "DESCI": "DeSci Meme", + "DESCI": "SUI Desci Agents", + "DESCIMEME": "DeSci Meme", "DESI": "Desico", "DESO": "Decentralized Social", "DESTINY": "Destiny", @@ -4241,9 +4336,10 @@ "DIA": "DIA", "DIAB": "Diablo IV Solana", "DIABLO": "Diablo IV", - "DIAM": "Diamond", + "DIAM": "DIAM", "DIAMND": "Projekt Diamond", "DIAMO": "Diamond Launch", + "DIAMON": "Diamond", "DIAMOND": "Diamond Coin", "DIAMONDINU": "Diamond", "DIBBLE": "Dibbles", @@ -4287,13 +4383,15 @@ "DIM": "DIMCOIN", "DIME": "DimeCoin", "DIMO": "DIMO", - "DIN": "Dinero", + "DIN": "DIN", + "DINE": "Dinero", "DINERO": "Dinero", "DINEROBET": "Dinerobet", "DINGER": "Dinger Token", "DINGO": "Dingocoin", - "DINO": "DinoSwap", + "DINO": "DinoLFG", "DINOS": "Dinosaur Inu", + "DINOSWAP": "DinoSwap", "DINT": "DinarTether", "DINU": "Dogey-Inu", "DINW": "Dinowars", @@ -4354,7 +4452,7 @@ "DMAGA": "Dark MAGA", "DMAIL": "DMAIL Network", "DMAR": "DMarket", - "DMC": "Dream21", + "DMC": "Datamall Coin", "DMCC": "DiscoverFeed", "DMCH": "DARMA Cash", "DMCK": "Diamond Castle", @@ -4366,6 +4464,7 @@ "DMLG": "Demole", "DMOD": "Demodyfi Token", "DMOON": "Dollarmoon", + "DMR": "dmr", "DMS": "Documentchain", "DMT": "Dream Machine Token", "DMTC": "Demeter Chain", @@ -4405,6 +4504,7 @@ "DOCK": "Dock.io", "DOCSWAP": "Dex on Crypto", "DOCT": "DocTailor", + "DOCTO": "DoctorX", "DOD": "Day Of Defeat 2.0", "DOD100": "Day of Defeat Mini 100x", "DODI": "DoubleDice", @@ -4446,6 +4546,7 @@ "DOGEFATHER": "Dogefather", "DOGEFORK": "DogeFork", "DOGEGF": "DogeGF", + "DOGEGOV": "Department Of Government Efficiency (dogegov.com)", "DOGEGROK": "Doge Grok", "DOGEGROKAI": "Doge Of Grok AI", "DOGEI": "Dogei", @@ -4485,6 +4586,7 @@ "DOGIN": "Doginhood", "DOGINC": "dog in cats world", "DOGINME": "doginme", + "DOGINWOTAH": "doginwotah", "DOGIRA": "Dogira", "DOGK": "Dagknight Dog", "DOGLAI": "Doglaikacoin", @@ -4514,13 +4616,14 @@ "DOLLARCOIN": "DollarCoin", "DOLLUR": "Dollur Go Brrr", "DOLLY": "DOLLY", + "DOLO": "Dolomite", "DOLPHY": "Dolphy", "DOLZ": "DOLZ", - "DOM": "Ancient Kingdom", + "DOM": "DomusAI", "DOME": "Everdome", "DOMI": "Domi", "DOMO": "Dony Montana", - "DON": "Donnie Finance", + "DON": "TheDonato Token", "DONA": "DONASWAP", "DONAL": "Donald Pump", "DONALD": "DONALD TRUMP", @@ -4532,11 +4635,13 @@ "DONJR": "Don Jr.", "DONK": "Don-key", "DONKE": "DONKE", + "DONNIEFIN": "Donnie Finance", "DONS": "The Dons", "DONT": "Donald Trump (dont.cash)", "DONU": "Donu", "DONUT": "Donut", "DONUTS": "The Simpsons", + "DOOD": "Doodles", "DOODI": "Doodipals", "DOODOO": "Doodoo", "DOOGLE": "Doogle", @@ -4617,6 +4722,7 @@ "DRCT": "Ally Direct", "DRE": "DoRen", "DREAM": "DREAM", + "DREAM21": "Dream21", "DREAMS": "Dreams Quest", "DREP": "DREP", "DRF": "Drife", @@ -4761,6 +4867,7 @@ "DVT": "DeVault", "DVTC": "DivotyCoin", "DVX": "Derivex", + "DWAIN": "DWAIN", "DWARFY": "Dwarfy", "DWARS": "Dynasty Wars", "DWC": "Digital Wallet", @@ -4817,6 +4924,7 @@ "E1INCH": "1inch (Energi Bridge)", "E21": "E21 Coin", "E2C": "Electronic Energy Coin", + "E4C": "E4C", "E8": "Energy8", "EA": "EagleCoin", "EAC": "Education Assessment Cult", @@ -4828,11 +4936,14 @@ "EAI": "Eagle AI", "EARLY": "Early Risers", "EARLYF": "EarlyFans", - "EARN": "EarnGuild", + "EARN": "Earn Network", "EARNB": "Earn BTC", + "EARNGUILD": "EarnGuild", + "EARNM": "EARNM", "EARTH": "Earth Token", "EARTHCOIN": "EarthCoin", "EASYF": "EasyFeedback", + "EASYMINE": "EasyMine", "EAT": "EDGE Activity Token", "EATH": "Eartherium", "EAURIC": "Eauric", @@ -4873,7 +4984,8 @@ "ECI": "Euro Cup Inu", "ECL": "ECLAT", "ECLD": "Ethernity Cloud", - "ECLIP": "Eclipse", + "ECLIP": "Eclipse Fi", + "ECLIPSE": "Eclipse", "ECO": "Ormeus Ecosystem", "ECOB": "EcoBit", "ECOC": "ECOcoin", @@ -4902,7 +5014,8 @@ "EDEXA": "edeXa Security Token", "EDFI": "EdFi", "EDG": "Edgeless", - "EDGE": "EDGE", + "EDGE": "Definitive", + "EDGENET": "EDGE", "EDGESOL": "Edgevana Staked SOL", "EDGEW": "Edgeware", "EDGT": "Edgecoin", @@ -4924,6 +5037,7 @@ "EDWIN": "Edwin", "EDX": "Equilibrium", "EEFS": "Eefs", + "EEG": "EEG Token", "EER": "Ethereum eRush", "EETH": "ether fi", "EFBAI": "EuroFootball AI", @@ -4971,6 +5085,7 @@ "EHRT": "Eight Hours Token", "EIFI": "EIFI FINANCE", "EIGEN": "EigenLayer", + "EIGENP": "Eigenpie", "EIM": "Expert Infra", "EIQT": "IQ Prediction", "EJAC": "EJA Coin", @@ -5013,7 +5128,8 @@ "ELI": "GoCrypto", "ELIC": "Elicoin", "ELITE": "EthereumLite", - "ELIX": "Elixir", + "ELIX": "Elixir Games", + "ELIXI": "Elixir", "ELIXIR": "Starchi", "ELIZ": "Eliza (ai16zeliza)", "ELIZA": "Eliza (elizawakesup.ai)", @@ -5069,7 +5185,8 @@ "EMATIC": "Wrapped Polygon (Energi Bridge)", "EMAX": "EthereumMax", "EMB": "Overline Emblem", - "EMBER": "EmberCoin", + "EMBER": "Ember", + "EMBERCOIN": "EmberCoin", "EMBR": "Embr", "EMC": "Edge Matrix Computing", "EMC2": "Einsteinium", @@ -5092,7 +5209,7 @@ "EMR": "Emorya Finance", "EMRLD": "The Emerald Company", "EMRX": "Emirex Token", - "EMT": "EasyMine", + "EMT": "EMAIL Token", "EMU": "eMusic", "EMV": "Ethereum Movie Venture", "EMX": "EMX", @@ -5165,6 +5282,7 @@ "EPIX": "Byepix", "EPK": "EpiK Protocol", "EPS": "Ellipsis (OLD)", + "EPT": "Balance", "EPTT": "Evident Proof Transaction Token", "EPX": "Ellipsis X", "EPY": "Empyrean", @@ -5214,6 +5332,7 @@ "ES": "Era Swap Token", "ESAI": "Ethscan AI", "ESBC": "ESBC", + "ESCC": "Eos Stable Coin Chain", "ESCE": "Escroco Emerald", "ESCROW": "Cryptegrity DAO", "ESCU": "EYESECU AI", @@ -5373,11 +5492,12 @@ "EVIN": "Evin Token", "EVMOS": "Evmos", "EVN": "Evn Token", - "EVO": "EvoVerses", + "EVO": "Devomon", "EVOAI": "EvolveAI", "EVOC": "EVOCPLUS", "EVOL": "EVOL NETWORK", "EVOS": "EVOS", + "EVOVERSES": "EvoVerses", "EVR": "Everus", "EVRICE": "Evrice", "EVRM": "Evrmore", @@ -5429,6 +5549,7 @@ "EYE": "MEDIA EYE", "EYES": "Eyes Protocol", "EYETOKEN": "EYE Token", + "EYWA": "EYWA", "EZ": "EasyFi V2", "EZC": "EZCoin", "EZEIGEN": "Restaked EIGEN", @@ -5437,6 +5558,8 @@ "EZM": "EZMarket", "EZPZ": "Eazy Peazy", "EZSOL": "Renzo Restaked SOL", + "EZSWAP": "EZswap Protocol", + "EZSWAPV1": "EZswap Protocol v1", "EZT": "EZToken", "EZY": "EzyStayz", "ElvishMagic": "EMAGIC", @@ -5459,6 +5582,7 @@ "FACTOM": "Factom", "FACTORY": "ChainFactory", "FACTR": "Defactor", + "FACTRPAY": "FactR", "FADO": "FADO Go", "FAFO": "FAFO", "FAFOSOL": "Fafo", @@ -5522,7 +5646,7 @@ "FAYD": "Fayda", "FAYRE": "Fayre", "FAZZ": "FazzCoin", - "FB": "Fenerbahçe Token", + "FB": "Fractal Bitcoin", "FBA": "Firebird Aggregator", "FBB": "FilmBusinessBuster", "FBG": "Fort Block Games", @@ -5573,6 +5697,7 @@ "FELIX": "FelixCoin", "FELIX2": "Felix 2.0 ETH", "FEN": "First Ever NFT", + "FENE": "Fenerbahçe Token", "FENOMY": "Fenomy", "FENTANYL": "Chinese Communist Dragon", "FER": "Ferro", @@ -5608,6 +5733,7 @@ "FI": "Fideum", "FIA": "FIA Protocol", "FIBO": "FibSWAP DEx", + "FIBOS": "FIBOS", "FIBRE": "FIBRE", "FIC": "Filecash", "FID": "Fidira", @@ -5621,7 +5747,7 @@ "FIFTY": "FIFTYONEFIFTY", "FIG": "FlowCom", "FIGH": "FIGHT FIGHT FIGHT", - "FIGHT": "Crypto Fight Club", + "FIGHT": "Fight to MAGA", "FIGHTMAGA": "FIGHT MAGA", "FIGHTPEPE": "FIGHT PEPE", "FIGHTRUMP": "FIGHT TRUMP", @@ -5630,6 +5756,7 @@ "FIL": "FileCoin", "FILDA": "Filda", "FILES": "Solfiles", + "FILEST": "FileStar", "FILL": "Fillit", "FILM": "Filmpass", "FILST": "Filecoin Standard Hashrate Token", @@ -5646,6 +5773,7 @@ "FINK": "FINK", "FINN": "Huckleberry", "FINOM": "Finom FIN Token", + "FINOMNOM": "Finom NOM Token", "FINS": "AutoShark DEX", "FINT": "FintraDao", "FINU": "Formula Inu", @@ -5656,6 +5784,7 @@ "FIRA": "Defira", "FIRE": "Matr1x Fire", "FIRECOIN": "FireCoin", + "FIREP": "Fire Protocol", "FIREW": "Fire Wolf", "FIRO": "Firo", "FIRSTHARE": "FirstHare", @@ -5697,6 +5826,7 @@ "FLAS": "Flas Exchange Token", "FLASH": "Flashstake", "FLASHC": "FLASH coin", + "FLASHT": "FlashToken", "FLAVIA": "Flavia Is Online", "FLAY": "Flayer", "FLC": "FlowChainCoin", @@ -5813,10 +5943,11 @@ "FNX": "FinNexus", "FNXAI": "Finanx AI", "FNZ": "Fanzee", - "FO": "FIBOS", + "FO": "Official FO", "FOA": "Fragments of arker", "FOAM": "Foam", "FOC": "TheForce Trade", + "FOCAI": "focai.fun", "FOCV": "FOCV", "FODL": "Fodl Finance", "FOF": "Future Of Fintech", @@ -5829,7 +5960,8 @@ "FOL": "Folder Protocol", "FOLD": "Manifold Finance", "FOLO": "Alpha Impact", - "FOMO": "FOMO BULL CLUB", + "FOM": "FOMO BULL CLUB", + "FOMO": "Fomo", "FOMON": "FOMO Network", "FOMOSOL": "FOMOSolana", "FON": "INOFI", @@ -5870,6 +6002,7 @@ "FOTA": "Fight Of The Ages", "FOTO": "Unique Photo", "FOTTIE": "Fottie", + "FOU": "Four", "FOUND": "ccFound", "FOUNTAIN": "Fountain", "FOUR": "4", @@ -5893,6 +6026,7 @@ "FPI": "Frax Price Index", "FPIBANK": "FPIBANK", "FPIS": "Frax Price Index Share", + "FPS": "WEB3WAR Token", "FQS": "FQSwap V2", "FR": "Freedom Reserve", "FRA": "Findora", @@ -5914,6 +6048,7 @@ "FREE": "FREE coin", "FREED": "FreedomCoin", "FREEDO": "Freedom", + "FREEDOG": "Freedogs", "FREEDOM": "Freedom Protocol Token", "FREELA": "DecentralFree", "FREEPAVEL": "Free Pavel", @@ -5950,6 +6085,7 @@ "FROGLIC": "Pink Hood Froglicker", "FROGO": "Frogo", "FROK": "Frok.ai", + "FROKAI": "FrokAI", "FRONK": "Fronk", "FRONT": "Frontier", "FROP": "Popo The Frog", @@ -5999,7 +6135,7 @@ "FTO": "FuturoCoin", "FTON": "Fanton", "FTP": "FuturePoints", - "FTR": "FactR", + "FTR": "Fautor", "FTRB": "Faith Tribe", "FTRC": "FutureCoin", "FTS": "Fortress Lending", @@ -6016,7 +6152,8 @@ "FUBAO": "FUBAO", "FUCK": "Fuck Token", "FUCKTRUMP": "FUCK TRUMP", - "FUD": "FUD.finance", + "FUD": "Fud the Pug", + "FUDFINANCE": "FUD.finance", "FUEGO": "FUEGO", "FUEL": "Fuel Network", "FUELX": "Fuel", @@ -6070,6 +6207,7 @@ "FWT": "Freeway Token", "FWW": "Farmers World Wood", "FX": "Function X", + "FXAKV": "Akiverse Governance", "FXB": "FxBox", "FXC": "Flexacoin", "FXD": "Fathom Dollar", @@ -6084,6 +6222,7 @@ "FXUSD": "f(x) Protocol fxUSD", "FXY": "Floxypay", "FYD": "FYDcoin", + "FYDE": "Fyde", "FYDO": "Fly Doge", "FYN": "Affyn", "FYP": "FlypMe", @@ -6127,6 +6266,7 @@ "GAMBIT": "Gambit", "GAMBL": "Metagamble", "GAME": "GameBuild", + "GAME5BALL": "Game 5 BALL", "GAMEBUD": "GAMEBUD", "GAMEBYV": "GAME by Virtuals", "GAMEC": "Game", @@ -6145,6 +6285,7 @@ "GAMESTOP": "GameStop", "GAMESTUMP": "GAMESTUMP", "GAMET": "GAME Token", + "GAMETA": "Gameta", "GAMEX": "GameX", "GAMI": "GAMI World", "GAMIN": "Gaming Stars", @@ -6238,9 +6379,10 @@ "GE": "GEchain", "GEA": "Goldea", "GEAR": "Gearbox Protocol", - "GEC": "Geco.one", + "GEC": "Gecko Inu", "GECKO": "Gecko Coin", "GECKY": "Gecky", + "GECO": "GECOIN", "GEEK": "De:Lithe Last Memories", "GEEQ": "Geeq", "GEF": "GemFlow", @@ -6423,6 +6565,7 @@ "GLIESE": "GlieseCoin", "GLINK": "Gemlink", "GLINT": "BeamSwap", + "GLIZZY": "GLIZZY", "GLM": "Golem Network Token", "GLMR": "Moonbeam", "GLMV1": "Golem Network Token v1", @@ -6480,7 +6623,7 @@ "GMX": "GMX", "GN": "GN", "GNBT": "Genebank Token", - "GNC": "Greencoin", + "GNC": "Greenchie", "GND": "GND Protoco", "GNFT": "GNFT", "GNG": "GreenGold", @@ -6499,12 +6642,14 @@ "GNY": "GNY", "GO": "GoChain", "GOA": "GoaCoin", - "GOAL": "GOAL token", + "GOAL": "TopGoal Token", "GOALBON": "Goal Bonanza", "GOALS": "UnitedFans", + "GOALTOKEN": "GOAL token", "GOAT": "Goatseus Maximus", "GOATAI": "GOAT AI", "GOATCOIN": "Goat", + "GOATS": "GOATS", "GOATSE": "GOATSE", "GOB": "Goons of Balatroon", "GOC": "GoCrypto", @@ -6520,6 +6665,7 @@ "GOETH": "Algomint", "GOF": "Golff", "GOFF": "Gift Off Token", + "GOFINDXR": "Gofind XR", "GOFX": "GooseFX", "GOG": "Guild of Guardians", "GOGLZ": "GOGGLES", @@ -6537,6 +6683,7 @@ "GOLDCOINETH": "Gold", "GOLDE": "GOLDEN AGE", "GOLDEN": "Golden Inu", + "GOLDENC": "GoldenCat", "GOLDENG": "Golden Goose", "GOLDF": "Gold Fever", "GOLDMIN": "GoldMiner", @@ -6573,6 +6720,7 @@ "GOON": "Goonies", "GOP": "The Republican Party", "GOPX": "GOPX Token", + "GOR": "@gork", "GORA": "Gora", "GOREC": "GoRecruit", "GORGONZOLA": "Heroes 3 Foundation", @@ -6580,6 +6728,7 @@ "GORILLA": "Gorilla", "GORILLAD": "Gorilla Diamond", "GORILLAINU": "Gorilla Inu", + "GORK": "New XAI gork", "GORPLE": "GorplesCoin", "GOS": "Gosama", "GOSS": "GOSSIP-Coin", @@ -6643,6 +6792,7 @@ "GREARN": "GrEarn", "GREE": "Green God Candle", "GREEN": "GreenX", + "GREENCOIN": "Greencoin", "GREENH": "Greenheart CBD", "GREENMMT": "Green Mining Movement Token", "GREENPOWER": "GreenPower", @@ -6701,10 +6851,12 @@ "GROOOOOK": "Groooook", "GROOVE": "GROOVE", "GROW": "Grow Token", + "GROWAI": "SocialGrowAI", "GROWNCOIN": "GrownCoin", "GROWTH": "GROWTH DeFi", "GROYPER": "Groyper", "GRP": "Grape", + "GRPH": "Soul Graph", "GRPL": "Golden Ratio Per Liquidity", "GRS": "Groestlcoin", "GRT": "The Graph", @@ -6778,6 +6930,7 @@ "GUILD": "BlockchainSpace", "GUISE": "GUISE", "GULF": "GulfCoin", + "GULL": "GULL", "GUM": "Gourmet Galaxy", "GUMMIES": "GUMMIES", "GUMMY": "GUMMY", @@ -6809,6 +6962,7 @@ "GXC": "GXChain", "GXE": "XENO Governance", "GXT": "Gem Exchange And Trading", + "GYAT": "Gyat Coin", "GYEN": "GYEN", "GYM": "GYM Token", "GYMNET": "Gym Network", @@ -6839,6 +6993,7 @@ "HACHIKO": "Hachiko Inu Token", "HACHIONB": "Hachi On Base", "HACK": "HACK", + "HAEDAL": "Haedal Protocol", "HAGGIS": "New Born Haggis Pygmy Hippo", "HAHA": "Hasaki", "HAI": "Hacken Token", @@ -6848,6 +7003,7 @@ "HAKU": "HakuSwap", "HAL": "Halcyon", "HALF": "0.5X Long Bitcoin Token", + "HALFP": "Half Pizza", "HALFSHIT": "0.5X Long Shitcoin Index Token", "HALLO": "Halloween Coin", "HALLOWEEN": "HALLOWEEN", @@ -6857,7 +7013,7 @@ "HAMI": "Hamachi Finance", "HAMMY": "SAD HAMSTER", "HAMS": "HamsterCoin", - "HAMSTER": "Space Hamster", + "HAMSTER": "Hamster", "HAMSTERB": "HamsterBase", "HAMSTR": "Hamster Coin", "HAN": "HanChain", @@ -6878,6 +7034,7 @@ "HARE": "Hare Token", "HAREPLUS": "Hare Plus", "HAROLD": "Harold", + "HAROLDDUCK": "Harold", "HARPER": "Harper", "HARR": "HARRIS DOGS", "HARRIS": "KAMALA HARRIS", @@ -6889,9 +7046,10 @@ "HASBIK": "Hasbulla", "HASH": "Provenance Blockchain", "HASHAI": "HashAI", + "HASHNET": "HashNet BitEco", "HASHT": "HASH Token", "HASUI": "Haedal", - "HAT": "Hawala.Exchange", + "HAT": "TOP HAT", "HATAY": "Hatayspor Token", "HATCHY": "Hatchyverse", "HATI": "Hati", @@ -6899,6 +7057,7 @@ "HAVOC": "Havoc", "HAVY": "Havy", "HAW": "Hawk Tuah", + "HAWALA": "HAWALA", "HAWK": "Hawksight", "HAWKCITY": "Hawk", "HAWKPTAH": "Hawk Ptah", @@ -6975,12 +7134,13 @@ "HEM": "Hemera", "HEMAN": "HE-MAN", "HEMULE": "Hemule", + "HENAI": "HenjinAI Token", "HENG": "HengCoin", "HENL": "henlo", "HENLO": "Henlo", "HENLOV1": "Henlo v1", "HEP": "Health Potion", - "HER": "Hero Node", + "HER": "Her.AI", "HERA": "Hero Arena", "HERAF": "Hera Finance", "HERB": "HerbCoin", @@ -6995,6 +7155,7 @@ "HEROESAI": "HEROES AI", "HEROESC": "HeroesChained", "HEROI": "Heroic Saga Shiba", + "HERONODE": "Hero Node", "HET": "HavEther", "HETA": "HetaChain", "HETH": "Huobi Ethereum", @@ -7117,7 +7278,7 @@ "HMTT": "Hype Meme Token", "HMU": "hit meeee upp", "HMX": "HMX", - "HNB": "HashNet BitEco", + "HNB": "HNB Protocol", "HNC": "Hellenic Coin", "HNCN": "Huncoin", "HND": "Hundred Finance", @@ -7148,9 +7309,11 @@ "HOKK": "Hokkaidu Inu", "HOL": "Hololoot", "HOLA": "Hola Token", - "HOLD": "HOLD", + "HOLD": "Holdcoin", + "HOLDCO": "HOLD", "HOLDEX": "Holdex Finance", "HOLDON4": "HoldOn4DearLife", + "HOLDS": "Holdstation", "HOLY": "Holy Trinity", "HOM": "Homeety", "HOME": "OtterHome", @@ -7187,6 +7350,7 @@ "HORUS": "HorusPay", "HOS": "Hotel of Secrets", "HOSHI": "Dejitaru Hoshi", + "HOSICO": "Hosico Cat", "HOSKY": "Hosky", "HOSTAI": "Host AI", "HOT": "Holo", @@ -7196,7 +7360,7 @@ "HOTN": "HotNow", "HOTT": "HOT Token", "HOUND": "BaseHoundBot by Virtuals", - "HOUSE": "Klaymore Stakehouse", + "HOUSE": "Housecoin", "HOW": "HowInu", "HOWL": "Coyote", "HP": "HeroPark", @@ -7211,6 +7375,7 @@ "HPX": "HUPAYX", "HPY": "Hyper Pay", "HPYPEPE": "Happy Pepe Token", + "HQ": "Metaverse HQ", "HQR": "Hayya Qatar", "HQT": "HyperQuant", "HQX": "HOQU", @@ -7314,16 +7479,18 @@ "HYDROP": "Hydro Protocol", "HYGH": "HYGH", "HYN": "Hyperion", - "HYP": "HyperStake", + "HYP": "HyperX", "HYPC": "HyperCycle", "HYPE": "Hyperliquid", - "HYPER": "HyperChainX", + "HYPER": "Hyperlane", "HYPERAI": "HyperHash AI", + "HYPERC": "HyperChainX", "HYPERCOIN": "HyperCoin", "HYPERD": "HyperDAO", "HYPERIONX": "HyperionX", "HYPERS": "HyperSpace", "HYPERSKIDS": "HYPERSKIDS", + "HYPERSTAKE": "HyperStake", "HYPES": "Supreme Finance", "HYPEV1": "Hype v1", "HYPR": "Hypr Network", @@ -7340,6 +7507,7 @@ "I7": "ImpulseVen", "I9C": "i9 Coin", "IAG": "IAGON", + "IAGV1": "IAGON v1", "IAI": "inheritance Art", "IAM": "IAME Identity", "IAOMIN": "Yao Ming", @@ -7463,6 +7631,7 @@ "ILV": "Illuvium", "IMARO": "IMARO", "IMAYC": "IMAYC", + "IMBREX": "Imbrex", "IMBTC": "The Tokenized Bitcoin", "IMC": "i Money Crypto", "IME": "Imperium Empires", @@ -7535,6 +7704,7 @@ "INFTT": "iNFT Token", "INFX": "Influxcoin", "ING": "Infinity Games", + "INIT": "Initia", "INJ": "Injective", "INK": "Ink", "INN": "Innova", @@ -7548,10 +7718,11 @@ "INRXV1": "INRx v1", "INS": "Insolar (Old Chain)", "INSANE": "InsaneCoin", + "INSANECOIN": "InsaneCoin", "INSANITY": "Insanity Coin", "INSC": "INSC (Ordinals)", "INSE": "INSECT", - "INSN": "Insane Coin", + "INSN": "Industry Sonic", "INSP": "Inspect", "INSPI": "InspireAI", "INSR": "Insurabler", @@ -7596,8 +7767,9 @@ "IOETH": "ioETH", "IOEX": "ioeX", "IOI": "IOI Token", - "ION": "Ionomy", + "ION": "Ionic", "IONC": "IONChain", + "IONOMY": "Ionomy", "IONP": "Ion Power Token", "IONX": "Charged Particles", "IONZ": "IONZ", @@ -7629,6 +7801,7 @@ "IPX": "InpulseX", "IQ": "IQ", "IQ50": "IQ50", + "IQ6900": "IQ6900", "IQC": "IQ.cash", "IQG": "IQ Global", "IQN": "IQeon", @@ -7668,6 +7841,7 @@ "IST": "Inter Stable Token", "ISTEP": "iSTEP", "ITA": "Italian National Football Team Fan Token", + "ITALIANROT": "Italian Brainrot", "ITALOCOIN": "Italocoin", "ITAM": "ITAM Games", "ITAMCUBE": "CUBE", @@ -7676,6 +7850,7 @@ "ITF": "Intelligent Trading", "ITG": "iTrust Governance", "ITGR": "Integral", + "ITHACA": "Ithaca Protocol", "ITHEUM": "Itheum", "ITL": "Italian Lira", "ITLR": "MiTellor", @@ -7782,8 +7957,9 @@ "JEN": "JEN COIN", "JENNER": "Caitlyn Jenner", "JENSEN": "Jensen Huang", - "JERRY": "Jerry Inu", + "JERRY": "jerry", "JERRYINU": "JERRYINU", + "JERRYINUCOM": "Jerry Inu", "JES": "Jesus", "JEST": "Jester", "JESUS": "Jesus Coin", @@ -7863,6 +8039,7 @@ "JONESUSDC": "Jones USDC", "JOOPS": "JOOPS", "JOPER": "Joker Pepe", + "JOS": "JuliaOS", "JOSE": "Jose", "JOTCHUA": "Perro Dinero", "JOULE": "Joule", @@ -7898,6 +8075,7 @@ "JUIC": "Juice", "JUICE": "Juice Finance", "JUICEB": "Juice", + "JUICET": "Juice Town", "JUL": "Joule", "JULB": "JustLiquidity Binance", "JULD": "JulSwap", @@ -7954,6 +8132,7 @@ "KAILY": "Kailith", "KAIM": "Kai Meme", "KAINET": "KAINET", + "KAIRO": "Kairo", "KAITO": "KAITO", "KAKA": "KAKA NFT World", "KAKAXA": "KAKAXA", @@ -7972,6 +8151,7 @@ "KAMAL": "Kamala Harris", "KAMALA": "Kamala Harris", "KAMALAHARRIS": "KAMALA HARRIS", + "KAMB": "Kambria", "KAMLA": "KAMALAMA (kamalama.org)", "KAMPAY": "KamPay", "KAN": "Bitkan", @@ -8000,7 +8180,7 @@ "KASPY": "KASPY", "KASSIAHOME": "Kassia Home", "KASTA": "Kasta", - "KAT": "Kambria", + "KAT": "Karat", "KATA": "Katana Inu", "KATANA": "Katana Finance", "KATCHU": "Katchu Coin", @@ -8114,7 +8294,8 @@ "KILLSOLANA": "KillSolana", "KILO": "KiloEx", "KILT": "KILT Protocol", - "KIM": "King Money", + "KIM": "KIM Token", + "KIMA": "Kima", "KIMBO": "Kimbo", "KIMCHI": "KIMCHI.finance", "KIMIAI": "Kimi AI Agent", @@ -8127,11 +8308,13 @@ "KINGB": "King Bean", "KINGBONK": "King Bonk", "KINGCAT": "King Cat", + "KINGCOIN": "KING", "KINGD": "Kingdom of Ants", "KINGDOG": "King Dog Inu", "KINGDOMQUEST": "Kingdom Quest", "KINGF": "King Finance", "KINGGROK": "King Grok", + "KINGMONEY": "King Money", "KINGNEIRO": "King Neiro", "KINGO": "King of memes", "KINGOF": "King Of Memes", @@ -8178,6 +8361,7 @@ "KKT": "Kingdom Karnage", "KLAP": "Klap Finance", "KLAUS": "Klaus", + "KLAYMORE": "Klaymore Stakehouse", "KLC": "KiloCoin", "KLD": "Koduck", "KLEE": "KleeKai", @@ -8240,7 +8424,8 @@ "KOIP": "KoiPond", "KOJI": "Koji", "KOK": "KOK Coin", - "KOKO": "KokoSwap", + "KOKO": "KOALA AI", + "KOKOSWAP": "KokoSwap", "KOL": "Kollect", "KOLANA": "KOLANA", "KOLION": "Kolion", @@ -8260,6 +8445,7 @@ "KORE": "KORE Vault", "KOREC": "Kore", "KORRA": "KORRA", + "KOS": "KONTOS", "KOSS": "Koss", "KOTARO": "KOTARO", "KOTO": "Koto", @@ -8292,7 +8478,7 @@ "KRL": "Kryll", "KRM": "Karma", "KRN": "KRYZA Network", - "KRO": "Betoken", + "KRO": "Kroma", "KROM": "Kromatika", "KROME": "KROME Shares", "KRONE": "Kronecoin", @@ -8407,12 +8593,15 @@ "LAELAPS": "Laelaps", "LAFFIN": "Laffin Kamala", "LAI": "LayerAI", - "LAIKA": "Laika Protocol", + "LAIKA": "LAIKA", + "LAIKAPROTOCOL": "Laika Protocol", "LAINESOL": "Laine Staked SOL", + "LAIR": "Lair", "LAKE": "Data Lake", "LALA": "LaLa World", "LAMB": "Lambda", "LAMBO": "LAMBO", + "LAMPIX": "Lampix", "LAN": "Lanify", "LANA": "LanaCoin", "LANC": "Lanceria", @@ -8445,6 +8634,7 @@ "LATX": "Latium", "LAUGHCOIN": "Laughcoin", "LAUNCH": "Launchblock.com", + "LAUNCHCOIN": "Launch Coin on Believe", "LAVA": "Lava Network", "LAVASWAP": "Lavaswap", "LAVAX": "LavaX Labs", @@ -8576,6 +8766,7 @@ "LGBT": "Let's Go Brandon Token", "LGBTQ": "LGBTQoin", "LGC": "LiveGreen Coin", + "LGCT": "Legacy Token", "LGCY": "LGCY Network", "LGD": "Legends Cryptocurrency", "LGG": "Let's Go Gambling", @@ -8665,6 +8856,7 @@ "LISAS": "Lisa Simpson", "LIST": "KList Protocol", "LISTA": "Lista DAO", + "LISTEN": "Listen", "LISUSD": "lisUSD", "LIT": "Litentry", "LITE": "Lite USD", @@ -8680,6 +8872,7 @@ "LIVESEY": "Dr. Livesey", "LIVESTARS": "Live Stars", "LIXX": "Libra Incentix", + "LIY": "Lily", "LIZ": "Lizus Payment", "LIZA": "Liza", "LIZARD": "LIZARD", @@ -8752,6 +8945,7 @@ "LOG": "Wood Coin", "LOGO": "LOGOS", "LOGOS": "LOGOSAI", + "LOGT": "Lord of Dragons Governance Token", "LOGX": "LogX Network", "LOIS": "Lois Token", "LOKA": "League of Kingdoms", @@ -8798,7 +8992,7 @@ "LOUD": "Loud Market", "LOULOU": "LOULOU", "LOV": "LoveChain", - "LOVE": "Deesse", + "LOVE": "Love Monster", "LOVELY": "Lovely finance", "LOVELYV1": "Lovely Inu Finance", "LOVESNOOPY": "I LOVE SNOOPY", @@ -8915,6 +9109,7 @@ "LUMI": "LUMI Credits", "LUMIA": "Lumia", "LUMIO": "Solana Mascot", + "LUMO": "Lumo-8B-Instruct", "LUMOS": "Lumos", "LUN": "Lunyr", "LUNA": "Terra", @@ -8944,10 +9139,12 @@ "LVIP": "Limitless VIP", "LVL": "Level", "LVLUSD": "Level USD", + "LVLY": "LyvelyToken", "LVM": "LakeViewMeta", "LVN": "LivenPay", "LVVA": "Levva Protocol Token", "LVX": "Level01", + "LWA": "LUMIWAVE", "LWC": "Linework Coin", "LWF": "Local World Forwarders", "LX": "Moonlight", @@ -8968,6 +9165,7 @@ "LYNK": "Lynked.World", "LYNX": "Lynx", "LYO": "LYO Credit", + "LYP": "Lympid Token", "LYQD": "eLYQD", "LYR": "Lyra", "LYRA": "Lyra", @@ -8985,6 +9183,7 @@ "M2O": "M2O Token", "M3M3": "M3M3", "M87": "MESSIER", + "MA": "Mind-AI", "MAAL": "Maal Chain", "MABA": "Make America Based Again", "MAC": "MachineCoin", @@ -8998,9 +9197,11 @@ "MADOG": "MarvelDoge", "MADP": "Mad Penguin", "MADPEPE": "Mad Pepe", + "MAECENAS": "Maecenas", "MAEP": "Maester Protocol", "MAF": "MetaMAFIA", "MAG": "Magnify Cash", + "MAG7SSI": "MAG7.ssi", "MAGA": "MAGA", "MAGA2024": "MAGA2024", "MAGA47": "MAGA 47", @@ -9035,13 +9236,14 @@ "MAGPAC": "MAGA Meme PAC", "MAH": "Mahabibi Bin Solman", "MAHA": "MahaDAO", - "MAI": "Mindsync", + "MAI": "MAI", "MAIA": "Maia", "MAID": "MaidSafe Coin", "MAIL": "CHAINMAIL", "MAINSTON": "Ston", + "MAJ": "Major Frog", "MAJO": "Majo", - "MAJOR": "Major Frog", + "MAJOR": "Major", "MAK": "MetaCene", "MAKE": "MAKE", "MAKEA": "Make America Healthy Again", @@ -9055,6 +9257,7 @@ "MAMBA": "Mamba", "MAN": "Matrix AI Network", "MANA": "Decentraland", + "MANA3": "MANA3", "MANC": "Mancium", "MAND": "Mandala Exchange Token", "MANDALA": "Mandala Exchange Token", @@ -9067,6 +9270,7 @@ "MANIFEST": "Manifest", "MANNA": "Manna", "MANORUKA": "ManoRuka", + "MANSONCOIN": "Manson Coin", "MANT": "Mantle USD", "MANTA": "Manta Network", "MANTI": "Mantis", @@ -9079,6 +9283,7 @@ "MAP": "MAP Protocol", "MAPC": "MapCoin", "MAPE": "Mecha Morphing", + "MAPO": "MAP Protocol", "MAPR": "Maya Preferred 223", "MAPS": "MAPS", "MAR3": "Mar3 AI", @@ -9096,6 +9301,7 @@ "MARLEY": "Marley Token", "MARMAJ": "marmaj", "MARO": "Maro", + "MAROV1": "TTC PROTOCOL", "MARS": "MarsCoin", "MARS4": "MARS4", "MARSC": "MarsCoin", @@ -9104,7 +9310,7 @@ "MARSRISE": "MarsRise", "MARSUPILAMI": "MARSUPILAMI INU", "MARSW": "Marswap", - "MART": "Monart", + "MART": "ArtMeta", "MARTIA": "Colonize Mars", "MARTK": "Martkist", "MARTY": "Marty Inu", @@ -9125,9 +9331,10 @@ "MASTER": "Mastercoin", "MASTERCOIN": "MasterCoin", "MASTERMINT": "MasterMint", + "MASTERMIX": "Master MIX Token", "MASTERTRADER": "MasterTraderCoin", "MASYA": "MASYA", - "MAT": "MiniApps", + "MAT": "My Master Wa", "MATA": "Ninneko", "MATAR": "MATAR AI", "MATCH": "Matching Game", @@ -9137,7 +9344,8 @@ "MATIC": "Polygon", "MATICX": "Stader MaticX", "MATPAD": "MaticPad", - "MATRIX": "Matrix Labs", + "MATRIX": "Matrix One", + "MATRIXLABS": "Matrix Labs", "MATT": "Matt Furie", "MATTER": "AntiMatter", "MAU": "MAU", @@ -9288,6 +9496,7 @@ "MEER": "Qitmeer Network", "MEET": "CoinMeet", "MEETONE": "MEET.ONE", + "MEETPLE": "Meetple", "MEF": "MEFLEX", "MEFA": "Metaverse Face", "MEGA": "MegaFlash", @@ -9296,6 +9505,7 @@ "MEGAHERO": "MEGAHERO", "MEGALAND": "Metagalaxy Land", "MEGALANDV1": "Metagalaxy Land v1", + "MEGATECH": "Megatech", "MEGAX": "Megahex", "MEGE": "MEGE", "MEH": "meh", @@ -9305,7 +9515,9 @@ "MELANIA": "Melania Meme", "MELANIATRUMP": "Melania Trump", "MELB": "Minelab", - "MELD": "MELD", + "MELD": "MetaElfLand Token", + "MELDV1": "MELD v1", + "MELDV2": "MELD", "MELI": "Meli Games", "MELLO": "Mello Token", "MELLOW": "Mellow Man", @@ -9317,6 +9529,7 @@ "MELT": "Defrost Finance", "MEM": "Memecoin", "MEMAGX": "Meta Masters Guild Games", + "MEMBERSHIP": "Membership Placeholders", "MEMD": "MemeDAO", "MEMDEX": "Memdex100", "MEME": "Memecoin", @@ -9325,6 +9538,7 @@ "MEMECUP": "Meme Cup", "MEMEETF": "Meme ETF", "MEMEFI": "MemeFi", + "MEMEFICASH": "MemeFi", "MEMEINU": "Meme Inu", "MEMEM": "Meme Man", "MEMEME": "MEMEME", @@ -9345,6 +9559,7 @@ "MENLO": "Menlo One", "MEO": "Meow Of Meme", "MEOW": "Zero Tech", + "MEOWCAT": "MeowCat", "MEOWETH": "Meow", "MEOWG": "MeowGangs", "MEOWIF": "Meowifhat", @@ -9461,7 +9676,7 @@ "MGOD": "MetaGods", "MGP": "MangoChain", "MGPT": "MotoGP Fan Token", - "MGT": "Megatech", + "MGT": "Moongate", "MGUL": "Mogul Coin", "MGX": "MargiX", "MHAM": "Metahamster", @@ -9481,8 +9696,9 @@ "MICHI": "michi", "MICK": "Mickey Meme", "MICKEY": "Steamboat Willie", - "MICRO": "Micromines", + "MICRO": "Micro GPT", "MICRODOGE": "MicroDoge", + "MICROMINES": "Micromines", "MIDAI": "Midway AI", "MIDAS": "Midas", "MIDASDOLLAR": "Midas Dollar Share", @@ -9504,9 +9720,10 @@ "MILA": "MILADY MEME TOKEN", "MILE": "milestoneBased", "MILEI": "MILEI", - "MILK": "Milkshake Swap", + "MILK": "MilkyWay", "MILK2": "Spaceswap MILK2", "MILKBAG": "MILKBAG", + "MILKSHAKE": "Milkshake Swap", "MILKYWAY": "MilkyWayZone", "MILLI": "Million", "MILLY": "milly", @@ -9529,6 +9746,7 @@ "MINDEX": "Mindexcoin", "MINDGENE": "Mind Gene", "MINDS": "Minds", + "MINDSYNC": "Mindsync", "MINE": "SpaceMine", "MINEA": "Mine AI", "MINER": "MINER", @@ -9538,6 +9756,7 @@ "MINEX": "Minex", "MINGO": "Mingo", "MINI": "mini", + "MINIAPPS": "MiniApps", "MINIBNBTIGER": "MiniBNBTiger", "MINID": "Mini Donald", "MINIDO": "MiniDoge", @@ -9555,6 +9774,7 @@ "MINOCOINCTO": "MINO", "MINS": "Minswap", "MINT": "Mint Club", + "MINTCHAIN": "Mint", "MINTCOIN": "MintCoin", "MINTE": "Minter HUB", "MINTME": "MintMe.com Coin", @@ -9569,9 +9789,11 @@ "MIR": "Mirror Protocol", "MIRA": "Chains of War", "MIRACLE": "MIRACLE", - "MIRAI": "MIRAI", + "MIRAI": "Project MIRAI", + "MIRAIBUILD": "MIRAI", "MIRC": "MIR COIN", "MIRT": "MIR Token", + "MIRX": "Mirada AI", "MIS": "Mithril Share", "MISA": "Sangkara", "MISCOIN": "MIScoin", @@ -9644,7 +9866,7 @@ "MMS": "Marsverse", "MMSC": "MMSC PLATFORM", "MMSS": "MMSS (Ordinals)", - "MMT": "Master MIX Token", + "MMT": "MeMusic", "MMTM": "Momentum", "MMUI": "MetaMUI", "MMULTI": "Multichain (via Multichain Cross-Chain Router)", @@ -9673,6 +9895,7 @@ "MNR": "Mineral", "MNRB": "MoneyRebel", "MNRCH": "Monarch", + "MNRY": "Moonray", "MNS": "Monnos", "MNSRY": "MANSORY", "MNST": "MoonStarter", @@ -9744,8 +9967,9 @@ "MOI": "MyOwnItem", "MOIN": "MoinCoin", "MOJI": "Moji", - "MOJO": "Mojocoin", + "MOJO": "Planet Mojo", "MOJOB": "Mojo on Base", + "MOJOCOIN": "Mojocoin", "MOK": "MocktailSwap", "MOL": "Molecule", "MOLA": "MoonLana", @@ -9762,6 +9986,7 @@ "MONA": "MonaCoin", "MONAIZE": "Monaize", "MONARCH": "TRUEMONARCH", + "MONART": "Monart", "MONAV": "Monavale", "MONB": "MonbaseCoin", "MONDO": "mondo", @@ -9811,6 +10036,7 @@ "MOON": "r/CryptoCurrency Moons", "MOONARCH": "Moonarch", "MOONB": "Moon Base", + "MOONBEANS": "Moonbeans", "MOONBI": "Moonbix", "MOONBIX": "MOONBIX MEME", "MOONC": "MoonCoin", @@ -9824,6 +10050,7 @@ "MOONION": "Moonions", "MOONKIZE": "MoonKize", "MOONLIGHT": "Moonlight Token", + "MOONPIG": "Moonpig", "MOONR": "PulseMoonR", "MOONS": "Sailor Moons", "MOONSHOT": "Moonshot", @@ -9848,7 +10075,7 @@ "MOS": "MOS Coin", "MOSS": "MOSS AI", "MOST": "MOST Global", - "MOT": "Olympus Labs", + "MOT": "Mobius Token", "MOTA": "MotaCoin", "MOTG": "MetaOctagon", "MOTH": "MOTH", @@ -9870,9 +10097,10 @@ "MOWA": "Moniwar", "MOXIE": "Moxie", "MOYA": "MOYA", - "MOZ": "Mozik", + "MOZ": "Lumoz token", "MOZA": "Mozaic", - "MP": "Membership Placeholders", + "MOZIK": "Mozik", + "MP": "MerlinSwap Token", "MP3": "MP3", "MPAA": "MPAA", "MPAD": "MultiPad", @@ -9889,7 +10117,8 @@ "MPM": "Monopoly Meta", "MPRO": "MediumProject", "MPS": "Mt Pelerin Shares", - "MPT": "Meetple", + "MPT": "Miracleplay Token", + "MPTV1": "Miracleplay Token v1", "MPWR": "Empower", "MPX": "Morphex", "MPXT": "Myplacex", @@ -9935,7 +10164,7 @@ "MSHEESHA": "Sheesha Finance Polygon", "MSHIB": "Magic Shiba Starter", "MSHIP": "MetaShipping", - "MSN": "Manson Coin", + "MSN": "Meson.Network", "MSOL": "Marinade Staked SOL", "MSOT": "BTour Chain", "MSP": "Mothership", @@ -9975,6 +10204,7 @@ "MTMS": "MTMS Network", "MTN": "TrackNetToken", "MTO": "Merchant Token", + "MTOS": "MomoAI", "MTP": "Macro Protocol", "MTR": "Meter Stable", "MTRA": "MetaRare", @@ -10233,8 +10463,9 @@ "NEBU": "Nebuchadnezzar", "NEC": "Nectar", "NEER": "Metaverse.Network Pioneer", - "NEET": "NEET Finance", + "NEET": "Not in Employment, Education, or Training", "NEETCOIN": "Neetcoin", + "NEETFINANCE": "NEET Finance", "NEF": "NefariousCoin", "NEFTIPEDIA": "NEFTiPEDiA", "NEFTY": "NeftyBlocks", @@ -10256,6 +10487,7 @@ "NEKOARC": "Neko Arc", "NEKOIN": "Nekoin", "NEKOS": "Nekocoin", + "NEKTAR": "Nektar Token", "NEMO": "NEMO", "NEMS": "The Nemesis", "NEO": "NEO", @@ -10277,9 +10509,10 @@ "NEST": "Nest Protocol", "NESTREE": "Nestree", "NESTV1": "Nest Protocol v1", - "NET": "NetCoin", + "NET": "NET", "NETA": "Negative Tax", "NETC": "NetworkCoin", + "NETCOI": "NetCoin", "NETCOIN": "Netcoincapital", "NETCOINV1": "Netcoincapital v1", "NETK": "Netkoin", @@ -10294,6 +10527,7 @@ "NEURA": "Neurahub", "NEURAL": "NeuralAI", "NEURALINK": "Neuralink", + "NEURO": "NeuroWeb", "NEURON": "Cerebrum DAO", "NEURONI": "Neuroni AI", "NEUROS": "Shockwaves", @@ -10305,7 +10539,6 @@ "NEVANETWORK": "Neva", "NEVE": "NEVER SURRENDER", "NEVER": "neversol", - "NEW": "Newton", "NEWB": "Newbium", "NEWBV1": "Newbium v1", "NEWC": "New Cat", @@ -10324,6 +10557,7 @@ "NEXAI": "NexAI", "NEXBOX": "NexBox", "NEXBT": "Native XBTPro Exchange Token", + "NEXD": "Nexade", "NEXEA": "NEXEA", "NEXG": "NexGami", "NEXM": "Nexum", @@ -10485,7 +10719,7 @@ "NOKU": "NOKU Master token", "NOKUV1": "NOKU Master token v1", "NOLA": "Nola", - "NOM": "Finom NOM Token", + "NOM": "Onomy Protocol", "NOMAI": "nomAI by Virtuals", "NOMNOM": "nomnom", "NOMOX": "NOMOEX Token", @@ -10597,7 +10831,8 @@ "NULS": "Nuls", "NUM": "Numbers Protocol", "NUMBERS": "NumbersCoin", - "NUMI": "Numitor", + "NUMI": "NUMINE Token", + "NUMITOR": "Numitor", "NUR": "Nurcoin", "NUSA": "Nusa", "NUSD": "Nomin USD", @@ -10635,6 +10870,7 @@ "NXM": "Nexus Mutual", "NXMC": "NextMindCoin", "NXN": "Naxion", + "NXPC": "NXPC", "NXQ": "NexQloud", "NXRA": "AllianceBlock Nexera", "NXS": "Nexus", @@ -10680,6 +10916,7 @@ "OBI": "Orbofi AI", "OBICOIN": "OBI Real Estate", "OBITS": "Obits Coin", + "OBOL": "Obol Network", "OBOT": "Obortech", "OBROK": "OBRok", "OBS": "One Basis Cash", @@ -10694,7 +10931,7 @@ "OCADA": "OCADA.AI", "OCAI": "Onchain AI", "OCAVU": "Ocavu Network Token", - "OCB": "BLOCKMAX", + "OCB": "OneCoinBuy", "OCC": "OccamFi", "OCD": "On-Chain Dynamics", "OCE": "OceanEX Token", @@ -10794,6 +11031,7 @@ "OKSE": "Okse", "OKT": "OKT Chain", "OL": "Open Loot", + "OLA": "Ola", "OLAF": "Olaf Token", "OLAND": "Oceanland", "OLAS": "Autonolas", @@ -10810,6 +11048,7 @@ "OLY": "Olyseum", "OLYMP": "OlympCoin", "OLYMPE": "OLYMPÉ", + "OLYMPUSLABS": "Olympus Labs", "OLYN": "Olyn by Virtuals", "OM": "MANTRA", "OMA": "OmegaCoin", @@ -10859,6 +11098,7 @@ "ONIGIRI": "Onigiri The Cat", "ONION": "DeepOnion", "ONIT": "ONBUFF", + "ONIX": "Onix", "ONL": "On.Live", "ONLINE": "Onlinebase", "ONLY": "OnlyCam", @@ -10870,7 +11110,7 @@ "ONT": "Ontology", "ONTACT": "OnTact", "ONUS": "ONUS", - "ONX": "Onix", + "ONX": "OnX.finance", "OOE": "OpenOcean", "OOFP": "OOFP", "OOGI": "OOGI", @@ -10883,6 +11123,7 @@ "OOW": "OPP Open WiFi", "OP": "Optimism", "OPA": "Option Panda Platform", + "OPAI": "Optopia AI", "OPAIG": "OvalPixel", "OPC": "OP Coin", "OPCA": "OP_CAT(BIP-420)", @@ -10943,6 +11184,7 @@ "ORAO": "ORAO Network", "ORARE": "OneRare", "ORB": "KlayCity ORB", + "ORBI": "Orbs", "ORBIS": "Orbis", "ORBIT": "Orbit Protocol", "ORBITCOIN": "Orbitcoin", @@ -10975,6 +11217,7 @@ "ORME": "Ormeus Coin", "ORMO": "Ormolus", "ORN": "Orion Protocol", + "ORNG": "Juice Town", "ORNJ": "Orange", "ORO": "Operon Origins", "OROC": "Orocrypt", @@ -11000,6 +11243,7 @@ "OSIS": "OSIS", "OSK": "OSK", "OSKDAO": "OSK DAO", + "OSKY": "OpenSky Token", "OSL": "OSL AI", "OSMI": "OSMI", "OSMO": "Osmosis", @@ -11027,16 +11271,20 @@ "OUSE": "OUSE Token", "OUSG": "OUSG", "OUT": "Netscouters", + "OUTL": "Outlanders Token", + "OVATO": "Ovato", "OVC": "OVCODE", + "OVER": "OverProtocol", "OVERLORD": "Overlord", "OVN": "Overnight", - "OVO": "Ovato", + "OVO": "OVO", "OVR": "Ovr", "OWC": "Oduwa", "OWD": "Owlstand", "OWL": "OWL Token", - "OWN": "Ownly", + "OWN": "OTHERWORLD", "OWNDATA": "OWNDATA", + "OWNLY": "Ownly", "OWO": "SoMon", "OX": "Open Exchange Token", "OXAI": "OxAI.com", @@ -11077,12 +11325,14 @@ "PACOCA": "Pacoca", "PACP": "PAC Protocol", "PACT": "impactMarket", + "PACTV1": "impactMarket v1", "PAD": "NearPad", "PAF": "Pacific", "PAGE": "Page", - "PAI": "Project Pai", + "PAI": "ParallelAI", "PAID": "PAID Network", "PAIDV1": "PAID Network v1", + "PAIN": "PAIN", "PAINT": "MurAll", "PAIRED": "PairedWorld", "PAJAMAS": "The First Youtube Cat", @@ -11167,8 +11417,9 @@ "PAVO": "Pavocoin", "PAW": "PAWSWAP", "PAWPAW": "PawPaw", - "PAWS": "PawStars", + "PAWS": "PAWS", "PAWSTA": "dogeatingpasta", + "PAWSTARS": "PawStars", "PAWTH": "Pawthereum", "PAXE": "Paxe", "PAXEX": "PAXEX", @@ -11209,7 +11460,7 @@ "PCCM": "Poseidon Chain", "PCD": " Phecda", "PCE": "PEACE COIN", - "PCH": "POPCHAIN", + "PCH": "Pichi", "PCHS": "Peaches.Finance", "PCI": "PayProtocol Paycoin", "PCKB": "pCKB (via Godwoken Bridge from CKB)", @@ -11272,6 +11523,7 @@ "PEG": "PegNet", "PEGA": "PEGA", "PEGAMAGA": "Pepe Maga", + "PEGASCOIN": "Pegascoin", "PEGG": "PokPok Golden Egg", "PEGS": "PegShares", "PEIPEI": "PeiPei", @@ -11301,6 +11553,7 @@ "PENTA": "Penta", "PEON": "Peon", "PEOPLE": "ConstitutionDAO", + "PEOPLEFB": "PEOPLE", "PEOSONE": "pEOS", "PEP": "Pepechain", "PEPA": "Pepa Inu", @@ -11320,7 +11573,8 @@ "PEPEBURN": "Pepeburn", "PEPEC": "Pepe Chain", "PEPECASH": "Pepe Cash", - "PEPECAT": "PEPE CAT", + "PEPECAT": "PEPECAT", + "PEPECATCLUB": "PEPE CAT", "PEPECEO": "REAL PEPE CEO", "PEPECHAIN": "PEPE Chain", "PEPECO": "PEPE COIN BSC", @@ -11386,6 +11640,7 @@ "PERU": "PeruCoin", "PERX": "PeerEx Network", "PESA": "Credible", + "PESETACOIN": "PesetaCoin", "PESHI": "PESHI", "PESOBIT": "PesoBit", "PESTO": "Pesto the Baby King Penguin", @@ -11408,11 +11663,11 @@ "PFID": "Pofid Dao", "PFL": "Professional Fighters League Fan Token", "PFR": "PayFair", - "PFT": "Pitch Finance Token", + "PFT": "PolarFighters", "PFY": "Portify", "PG": "Pepe Grow", "PGALA": "pGALA", - "PGC": "Pegascoin", + "PGC": "PiggyPiggyCoin", "PGEN": "Polygen", "PGF7T": "PGF500", "PGL": "Prospectors", @@ -11471,11 +11726,13 @@ "PICKLE": "Pickle Finance", "PICO": "PicoGo", "PICOLO": "PICOLO", + "PIDOG": "Pi Network Dog", "PIDOGE": "Pi Network Doge", "PIE": "Persistent Information Exchange", "PIERRE": "sacré bleu", "PIF": "Pepe Wif Hat", "PIG": "Pig Finance", + "PIGC": "Pigcoin", "PIGE": "Pige", "PIGEON": "Pigeon In Yellow Boots", "PIGEONC": "Pigeoncoin", @@ -11485,6 +11742,7 @@ "PIGONK": "PIGONK", "PIGS": "Elon Vitalik Pigs", "PIIN": "piin (Ordinals)", + "PIK": "Pika Protocol", "PIKA": "Pikaboss", "PIKACHU": "Pikachu Inu", "PIKACRYPTO": "Pika", @@ -11501,6 +11759,7 @@ "PINETWORKDEFI": "Pi Network DeFi", "PINEYE": "PinEye", "PING": "CryptoPing", + "PINGO": "PinGo", "PINK": "PINK - The Panther", "PINKCOIN": "PinkCoin", "PINKSALE": "PinkSale", @@ -11530,24 +11789,28 @@ "PIST": "Pist Trust", "PIT": "Pitbull", "PITCH": "PITCH", + "PITCHFINANCE": "Pitch Finance Token", + "PITISCOIN": "Pitis Coin", "PIUU": "PIXIU", "PIVN": "PIVN", "PIVX": "Private Instant Verified Transaction", - "PIX": "Lampix", + "PIX": "PixelSwap", "PIXEL": "Pixels", "PIXELV": "PixelVerse", "PIXFI": "Pixelverse", "PIXL": "PIXL", - "PIZA": "Half Pizza", + "PIZA": "PIZA", "PIZPEPE": "Pepe Pizzeria", - "PIZZA": "PizzaSwap", + "PIZZA": "Pizza", "PIZZACOIN": "PizzaCoin", + "PIZZASWAP": "PizzaSwap", "PJM": "Pajama.Finance", "PKB": "ParkByte", "PKC": "Pikciochain", "PKD": "PetKingdom", "PKF": "PolkaFoundry", "PKG": "PKG Token", + "PKIN": "PUMPKIN", "PKN": "Poken", "PKOIN": "Pocketcoin", "PKT": "PKT", @@ -11581,6 +11844,7 @@ "PLEA": "Plearn", "PLEB": "PLEBToken", "PLEBONBASE": "PLEB", + "PLENA": "PLENA", "PLENTY": "Plenty DeFi", "PLEO": "Empleos", "PLERF": "Plerf", @@ -11638,11 +11902,13 @@ "PMR": "Pomerium Utility Token", "PMT": "POWER MARKET", "PMTN": "Peer Mountain", + "PMX": "Primex Finance", "PNB": "Pink BNB", "PNC": "PlatiniumCoin", "PND": "PandaCoin", "PNDC": "Pond Coin", "PNDN": "Pandana", + "PNDO": "Pondo", "PNDR": "Pandora Finance", "PNFT": "Pawn My NFT", "PNG": "Pangolin", @@ -11743,6 +12009,7 @@ "POP": "Popcoin", "POPC": "PopChest", "POPCAT": "Popcat", + "POPCHAIN": "POPCHAIN", "POPCO": "Popcorn", "POPDOG": "PopDog", "POPE": "PopPepe", @@ -11754,6 +12021,7 @@ "POPO": "popo", "POPOETH": "POPO", "POPSICLE": "Popsicle Finance", + "POPU": "Populous", "POPULARCOIN": "PopularCoin", "POR": "Portugal National Team Fan Token", "PORA": "PORA AI", @@ -11787,7 +12055,7 @@ "POUW": "Pouwifhat", "POW": "PowBlocks", "POWELL": "Jerome Powell", - "POWER": "UniPower", + "POWER": "Powerloom Token", "POWR": "Power Ledger", "POWSCHE": "Powsche", "POX": "Monkey Pox", @@ -11809,10 +12077,11 @@ "PPP": "PayPie", "PPR": "Papyrus", "PPS": "PopulStay", - "PPT": "Populous", + "PPT": "Pop Token", "PPY": "Peerplays", "PQT": "Prediqt", "PRA": "ProChain", + "PRAI": "Privasea AI", "PRARE": "Polkarare", "PRB": "Paribu Net", "PRC": "ProsperCoin", @@ -11862,6 +12131,7 @@ "PROFITHUNTERS": "Profit Hunters Coin", "PROGE": "Protector Roge", "PROJECT89": "Project89", + "PROJECTPAI": "Project Pai", "PROLIFIC": "Prolific Game Studio", "PROM": "Prometeus", "PROMPT": "Wayfinder", @@ -11906,7 +12176,8 @@ "PSEUD": "PseudoCash", "PSF": "Prime Shipping Foundation", "PSG": "Paris Saint-Germain Fan Token", - "PSI": "PSIcoin", + "PSI": "Trident", + "PSICOIN": "PSIcoin", "PSILOC": "Psilocybin", "PSK": "Pool of Stake", "PSL": "Pastel", @@ -11927,7 +12198,7 @@ "PT": "Phemex", "PTA": "PentaCoin", "PTAS": "La Peseta", - "PTC": "PesetaCoin", + "PTC": "Particle Trade", "PTD": "Pilot", "PTERIA": "Pteria", "PTF": "PowerTrade Fuel", @@ -11942,6 +12213,7 @@ "PTP": "Platypus Finance", "PTR": "Petro", "PTRUMP": "Pepe Trump", + "PTS": "Petals", "PTT": "Pink Taxi Token", "PTU": "Pintu Token", "PTX": "PlatinX", @@ -11965,7 +12237,8 @@ "PUMA": "Puma", "PUMBAA": "Pumbaa", "PUMLX": "PUMLx", - "PUMP": "PUMP", + "PUMP": "Big Pump", + "PUMPAI": "PumpAI", "PUMPB": "Pump", "PUMPBTC": "pumpBTC", "PUMPFUNBAN": "Pump Fun Ban", @@ -11994,6 +12267,7 @@ "PURA": "Pura", "PURE": "Puriever", "PUREALT": "Pure", + "PURGE": "Forgive Me Father", "PURP": "Purple Platform io", "PURPE": "Purple Pepe", "PURPLEBTC": "Purple Bitcoin", @@ -12093,6 +12367,7 @@ "QIE": "QI Blockchain", "QINGWA": "ShangXin QingWa", "QISWAP": "QiSwap", + "QKA": "Qkacoin", "QKC": "QuarkChain", "QKNTL": "Quick Intel", "QLC": "Kepple [OLD]", @@ -12186,6 +12461,7 @@ "RABB": "Rabbit INU", "RABBI": "Len \"rabbi\" Sassaman", "RABBIT": "Rabbit Finance", + "RABBITC": "RabBitcoin", "RABI": "Rabi", "RAC": "RAcoin", "RACA": "Radio Caca", @@ -12238,7 +12514,7 @@ "RAT": "RatCoin", "RATECOIN": "Ratecoin", "RATING": "DPRating", - "RATIO": "Ratio", + "RATIO": "Ratio Governance Token", "RATS": "Rats", "RATWIF": "RatWifHat", "RAVE": "Ravendex", @@ -12310,12 +12586,16 @@ "REA": "Realisto", "REACH": "/Reach", "REACT": "Reactive Network", + "READY": "READY!", "REAL": "RealLink", "REALESTATE": "RealEstate", + "REALIS": "Realis Worlds", "REALM": "Realm", "REALMS": "Realms of Ethernity", "REALP": "Real Pepe", "REALPLATFORM": "REAL", + "REALPUMPITCOIN": "PUMP", + "REALR": "Real Realm", "REALTRACT": "RealTract", "REALUSD": "Real USD", "REALUSDV1": "Real USD v1", @@ -12373,7 +12653,9 @@ "REI": "REI Network", "REIGN": "Reign of Terror", "REINDEER": "Reindeer", - "REKT": "REKT", + "REK": "Rekt", + "REKT": "Rekt", + "REKTV1": "REKT", "REKTV2": "REKT 2.0", "REKTV3": "REKT v3 (rekt.game)", "REL": "Reliance", @@ -12440,7 +12722,7 @@ "REW": "Review.Network", "REWARD": "Rewardable", "REWARDS": "Solana Rewards", - "REX": "Imbrex", + "REX": "REVOX", "REXBT": "rexbt by VIRTUALS", "REXHAT": "rexwifhat", "REZ": "Renzo", @@ -12476,8 +12758,9 @@ "RIBB": "Ribbit", "RIBBIT": "Ribbit", "RIC": "Riecoin", - "RICE": "RiceFarm", + "RICE": "DAOSquare Governance Token", "RICECOIN": "RiceCoin", + "RICEFARM": "RiceFarm", "RICHIE": "Richie2.0", "RICHIEV1": "Richie", "RICHOFME": "Rich Of Memes", @@ -12533,6 +12816,7 @@ "RIZZMAS": "Rizzmas", "RJV": "Rejuve.AI", "RKC": "Royal Kingdom Coin", + "RKEY": "RKEY", "RKI": "RAKHI", "RKN": "RAKON", "RKR": "REAKTOR", @@ -12584,7 +12868,7 @@ "ROBOTAXI": "ROBOTAXI", "ROC": "Rasputin Online Coin", "ROCCO": "Just A Rock", - "ROCK": "Bedrock", + "ROCK": "Zenrock", "ROCK2": "Ice Rock Mining", "ROCKET": "Team Rocket", "ROCKETCOIN": "RocketCoin", @@ -12705,8 +12989,9 @@ "RUBB": "Rubber Ducky Cult", "RUBCASH": "RUBCASH", "RUBIT": "Rublebit", + "RUBIUS": "Rubius", "RUBX": "eToro Russian Ruble", - "RUBY": "Rubius", + "RUBY": "RubyToken", "RUBYEX": "Ruby.Exchange", "RUC": "Rush", "RUFF": "Ruff", @@ -12718,7 +13003,9 @@ "RUM": "RUM Pirates of The Arrland Token", "RUN": "Run", "RUNE": "Thorchain", + "RUNESX": "RUNES·X·BITCOIN", "RUNEVM": "RUNEVM", + "RUNI": "Runesterminal", "RUNNER": "Runner", "RUNY": "Runy", "RUP": "Rupee", @@ -12749,7 +13036,7 @@ "RVST": "Revest Finance", "RVT": "Rivetz", "RVX": "Rivex", - "RWA": "Xend Finance", + "RWA": "RWA Inc.", "RWAECO": "RWA Ecosystem", "RWAS": "RWA Finance", "RWB": "RawBlock", @@ -12786,6 +13073,7 @@ "SAAD": "Saad Boi", "SAAS": "SaaSGo", "SABAI": "Sabai Protocol", + "SABER": "Saber", "SABLE": "Sable Finance", "SABR": "SABR Coin", "SAC1": "Sable Coin", @@ -12873,6 +13161,7 @@ "SATA": "Signata", "SATAN": "MrBeast's Cat", "SATO": "Atsuko Sato", + "SATOPAY": "SatoPay", "SATORI": "Satori Network", "SATOSHINAKAMOTO": "Satoshi Nakamoto", "SATOX": "Satoxcoin", @@ -12890,6 +13179,7 @@ "SAUNA": "SaunaFinance Token", "SAV": "Save America", "SAV3": "SAV3", + "SAVEOCEAN": "Save The Ocean", "SAVG": "SAVAGE", "SAVM": "SatoshiVM", "SAY": "SAY Coin", @@ -12908,7 +13198,7 @@ "SBIO": "Vector Space Biosciences, Inc.", "SBNB": "Binance Coin (SpookySwap)", "SBOX": "SUIBOXER", - "SBR": "Saber", + "SBR": "STRATEGIC BITCOIN RESERVE", "SBRT": "SaveBritney", "SBSC": "Subscriptio", "SBT": "SOLBIT", @@ -13048,6 +13338,7 @@ "SENATE": "SENATE", "SENC": "Sentinel Chain", "SEND": "Suilend", + "SENDCOIN": "Sendcoin", "SENDOR": "Sendor", "SENK": "Senk", "SENNO": "SENNO", @@ -13107,7 +13398,7 @@ "SFRC": "Safari Crush", "SFRXETH": "Frax Staked Ether", "SFRXUSD": "Staked Frax USD", - "SFT": "SportsFix", + "SFT": "Fightly", "SFTMX": "Stader sFTMX", "SFTY": "Stella Fantasy", "SFU": "Saifu", @@ -13180,6 +13471,7 @@ "SHIB05": "Half Shiba Inu", "SHIB1": "Shib1", "SHIB2": "SHIB2", + "SHIB20": "Shib2.0", "SHIBA": "Shibaqua", "SHIBAAI": "SHIBAAI", "SHIBAC": "SHIBA CLASSIC", @@ -13188,6 +13480,7 @@ "SHIBAI": "AiShiba", "SHIBAKEN": "Shibaken Finance", "SHIBAMOM": "Shiba Mom", + "SHIBANCE": "Shibance Token", "SHIBAR": "Shibarium Name Service", "SHIBARMY": "Shib Army", "SHIBAW": "Shiba $Wing", @@ -13242,6 +13535,7 @@ "SHK": "Shrike", "SHL": "Oyster Shell", "SHLD": "ShieldCoin", + "SHM": "Shardeum", "SHND": "StrongHands", "SHNT": "Sats Hunters", "SHO": "Showcase Token", @@ -13298,9 +13592,10 @@ "SIFU": "SIFU", "SIG": "Signal", "SIGMA": "SIGMA", - "SIGN": "Sign Token", + "SIGN": "Sign", "SIGNA": "Signa", "SIGNAT": "SignatureChain", + "SIGNMETA": "Sign Token", "SIGT": "Signatum", "SIGU": "Singular", "SIKA": "SikaSwap", @@ -13403,6 +13698,7 @@ "SKX": "SKPANAX", "SKY": "Sky", "SKYA": "Sekuya Multiverse", + "SKYAI": "SKYAI", "SKYCOIN": "Skycoin", "SKYFT": "SKYFchain", "SKYM": "SkyMap", @@ -13432,6 +13728,7 @@ "SLING": "Sling Coin", "SLINK": "Soft Link", "SLISBNB": "Lista Staked BNB", + "SLK": "SLK", "SLM": "SlimCoin", "SLN": "Smart Layer Network", "SLND": "Solend", @@ -13458,8 +13755,9 @@ "SMAC": "Social Media Coin", "SMAK": "Smartlink", "SMARS": "SafeMars", - "SMART": "SmartCash", + "SMART": "Smart game", "SMARTB": "Smart Coin", + "SMARTCASH": "SmartCash", "SMARTCREDIT": "SmartCredit Token", "SMARTH": "SmartHub", "SMARTLOX": "SmartLOX", @@ -13470,6 +13768,7 @@ "SMARTSHARE": "Smartshare", "SMARTUP": "Smartup", "SMAT": "Smathium", + "SMB": "SMB Token", "SMBR": "Sombra", "SMBSWAP": "SimbCoin Swap", "SMC": "SmartCoin", @@ -13483,7 +13782,9 @@ "SMI": "SafeMoon Inu", "SMIDGE": "Smidge", "SMIDGEETH": "Smidge", - "SMILE": "Smile Token", + "SMIL": "Smile Token", + "SMILE": "bitSmiley", + "SMILEAI": "Smile AI", "SMILEK": "Smilek to the Bank", "SMILEY": "SMILEY", "SMILY": "Smily Trump", @@ -13522,11 +13823,14 @@ "SNAI": "SwarmNode.ai", "SNAIL": "SnailBrook", "SNAKE": "snake", + "SNAKEAI": "Snake-ai", "SNAKEMOON": "Snakemoon", "SNAKES": "Snakes Game", + "SNAKETOKEN": "Snake Token", "SNAKT": "Sna-King Trump", "SNAP": "SnapEx", "SNAPCAT": "Snapcat", + "SNAPKERO": "SNAP", "SNB": "SynchroBitcoin", "SNC": "SunContract", "SNCT": "SnakeCity", @@ -13546,7 +13850,7 @@ "SNIP": "LyrnAI", "SNIPPEPE": "SNIPING PEPE", "SNITCH": "Randall", - "SNK": "Snake Token", + "SNK": "Snook", "SNL": "Sport and Leisure", "SNM": "SONM", "SNMT": "Satoshi Nakamoto Token", @@ -13566,6 +13870,7 @@ "SNPAD": "SNP adverse", "SNPC": "SnapCoin", "SNPS": "Snaps", + "SNPT": "SNPIT TOKEN", "SNRG": "Synergy", "SNRK": "Snark Launch", "SNS": "Synesis One", @@ -13694,7 +13999,9 @@ "SONICWIF": "SonicWifHat", "SONNE": "Sonne Finance", "SONOF": "Son of Solana", - "SOON": "Soonaverse", + "SONOR": "SonorusToken", + "SOON": "SOON", + "SOONAVERSE": "Soonaverse", "SOONCOIN": "SoonCoin", "SOOTCASE": "I like my sootcase", "SOP": "SoPay", @@ -13707,14 +14014,13 @@ "SORAETH": "SORA", "SORAI": "Sora AI", "SORAPORN": "Sora Porn", - "SOSNOVKINO": "Sosnovkino", "SOSO": "SoSoValue", - "SOSWAP": "Solana Swap", "SOT": "Soccer Crypto", "SOTA": "SOTA Finance", "SOUL": "Phantasma", "SOULO": "SouloCoin", - "SOULS": "Soulsaver", + "SOULS": "Unfettered Ecosystem", + "SOULSA": "Soulsaver", "SOUND": "Sound Coin", "SOURCE": "ReSource Protocol", "SOUTH": "DeepSouth AI", @@ -13729,9 +14035,11 @@ "SP8DE": "Sp8de", "SPA": "Sperax", "SPAC": "SPACE DOGE", - "SPACE": "Spacelens", + "SPACE": "MicroVisionChain", "SPACECOIN": "SpaceCoin", "SPACED": "SPACE DRAGON", + "SPACEHAMSTER": "Space Hamster", + "SPACELENS": "Spacelens", "SPACEM": "Spacem Token", "SPACEPI": "SpacePi", "SPAD": "SolPad", @@ -13785,7 +14093,8 @@ "SPHYNXV3": "Sphynx Token v3", "SPHYNXV4": "Sphynx Token v4", "SPI": "Shopping.io", - "SPICE": "Spice", + "SPICE": "SPICE", + "SPICETOKEN": "Spice", "SPIDER": "Spider Man", "SPIDERMAN": "SPIDERMAN BITCOIN", "SPIDEY": "Spidey", @@ -13816,7 +14125,10 @@ "SPORE": "Spore", "SPORT": "SportsCoin", "SPORTS": "ZenSports", + "SPORTSFIX": "SportsFix", "SPORTSP": "SportsPie", + "SPOT": "Defispot", + "SPOTCOIN": "Spotcoin", "SPOTS": "Spots", "SPOX": "Sports Future Exchange Token", "SPRING": "Spring", @@ -13839,6 +14151,7 @@ "SPXC": "SpaceXCoin", "SPY": "Smarty Pay", "SPYRO": "SPYRO", + "SQ3": "Squad3", "SQAT": "Syndiqate", "SQD": "SQD", "SQG": "Squid Token", @@ -13869,6 +14182,7 @@ "SRCX": "Source Token", "SREUR": "SocialRemit", "SRG": "Street Runner NFT", + "SRGD": "Studio Releasing Gold", "SRK": "SparkPoint", "SRLTY": "SaitaRealty", "SRLY": "Rally (Solana)", @@ -13880,6 +14194,7 @@ "SRWD": "ShibRWD", "SRX": "StorX", "SS": "Sharder", + "SS20": "Shell Trade", "SSB": "SatoshiStreetBets", "SSC": "SelfSell", "SSD": "Sonic Screw Driver Coin", @@ -13915,6 +14230,7 @@ "STACK": "StackOS", "STACKS": " STACKS PAY", "STACS": "STACS Token", + "STAGE": "Stage", "STAK": "Jigstack", "STAKE": "xDai Chain", "STAKEDETH": "StakeHound Staked Ether", @@ -13923,7 +14239,7 @@ "STAN": "Stank Memes", "STANDARD": "Stakeborg DAO", "STAPT": "Ditto Staked Aptos", - "STAR": "FileStar", + "STAR": "StarHeroes", "STAR10": "Ronaldinho Coin", "STARAMBA": "Staramba", "STARBASE": "Starbase", @@ -13946,7 +14262,8 @@ "STARTER": "Starter.xyz", "STARWARS": "Star Wars", "STARX": "STARX TOKEN", - "STASH": "BitStash", + "STASH": "STASH INU", + "STASHV1": "BitStash", "STAT": "STAT", "STATE": "New World Order", "STATER": "Stater", @@ -13995,6 +14312,7 @@ "STHYPE": "Staked HYPE", "STI": "Seek Tiger", "STIC": "StickMan", + "STICKMAN": "stickman", "STIK": "Staika", "STIMA": "STIMA", "STING": "Sting", @@ -14016,10 +14334,11 @@ "STMAN": "Stickman Battleground", "STMATIC": "Lido Staked Matic", "STMX": "StormX", + "STMXV1": "StormX v1", "STND": "Standard Protocol", "STNEAR": "Staked NEAR", "STNK": "Stonks", - "STO": "Save The Ocean", + "STO": "StakeStone", "STOC": "STO Cash", "STOCK": "Digital Asset Stockpile", "STOG": "Stooges", @@ -14030,7 +14349,7 @@ "STONEDE": "Stone DeFi", "STONK": "STONK", "STONKS": "HarryPotterObamaWallStreetBets10Inu", - "STOP": "SatoPay", + "STOP": "LETSTOP", "STOR": "Self Storage Coin", "STORE": "Bit Store", "STOREP": "Storepay", @@ -14052,7 +14371,8 @@ "STRAY": "Stray Dog", "STRD": "Stride", "STRDY": "Sturdy", - "STREAM": "STREAMIT COIN", + "STREAM": "Streamflow", + "STREAMIT": "STREAMIT COIN", "STREETH": "STREETH", "STRI": "Strite", "STRIKE": "Strike", @@ -14105,9 +14425,11 @@ "SUCR": "Sucre", "SUD": "Sudo Labs", "SUDO": "sudoswap", + "SUEDE": "Johnny Suede", "SUGAR": "Sugar Exchange", "SUI": "Sui", "SUIA": "SUIA", + "SUIAGENT": "aiSUI", "SUIAI": "SUI Agents", "SUIB": "Suiba Inu", "SUIDEPIN": "Sui DePIN", @@ -14117,6 +14439,7 @@ "SUIMON": "Sui Monster", "SUIP": "SuiPad", "SUIRWA": "Sui RWA", + "SUIRWAPIN": "SUIRWAPIN", "SUISHIB": "SuiShiba", "SUITE": "Suite", "SUKI": "SUKI", @@ -14234,6 +14557,7 @@ "SWISE": "StakeWise", "SWITCH": "Switch", "SWM": "Swarm Fund", + "SWO": "SwordMagicToken", "SWOLE": "Swole Doge", "SWOP": "Swop", "SWORD": "eZKalibur", @@ -14257,6 +14581,7 @@ "SXM": "saxumdao", "SXP": "SXP", "SXS": "Sphere", + "SXT": "Space and Time", "SXUT": "SPECTRE Utility Token", "SYA": "SaveYourAssets", "SYBC": "SYB Coin", @@ -14327,12 +14652,13 @@ "TANG": "Tangent", "TANGO": "keyTango", "TANGYUAN": "TangYuan", - "TANK": "CryptoTanks", + "TANK": "AgentTank", "TANPIN": "Tanpin", "TANUKI": "Tanuki", "TANUPAD": "Tanuki Launchpad", "TAO": "Bittensor", "TAOBOT": "tao.bot", + "TAOCAT": "TAOCat by Virtuals", "TAONU": "TAO INU", "TAOP": "TaoPad", "TAOTOOLS": "TAOTools", @@ -14445,6 +14771,7 @@ "TELO": "Telo Meme Coin", "TELOS": "Teloscoin", "TEM": "Temtum", + "TEMA": "Tema", "TEMCO": "TEMCO", "TEMM": "TEM MARKET", "TEMP": "Tempus", @@ -14474,6 +14801,7 @@ "TERR": "Terrier", "TERRA": "Terraport", "TERRAB": "TERRABYTE AI", + "TERRACOIN": "TerraCoin", "TERRY": "Terry The Disgruntled Turtle", "TERZ": "SHELTERZ", "TES": "TeslaCoin", @@ -14485,6 +14813,7 @@ "TETH": "Treehouse ETH", "TETHYS": "Tethys", "TETRA": "Tetra", + "TETSUO": "Tetsuo Coin", "TETU": "TETU", "TEVA": "Tevaera", "TEW": "Trump in a memes world", @@ -14543,6 +14872,7 @@ "THG": "Thetan Arena", "THIK": "ThikDik", "THING": "Nothing", + "THINGSOP": "ThingsOperatingSystem", "THINKWAREAI": "ThinkwareAI", "THISISF": "This is Fine", "THL": "Thala", @@ -14601,7 +14931,7 @@ "TINU": "Telegram Inu", "TINY": "TinyBits", "TIOX": "TIOx", - "TIP": "Tip Blockchain", + "TIP": "Tip", "TIPC": "Tipcoin", "TIPINU": "Tip Inu", "TIPS": "FedoraCoin", @@ -14674,13 +15004,14 @@ "TOC": "TouchCon", "TODAY": "TodayCoin", "TODD": "TURBO TODD", - "TOK": "Tokenplace", + "TOK": "Tokai", "TOKA": "Tonka Finance", "TOKAMAK": "Tokamak Network", "TOKAU": "Tokyo AU", "TOKC": "Tokyo Coin", "TOKE": "Tokemak", "TOKEN": "TokenFi", + "TOKENPLACE": "Tokenplace", "TOKENSTARS": "TokenStars", "TOKERO": "TOKERO LevelUP Token", "TOKKI": "CRYPTOKKI", @@ -14691,6 +15022,7 @@ "TOLO": "Tolo Yacoloco", "TOLYCAT": "Toly's Cat", "TOM": "TOM Finance", + "TOMA": "TomaInfo", "TOMAHAWKCOIN": "Tomahawkcoin", "TOMAN": "IRR", "TOMB": "Tomb", @@ -14738,7 +15070,7 @@ "TORO": "Toro Inoue", "TOROSOL": "Toro", "TORSY": "TORSY", - "TOS": "ThingsOperatingSystem", + "TOS": "Cryptos", "TOSA": "TosaInu BSC", "TOSC": "T.OS", "TOSDIS": "TosDis", @@ -14801,7 +15133,7 @@ "TRB": "Tellor", "TRBT": "Tribute", "TRBV1": "Tellor Tributes v1", - "TRC": "TerraCoin", + "TRC": "Terrace", "TRCB": "TRCB Chain", "TRCL": "Treecle", "TRCT": "Tracto", @@ -14810,7 +15142,8 @@ "TRDS": "Traders Token", "TRDT": "Trident", "TRDX": "Trendix", - "TREAT": "Treat", + "TREA": "Treat", + "TREAT": "Shiba Inu Treat", "TREB": "Treble", "TRECENTO": "Trecento Blockchain Capital", "TREE": "Tree", @@ -14845,7 +15178,8 @@ "TRNGUY": "Tron Guy Project", "TROG": "Trog", "TROGE": "Troge", - "TROLL": "Trollcoin", + "TROLL": "TROLL", + "TROLLC": "Trollcoin", "TROLLHEIM": "Trollheim", "TROLLICTO": "TROLLI CTO", "TROLLMODE": "TROLL MODE", @@ -14891,7 +15225,8 @@ "TRUMPCAT": "TRUMPCAT", "TRUMPCATF": "Trump Cat Family", "TRUMPCATS": "Trump Golden Cat", - "TRUMPCOIN": "TrumpCoin", + "TRUMPCOIN": "MAGA: Fight for Trump", + "TRUMPCOINROCKS": "TrumpCoin", "TRUMPDAO": "TRUMP DAO", "TRUMPDO": "TRUMP", "TRUMPDOGE": "Trump Doge", @@ -14955,6 +15290,7 @@ "TSLT": "Tamkin", "TSN": "Tsunami Exchange Token", "TSO": "Thesirion", + "TSOTCHKE": "tsotchke", "TSR": "Tesra", "TST": "Test", "TSTAI": "Test AI", @@ -14965,7 +15301,7 @@ "TSUKA": "Dejitaru Tsuka", "TSX": "TradeStars", "TT": "ThunderCore", - "TTC": "TTC PROTOCOL", + "TTC": "TonTycoon", "TTF": "TurboTrix Finance", "TTK": "The Three Kingdoms", "TTM": "Tradetomato", @@ -14984,6 +15320,7 @@ "TULIP": "Tulip Protocol", "TUNA": "TUNACOIN", "TUNE": "Bitune", + "TUNETRADEX": "TuneTrade", "TUP": "Tenup", "TUPE": "Turtle Pepe", "TUR": "Turron", @@ -15034,7 +15371,7 @@ "TXC": "TEXITcoin", "TXG": "TRUSTxGAMING", "TXL": "Autobahn Network", - "TXT": "TuneTrade", + "TXT": "Taxa Token", "TYBENG": "TYBENG", "TYBG": "Base God", "TYBGSc": "Base Goddess", @@ -15044,6 +15381,7 @@ "TYLER": "Tyler", "TYOGHOUL": "TYO GHOUL", "TYPE": "TypeAI", + "TYPEL": "TypeIt", "TYPERIUM": "Typerium", "TYPUS": "Typus", "TYRANT": "Fable Of The Dragon", @@ -15054,6 +15392,7 @@ "TZKI": "Tsuzuki Inu", "TZU": "Sun Tzu", "U": "Unidef", + "U2U": "U2U Network", "U8D": "Universal Dollar", "UAEC": "United Arab Emirates Coin", "UAHG": "UAHg", @@ -15152,6 +15491,7 @@ "UMT": "UnityMeta", "UMX": "UniMex Network", "UMY": "KaraStar UMY", + "UNA": "Unagi Token", "UNAT": "Unattanium", "UNB": "Unbound Finance", "UNBNK": "Unbanked", @@ -15159,6 +15499,7 @@ "UNC": "UnCoin", "UNCL": "UNCL", "UNCN": "Unseen", + "UNCOMMONGOODS": "UNCOMMON•GOODS", "UNCX": "UniCrypt", "UND": "United Network Distribution", "UNDB": "unibot.cash", @@ -15185,8 +15526,11 @@ "UNIL": "UniLayer", "UNIM": "Unicorn Milk", "UNIO": "Unio Coin", + "UNIPOWER": "UniPower", + "UNIPT": "Universal Protocol Token", "UNIQ": "Uniqredit", "UNIQUE": "Unique One", + "UNIR": "UniRouter", "UNISD": "unified Stable Dollar", "UNISDV1": "uniswap State Dollar", "UNISTAKE": "Unistake", @@ -15232,7 +15576,7 @@ "UPR": "Upfire", "UPRO": "ULTRAPRO", "UPS": "UPFI Network", - "UPT": "Universal Protocol Token", + "UPT": "UPROCK", "UPTOS": "UPTOS", "UPUNK": "Unicly CryptoPunks Collection", "UPUSD": "Universal US Dollar", @@ -15242,7 +15586,9 @@ "URAC": "Uranus", "URALS": "Urals Coin", "URFA": "Urfaspor Token", - "URO": "UroCoin", + "URMOM": "urmom", + "URO": "Urolithin A", + "UROCOIN": "UroCoin", "URQA": "UREEQA", "URS": "URUS", "URUS": "Urus Token", @@ -15255,7 +15601,7 @@ "USCC": "USC", "USCOIN": "USCoin", "USD0": "Usual", - "USD1": "USD1", + "USD1": "World Liberty Financial USD", "USD3": "Web 3 Dollar", "USDA": "USDa", "USDACC": "USDA", @@ -15292,6 +15638,7 @@ "USDMA": "USD mars", "USDN": "Neutral AI", "USDO": "USD Open Dollar", + "USDONE": "Currency One USD", "USDP": "Pax Dollar", "USDPLUS": "Overnight.fi USD+", "USDQ": "Quantoz USDQ", @@ -15396,6 +15743,7 @@ "VANCE": "JD Vance", "VANCEMEME": "Vance Meme", "VANF": "Van Fwogh", + "VANKEDISI": "vankedisi", "VANRY": "Vanar Chain", "VANT": "Vanta Network", "VANY": "Vanywhere", @@ -15427,6 +15775,7 @@ "VCF": "Valencia CF Fan Token", "VCG": "VCGamers", "VCHF": "VNX Swiss Franc", + "VCI": "VinciToken", "VCK": "28VCK", "VCNT": "ViciCoin", "VCORE": "VCORE", @@ -15457,6 +15806,7 @@ "VEIL": "VEIL", "VEKTOR": "VEKTOR", "VELA": "Vela Token", + "VELAAI": "velaai", "VELAR": "Velar", "VELO": "Velo", "VELOD": "Velodrome Finance", @@ -15482,6 +15832,7 @@ "VERSA": "Versa Token", "VERSACE": "VERSACE", "VERSE": "Verse", + "VERT": "VERT", "VERTAI": "Vertical AI", "VERTEX": "Vertex", "VERUM": "Verum Coin", @@ -15549,6 +15900,7 @@ "VIS": "Vigorus", "VISIO": "Visio", "VISION": "VisionGame", + "VISIONCITY": "Vision City", "VISR": "Visor", "VIST": "VISTA", "VISTA": "Ethervista", @@ -15567,12 +15919,13 @@ "VITY": "Vitteey", "VIU": "Viuly", "VIVEK": "Head of D.O.G.E", + "VIVI": "LH VIVI", "VIVID": "Vivid Coin", "VIVO": "VIVO Coin", "VIX": "VIXCO", "VIX7": "VIX777", "VIXV1": "VIXCO v1", - "VIZ": "Vision City", + "VIZ": "VIZ Token", "VIZION": "ViZion Protocol", "VIZSLASWAP": "VizslaSwap", "VKNF": "VKENAF", @@ -15627,6 +15980,7 @@ "VOLTX": "VolatilityX", "VOLTZ": "Voltz", "VOLX": "VolumeX", + "VON": "Vameon", "VONE": "Vone", "VONSPEED": "Andrea Von Speed", "VOOT": "VootCoin", @@ -15647,6 +16001,7 @@ "VPS": "VPS AI", "VPT": "Veritas Protocol", "VR": "Victoria", + "VR1": "VR1", "VRA": "Verasity", "VRC": "Virtual Coin", "VRGW": "Virtual Reality Game World", @@ -15727,6 +16082,7 @@ "W12": "W12 Protocol", "W2E": "Walk To Earn", "W3C": "W3Coin", + "W3GG": "W3GG Token", "W3M": "Web3Met", "W3S": "Web3Shot", "W3W": "Web3 Whales", @@ -15788,10 +16144,12 @@ "WASSIE": "WASSIE", "WASTED": "WastedLands", "WASTR": "Wrapped Astar", - "WAT": "Wat", + "WAT": "WATCoin", + "WAT0X63": "Wat", "WATC": "WATCoin", "WATCH": "Yieldwatch", - "WATER": "doginwotah", + "WATER": "WATER", + "WATT": "WATTTON", "WAVAX": "Wrapped AVAX", "WAVES": "Waves", "WAVESCOMM": "Waves Community Token", @@ -15858,6 +16216,7 @@ "WEALTH": "WealthCoin", "WEAPON": "MEGAWEAPON", "WEAR": "MetaWear", + "WEAVE6": "Weave6", "WEB": "Webcoin", "WEB3": "WEB3 Inu", "WEB4": "WEB4 AI", @@ -15885,6 +16244,7 @@ "WELA": "Wrapped Elastos", "WELD": "Weld", "WELL": "Moonwell", + "WELL3": "WELL3", "WELLTOKEN": "Well", "WELLV1": "Moonwell v1", "WELON": "WrappedElon", @@ -15941,6 +16301,7 @@ "WHALE": "WHALE", "WHALES": "Whales Market", "WHAT": "What the Duck", + "WHATSONPIC": "WhatsOnPic", "WHBAR": "Wrapped HBAR", "WHC": "Whales Club", "WHEAT": "Wheat Token", @@ -15964,6 +16325,8 @@ "WHX": "WHITEX", "WHY": "WHY", "WHYCAT": "WhyCat", + "WHYPAD": "Unamano", + "WHYPADV1": "Unamano v1", "WIB": "Wibson", "WIBE": "Wibegram", "WIC": "Wi Coin", @@ -16005,6 +16368,7 @@ "WINTER": "Winter", "WINU": "Walter Inu", "WINX": "WinX.io", + "WIOTA": "wIOTA", "WIOTX": "Wrapped IoTeX", "WIRE": "717ai by Virtuals", "WIRTUAL": "Wirtual", @@ -16020,6 +16384,7 @@ "WIWI": "Wiggly Willy", "WIX": "Wixlar", "WIZA": "Wizardia", + "WIZZ": "Wizzwoods Token", "WJD": "WJD", "WJEWEL": "WJEWEL", "WJXN": "Jax.Network", @@ -16062,6 +16427,7 @@ "WNCG": "Wrapped NCG", "WND": "WonderHero", "WNDR": "Wonderman Nation", + "WNE": "Winee3", "WNEAR": "Wrapped Near", "WNEON": "Wrapped Neon EVM", "WNET": "Wavesnode.net", @@ -16075,7 +16441,7 @@ "WNYC": "Wrapped NewYorkCoin", "WNZ": "Winerz", "WOA": "Wrapped Origin Axie", - "WOD": "World of Defish", + "WOD": "World of Dypians", "WOETH": "Wrapped Origin Ether", "WOFM": "World of Masters", "WOID": "WORLD ID", @@ -16105,7 +16471,7 @@ "WONE": "Wrapped Harmony", "WOO": "WOO Network", "WOOD": "Mindfolk Wood", - "WOOF": "Shibance Token", + "WOOF": "WoofWork.io", "WOOFY": "Woofy", "WOOL": "Wolf Game Wool", "WOONK": "Woonkly", @@ -16116,10 +16482,12 @@ "WOP": "WorldPay", "WOR": "Hollywood Capital Group WARRIOR", "WORK": "Work X", + "WORKCHAIN": "WorkChain.io", "WORKE": "Worken", "WORKIE": "Workie", "WORL": "World Record Banana", "WORLD": "World Token", + "WORLDOFD": "World of Defish", "WORM": "HealthyWorm", "WORX": "Worx", "WOS": "Wolf Of Solana", @@ -16339,7 +16707,8 @@ "XELS": "XELS Coin", "XEM": "NEM", "XEN": "XEN Crypto", - "XEND": "Xend Finance", + "XENDV1": "Xend Finance", + "XENDV2": "Xend Finance", "XENIX": "XenixCoin", "XENO": "Xeno", "XENOVERSE": "Xenoverse", @@ -16365,6 +16734,7 @@ "XGD": "X Gold", "XGEM": "Exchange Genesis Ethlas Medium", "XGLI": "Glitter Finance", + "XGN": "0xGen", "XGOLD": "XGOLD COIN", "XGOX": "Go!", "XGP": "XGP", @@ -16489,6 +16859,7 @@ "XQN": "Quotient", "XQR": "Qredit", "XQUOK": "XQUOK", + "XR": "Xraders", "XRA": "Xriba", "XRAI": "X-Ratio A", "XRAY": "Ray Network", @@ -16496,6 +16867,7 @@ "XRD": "Radix", "XRDOGE": "XRdoge", "XRE": "RevolverCoin", + "XREA": "XREATORS", "XRGB": "XRGB", "XRISE": "Xrise", "XRL": "Rialto.AI", @@ -16517,7 +16889,7 @@ "XSAUCE": "xSAUCE", "XSC": "Hyperspace", "XSD": "SounDAC", - "XSEED": "BitSeeds", + "XSEED": "XSEED", "XSGD": "XSGD", "XSH": "SHIELD", "XSHIB": "XSHIB", @@ -16556,6 +16928,7 @@ "XTRM": "XTRM COIN", "XTRUMP": "X TRUMP", "XTT": "XSwap Treasure", + "XTTA": "XTTA", "XTTB20": "XTblock", "XTUSD": "XT Stablecoin XTUSD", "XTV": "XTV", @@ -16585,6 +16958,7 @@ "XY": "XY Finance", "XYM": "Symbol", "XYO": "XY Oracle", + "XYRO": "XYRO", "XYZ": "Universe.XYZ", "XZK": "Mystiko Network", "Y24": "Yield 24", @@ -16605,6 +16979,7 @@ "YAMV2": "YAM v2", "YAOYAO": "Yaoyao's Cat", "YAP": "Yap Stone", + "YAPSTER": "YAPSTER", "YARL": "Yarloo", "YAW": "Yawww", "YAWN": "YAWN", @@ -16705,6 +17080,7 @@ "YOUSIM": "YouSim", "YOVI": "YobitVirtualCoin", "YOYOW": "Yoyow", + "YOZI": "YoZi Protocol", "YPC": "YoungParrot", "YPIE": "PieDAO Yearn Ecosystem Pie", "YPRISMA": "Yearn yPRISMA", @@ -16745,13 +17121,15 @@ "YYE": "YYE Energy", "YYFI": "YYFI.Protocol", "YYOLO": "yYOLO", - "YZY": "Yeezy", + "YZY": "Swasticoin", "Z3": "Z-Cubed", + "ZAAR": "THE•ORDZAAR•RUNES", "ZABAKU": "Zabaku Inu", "ZACK": "Zack Morris", "ZAFI": "ZakumiFi", - "ZAI": "Zero Collateral Dai", + "ZAI": "Zen AI", "ZAIF": "Zaif Token", + "ZAIFIN": "Zero Collateral Dai", "ZAM": "Zamio", "ZAMZAM": "ZAMZAM", "ZANO": "Zano", @@ -16794,26 +17172,28 @@ "ZEBU": "ZEBU", "ZEC": "ZCash", "ZECD": "ZCashDarkCoin", - "ZED": "ZED Token", - "ZEDCOIN": "ZedCoin", + "ZED": "ZedCoins", "ZEDD": "ZedDex", "ZEDTOKEN": "Zed Token", "ZEDX": "ZEDX Сoin", "ZEDXION": "Zedxion", "ZEDXIONV1": "Zedxion v1", "ZEE": "ZeroSwap", + "ZEEP": "ZEEPR", "ZEFI": "ZCore Finance", "ZEFU": "Zenfuse", "ZEIT": "ZeitCoin", "ZEL": "Zelcash", "ZELIX": "ZELIX", "ZEN": "Horizen", + "ZENAD": "Zenad", "ZENC": "Zenc Coin", "ZEND": "zkLend", "ZENF": "Zenland", "ZENI": "Zennies", "ZENIQ": "Zeniq Coin", "ZENITH": "Zenith Chain", + "ZENPROTOCOL": "Zen Protocol", "ZENQ": "Zenqira", "ZENT": "Zentry", "ZEON": "Zeon Network", @@ -16864,7 +17244,8 @@ "ZIPT": "Zippie", "ZIRVE": "Zirve Coin", "ZIV4": "Ziv4 Labs", - "ZIX": "ZIX Token", + "ZIX": "Coinzix Token", + "ZIXTOKEN": "ZIX Token", "ZIZLE": "Zizle", "ZIZY": "ZIZY", "ZJLT": "ZJLT Distributed Factoring Network", @@ -16912,7 +17293,7 @@ "ZMBE": "RugZombie", "ZMN": "ZMINE", "ZMT": "Zipmex Token", - "ZND": "Zenad", + "ZND": "ZND Token", "ZNE": "ZoneCoin", "ZNN": "Zenon", "ZNT": "Zenith Finance", @@ -16935,12 +17316,13 @@ "ZOOMER": "Zoomer Coin", "ZOON": "CryptoZoon", "ZOOT": "Zoo Token", - "ZORA": "Zoracles", + "ZORA": "Zora", + "ZORACLES": "Zoracles", "ZORKSEES": "Zorksees", "ZORO": "Zoro Inu", "ZORRO": "Zorro", "ZORT": "Zort", - "ZP": "Zen Protocol", + "ZP": "Zombie Power", "ZPAE": "ZelaaPayAE", "ZPAY": "ZoidPay", "ZPC": "Zen Panda Coin", @@ -16949,7 +17331,8 @@ "ZPRO": "ZAT Project", "ZPT": "Zeepin", "ZPTC": "Zeptacoin", - "ZRC": "ZrCoin", + "ZRC": "Zircuit", + "ZRCOIN": "ZrCoin", "ZRO": "LayerZero", "ZRPY": "Zerpaay", "ZRS": "Zaros", @@ -16966,6 +17349,7 @@ "ZUC": "Zeux", "ZUCKPEPE": "ZuckPepe", "ZUKI": "Zuki Moba", + "ZULU": "Zulu Network", "ZUM": "ZumCoin", "ZUN": "Zunami Governance Token", "ZUNA": "ZUNA", @@ -16994,7 +17378,9 @@ "ZYTARA": "Zytara dollar", "ZZ": "ZigZag", "ZZC": "ZudgeZury", - "ZZZ": "zzz.finance", + "ZZZ": "ZZZ", + "ZZZV1": "zzz.finance", + "anyeth1": "anyeth1", "eFIC": "FIC Network", "ePRX": "eProxy", "gOHM": "Governance OHM", From 03b04ac7f0035ce6b657f443ef3b19c8bcea13cd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 19:06:44 +0200 Subject: [PATCH 19/81] Feature/update locales (#4792) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 6 +++--- apps/client/src/locales/messages.de.xlf | 6 +++--- apps/client/src/locales/messages.es.xlf | 6 +++--- apps/client/src/locales/messages.fr.xlf | 6 +++--- apps/client/src/locales/messages.it.xlf | 6 +++--- apps/client/src/locales/messages.nl.xlf | 6 +++--- apps/client/src/locales/messages.pl.xlf | 6 +++--- apps/client/src/locales/messages.pt.xlf | 6 +++--- apps/client/src/locales/messages.tr.xlf | 6 +++--- apps/client/src/locales/messages.uk.xlf | 6 +++--- apps/client/src/locales/messages.xlf | 6 +++--- apps/client/src/locales/messages.zh.xlf | 6 +++--- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 5ce42fe53..1d1f57e0b 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -2463,7 +2463,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -5501,7 +5501,7 @@ Go back to Home Page apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7592,7 +7592,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 86c156192..41e77aac6 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1114,7 +1114,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2478,7 +2478,7 @@ Zurück zur Startseite apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7592,7 +7592,7 @@ Berechnungen basieren auf verzögerten Marktdaten und werden nicht in Echtzeit angezeigt. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 95c2af93f..0a3721ea6 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -1099,7 +1099,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2463,7 +2463,7 @@ Volver a la página principal apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7593,7 +7593,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 202082270..6aa3e880e 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -1450,7 +1450,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2958,7 +2958,7 @@ Retour à la Page d’Accueil apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7592,7 +7592,7 @@ Les calculs sont basés sur des données de marché retardées et peuvent ne pas être affichés en temps réel. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 005af3ea5..c3da10365 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1099,7 +1099,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2463,7 +2463,7 @@ Torna alla pagina iniziale apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7593,7 +7593,7 @@ I calcoli sono basati su dati di mercato ritardati e potrebbero non essere visualizzati in tempo reale. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index f285a759b..31e76dc0f 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -1098,7 +1098,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2462,7 +2462,7 @@ Ga terug naar de startpagina apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7592,7 +7592,7 @@ Berekeningen zijn gebaseerd op vertraagde marktgegevens en worden mogelijk niet in realtime weergegeven. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index df975a108..571b27c12 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -2119,7 +2119,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -5044,7 +5044,7 @@ Wróć do Strony Głównej apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7592,7 +7592,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 9cba3c1bb..d976102c4 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -1330,7 +1330,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -2854,7 +2854,7 @@ Voltar à Página Inicial apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7592,7 +7592,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index cab998274..e98de40cf 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1971,7 +1971,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -4772,7 +4772,7 @@ Ana Sayfaya Geri Dön apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7592,7 +7592,7 @@ Hesaplamalar gecikmeli piyasa verilerine dayanmaktadır ve gerçek zamanlı olarak görüntülenemeyebilir. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 4113fc335..b9efb87bc 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1907,7 +1907,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -6115,7 +6115,7 @@ Повернутися на головну сторінку apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7592,7 +7592,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index e9a6a6c08..736d8af54 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1989,7 +1989,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -4632,7 +4632,7 @@ Go back to Home Page apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -6827,7 +6827,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. apps/client/src/app/components/home-market/home-market.html - 41 + 43 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 01f2342fa..60fa676aa 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -2128,7 +2128,7 @@ apps/client/src/app/pages/webauthn/webauthn-page.html - 29 + 30 @@ -5077,7 +5077,7 @@ 返回首页 apps/client/src/app/pages/webauthn/webauthn-page.html - 31 + 33 @@ -7593,7 +7593,7 @@ 计算基于延迟的市场数据,可能无法实时显示。 apps/client/src/app/components/home-market/home-market.html - 41 + 43 From c553fdf6d4c8d967aea4f0be4006fc1d161b8ca7 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 31 May 2025 10:22:02 +0200 Subject: [PATCH 20/81] Bugfix/change investment value to take currency effects into account in holding detail dialog (#4789) * Change investment value to take currency effects into account * Update changelog --- CHANGELOG.md | 4 ++++ apps/api/src/app/portfolio/portfolio.service.ts | 7 ++++--- .../holding-detail-dialog.component.ts | 14 ++++++++------ .../holding-detail-dialog.html | 4 ++-- .../portfolio-holding-response.interface.ts | 2 +- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 119541163..0888e27a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Upgraded `big.js` from version `6.2.2` to `7.0.1` - Upgraded `ng-extract-i18n-merge` from version `2.14.3` to `2.15.0` +### Fixed + +- Changed the investment value to take the currency effects into account in the holding detail dialog + ## 2.164.0 - 2025-05-28 ### Changed diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 7e373c4cc..e8f50e1e2 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -663,7 +663,7 @@ export class PortfolioService { grossPerformancePercentWithCurrencyEffect: undefined, grossPerformanceWithCurrencyEffect: undefined, historicalData: [], - investment: undefined, + investmentInBaseCurrencyWithCurrencyEffect: undefined, marketPrice: undefined, marketPriceMax: undefined, marketPriceMin: undefined, @@ -853,7 +853,8 @@ export class PortfolioService { grossPerformanceWithCurrencyEffect: position.grossPerformanceWithCurrencyEffect?.toNumber(), historicalData: historicalDataArray, - investment: position.investment?.toNumber(), + investmentInBaseCurrencyWithCurrencyEffect: + position.investmentWithCurrencyEffect?.toNumber(), netPerformance: position.netPerformance?.toNumber(), netPerformancePercent: position.netPerformancePercentage?.toNumber(), netPerformancePercentWithCurrencyEffect: @@ -952,7 +953,7 @@ export class PortfolioService { grossPerformancePercentWithCurrencyEffect: undefined, grossPerformanceWithCurrencyEffect: undefined, historicalData: historicalDataArray, - investment: 0, + investmentInBaseCurrencyWithCurrencyEffect: 0, netPerformance: undefined, netPerformancePercent: undefined, netPerformancePercentWithCurrencyEffect: undefined, 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 028866009..d866275c0 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 @@ -102,8 +102,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { public hasPermissionToCreateOwnTag: boolean; public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean; public historicalDataItems: LineChartItem[]; - public investment: number; - public investmentPrecision = 2; + public investmentInBaseCurrencyWithCurrencyEffect: number; + public investmentInBaseCurrencyWithCurrencyEffectPrecision = 2; public marketDataItems: MarketData[] = []; public marketPrice: number; public marketPriceMax: number; @@ -233,7 +233,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { feeInBaseCurrency, firstBuyDate, historicalData, - investment, + investmentInBaseCurrencyWithCurrencyEffect, marketPrice, marketPriceMax, marketPriceMin, @@ -288,13 +288,15 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } ); - this.investment = investment; + this.investmentInBaseCurrencyWithCurrencyEffect = + investmentInBaseCurrencyWithCurrencyEffect; if ( this.data.deviceType === 'mobile' && - this.investment >= NUMERICAL_PRECISION_THRESHOLD + this.investmentInBaseCurrencyWithCurrencyEffect >= + NUMERICAL_PRECISION_THRESHOLD ) { - this.investmentPrecision = 0; + this.investmentInBaseCurrencyWithCurrencyEffectPrecision = 0; } this.marketPrice = marketPrice; 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 11898c44e..55ebbcd78 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 @@ -146,9 +146,9 @@ size="medium" [isCurrency]="true" [locale]="data.locale" - [precision]="investmentPrecision" + [precision]="investmentInBaseCurrencyWithCurrencyEffectPrecision" [unit]="data.baseCurrency" - [value]="investment" + [value]="investmentInBaseCurrencyWithCurrencyEffect" >Investment
diff --git a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index b330e8baa..000460228 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -22,7 +22,7 @@ export interface PortfolioHoldingResponse { grossPerformancePercentWithCurrencyEffect: number; grossPerformanceWithCurrencyEffect: number; historicalData: HistoricalDataItem[]; - investment: number; + investmentInBaseCurrencyWithCurrencyEffect: number; marketPrice: number; marketPriceMax: number; marketPriceMin: number; From fda9cc71f7fc8e39d905cce3a4976e0e6db2811c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 31 May 2025 10:22:41 +0200 Subject: [PATCH 21/81] Feature/modularize cron service (#4795) * Modularize cron service * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/app.module.ts | 8 +++---- apps/api/src/services/cron/cron.module.ts | 23 +++++++++++++++++++ .../src/services/{ => cron}/cron.service.ts | 15 ++++++------ 4 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 apps/api/src/services/cron/cron.module.ts rename apps/api/src/services/{ => cron}/cron.service.ts (79%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0888e27a2..5979ebc1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Renamed `orders` to `activities` in the `Tag` database schema +- Modularized the cron service - Refreshed the cryptocurrencies list - Improved the language localization for Dutch (`nl`) - Improved the language localization for Polish (`pl`) diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 87a4db5fc..6f512e89b 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -1,13 +1,12 @@ import { EventsModule } from '@ghostfolio/api/events/events.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; -import { CronService } from '@ghostfolio/api/services/cron.service'; +import { CronModule } from '@ghostfolio/api/services/cron/cron.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { PortfolioSnapshotQueueModule } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.module'; -import { TwitterBotModule } from '@ghostfolio/api/services/twitter-bot/twitter-bot.module'; import { DEFAULT_LANGUAGE_CODE, SUPPORTED_LANGUAGE_CODES @@ -78,6 +77,7 @@ import { UserModule } from './user/user.module'; CacheModule, ConfigModule.forRoot(), ConfigurationModule, + CronModule, DataGatheringModule, DataProviderModule, EventEmitterModule.forRoot(), @@ -128,10 +128,8 @@ import { UserModule } from './user/user.module'; SubscriptionModule, SymbolModule, TagsModule, - TwitterBotModule, UserModule, WatchlistModule - ], - providers: [CronService] + ] }) export class AppModule {} diff --git a/apps/api/src/services/cron/cron.module.ts b/apps/api/src/services/cron/cron.module.ts new file mode 100644 index 000000000..06f9d2caa --- /dev/null +++ b/apps/api/src/services/cron/cron.module.ts @@ -0,0 +1,23 @@ +import { UserModule } from '@ghostfolio/api/app/user/user.module'; +import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; +import { DataGatheringModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; +import { TwitterBotModule } from '@ghostfolio/api/services/twitter-bot/twitter-bot.module'; + +import { Module } from '@nestjs/common'; + +import { CronService } from './cron.service'; + +@Module({ + imports: [ + ConfigurationModule, + DataGatheringModule, + ExchangeRateDataModule, + PropertyModule, + TwitterBotModule, + UserModule + ], + providers: [CronService] +}) +export class CronModule {} diff --git a/apps/api/src/services/cron.service.ts b/apps/api/src/services/cron/cron.service.ts similarity index 79% rename from apps/api/src/services/cron.service.ts rename to apps/api/src/services/cron/cron.service.ts index 3d4aff08b..b770aa2d7 100644 --- a/apps/api/src/services/cron.service.ts +++ b/apps/api/src/services/cron/cron.service.ts @@ -1,4 +1,9 @@ import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; +import { TwitterBotService } from '@ghostfolio/api/services/twitter-bot/twitter-bot.service'; import { DATA_GATHERING_QUEUE_PRIORITY_LOW, GATHER_ASSET_PROFILE_PROCESS_JOB_NAME, @@ -10,12 +15,6 @@ import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { Injectable } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; -import { ConfigurationService } from './configuration/configuration.service'; -import { ExchangeRateDataService } from './exchange-rate-data/exchange-rate-data.service'; -import { PropertyService } from './property/property.service'; -import { DataGatheringService } from './queues/data-gathering/data-gathering.service'; -import { TwitterBotService } from './twitter-bot/twitter-bot.service'; - @Injectable() export class CronService { private static readonly EVERY_SUNDAY_AT_LUNCH_TIME = '0 12 * * 0'; @@ -43,7 +42,9 @@ export class CronService { @Cron(CronExpression.EVERY_DAY_AT_5PM) public async runEveryDayAtFivePm() { - this.twitterBotService.tweetFearAndGreedIndex(); + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + this.twitterBotService.tweetFearAndGreedIndex(); + } } @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT) From cf76f54c1c068f06171de5db7e3b443c3e56f113 Mon Sep 17 00:00:00 2001 From: Diego Noah Date: Sat, 31 May 2025 14:56:31 +0600 Subject: [PATCH 22/81] Feature/improve language localization for CA 20250531 (#4796) * Improve language localization for CA * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.ca.xlf | 28 ++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5979ebc1c..b422474d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Renamed `orders` to `activities` in the `Tag` database schema - Modularized the cron service - Refreshed the cryptocurrencies list +- Improved the language localization for Catalan (`ca`) - Improved the language localization for Dutch (`nl`) - Improved the language localization for Polish (`pl`) - Improved the language localization for Spanish (`es`) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 1d1f57e0b..f2d1ea26b 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -2516,7 +2516,7 @@
{VAR_PLURAL, plural, =1 {activity} other {activities}} - {VAR_PLURAL, plural, =1 {activity} other {activities}} + {VAR_PLURAL, plural, =1 {activitat} other {activitats}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 14 @@ -4257,7 +4257,7 @@ Mortgages, personal loans, credit cards - Mortgages, personal loans, credit cards + Hipoteques, préstecs personals, targetes de crèdit apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 57 @@ -4265,7 +4265,7 @@ Luxury items, real estate, private companies - Luxury items, real estate, private companies + Articles de luxe, immobiliari, empreses privades apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 73 @@ -4273,7 +4273,7 @@ Account - Account + Compte apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 85 @@ -4289,7 +4289,7 @@ Update Cash Balance - Update Cash Balance + Actualitzar el saldo d’efectiu apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 112 @@ -4297,7 +4297,7 @@ Unit Price - Unit Price + Preu unitari apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 213 @@ -4309,7 +4309,7 @@ Fee - Fee + Quota apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 261 @@ -4321,7 +4321,7 @@ Import Activities - Import Activities + Activitats d’importació apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 47 @@ -4329,7 +4329,7 @@ Import Dividends - Import Dividends + Importar dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 88 @@ -4337,7 +4337,7 @@ Importing data... - Importing data... + S’estan important dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 126 @@ -4345,7 +4345,7 @@ Import has been completed - Import has been completed + La importació s’ha completat apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 134 @@ -4353,7 +4353,7 @@ Validating data... - Validating data... + S’estan validant les dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts 242 @@ -4361,7 +4361,7 @@ Select Holding - Select Holding + Seleccioneu Holding apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 20 @@ -4369,7 +4369,7 @@ Select File - Select File + Seleccioneu Fitxer apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 22 From cb7434a8b299c20b2202bc6d018f54dfad80dca4 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 31 May 2025 10:57:13 +0200 Subject: [PATCH 23/81] Feature/sync demo account activities based on tags (#4797) * Sync demo account activities based on tags * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/admin/admin.controller.ts | 9 +++ apps/api/src/app/admin/admin.module.ts | 2 + apps/api/src/app/info/info.service.ts | 4 +- .../src/app/portfolio/portfolio.service.ts | 6 +- apps/api/src/app/user/user.service.ts | 6 +- apps/api/src/services/demo/demo.module.ts | 13 ++++ apps/api/src/services/demo/demo.service.ts | 59 +++++++++++++++++++ .../admin-overview.component.ts | 25 +++++++- .../admin-overview/admin-overview.html | 21 +++++-- .../admin-overview/admin-overview.module.ts | 2 + apps/client/src/app/services/admin.service.ts | 4 ++ libs/common/src/lib/config.ts | 7 ++- libs/common/src/lib/permissions.ts | 1 + 14 files changed, 147 insertions(+), 13 deletions(-) create mode 100644 apps/api/src/services/demo/demo.module.ts create mode 100644 apps/api/src/services/demo/demo.service.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index b422474d5..9e9b99fad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Improved the _Live Demo_ setup by syncing activities based on tags - Renamed `orders` to `activities` in the `Tag` database schema - Modularized the cron service - Refreshed the cryptocurrencies list diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 736f6da33..82524ef9b 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -3,6 +3,7 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard' import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service'; +import { DemoService } from '@ghostfolio/api/services/demo/demo.service'; import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { @@ -55,6 +56,7 @@ export class AdminController { private readonly adminService: AdminService, private readonly apiService: ApiService, private readonly dataGatheringService: DataGatheringService, + private readonly demoService: DemoService, private readonly manualService: ManualService, @Inject(REQUEST) private readonly request: RequestWithUser ) {} @@ -66,6 +68,13 @@ export class AdminController { return this.adminService.get({ user: this.request.user }); } + @Get('demo-user/sync') + @HasPermission(permissions.syncDemoUserAccount) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async syncDemoUserAccount(): Promise { + return this.demoService.syncDemoUserAccount(); + } + @HasPermission(permissions.accessAdminControl) @Post('gather') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) diff --git a/apps/api/src/app/admin/admin.module.ts b/apps/api/src/app/admin/admin.module.ts index 54145fa27..598b68f17 100644 --- a/apps/api/src/app/admin/admin.module.ts +++ b/apps/api/src/app/admin/admin.module.ts @@ -4,6 +4,7 @@ import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; +import { DemoModule } from '@ghostfolio/api/services/demo/demo.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; @@ -24,6 +25,7 @@ import { QueueModule } from './queue/queue.module'; ConfigurationModule, DataGatheringModule, DataProviderModule, + DemoModule, ExchangeRateDataModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 9581807b9..1f7b39d9b 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -11,7 +11,7 @@ import { HEADER_KEY_TOKEN, PROPERTY_BETTER_UPTIME_MONITOR_ID, PROPERTY_COUNTRIES_OF_SUBSCRIBERS, - PROPERTY_DEMO_USER_ID, + PROPERTY_DEMO_USER_ID_LEGACY, PROPERTY_IS_READ_ONLY_MODE, PROPERTY_SLACK_COMMUNITY_USERS, ghostfolioFearAndGreedIndexDataSource @@ -237,7 +237,7 @@ export class InfoService { private async getDemoAuthToken() { const demoUserId = (await this.propertyService.getByKey( - PROPERTY_DEMO_USER_ID + PROPERTY_DEMO_USER_ID_LEGACY )) as string; if (demoUserId) { diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index e8f50e1e2..18f923112 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -31,7 +31,7 @@ import { } from '@ghostfolio/common/calculation-helper'; import { DEFAULT_CURRENCY, - EMERGENCY_FUND_TAG_ID, + TAG_ID_EMERGENCY_FUND, UNKNOWN_KEY } from '@ghostfolio/common/config'; import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper'; @@ -564,7 +564,7 @@ export class PortfolioService { if ( filters?.length === 1 && - filters[0].id === EMERGENCY_FUND_TAG_ID && + filters[0].id === TAG_ID_EMERGENCY_FUND && filters[0].type === 'TAG' ) { const emergencyFundCashPositions = await this.getCashPositions({ @@ -1655,7 +1655,7 @@ export class PortfolioService { const emergencyFundHoldings = Object.values(holdings).filter(({ tags }) => { return ( tags?.some(({ id }) => { - return id === EMERGENCY_FUND_TAG_ID; + return id === TAG_ID_EMERGENCY_FUND; }) ?? false ); }); diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 87c82fa0b..2a48b2583 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -411,6 +411,10 @@ export class UserService { user.subscription.offer.durationExtension = undefined; user.subscription.offer.label = undefined; } + + if (hasRole(user, Role.ADMIN)) { + currentPermissions.push(permissions.syncDemoUserAccount); + } } if (this.configurationService.get('ENABLE_FEATURE_READ_ONLY_MODE')) { @@ -433,7 +437,7 @@ export class UserService { } } - if (!environment.production && role === 'ADMIN') { + if (!environment.production && hasRole(user, Role.ADMIN)) { currentPermissions.push(permissions.impersonateAllUsers); } diff --git a/apps/api/src/services/demo/demo.module.ts b/apps/api/src/services/demo/demo.module.ts new file mode 100644 index 000000000..8f86de058 --- /dev/null +++ b/apps/api/src/services/demo/demo.module.ts @@ -0,0 +1,13 @@ +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; + +import { Module } from '@nestjs/common'; + +import { DemoService } from './demo.service'; + +@Module({ + exports: [DemoService], + imports: [PrismaModule, PropertyModule], + providers: [DemoService] +}) +export class DemoModule {} diff --git a/apps/api/src/services/demo/demo.service.ts b/apps/api/src/services/demo/demo.service.ts new file mode 100644 index 000000000..477b43e3b --- /dev/null +++ b/apps/api/src/services/demo/demo.service.ts @@ -0,0 +1,59 @@ +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { + PROPERTY_DEMO_ACCOUNT_ID, + PROPERTY_DEMO_USER_ID, + TAG_ID_DEMO +} from '@ghostfolio/common/config'; + +import { Injectable } from '@nestjs/common'; +import { v4 as uuidv4 } from 'uuid'; + +@Injectable() +export class DemoService { + public constructor( + private readonly prismaService: PrismaService, + private readonly propertyService: PropertyService + ) {} + + public async syncDemoUserAccount() { + const [demoAccountId, demoUserId] = (await Promise.all([ + this.propertyService.getByKey(PROPERTY_DEMO_ACCOUNT_ID), + this.propertyService.getByKey(PROPERTY_DEMO_USER_ID) + ])) as [string, string]; + + let activities = await this.prismaService.order.findMany({ + orderBy: { + date: 'asc' + }, + where: { + tags: { + some: { + id: TAG_ID_DEMO + } + } + } + }); + + activities = activities.map((activity) => { + return { + ...activity, + accountId: demoAccountId, + accountUserId: demoUserId, + comment: null, + id: uuidv4(), + userId: demoUserId + }; + }); + + await this.prismaService.order.deleteMany({ + where: { + userId: demoUserId + } + }); + + return this.prismaService.order.createMany({ + data: activities + }); + } +} diff --git a/apps/client/src/app/components/admin-overview/admin-overview.component.ts b/apps/client/src/app/components/admin-overview/admin-overview.component.ts index 2f814668a..23578cff1 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.component.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.component.ts @@ -22,12 +22,13 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { MatSlideToggleChange } from '@angular/material/slide-toggle'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { differenceInSeconds, formatDistanceToNowStrict, parseISO } from 'date-fns'; -import { StringValue } from 'ms'; +import ms, { StringValue } from 'ms'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -42,6 +43,7 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { public coupons: Coupon[]; public hasPermissionForSubscription: boolean; public hasPermissionForSystemMessage: boolean; + public hasPermissionToSyncDemoUserAccount: boolean; public hasPermissionToToggleReadOnlyMode: boolean; public info: InfoItem; public isDataGatheringEnabled: boolean; @@ -60,6 +62,7 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { private changeDetectorRef: ChangeDetectorRef, private dataService: DataService, private notificationService: NotificationService, + private snackBar: MatSnackBar, private userService: UserService ) { this.info = this.dataService.fetchInfo(); @@ -80,6 +83,11 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { permissions.enableSystemMessage ); + this.hasPermissionToSyncDemoUserAccount = hasPermission( + this.user.permissions, + permissions.syncDemoUserAccount + ); + this.hasPermissionToToggleReadOnlyMode = hasPermission( this.user.permissions, permissions.toggleReadOnlyMode @@ -206,6 +214,21 @@ export class AdminOverviewComponent implements OnDestroy, OnInit { } } + public onSyncDemoUserAccount() { + this.adminService + .syncDemoUserAccount() + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + this.snackBar.open( + '✅ ' + $localize`Demo user account has been synced.`, + undefined, + { + duration: ms('3 seconds') + } + ); + }); + } + public ngOnDestroy() { this.unsubscribeSubject.next(); this.unsubscribeSubject.complete(); diff --git a/apps/client/src/app/components/admin-overview/admin-overview.html b/apps/client/src/app/components/admin-overview/admin-overview.html index bcbf666ef..246e5fe04 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.html +++ b/apps/client/src/app/components/admin-overview/admin-overview.html @@ -169,10 +169,23 @@
Housekeeping
- +
+ @if (hasPermissionToSyncDemoUserAccount) { + + } + +
diff --git a/apps/client/src/app/components/admin-overview/admin-overview.module.ts b/apps/client/src/app/components/admin-overview/admin-overview.module.ts index da49eb858..1c5fba202 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.module.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.module.ts @@ -9,6 +9,7 @@ import { MatCardModule } from '@angular/material/card'; import { MatMenuModule } from '@angular/material/menu'; import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; import { RouterModule } from '@angular/router'; import { AdminOverviewComponent } from './admin-overview.component'; @@ -24,6 +25,7 @@ import { AdminOverviewComponent } from './admin-overview.component'; MatCardModule, MatMenuModule, MatSelectModule, + MatSnackBarModule, MatSlideToggleModule, ReactiveFormsModule, RouterModule diff --git a/apps/client/src/app/services/admin.service.ts b/apps/client/src/app/services/admin.service.ts index cb72fb9fd..670535291 100644 --- a/apps/client/src/app/services/admin.service.ts +++ b/apps/client/src/app/services/admin.service.ts @@ -246,6 +246,10 @@ export class AdminService { ); } + public syncDemoUserAccount() { + return this.http.get(`/api/v1/admin/demo-user/sync`); + } + public testMarketData({ dataSource, scraperConfiguration, diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 06ff59bb7..a3b129b55 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -76,8 +76,6 @@ export const DERIVED_CURRENCIES = [ } ]; -export const EMERGENCY_FUND_TAG_ID = '4452656d-9fa4-4bd0-ba38-70492e31d180'; - export const GATHER_ASSET_PROFILE_PROCESS_JOB_NAME = 'GATHER_ASSET_PROFILE'; export const GATHER_ASSET_PROFILE_PROCESS_JOB_OPTIONS: JobOptions = { attempts: 12, @@ -122,7 +120,9 @@ export const PROPERTY_CURRENCIES = 'CURRENCIES'; export const PROPERTY_DATA_SOURCE_MAPPING = 'DATA_SOURCE_MAPPING'; export const PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS = 'DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS'; +export const PROPERTY_DEMO_ACCOUNT_ID = 'DEMO_ACCOUNT_ID'; export const PROPERTY_DEMO_USER_ID = 'DEMO_USER_ID'; +export const PROPERTY_DEMO_USER_ID_LEGACY = 'DEMO_USER_ID_LEGACY'; export const PROPERTY_IS_DATA_GATHERING_ENABLED = 'IS_DATA_GATHERING_ENABLED'; export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE'; export const PROPERTY_IS_USER_SIGNUP_ENABLED = 'IS_USER_SIGNUP_ENABLED'; @@ -171,4 +171,7 @@ export const SUPPORTED_LANGUAGE_CODES = [ 'zh' ]; +export const TAG_ID_EMERGENCY_FUND = '4452656d-9fa4-4bd0-ba38-70492e31d180'; +export const TAG_ID_DEMO = 'efa08cb3-9b9d-4974-ac68-db13a19c4874'; + export const UNKNOWN_KEY = 'UNKNOWN'; diff --git a/libs/common/src/lib/permissions.ts b/libs/common/src/lib/permissions.ts index 592167562..8f8a10427 100644 --- a/libs/common/src/lib/permissions.ts +++ b/libs/common/src/lib/permissions.ts @@ -45,6 +45,7 @@ export const permissions = { readTags: 'readTags', readWatchlist: 'readWatchlist', reportDataGlitch: 'reportDataGlitch', + syncDemoUserAccount: 'syncDemoUserAccount', toggleReadOnlyMode: 'toggleReadOnlyMode', updateAccount: 'updateAccount', updateAuthDevice: 'updateAuthDevice', From cb7326edb37ba3b2ededeba37e5844ef85247018 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 31 May 2025 11:00:18 +0200 Subject: [PATCH 24/81] Release 2.165.0 (#4799) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e9b99fad..b98444e2c 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.165.0 - 2025-05-31 ### Added diff --git a/package-lock.json b/package-lock.json index 3a920234a..47c6bcd04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.164.0", + "version": "2.165.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.164.0", + "version": "2.165.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 84c12ab76..6624fa7b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.164.0", + "version": "2.165.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From b66e60e9f4d8958782cd1f8ff23b8fe94abd34e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 31 May 2025 14:23:59 +0200 Subject: [PATCH 25/81] Feature/update locales (#4798) * Update locales * Update translations * Update changelog --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 6 ++++++ apps/client/src/locales/messages.ca.xlf | 26 ++++++++++++++++++----- apps/client/src/locales/messages.de.xlf | 28 +++++++++++++++++++------ apps/client/src/locales/messages.es.xlf | 26 ++++++++++++++++++----- apps/client/src/locales/messages.fr.xlf | 26 ++++++++++++++++++----- apps/client/src/locales/messages.it.xlf | 26 ++++++++++++++++++----- apps/client/src/locales/messages.nl.xlf | 26 ++++++++++++++++++----- apps/client/src/locales/messages.pl.xlf | 26 ++++++++++++++++++----- apps/client/src/locales/messages.pt.xlf | 26 ++++++++++++++++++----- apps/client/src/locales/messages.tr.xlf | 26 ++++++++++++++++++----- apps/client/src/locales/messages.uk.xlf | 26 ++++++++++++++++++----- apps/client/src/locales/messages.xlf | 24 ++++++++++++++++----- apps/client/src/locales/messages.zh.xlf | 26 ++++++++++++++++++----- 13 files changed, 257 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b98444e2c..b3afa9d26 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 German (`de`) + ## 2.165.0 - 2025-05-31 ### Added diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index f2d1ea26b..948e56414 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1591,7 +1591,7 @@ Està segur qeu vol eliminar aquest cupó? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142
@@ -1599,7 +1599,7 @@ Està segur que vol eliminar aquest missatge del sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -1607,7 +1607,7 @@ Està segur que vol depurar el cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1615,7 +1615,7 @@ Si us plau, afegeixi el seu missatge del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1735,7 +1735,7 @@ Depurar el Cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -7604,6 +7604,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 41e77aac6..7709a8a13 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -634,7 +634,7 @@ Möchtest du diesen Gutscheincode wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -642,7 +642,7 @@ Möchtest du den Cache wirklich leeren? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -650,7 +650,7 @@ Bitte gebe deine Systemmeldung ein: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -762,7 +762,7 @@ Cache leeren apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -5732,7 +5732,7 @@ Möchtest du diese Systemmeldung wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -7597,13 +7597,29 @@ changelog - changelog + changelog kebab-case libs/common/src/lib/paths.ts 37 + + Demo user account has been synced. + Demo Benutzerkonto wurde synchronisiert. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Synchronisiere Demo Benutzerkonto + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 0a3721ea6..2f61747c4 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -635,7 +635,7 @@ ¿Estás seguro de eliminar este cupón? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -643,7 +643,7 @@ ¿Estás seguro de limpiar la caché? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -651,7 +651,7 @@ Por favor, establece tu mensaje del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -747,7 +747,7 @@ Limpiar caché apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -5709,7 +5709,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -7605,6 +7605,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 6aa3e880e..5e5efaf52 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -874,7 +874,7 @@ Voulez-vous vraiment supprimer ce code promotionnel ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -882,7 +882,7 @@ Voulez-vous vraiment vider le cache ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -890,7 +890,7 @@ Veuillez définir votre message système : apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1006,7 +1006,7 @@ Vider le Cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -5708,7 +5708,7 @@ Confirmer la suppresion de ce message système? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -7604,6 +7604,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index c3da10365..b90afc752 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -635,7 +635,7 @@ Vuoi davvero eliminare questo buono? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -643,7 +643,7 @@ Vuoi davvero svuotare la cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -651,7 +651,7 @@ Imposta il messaggio di sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -747,7 +747,7 @@ Svuota la cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -5709,7 +5709,7 @@ Confermi di voler cancellare questo messaggio di sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -7605,6 +7605,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 31e76dc0f..72ac1e155 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -634,7 +634,7 @@ Wil je deze coupon echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -642,7 +642,7 @@ Wil je echt de cache legen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -650,7 +650,7 @@ Stel je systeemboodschap in: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -746,7 +746,7 @@ Cache legen apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -5708,7 +5708,7 @@ Wilt u dit systeembericht echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -7604,6 +7604,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 571b27c12..8d426ecd9 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -1415,7 +1415,7 @@ Czy naprawdę chcesz usunąć ten kupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -1423,7 +1423,7 @@ Czy naprawdę chcesz usunąć tę wiadomość systemową? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -1431,7 +1431,7 @@ Czy naprawdę chcesz wyczyścić pamięć podręczną? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1439,7 +1439,7 @@ Proszę ustawić swoją wiadomość systemową: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1547,7 +1547,7 @@ Wyczyszczenie pamięci podręcznej apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -7604,6 +7604,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index d976102c4..804a0c31a 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -778,7 +778,7 @@ Deseja realmente eliminar este cupão? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -786,7 +786,7 @@ Deseja realmente limpar a cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -794,7 +794,7 @@ Por favor, defina a sua mensagem do sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -878,7 +878,7 @@ Limpar Cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -5708,7 +5708,7 @@ Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -7604,6 +7604,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index e98de40cf..7a26eac52 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1323,7 +1323,7 @@ Önbelleği temizlemeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -1331,7 +1331,7 @@ Önbelleği temizlemeyi gerçekten istiyor musunuz apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1339,7 +1339,7 @@ Lütfen sistem mesajınızı belirleyin: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1455,7 +1455,7 @@ Önbelleği temizle apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -5708,7 +5708,7 @@ Bu sistem mesajını silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -7604,6 +7604,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index b9efb87bc..d5ca1c3c8 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1587,7 +1587,7 @@ Ви дійсно хочете видалити цей купон? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -1595,7 +1595,7 @@ Ви дійсно хочете видалити це системне повідомлення? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -1603,7 +1603,7 @@ Ви дійсно хочете очистити кеш? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1611,7 +1611,7 @@ Будь ласка, встановіть ваше системне повідомлення: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1723,7 +1723,7 @@ Очистити кеш apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -7604,6 +7604,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 736d8af54..3a1be97e4 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1356,28 +1356,28 @@ Do you really want to delete this coupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 Do you really want to flush the cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 Please set your system message: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1472,7 +1472,7 @@ Flush Cache apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -6838,6 +6838,20 @@ 37 + + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + + + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 60fa676aa..fb53750cf 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -1424,7 +1424,7 @@ 您确实要删除此优惠券吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 134 + 142 @@ -1432,7 +1432,7 @@ 您真的要删除这条系统消息吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 147 + 155 @@ -1440,7 +1440,7 @@ 您真的要刷新缓存吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 171 + 179 @@ -1448,7 +1448,7 @@ 请设置您的系统消息: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 191 + 199 @@ -1556,7 +1556,7 @@ 刷新缓存 apps/client/src/app/components/admin-overview/admin-overview.html - 174 + 186 @@ -7605,6 +7605,22 @@ 37 + + Demo user account has been synced. + Demo user account has been synced. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 223 + + + + Sync Demo User Account + Sync Demo User Account + + apps/client/src/app/components/admin-overview/admin-overview.html + 181 + + From 32baf1946ce14d72d048ec076868c0004258788d Mon Sep 17 00:00:00 2001 From: Aris Hadrian Date: Sat, 31 May 2025 13:23:53 -0700 Subject: [PATCH 26/81] Feature/improve language localization for UK 20250531 (#4802) * Improve language localization for UK * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.uk.xlf | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3afa9d26..cb675c0e2 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 language localization for German (`de`) +- Improved the language localization for Ukrainian (`uk`) ## 2.165.0 - 2025-05-31 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index d5ca1c3c8..3ab04d5ef 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -2220,7 +2220,7 @@ Change with currency effect Change - Зміна з урахуванням валютного ефекту Зміна + Зміна з урахуванням валютного ефекту Зміна apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 50 @@ -2228,7 +2228,7 @@ Performance with currency effect Performance - Прибутковість з урахуванням валютного ефекту валюти Прибутковість + Прибутковість з урахуванням валютного ефекту валюти Прибутковість apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 69 @@ -6656,7 +6656,7 @@ Get access to 80’000+ tickers from over 50 exchanges - Отримайте доступ до 100 000+ тікерів з понад 50 бірж + Отримайте доступ до 80 000+ тікерів з понад 50 бірж libs/ui/src/lib/i18n.ts 24 From 9757df859fa43331d034f517b4c62c303d25f738 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 1 Jun 2025 09:01:23 +0200 Subject: [PATCH 27/81] Feature/improve data providers management style of admin control panel (#4804) * Various style improvements --- .../admin-settings/admin-settings.component.html | 7 +++---- .../admin-settings/admin-settings.component.scss | 13 +++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.html b/apps/client/src/app/components/admin-settings/admin-settings.component.html index 2dcdefdd0..2d577d582 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.html +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -23,7 +23,7 @@ [enableLink]="false" /> @if (isGhostfolioApiKeyValid === false) { - Early Access } @@ -105,12 +105,11 @@ } @else if (isGhostfolioApiKeyValid === false) { } } diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.scss b/apps/client/src/app/components/admin-settings/admin-settings.component.scss index c08ba95bc..384143300 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.scss +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.scss @@ -1,6 +1,19 @@ :host { display: block; + button { + &.special { + background: linear-gradient(45deg, rgb(228, 94, 237), rgb(104, 94, 237)); + color: #fff; + } + } + + .badge { + &.early-access { + border: 1px solid var(--mat-table-row-item-outline-color); + } + } + .mat-mdc-progress-bar { --mdc-linear-progress-active-indicator-height: 0.5rem; --mdc-linear-progress-track-height: 0.5rem; From ef8bbf1ae8284e3702c9eb6cfca0f4496dfb3d36 Mon Sep 17 00:00:00 2001 From: Fabio Carlos Date: Sun, 1 Jun 2025 00:48:24 -0700 Subject: [PATCH 28/81] Feature/improve language localization for TR 20250531 (#4803) * Improve language localization for TR * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.tr.xlf | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb675c0e2..4d62dc94c 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 language localization for German (`de`) +- Improved the language localization for Turkish (`tr`) - Improved the language localization for Ukrainian (`uk`) ## 2.165.0 - 2025-05-31 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 7a26eac52..6676ad3bc 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1320,7 +1320,7 @@ Do you really want to delete this coupon? - Önbelleği temizlemeyi gerçekten istiyor musunuz? + Bu kuponu gerçekten silmek istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts 142 @@ -1328,7 +1328,7 @@ Do you really want to flush the cache? - Önbelleği temizlemeyi gerçekten istiyor musunuz + Önbelleği temizlemeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts 179 @@ -1548,7 +1548,7 @@ Do you really want to delete this user? - Bu kullanıcıyı silmeyi gerçekten istiyor musunu? + Bu kullanıcıyı silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-users/admin-users.component.ts 142 @@ -1744,7 +1744,7 @@ Get started - Haydi Başlayalım + Haydi Başlayalım apps/client/src/app/components/header/header.component.html 420 From 7342e7e5ec15b8269dc2dfc51bc50e0f1a8d7d80 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 1 Jun 2025 09:49:37 +0200 Subject: [PATCH 29/81] Feature/support creating custom tags in create or update activity dialog (#4801) * Support creating custom tags in create or update activity dialog * Update changelog --- CHANGELOG.md | 4 ++ .../holding-detail-dialog.component.ts | 7 ++-- .../holding-detail-dialog.html | 4 +- ...ate-or-update-activity-dialog.component.ts | 37 ++++++++++++++++++- .../create-or-update-activity-dialog.html | 3 +- 5 files changed, 46 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d62dc94c..92a277712 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 create custom tags in the create or update activity dialog (experimental) + ### Changed - Improved the language localization for German (`de`) 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 d866275c0..cdaea83dc 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 @@ -452,10 +452,9 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { if (state?.user) { this.user = state.user; - this.hasPermissionToCreateOwnTag = hasPermission( - this.user.permissions, - permissions.createOwnTag - ); + this.hasPermissionToCreateOwnTag = + hasPermission(this.user.permissions, permissions.createOwnTag) && + this.user?.settings?.isExperimentalFeatures; this.tagsAvailable = this.user?.tags?.map((tag) => { 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 55ebbcd78..0f6c46a80 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 @@ -388,9 +388,7 @@ , public dialogRef: MatDialogRef, private formBuilder: FormBuilder, - @Inject(MAT_DATE_LOCALE) private locale: string + @Inject(MAT_DATE_LOCALE) private locale: string, + private userService: UserService ) {} public ngOnInit() { this.currencyOfAssetProfile = this.data.activity?.SymbolProfile?.currency; + this.hasPermissionToCreateOwnTag = + this.data.user?.settings?.isExperimentalFeatures && + hasPermission(this.data.user?.permissions, permissions.createOwnTag); this.locale = this.data.user?.settings?.locale; this.mode = this.data.activity?.id ? 'update' : 'create'; @@ -219,6 +226,34 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { this.changeDetectorRef.markForCheck(); }); + this.activityForm.get('tags').valueChanges.subscribe((tags: Tag[]) => { + const newTag = tags.find(({ id }) => { + return id === undefined; + }); + + if (newTag && this.hasPermissionToCreateOwnTag) { + this.dataService + .postTag({ ...newTag, userId: this.data.user.id }) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe((tag) => { + this.activityForm.get('tags').setValue( + tags.map((currentTag) => { + if (currentTag.id === undefined) { + return tag; + } + + return currentTag; + }) + ); + + this.userService + .get(true) + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(); + }); + } + }); + this.activityForm .get('type') .valueChanges.pipe(takeUntil(this.unsubscribeSubject)) 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 08e1b5162..985394a40 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 @@ -313,8 +313,9 @@ -
+
Date: Sun, 1 Jun 2025 09:50:08 +0200 Subject: [PATCH 30/81] Feature/improve style of system message (#4806) * Improve style of system message * Update changelog --- CHANGELOG.md | 1 + apps/client/src/app/app.component.html | 2 +- apps/client/src/app/app.component.scss | 6 ++++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92a277712..2c5a2771d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Improved the style of the system message - Improved the language localization for German (`de`) - Improved the language localization for Turkish (`tr`) - Improved the language localization for Ukrainian (`uk`) diff --git a/apps/client/src/app/app.component.html b/apps/client/src/app/app.component.html index a04e457ba..9680d0830 100644 --- a/apps/client/src/app/app.component.html +++ b/apps/client/src/app/app.component.html @@ -10,7 +10,7 @@ (click)="onCreateAccount()" > You are using the Live Demo. - Create Account + Create Account
} diff --git a/apps/client/src/app/app.component.scss b/apps/client/src/app/app.component.scss index 241d3331e..f848fe6ff 100644 --- a/apps/client/src/app/app.component.scss +++ b/apps/client/src/app/app.component.scss @@ -15,12 +15,14 @@ z-index: 999; .info-message { - color: rgba(var(--palette-foreground-text), 1); + color: rgba(var(--light-primary-text)); font-size: 80%; + font-weight: 500; max-width: 100%; .a { - font-weight: 500; + border: 1px solid rgba(var(--light-primary-text)); + border-radius: 0.25rem; } } } From c59d2701f0896580cb3a017d81dc127cd08afa08 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 1 Jun 2025 09:52:52 +0200 Subject: [PATCH 31/81] Feature/update locales (#4807) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 12 ++++++------ apps/client/src/locales/messages.de.xlf | 12 ++++++------ apps/client/src/locales/messages.es.xlf | 12 ++++++------ apps/client/src/locales/messages.fr.xlf | 12 ++++++------ apps/client/src/locales/messages.it.xlf | 12 ++++++------ apps/client/src/locales/messages.nl.xlf | 12 ++++++------ apps/client/src/locales/messages.pl.xlf | 12 ++++++------ apps/client/src/locales/messages.pt.xlf | 12 ++++++------ apps/client/src/locales/messages.tr.xlf | 12 ++++++------ apps/client/src/locales/messages.uk.xlf | 12 ++++++------ apps/client/src/locales/messages.xlf | 12 ++++++------ apps/client/src/locales/messages.zh.xlf | 12 ++++++------ 12 files changed, 72 insertions(+), 72 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 948e56414..d667f6ceb 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1123,7 +1123,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1171,7 +1171,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1803,7 +1803,7 @@ Plataformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -1811,7 +1811,7 @@ Etiquetes apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2231,7 +2231,7 @@ Informar d’un Problema amb les Dades apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -6893,7 +6893,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 7709a8a13..5ee8eb1d7 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -534,7 +534,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -582,7 +582,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1338,7 +1338,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1354,7 +1354,7 @@ Datenfehler melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -3966,7 +3966,7 @@ Plattformen apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -6917,7 +6917,7 @@ API-Schlüssel setzen apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 2f61747c4..85a13ca73 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -535,7 +535,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -583,7 +583,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1323,7 +1323,7 @@ Etiquetas apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1339,7 +1339,7 @@ Reporta un anomalía de los datos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -3943,7 +3943,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -6894,7 +6894,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 5e5efaf52..01593fe6d 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -590,7 +590,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -638,7 +638,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -930,7 +930,7 @@ Étiquettes apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1682,7 +1682,7 @@ Signaler une Erreur de Données apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -3942,7 +3942,7 @@ Platformes apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -6893,7 +6893,7 @@ Définir clé API apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index b90afc752..cef21a5b1 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -535,7 +535,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -583,7 +583,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1323,7 +1323,7 @@ Tag apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1339,7 +1339,7 @@ Segnala un’anomalia dei dati apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -3943,7 +3943,7 @@ Piattaforme apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -6894,7 +6894,7 @@ Imposta API Key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 72ac1e155..7b27a8cfe 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -534,7 +534,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -582,7 +582,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1322,7 +1322,7 @@ Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1338,7 +1338,7 @@ Gegevensstoring melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -3942,7 +3942,7 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -6893,7 +6893,7 @@ API-sleutel instellen apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 8d426ecd9..140e35872 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -1015,7 +1015,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1063,7 +1063,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1635,7 +1635,7 @@ Platformy apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -1643,7 +1643,7 @@ Tagi apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2403,7 +2403,7 @@ Zgłoś Błąd Danych apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -6893,7 +6893,7 @@ Skonfiguruj klucz API apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 804a0c31a..1b079bcd0 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -590,7 +590,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -638,7 +638,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1626,7 +1626,7 @@ Marcadores apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1642,7 +1642,7 @@ Dados do Relatório com Problema apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -3942,7 +3942,7 @@ Plataformas apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -6893,7 +6893,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 6676ad3bc..e044b4211 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -979,7 +979,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1027,7 +1027,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1379,7 +1379,7 @@ Etiketler apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -1543,7 +1543,7 @@ Platformlar apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -2247,7 +2247,7 @@ Rapor Veri Sorunu apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -6893,7 +6893,7 @@ API anahtarını ayarla apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 3ab04d5ef..88be53938 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1467,7 +1467,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1515,7 +1515,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1835,7 +1835,7 @@ Встановити ключ API apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 @@ -1843,7 +1843,7 @@ Платформи apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -1851,7 +1851,7 @@ Теги apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2343,7 +2343,7 @@ Повідомити про збій даних apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 3a1be97e4..e0772a40f 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -965,7 +965,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1012,7 +1012,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1553,14 +1553,14 @@ Platforms apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 Tags apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2243,7 +2243,7 @@ Report Data Glitch apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -6233,7 +6233,7 @@ Set API key apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index fb53750cf..391ec6d26 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -1024,7 +1024,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 336 + 337 apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.html @@ -1072,7 +1072,7 @@ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html - 343 + 344 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -1644,7 +1644,7 @@ 平台 apps/client/src/app/components/admin-settings/admin-settings.component.html - 137 + 136 @@ -1652,7 +1652,7 @@ 标签 apps/client/src/app/components/admin-settings/admin-settings.component.html - 143 + 142 libs/ui/src/lib/tags-selector/tags-selector.component.html @@ -2412,7 +2412,7 @@ 报告数据故障 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 409 + 407 @@ -6894,7 +6894,7 @@ 设置 API 密钥 apps/client/src/app/components/admin-settings/admin-settings.component.html - 113 + 112 From 8b8d19438385993915b012610bbdff0af1f2fd55 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:24:19 +0200 Subject: [PATCH 32/81] Feature/clean up legacy demo user id property (#4808) * Clean up --- apps/api/src/app/info/info.service.ts | 4 ++-- libs/common/src/lib/config.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 1f7b39d9b..9581807b9 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -11,7 +11,7 @@ import { HEADER_KEY_TOKEN, PROPERTY_BETTER_UPTIME_MONITOR_ID, PROPERTY_COUNTRIES_OF_SUBSCRIBERS, - PROPERTY_DEMO_USER_ID_LEGACY, + PROPERTY_DEMO_USER_ID, PROPERTY_IS_READ_ONLY_MODE, PROPERTY_SLACK_COMMUNITY_USERS, ghostfolioFearAndGreedIndexDataSource @@ -237,7 +237,7 @@ export class InfoService { private async getDemoAuthToken() { const demoUserId = (await this.propertyService.getByKey( - PROPERTY_DEMO_USER_ID_LEGACY + PROPERTY_DEMO_USER_ID )) as string; if (demoUserId) { diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index a3b129b55..e124360a1 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -122,7 +122,6 @@ export const PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS = 'DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS'; export const PROPERTY_DEMO_ACCOUNT_ID = 'DEMO_ACCOUNT_ID'; export const PROPERTY_DEMO_USER_ID = 'DEMO_USER_ID'; -export const PROPERTY_DEMO_USER_ID_LEGACY = 'DEMO_USER_ID_LEGACY'; export const PROPERTY_IS_DATA_GATHERING_ENABLED = 'IS_DATA_GATHERING_ENABLED'; export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE'; export const PROPERTY_IS_USER_SIGNUP_ENABLED = 'IS_USER_SIGNUP_ENABLED'; From 15deed303255405cd482b138aa5854251b097ba3 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:32:43 +0200 Subject: [PATCH 33/81] Feature/upgrade Stripe dependencies 20250529 (#4662) * Upgrade Stripe dependencies * Upgrade ngx-stripe to version 19.7.0 * Update changelog --- CHANGELOG.md | 2 ++ .../app/subscription/subscription.service.ts | 2 +- package-lock.json | 35 +++++++++++-------- package.json | 6 ++-- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c5a2771d..55257d015 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the language localization for German (`de`) - Improved the language localization for Turkish (`tr`) - Improved the language localization for Ukrainian (`uk`) +- Upgraded the _Stripe_ dependencies +- Upgraded `ngx-stripe` from version `19.0.0` to `19.7.0` ## 2.165.0 - 2025-05-31 diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 063c40608..2e5724c96 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -32,7 +32,7 @@ export class SubscriptionService { this.stripe = new Stripe( this.configurationService.get('STRIPE_SECRET_KEY'), { - apiVersion: '2024-09-30.acacia' + apiVersion: '2025-04-30.basil' } ); } diff --git a/package-lock.json b/package-lock.json index 47c6bcd04..6fc2a8887 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "@prisma/client": "6.8.2", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", - "@stripe/stripe-js": "5.4.0", + "@stripe/stripe-js": "7.3.0", "alphavantage": "2.2.0", "big.js": "7.0.1", "bootstrap": "4.6.2", @@ -76,7 +76,7 @@ "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", - "ngx-stripe": "19.0.0", + "ngx-stripe": "19.7.0", "open-color": "1.9.1", "papaparse": "5.3.1", "passport": "0.7.0", @@ -85,7 +85,7 @@ "passport-jwt": "4.0.1", "reflect-metadata": "0.2.2", "rxjs": "7.8.1", - "stripe": "17.3.0", + "stripe": "18.1.0", "svgmap": "2.12.2", "twitter-api-v2": "1.23.0", "uuid": "11.1.0", @@ -12113,9 +12113,9 @@ } }, "node_modules/@stripe/stripe-js": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-5.4.0.tgz", - "integrity": "sha512-3tfMbSvLGB+OsJ2MsjWjWo+7sp29dwx+3+9kG/TEnZQJt+EwbF/Nomm43cSK+6oXZA9uhspgyrB+BbrPRumx4g==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-7.3.0.tgz", + "integrity": "sha512-xnCyFIEI5SQnQrKkCxVj7nS5fWTZap+zuIGzmmxLMdlmgahFJaihK4zogqE8YyKKTLtrp/EldkEijSgtXsRVDg==", "license": "MIT", "engines": { "node": ">=12.16" @@ -27148,9 +27148,9 @@ } }, "node_modules/ngx-stripe": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/ngx-stripe/-/ngx-stripe-19.0.0.tgz", - "integrity": "sha512-Q95EnHcEjZrHg4f4XMwMhRlJNg/jenBfypk9JISC3T4R2hc+J6HS2NMHBuft9hfRepKrcQY+FiSLzH2yS+5cAg==", + "version": "19.7.0", + "resolved": "https://registry.npmjs.org/ngx-stripe/-/ngx-stripe-19.7.0.tgz", + "integrity": "sha512-WQ7IMJT1LmQEa/3y0blAEvbPbtASrIdSGPGC69bodcEEXpKVkEUVEklYKEsJHFMFPqIU36lMA8iue0bfyxuMpA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -27158,7 +27158,7 @@ "peerDependencies": { "@angular/common": ">=19.0.0 <20.0.0", "@angular/core": ">=19.0.0 <20.0.0", - "@stripe/stripe-js": ">=5.0.0 <6.0.0" + "@stripe/stripe-js": ">=7.0.0 <8.0.0" } }, "node_modules/no-case": { @@ -32716,16 +32716,23 @@ } }, "node_modules/stripe": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-17.3.0.tgz", - "integrity": "sha512-WACmytj1MssbIwGwPfAomo61jgldb2B/cB6A3W/Bqs9zId1olVcAa8X7HERkqpw4190GSsbvrD7KnkZogatyvw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-18.1.0.tgz", + "integrity": "sha512-MLDiniPTHqcfIT3anyBPmOEcaiDhYa7/jRaNypQ3Rt2SJnayQZBvVbFghIziUCZdltGAndm/ZxVOSw6uuSCDig==", "license": "MIT", "dependencies": { - "@types/node": ">=8.1.0", "qs": "^6.11.0" }, "engines": { "node": ">=12.*" + }, + "peerDependencies": { + "@types/node": ">=12.x.x" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/strtok3": { diff --git a/package.json b/package.json index 6624fa7b7..f9c862cf3 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "@prisma/client": "6.8.2", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", - "@stripe/stripe-js": "5.4.0", + "@stripe/stripe-js": "7.3.0", "alphavantage": "2.2.0", "big.js": "7.0.1", "bootstrap": "4.6.2", @@ -122,7 +122,7 @@ "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", - "ngx-stripe": "19.0.0", + "ngx-stripe": "19.7.0", "open-color": "1.9.1", "papaparse": "5.3.1", "passport": "0.7.0", @@ -131,7 +131,7 @@ "passport-jwt": "4.0.1", "reflect-metadata": "0.2.2", "rxjs": "7.8.1", - "stripe": "17.3.0", + "stripe": "18.1.0", "svgmap": "2.12.2", "twitter-api-v2": "1.23.0", "uuid": "11.1.0", From a11fef5e236da2832326918cf2c5ac809689af15 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 3 Jun 2025 07:51:38 +0200 Subject: [PATCH 34/81] Bugfix/fix exception with currencies in historical market data editor of admin control panel (#4813) * Fix exception with currencies * Update changelog --- CHANGELOG.md | 4 ++++ .../src/app/endpoints/market-data/market-data.controller.ts | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55257d015..35489f228 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Upgraded the _Stripe_ dependencies - Upgraded `ngx-stripe` from version `19.0.0` to `19.7.0` +### Fixed + +- Fixed an exception with currencies in the historical market data editor of the admin control panel + ## 2.165.0 - 2025-05-31 ### Added diff --git a/apps/api/src/app/endpoints/market-data/market-data.controller.ts b/apps/api/src/app/endpoints/market-data/market-data.controller.ts index 933e70e9d..96fca1b3c 100644 --- a/apps/api/src/app/endpoints/market-data/market-data.controller.ts +++ b/apps/api/src/app/endpoints/market-data/market-data.controller.ts @@ -85,7 +85,7 @@ export class MarketDataController { { dataSource, symbol } ]); - if (!assetProfile) { + if (!assetProfile && !isCurrency(getCurrencyFromSymbol(symbol))) { throw new HttpException( getReasonPhrase(StatusCodes.NOT_FOUND), StatusCodes.NOT_FOUND @@ -103,7 +103,7 @@ export class MarketDataController { ); const canUpsertOwnAssetProfile = - assetProfile.userId === this.request.user.id && + assetProfile?.userId === this.request.user.id && hasPermission( this.request.user.permissions, permissions.createMarketDataOfOwnAssetProfile From 3efe09d3eb9c1182deec1d9e91cf99d4cc926633 Mon Sep 17 00:00:00 2001 From: Fabio Carlos Date: Tue, 3 Jun 2025 00:52:23 -0500 Subject: [PATCH 35/81] Feature/improve language localization for ES 20250602 (#4814) * Improve language localization for ES * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.es.xlf | 40 ++++++++++++------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35489f228..cdaa14f02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Improved the style of the system message - Improved the language localization for German (`de`) +- Improved the language localization for Spanish (`es`) - Improved the language localization for Turkish (`tr`) - Improved the language localization for Ukrainian (`uk`) - Upgraded the _Stripe_ dependencies diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 85a13ca73..45c3e2c56 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -5269,7 +5269,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. - 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. + ¿Estás buscando una alternativa de código abierto a ? Ghostfolio es una potente herramienta de gestión de carteras que ofrece a los usuarios una plataforma integral para rastrear, analizar y optimizar sus inversiones. Ya seas un inversor con experiencia o estés comenzando, Ghostfolio ofrece una interfaz intuitiva y una amplia gama de funcionalidades para ayudarte a tomar decisiones informadas y tener el control de tu futuro financiero. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 18 @@ -5277,7 +5277,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 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 es un software de código abierto (OSS), que ofrece una alternativa rentable a lo que lo hace especialmente adecuado para personas con un presupuesto ajustado, como aquellas que buscan la Independencia Financiera y Jubilación Anticipada (FIRE). Al aprovechar los esfuerzos colectivos de una comunidad de desarrolladores y entusiastas de las finanzas personales, Ghostfolio mejora continuamente sus capacidades, seguridad y experiencia de usuario. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 32 @@ -5285,7 +5285,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. - 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. + Analicemos en detalle la tabla comparativa entre Ghostfolio y que encontrarás a continuación, para obtener una comprensión completa de cómo se posiciona Ghostfolio en relación con . Exploraremos diversos aspectos como funcionalidades, privacidad de los datos, precios y más, lo que te permitirá tomar una decisión bien fundamentada según tus necesidades personales. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 43 @@ -5302,7 +5302,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. - 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. + Ten en cuenta que la información proporcionada en la tabla comparativa entre Ghostfolio y se basa en nuestra investigación y análisis independientes. Este sitio web no está afiliado con ni con ningún otro producto mencionado en la comparación. Dado que el panorama de las herramientas de finanzas personales evoluciona constantemente, es fundamental verificar cualquier detalle específico o cambio directamente en la página oficial del producto correspondiente. ¿Los datos necesitan una actualización? Ayúdanos a mantener la información precisa en GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 311 @@ -5318,7 +5318,7 @@ Get Started - Get Started + Comenzar apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 333 @@ -5326,7 +5326,7 @@ Switzerland - Switzerland + Suiza apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 59 @@ -5338,7 +5338,7 @@ Global - Global + Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 60 @@ -5350,7 +5350,7 @@ (Last 24 hours) - (Last 24 hours) + (Últimas 24 horas) apps/client/src/app/pages/open/open-page.html 37 @@ -5358,7 +5358,7 @@ (Last 30 days) - (Last 30 days) + (Últimos 30 días) apps/client/src/app/pages/open/open-page.html 48 @@ -5370,7 +5370,7 @@ (Last 90 days) - (Last 90 days) + (Últimos 90 días) apps/client/src/app/pages/open/open-page.html 127 @@ -5378,7 +5378,7 @@ Choose or drop a file here - Choose or drop a file here + Elige o suelta un archivo aquí apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 84 @@ -5386,7 +5386,7 @@ You are using the Live Demo. - You are using the Live Demo. + Estás usando la demostración en vivo. apps/client/src/app/app.component.html 12 @@ -5394,7 +5394,7 @@ One-time fee, annual account fees - One-time fee, annual account fees + Tarifa única, tarifas anuales de la cuenta apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 33 @@ -5402,7 +5402,7 @@ Distribution of corporate earnings - Distribution of corporate earnings + Distribución de ganancias corporativas apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 41 @@ -5410,7 +5410,7 @@ Fee - Fee + Tarifa libs/ui/src/lib/i18n.ts 37 @@ -5418,7 +5418,7 @@ Interest - Interest + Interés apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 307 @@ -5426,7 +5426,7 @@ Revenue for lending out money - Revenue for lending out money + Ingresos por prestar dinero apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 49 @@ -5434,7 +5434,7 @@ Add Tag - Add Tag + Agregar etiqueta apps/client/src/app/components/admin-tag/admin-tag.component.html 8 @@ -5442,7 +5442,7 @@ Do you really want to delete this tag? - Do you really want to delete this tag? + ¿Realmente deseas eliminar esta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts 85 @@ -5450,7 +5450,7 @@ Update tag - Update tag + Actualizar etiqueta apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 8 From de56a351977e73c2b45635638289cdc4085ce3cc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 08:39:43 +0200 Subject: [PATCH 36/81] Feature/update locales (#4819) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.es.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 45c3e2c56..21457ce5a 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -5302,7 +5302,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. - Ten en cuenta que la información proporcionada en la tabla comparativa entre Ghostfolio y se basa en nuestra investigación y análisis independientes. Este sitio web no está afiliado con ni con ningún otro producto mencionado en la comparación. Dado que el panorama de las herramientas de finanzas personales evoluciona constantemente, es fundamental verificar cualquier detalle específico o cambio directamente en la página oficial del producto correspondiente. ¿Los datos necesitan una actualización? Ayúdanos a mantener la información precisa en GitHub. + Ten en cuenta que la información proporcionada en la tabla comparativa entre Ghostfolio y se basa en nuestra investigación y análisis independientes. Este sitio web no está afiliado con ni con ningún otro producto mencionado en la comparación. Dado que el panorama de las herramientas de finanzas personales evoluciona constantemente, es fundamental verificar cualquier detalle específico o cambio directamente en la página oficial del producto correspondiente. ¿Los datos necesitan una actualización? Ayúdanos a mantener la información precisa en GitHub. apps/client/src/app/pages/resources/personal-finance-tools/product-page.html 311 From 5c617f761a6697473048e40da090ba7710b66981 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:11:55 +0200 Subject: [PATCH 37/81] Feature/clean up Dockerfile (#4811) * Clean up --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 922b880e3..89121eee5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,14 +38,14 @@ RUN npm run build:production # Prepare the dist image with additional node_modules WORKDIR /ghostfolio/dist/apps/api # package.json was generated by the build process, however the original -# package-lock.json needs to be used to ensure the same versions +# package-lock.json needs to be used to ensure the same versions COPY ./package-lock.json /ghostfolio/dist/apps/api/package-lock.json RUN npm install COPY prisma /ghostfolio/dist/apps/api/prisma # Overwrite the generated package.json with the original one to ensure having -# all the scripts +# all the scripts COPY package.json /ghostfolio/dist/apps/api RUN npm run database:generate-typings From 9366aea9d528f162d6c3bf5f6f54443d36387f95 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 3 Jun 2025 15:55:16 +0200 Subject: [PATCH 38/81] Feature/improve style of card components (#4812) * Improve style of title * Update changelog --- CHANGELOG.md | 1 + apps/client/src/styles.scss | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdaa14f02..d7623113a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Improved the style of the card components - Improved the style of the system message - Improved the language localization for German (`de`) - Improved the language localization for Spanish (`es`) diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index b4723d377..1975b02b3 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -414,6 +414,14 @@ ngx-skeleton-loader { } } +.mat-mdc-card { + .mat-mdc-card-title { + --mat-card-title-text-line-height: 1.2; + + margin-bottom: 0.5rem; + } +} + .mat-mdc-checkbox { label { margin-bottom: 0; From ccee5b13375ec958632cb06313883c4971e0b500 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 4 Jun 2025 08:53:17 +0200 Subject: [PATCH 39/81] Bugfix/respect filter by holding when deleting activities (#4823) * Respect filter by holding when deleting activities * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/order/order.controller.ts | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7623113a..4ab9c06e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Respected the filter by holding when deleting activities on the portfolio activities page - Fixed an exception with currencies in the historical market data editor of the admin control panel ## 2.165.0 - 2025-05-31 diff --git a/apps/api/src/app/order/order.controller.ts b/apps/api/src/app/order/order.controller.ts index 2c4a58596..198850b6b 100644 --- a/apps/api/src/app/order/order.controller.ts +++ b/apps/api/src/app/order/order.controller.ts @@ -53,14 +53,19 @@ export class OrderController { @Delete() @HasPermission(permissions.deleteOrder) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseInterceptors(TransformDataSourceInRequestInterceptor) public async deleteOrders( @Query('accounts') filterByAccounts?: string, @Query('assetClasses') filterByAssetClasses?: string, + @Query('dataSource') filterByDataSource?: string, + @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string ): Promise { const filters = this.apiService.buildFiltersFromQueryParams({ filterByAccounts, filterByAssetClasses, + filterByDataSource, + filterBySymbol, filterByTags }); From 85af3db0d83cea74a90724d51c4e4e85ad70dc31 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Wed, 4 Jun 2025 20:09:06 +0200 Subject: [PATCH 40/81] Bugfix/respect filter by holding when exporting activities (#4824) * Respect filter by holding when exporting activities * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/export/export.controller.ts | 15 ++++++++++++++- apps/api/src/app/export/export.module.ts | 9 ++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ab9c06e5..606b144d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Respected the filter by holding when deleting activities on the portfolio activities page +- Respected the filter by holding when exporting activities on the portfolio activities page - Fixed an exception with currencies in the historical market data editor of the admin control panel ## 2.165.0 - 2025-05-31 diff --git a/apps/api/src/app/export/export.controller.ts b/apps/api/src/app/export/export.controller.ts index d807132c9..db2c7e3d9 100644 --- a/apps/api/src/app/export/export.controller.ts +++ b/apps/api/src/app/export/export.controller.ts @@ -1,9 +1,17 @@ import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { Export } from '@ghostfolio/common/interfaces'; import type { RequestWithUser } from '@ghostfolio/common/types'; -import { Controller, Get, Inject, Query, UseGuards } from '@nestjs/common'; +import { + Controller, + Get, + Inject, + Query, + UseGuards, + UseInterceptors +} from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; @@ -19,16 +27,21 @@ export class ExportController { @Get() @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseInterceptors(TransformDataSourceInRequestInterceptor) public async export( @Query('accounts') filterByAccounts?: string, @Query('activityIds') filterByActivityIds?: string, @Query('assetClasses') filterByAssetClasses?: string, + @Query('dataSource') filterByDataSource?: string, + @Query('symbol') filterBySymbol?: string, @Query('tags') filterByTags?: string ): Promise { const activityIds = filterByActivityIds?.split(',') ?? []; const filters = this.apiService.buildFiltersFromQueryParams({ filterByAccounts, filterByAssetClasses, + filterByDataSource, + filterBySymbol, filterByTags }); diff --git a/apps/api/src/app/export/export.module.ts b/apps/api/src/app/export/export.module.ts index 892a761cc..424e83617 100644 --- a/apps/api/src/app/export/export.module.ts +++ b/apps/api/src/app/export/export.module.ts @@ -1,5 +1,6 @@ import { AccountModule } from '@ghostfolio/api/app/account/account.module'; import { OrderModule } from '@ghostfolio/api/app/order/order.module'; +import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; @@ -9,8 +10,14 @@ import { ExportController } from './export.controller'; import { ExportService } from './export.service'; @Module({ - imports: [AccountModule, ApiModule, OrderModule, TagModule], controllers: [ExportController], + imports: [ + AccountModule, + ApiModule, + OrderModule, + TagModule, + TransformDataSourceInRequestModule + ], providers: [ExportService] }) export class ExportModule {} From 5fdd27eca0b2f2481db6ec2aca0e885e72f77348 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 5 Jun 2025 07:59:24 +0200 Subject: [PATCH 41/81] Release 2.166.0 (#4830) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 606b144d2..d4ea3660a 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.166.0 - 2025-06-05 ### Added diff --git a/package-lock.json b/package-lock.json index 6fc2a8887..cce994e72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.165.0", + "version": "2.166.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.165.0", + "version": "2.166.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index f9c862cf3..a2f647c73 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.165.0", + "version": "2.166.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 8cee03f16a034abdbbb5b73c420b5767e1d772dd Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 5 Jun 2025 17:38:15 +0200 Subject: [PATCH 42/81] Feature/upgrade Nx to version 21.1.2 (#4809) * Upgrade Nx to version 21.1.2 * Update changelog --- .env.dev | 1 - .gitignore | 2 + CHANGELOG.md | 6 + Dockerfile | 1 + apps/client-e2e/project.json | 7 +- apps/client/project.json | 109 ++- apps/ui-e2e/project.json | 9 +- nx.json | 3 +- package-lock.json | 1793 +++++++++++++--------------------- package.json | 24 +- 10 files changed, 780 insertions(+), 1175 deletions(-) diff --git a/.env.dev b/.env.dev index c4c8a0d35..d0c9a1576 100644 --- a/.env.dev +++ b/.env.dev @@ -22,4 +22,3 @@ JWT_SECRET_KEY= # For more info, see: https://nx.dev/concepts/inferred-tasks NX_ADD_PLUGINS=false -NX_NATIVE_COMMAND_RUNNER=false diff --git a/.gitignore b/.gitignore index d7e5e5eb1..e753d3bf7 100644 --- a/.gitignore +++ b/.gitignore @@ -25,8 +25,10 @@ npm-debug.log # misc /.angular/cache +.cursor/rules/nx-rules.mdc .env .env.prod +.github/instructions/nx.instructions.md .nx/cache .nx/workspace-data /.sass-cache diff --git a/CHANGELOG.md b/CHANGELOG.md index d4ea3660a..63c2b12d1 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 `20.8.1` to `21.1.2` + ## 2.166.0 - 2025-06-05 ### Added diff --git a/Dockerfile b/Dockerfile index 89121eee5..c740413ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,6 +33,7 @@ COPY ./nx.json nx.json COPY ./replace.build.mjs replace.build.mjs COPY ./tsconfig.base.json tsconfig.base.json +ENV NX_DAEMON=false RUN npm run build:production # Prepare the dist image with additional node_modules diff --git a/apps/client-e2e/project.json b/apps/client-e2e/project.json index 16d13e012..92e2f09ef 100644 --- a/apps/client-e2e/project.json +++ b/apps/client-e2e/project.json @@ -3,12 +3,13 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "apps/client-e2e/src", "projectType": "application", + "tags": [], + "implicitDependencies": ["client"], "targets": { "e2e": { "executor": "@nx/cypress:cypress", "options": { "cypressConfig": "apps/client-e2e/cypress.json", - "tsConfig": "apps/client-e2e/tsconfig.e2e.json", "devServerTarget": "client:serve" }, "configurations": { @@ -17,7 +18,5 @@ } } } - }, - "tags": [], - "implicitDependencies": ["client"] + } } diff --git a/apps/client/project.json b/apps/client/project.json index b2144d7b3..0bc04556a 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -2,13 +2,63 @@ "name": "client", "$schema": "../../node_modules/nx/schemas/project-schema.json", "projectType": "application", + "sourceRoot": "apps/client/src", + "prefix": "gf", + "i18n": { + "locales": { + "ca": { + "baseHref": "/ca/", + "translation": "apps/client/src/locales/messages.ca.xlf" + }, + "de": { + "baseHref": "/de/", + "translation": "apps/client/src/locales/messages.de.xlf" + }, + "es": { + "baseHref": "/es/", + "translation": "apps/client/src/locales/messages.es.xlf" + }, + "fr": { + "baseHref": "/fr/", + "translation": "apps/client/src/locales/messages.fr.xlf" + }, + "it": { + "baseHref": "/it/", + "translation": "apps/client/src/locales/messages.it.xlf" + }, + "nl": { + "baseHref": "/nl/", + "translation": "apps/client/src/locales/messages.nl.xlf" + }, + "pl": { + "baseHref": "/pl/", + "translation": "apps/client/src/locales/messages.pl.xlf" + }, + "pt": { + "baseHref": "/pt/", + "translation": "apps/client/src/locales/messages.pt.xlf" + }, + "tr": { + "baseHref": "/tr/", + "translation": "apps/client/src/locales/messages.tr.xlf" + }, + "uk": { + "baseHref": "/uk/", + "translation": "apps/client/src/locales/messages.uk.xlf" + }, + "zh": { + "baseHref": "/zh/", + "translation": "apps/client/src/locales/messages.zh.xlf" + } + }, + "sourceLocale": "en" + }, + "tags": [], "generators": { "@schematics/angular:component": { "style": "scss" } }, - "sourceRoot": "apps/client/src", - "prefix": "gf", "targets": { "build": { "executor": "@nx/angular:webpack-browser", @@ -211,7 +261,8 @@ "production": { "buildTarget": "client:build:production" } - } + }, + "continuous": true }, "extract-i18n": { "executor": "ng-extract-i18n-merge:ng-extract-i18n-merge", @@ -247,55 +298,5 @@ }, "outputs": ["{workspaceRoot}/coverage/apps/client"] } - }, - "i18n": { - "locales": { - "ca": { - "baseHref": "/ca/", - "translation": "apps/client/src/locales/messages.ca.xlf" - }, - "de": { - "baseHref": "/de/", - "translation": "apps/client/src/locales/messages.de.xlf" - }, - "es": { - "baseHref": "/es/", - "translation": "apps/client/src/locales/messages.es.xlf" - }, - "fr": { - "baseHref": "/fr/", - "translation": "apps/client/src/locales/messages.fr.xlf" - }, - "it": { - "baseHref": "/it/", - "translation": "apps/client/src/locales/messages.it.xlf" - }, - "nl": { - "baseHref": "/nl/", - "translation": "apps/client/src/locales/messages.nl.xlf" - }, - "pl": { - "baseHref": "/pl/", - "translation": "apps/client/src/locales/messages.pl.xlf" - }, - "pt": { - "baseHref": "/pt/", - "translation": "apps/client/src/locales/messages.pt.xlf" - }, - "tr": { - "baseHref": "/tr/", - "translation": "apps/client/src/locales/messages.tr.xlf" - }, - "uk": { - "baseHref": "/uk/", - "translation": "apps/client/src/locales/messages.uk.xlf" - }, - "zh": { - "baseHref": "/zh/", - "translation": "apps/client/src/locales/messages.zh.xlf" - } - }, - "sourceLocale": "en" - }, - "tags": [] + } } diff --git a/apps/ui-e2e/project.json b/apps/ui-e2e/project.json index 4595b6c66..a5b4cf53a 100644 --- a/apps/ui-e2e/project.json +++ b/apps/ui-e2e/project.json @@ -3,13 +3,14 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "sourceRoot": "apps/ui-e2e/src", "projectType": "application", + "tags": [], + "implicitDependencies": ["ui"], "targets": { "e2e": { "executor": "@nx/cypress:cypress", "options": { "cypressConfig": "apps/ui-e2e/cypress.json", - "devServerTarget": "ui:storybook", - "tsConfig": "apps/ui-e2e/tsconfig.json" + "devServerTarget": "ui:storybook" }, "configurations": { "ci": { @@ -23,7 +24,5 @@ "lintFilePatterns": ["apps/ui-e2e/**/*.{js,ts}"] } } - }, - "tags": [], - "implicitDependencies": ["ui"] + } } diff --git a/nx.json b/nx.json index 785ffa781..d843d15b3 100644 --- a/nx.json +++ b/nx.json @@ -72,6 +72,5 @@ ] }, "parallel": 1, - "defaultBase": "origin/main", - "useLegacyCache": true + "defaultBase": "origin/main" } diff --git a/package-lock.json b/package-lock.json index cce994e72..18360e2f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -108,17 +108,17 @@ "@eslint/js": "9.24.0", "@nestjs/schematics": "11.0.5", "@nestjs/testing": "11.1.0", - "@nx/angular": "20.8.1", - "@nx/cypress": "20.8.1", - "@nx/eslint-plugin": "20.8.1", - "@nx/jest": "20.8.1", - "@nx/js": "20.8.1", - "@nx/module-federation": "20.8.1", - "@nx/nest": "20.8.1", - "@nx/node": "20.8.1", - "@nx/storybook": "20.8.1", - "@nx/web": "20.8.1", - "@nx/workspace": "20.8.1", + "@nx/angular": "21.1.2", + "@nx/cypress": "21.1.2", + "@nx/eslint-plugin": "21.1.2", + "@nx/jest": "21.1.2", + "@nx/js": "21.1.2", + "@nx/module-federation": "21.1.2", + "@nx/nest": "21.1.2", + "@nx/node": "21.1.2", + "@nx/storybook": "21.1.2", + "@nx/web": "21.1.2", + "@nx/workspace": "21.1.2", "@schematics/angular": "19.2.1", "@storybook/addon-essentials": "8.6.12", "@storybook/addon-interactions": "8.6.12", @@ -145,7 +145,7 @@ "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-preset-angular": "14.4.2", - "nx": "20.8.1", + "nx": "21.1.2", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "6.8.2", @@ -5185,14 +5185,14 @@ } }, "node_modules/@modern-js/node-bundle-require": { - "version": "2.65.1", - "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.65.1.tgz", - "integrity": "sha512-XpEkciVEfDbkkLUI662ZFlI9tXsUQtLXk4NRJDBGosNnk9uL2XszmC8sKsdCSLK8AYuPW2w6MTVWuJsOR0EU8A==", + "version": "2.67.6", + "resolved": "https://registry.npmjs.org/@modern-js/node-bundle-require/-/node-bundle-require-2.67.6.tgz", + "integrity": "sha512-rRiDQkrm3kgn0E/GNrcvqo4c71PaUs2R8Xmpv6GUKbEr6lz7VNgfZmAhdAQPtNfRfiBe+1sFLzEcwfEdDo/dTA==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/utils": "2.65.1", - "@swc/helpers": "0.5.13", + "@modern-js/utils": "2.67.6", + "@swc/helpers": "^0.5.17", "esbuild": "0.17.19" } }, @@ -5570,16 +5570,6 @@ "node": ">=12" } }, - "node_modules/@modern-js/node-bundle-require/node_modules/@swc/helpers": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", - "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@modern-js/node-bundle-require/node_modules/esbuild": { "version": "0.17.19", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", @@ -5619,28 +5609,18 @@ } }, "node_modules/@modern-js/utils": { - "version": "2.65.1", - "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.65.1.tgz", - "integrity": "sha512-HrChf19F+6nALo5XPra8ycjhXGQfGi23+S7Y2FLfTKe8vaNnky8duT/XvRWpbS4pp3SQj8ryO8m/qWSsJ1Rogw==", + "version": "2.67.6", + "resolved": "https://registry.npmjs.org/@modern-js/utils/-/utils-2.67.6.tgz", + "integrity": "sha512-cxY7HsSH0jIN3rlL6RZ0tgzC1tH0gHW++8X6h7sXCNCylhUdbGZI9yTGbpAS8bU7c97NmPaTKg+/ILt00Kju1Q==", "dev": true, "license": "MIT", "dependencies": { - "@swc/helpers": "0.5.13", + "@swc/helpers": "^0.5.17", "caniuse-lite": "^1.0.30001520", "lodash": "^4.17.21", "rslog": "^1.1.0" } }, - "node_modules/@modern-js/utils/node_modules/@swc/helpers": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", - "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@module-federation/bridge-react-webpack-plugin": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.9.1.tgz", @@ -5667,15 +5647,15 @@ } }, "node_modules/@module-federation/cli": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.13.0.tgz", - "integrity": "sha512-5n7fjeTNq0O+0M4j1Behp/kfNqTpmib0CwcETNov3Bw7J4ohiyrGS76CRB0OrkE7WlE6psFlyCPAiPI9YsDldg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.14.3.tgz", + "integrity": "sha512-BRR1d+piUSKW5OAuU+ej/zS3pMS4ismea9XHD/DWGJXW/Am7h1pFxRNYAZ8iflLJQ46oqjS/j1ECc5WJmbHlxw==", "dev": true, "license": "MIT", "dependencies": { - "@modern-js/node-bundle-require": "2.65.1", - "@module-federation/dts-plugin": "0.13.0", - "@module-federation/sdk": "0.13.0", + "@modern-js/node-bundle-require": "2.67.6", + "@module-federation/dts-plugin": "0.14.3", + "@module-federation/sdk": "0.14.3", "chalk": "3.0.0", "commander": "11.1.0" }, @@ -5687,16 +5667,16 @@ } }, "node_modules/@module-federation/cli/node_modules/@module-federation/dts-plugin": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.13.0.tgz", - "integrity": "sha512-+I3kaf1BHZLTv37dxQTQ/WErAePAnVWKs1cdkea1PA/oRo4IJRVkMya53mKRlawR/Tam9GldphrR1ylOJxMl4w==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.14.3.tgz", + "integrity": "sha512-QiE4wcra6dNo36028cX//QfX0uKF6UeoQoaVIIu06imF4KjCNQD3bE91D6H3DlVVD/UjnIDeUSt9AoGesLzbSA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/sdk": "0.13.0", - "@module-federation/third-party-dts-extractor": "0.13.0", + "@module-federation/error-codes": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/sdk": "0.14.3", + "@module-federation/third-party-dts-extractor": "0.14.3", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.8.2", @@ -5721,35 +5701,35 @@ } }, "node_modules/@module-federation/cli/node_modules/@module-federation/error-codes": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.13.0.tgz", - "integrity": "sha512-4soAMLr7qcVWuvCsyRmBbiBfuhxmnDeyl+qzjMx8VurQgL+XQDQJapM9RXngNGT4g8FoCq9o7rM5YWNgFFNUiw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.14.3.tgz", + "integrity": "sha512-sBJ3XKU9g5Up31jFeXPFsD8AgORV7TLO/cCSMuRewSfgYbG/3vSKLJmfHrO6+PvjZSb9VyV2UaF02ojktW65vw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/cli/node_modules/@module-federation/managers": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.13.0.tgz", - "integrity": "sha512-dpfRjIE4UR4QRP20rENQJs9HfnuWzzsA9W6Eu+r+G+obZnzNIxbONUzg5bCMmhbDsR3krxU6LRrwU1zXnA6bxw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.14.3.tgz", + "integrity": "sha512-uQiLRUvy2yiWm7Xa75y8/He3swW0l2hn8Ef09mvSXhjewwFQMPClQAmZa1UCgNk1F7s/dXDtL9E8vlnX/aZdOQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.13.0", + "@module-federation/sdk": "0.14.3", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/cli/node_modules/@module-federation/sdk": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.13.0.tgz", - "integrity": "sha512-JdMZaPD+EQvMJYS+/8/8QjaAHQ3qljogvioXBsAuedcStu/msn5e1Fswc0G34kXY9ixs2hUPZU2cAllfSKWIBQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.14.3.tgz", + "integrity": "sha512-THJZMfbXpqjQOLblCQ8jjcBFFXsGRJwUWE9l/Q4SmuCSKMgAwie7yLT0qSGrHmyBYrsUjAuy+xNB4nfKP0pnGw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/cli/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.13.0.tgz", - "integrity": "sha512-0sBgo917+AksBjFXrdWOhX58D+wjHR/vXtiCbwFdAGDwLuMs7crMMc4Aay2FJRwPCm1fMGy/4kYvLh5MRhUHRA==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.14.3.tgz", + "integrity": "sha512-XAbUoN5hP9iSnrKGikDIy8CloWCKHRIpe+DWOlq8u7uXoRpAPs/a5K7uegxB27dZUNxSFEfqDeHrpQORNnDqPg==", "dev": true, "license": "MIT", "dependencies": { @@ -6041,16 +6021,15 @@ } }, "node_modules/@module-federation/node": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.1.tgz", - "integrity": "sha512-CKFoCq0R6k01Wt+qfWqWnF7XSHNDdIq4reVGvx1/TtAcv3U1opfI1Fgn2zWci9b8E0xQKteCVD5lI3Ws3dJt6w==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.6.tgz", + "integrity": "sha512-QZlUvOOKrwMMDA9CULIi/wrwlnssDi2WDctat3oszxsoziPSpwwbsfm9tGPasw2FvMCvZDO0kCMWSmvuIIeEKg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/enhanced": "0.13.0", - "@module-federation/runtime": "0.13.0", - "@module-federation/sdk": "0.13.0", - "@module-federation/utilities": "3.1.53", + "@module-federation/enhanced": "0.14.3", + "@module-federation/runtime": "0.14.3", + "@module-federation/sdk": "0.14.3", "btoa": "1.2.1", "encoding": "^0.1.13", "node-fetch": "2.7.0" @@ -6073,26 +6052,26 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.13.0.tgz", - "integrity": "sha512-5p+LKEq0fwuPGIIzt/dsPlz0atgwv/G2ijeqtzh1K/1tEhtasfr6LNjjnOsjZNA8YR3v0agQAijabIpT6B7PYQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.14.3.tgz", + "integrity": "sha512-lRkAeNpRdsOFIYx+SSEzsWUZbr2RdfcLA0UbadBaWV3FgeoSd0mef9IO9+KlY1y05anvwOS17VlsX0DeCbvMXg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.13.0", + "@module-federation/sdk": "0.14.3", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.13.0.tgz", - "integrity": "sha512-mimi7eqKySOmKrXDCo3Lk4KZq1i0PZDwSmP9Es5RWK8senaCRu10WwFLhAVJ/yIH2Wt7HFy23ZyYNukrLikedQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.14.3.tgz", + "integrity": "sha512-jGSeo4e32PxTIqPxxwb11oqBXLzygx7fsbV0RXHhy0W1IXDzFObYbHCN95ohxAEh25Hn5jinxBCFn/ltEzQUlA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.13.0", - "@module-federation/sdk": "0.13.0", + "@module-federation/runtime": "0.14.3", + "@module-federation/sdk": "0.14.3", "fs-extra": "9.1.0" }, "peerDependencies": { @@ -6101,16 +6080,16 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.13.0.tgz", - "integrity": "sha512-+I3kaf1BHZLTv37dxQTQ/WErAePAnVWKs1cdkea1PA/oRo4IJRVkMya53mKRlawR/Tam9GldphrR1ylOJxMl4w==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.14.3.tgz", + "integrity": "sha512-QiE4wcra6dNo36028cX//QfX0uKF6UeoQoaVIIu06imF4KjCNQD3bE91D6H3DlVVD/UjnIDeUSt9AoGesLzbSA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/sdk": "0.13.0", - "@module-federation/third-party-dts-extractor": "0.13.0", + "@module-federation/error-codes": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/sdk": "0.14.3", + "@module-federation/third-party-dts-extractor": "0.14.3", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.8.2", @@ -6135,23 +6114,23 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.13.0.tgz", - "integrity": "sha512-G9R5U6sQVkHAKW+VYlT8DprkJJasV0H9vPyt8CLrNxL1myzz3YVObr1RG3JciF+RsBC3zdmSNftXkUz15nUZ/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.13.0", - "@module-federation/cli": "0.13.0", - "@module-federation/data-prefetch": "0.13.0", - "@module-federation/dts-plugin": "0.13.0", - "@module-federation/error-codes": "0.13.0", - "@module-federation/inject-external-runtime-core-plugin": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/manifest": "0.13.0", - "@module-federation/rspack": "0.13.0", - "@module-federation/runtime-tools": "0.13.0", - "@module-federation/sdk": "0.13.0", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.14.3.tgz", + "integrity": "sha512-9R15Sm+hCn9yNtOTEwN1cHppC/sMb/LfoTcA94jLMB6lcyYz+uNzc5JliyrMawU1/guOQiBZkUVL/thB8DHURw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.14.3", + "@module-federation/cli": "0.14.3", + "@module-federation/data-prefetch": "0.14.3", + "@module-federation/dts-plugin": "0.14.3", + "@module-federation/error-codes": "0.14.3", + "@module-federation/inject-external-runtime-core-plugin": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/manifest": "0.14.3", + "@module-federation/rspack": "0.14.3", + "@module-federation/runtime-tools": "0.14.3", + "@module-federation/sdk": "0.14.3", "btoa": "^1.2.1", "schema-utils": "^4.3.0", "upath": "2.0.1" @@ -6177,62 +6156,62 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.13.0.tgz", - "integrity": "sha512-4soAMLr7qcVWuvCsyRmBbiBfuhxmnDeyl+qzjMx8VurQgL+XQDQJapM9RXngNGT4g8FoCq9o7rM5YWNgFFNUiw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.14.3.tgz", + "integrity": "sha512-sBJ3XKU9g5Up31jFeXPFsD8AgORV7TLO/cCSMuRewSfgYbG/3vSKLJmfHrO6+PvjZSb9VyV2UaF02ojktW65vw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.13.0.tgz", - "integrity": "sha512-+V6Dhpqg8N9nqGHqOKDYebaHdJYqaTEFlF2VcrTmNlIcIYuiSLZngEQliebOkMRwUmO2T3eVS5IzzTlL/jfrJw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.14.3.tgz", + "integrity": "sha512-OurBx/gDkRPKl9pidefG4EtJeSk8izaj3ZVN/sGGMOXLFeWLK2i0ZSUM/5ogPLj9NPdQC8tTlPalEUsRQ38DoA==", "dev": true, "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "0.13.0" + "@module-federation/runtime-tools": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/managers": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.13.0.tgz", - "integrity": "sha512-dpfRjIE4UR4QRP20rENQJs9HfnuWzzsA9W6Eu+r+G+obZnzNIxbONUzg5bCMmhbDsR3krxU6LRrwU1zXnA6bxw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.14.3.tgz", + "integrity": "sha512-uQiLRUvy2yiWm7Xa75y8/He3swW0l2hn8Ef09mvSXhjewwFQMPClQAmZa1UCgNk1F7s/dXDtL9E8vlnX/aZdOQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.13.0", + "@module-federation/sdk": "0.14.3", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.13.0.tgz", - "integrity": "sha512-YHJW4qavvfqfpUusz+BlT9snPmbXmiiS5bO5nReFPjfWXT3/9xFA1TvcwpRc+EXNDNKnf5bPF5E/rsaGxSlp7A==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.14.3.tgz", + "integrity": "sha512-GsD4PK7JTDOX8g2NyGhsoejhfyP88h6wCaxW4zAq6X91CE9Yu1R/Ec6QHhp9jfXdQlgkoXz1nQRlkbiU7RNTDA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/sdk": "0.13.0", + "@module-federation/dts-plugin": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/sdk": "0.14.3", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.13.0.tgz", - "integrity": "sha512-hb60x8EdiOXfzJGQLlbv1MDJVjEpQ3ppH0ONIra8CAkGRPGjB+eTwg9nLB6wkcI3xdMjgax509DwbSG+BDmCqw==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.14.3.tgz", + "integrity": "sha512-s02E7n9CnR+IMraYwGqfSU2uScENPU+TUd45YteMKxcKOIqNRALtGMn/YT24bbnj+wZ/jhvzr7Rbcx9AkaxKhA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "0.13.0", - "@module-federation/dts-plugin": "0.13.0", - "@module-federation/inject-external-runtime-core-plugin": "0.13.0", - "@module-federation/managers": "0.13.0", - "@module-federation/manifest": "0.13.0", - "@module-federation/runtime-tools": "0.13.0", - "@module-federation/sdk": "0.13.0", + "@module-federation/bridge-react-webpack-plugin": "0.14.3", + "@module-federation/dts-plugin": "0.14.3", + "@module-federation/inject-external-runtime-core-plugin": "0.14.3", + "@module-federation/managers": "0.14.3", + "@module-federation/manifest": "0.14.3", + "@module-federation/runtime-tools": "0.14.3", + "@module-federation/sdk": "0.14.3", "btoa": "1.2.1" }, "peerDependencies": { @@ -6250,50 +6229,50 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.13.0.tgz", - "integrity": "sha512-Ne/3AEVWz6LL6G/i41O5MC6YYlg0SatNNqG/0XbuMAfyGM+llRmB6VKt0o2+JR4isxWuPNp97TbUkkfORit6Eg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.14.3.tgz", + "integrity": "sha512-7ZHpa3teUDVhraYdxQGkfGHzPbjna4LtwbpudgzAxSLLFxLDNanaxCuSeIgSM9c+8sVUNC9kvzUgJEZB0krPJw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.13.0", - "@module-federation/runtime-core": "0.13.0", - "@module-federation/sdk": "0.13.0" + "@module-federation/error-codes": "0.14.3", + "@module-federation/runtime-core": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.13.0.tgz", - "integrity": "sha512-Oj/1p0mfxZ+8EbU7ND4gMvRmikFpIvPCbblOgat9N8ZIVAKYpTimCgMhzg4yRqAwzlGCVwnnW7XZ8UlA+Zqrvg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.14.3.tgz", + "integrity": "sha512-xMFQXflLVW/AJTWb4soAFP+LB4XuhE7ryiLIX8oTyUoBBgV6U2OPghnFljPjeXbud72O08NYlQ1qsHw1kN/V8Q==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.13.0", - "@module-federation/sdk": "0.13.0" + "@module-federation/error-codes": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.13.0.tgz", - "integrity": "sha512-6ECWX18yGrQKcmkrQoNPd5VEpxZP1SMaB/Bp55xlpEhsrpn4zHnriQluxDw6xldjSOLl1qbokfxwCwjS2OaEbg==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.14.3.tgz", + "integrity": "sha512-QBETX7iMYXdSa3JtqFlYU+YkpymxETZqyIIRiqg0gW+XGpH3jgU68yjrme2NBJp7URQi/CFZG8KWtfClk0Pjgw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.13.0", - "@module-federation/webpack-bundler-runtime": "0.13.0" + "@module-federation/runtime": "0.14.3", + "@module-federation/webpack-bundler-runtime": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.13.0.tgz", - "integrity": "sha512-JdMZaPD+EQvMJYS+/8/8QjaAHQ3qljogvioXBsAuedcStu/msn5e1Fswc0G34kXY9ixs2hUPZU2cAllfSKWIBQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.14.3.tgz", + "integrity": "sha512-THJZMfbXpqjQOLblCQ8jjcBFFXsGRJwUWE9l/Q4SmuCSKMgAwie7yLT0qSGrHmyBYrsUjAuy+xNB4nfKP0pnGw==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.13.0.tgz", - "integrity": "sha512-0sBgo917+AksBjFXrdWOhX58D+wjHR/vXtiCbwFdAGDwLuMs7crMMc4Aay2FJRwPCm1fMGy/4kYvLh5MRhUHRA==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.14.3.tgz", + "integrity": "sha512-XAbUoN5hP9iSnrKGikDIy8CloWCKHRIpe+DWOlq8u7uXoRpAPs/a5K7uegxB27dZUNxSFEfqDeHrpQORNnDqPg==", "dev": true, "license": "MIT", "dependencies": { @@ -6303,14 +6282,14 @@ } }, "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.13.0.tgz", - "integrity": "sha512-ycgAsFeCTo+3GR8JxkhCyg2UZm6Au98ISdLTdVXYphO4UDcO/KjqyJen1LXEslkpCEohDj68Prei2fUHRruK6g==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.14.3.tgz", + "integrity": "sha512-hIyJFu34P7bY2NeMIUHAS/mYUHEY71VTAsN0A0AqEJFSVPszheopu9VdXq0VDLrP9KQfuXT8SDxeYeJXyj0mgA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.13.0", - "@module-federation/sdk": "0.13.0" + "@module-federation/runtime": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@module-federation/node/node_modules/chalk": { @@ -6540,39 +6519,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@module-federation/utilities": { - "version": "3.1.53", - "resolved": "https://registry.npmjs.org/@module-federation/utilities/-/utilities-3.1.53.tgz", - "integrity": "sha512-6pM6wf9wJ+qebFSAdz7Mqn+k8XRubdcORp3866fMQhBUGLvNhOJuN2Vfd4/0HsPyKx2snCo2IamQyr9OqG7NRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/sdk": "0.13.0" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18", - "webpack": "^5.40.0" - }, - "peerDependenciesMeta": { - "next": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@module-federation/utilities/node_modules/@module-federation/sdk": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.13.0.tgz", - "integrity": "sha512-JdMZaPD+EQvMJYS+/8/8QjaAHQ3qljogvioXBsAuedcStu/msn5e1Fswc0G34kXY9ixs2hUPZU2cAllfSKWIBQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@module-federation/webpack-bundler-runtime": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.9.1.tgz", @@ -7664,20 +7610,20 @@ } }, "node_modules/@nx/angular": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-20.8.1.tgz", - "integrity": "sha512-BT6kc2CMwC1RpzdJdl1jbaZa7yCp5sN4BCHj8w+MOCnX6630EcrN6lCi+u5xSVvY2DmemP5I1ZHybSYkYilLLg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-21.1.2.tgz", + "integrity": "sha512-xkHatgZaSBSJ3G+pRbQ025sPtf+brtsqQGLk3YxoICf6S/pYLUIOZwnPn3pVqDQCM4ObOPdA2IMTQnKLClD9aw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/js": "20.8.1", - "@nx/module-federation": "20.8.1", - "@nx/rspack": "20.8.1", - "@nx/web": "20.8.1", - "@nx/webpack": "20.8.1", - "@nx/workspace": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/js": "21.1.2", + "@nx/module-federation": "21.1.2", + "@nx/rspack": "21.1.2", + "@nx/web": "21.1.2", + "@nx/webpack": "21.1.2", + "@nx/workspace": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "@typescript-eslint/type-utils": "^8.0.0", "enquirer": "~2.3.6", @@ -7713,18 +7659,19 @@ } }, "node_modules/@nx/cypress": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-20.8.1.tgz", - "integrity": "sha512-eVPBZ4R0qgkRxaKPg46OXhA/xQdgVO4zjKoRjKkNX7dDRmq8o2xXHBoU+ZnuNITeFV1fmJ9Cr1qpGMWrHXb2Ew==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-21.1.2.tgz", + "integrity": "sha512-LnQ5etyx7MV+JtHQiCbilt9R4NQOcq4o8wgJj+Jlb+qU6FMLFEXGtSxFE1vGXNVCM5obsNa226tAh1VaGV7vAA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/js": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "detect-port": "^1.5.1", "semver": "^7.6.3", + "tree-kill": "1.2.2", "tslib": "^2.3.0" }, "peerDependencies": { @@ -7737,9 +7684,9 @@ } }, "node_modules/@nx/devkit": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.1.tgz", - "integrity": "sha512-N3nwIg/7RIZeB76iuVo29q+l9WyTtvuBSgDFM2msiIK6Q928ilzoeNPZ/p7w/TE3Gqs5XVhq9ExMvDAOTxdmXA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.1.2.tgz", + "integrity": "sha512-1dgjwSsNDdp/VXydZnSfzfVwySEB3C9yjzeIw6+3+nRvZfH16a7ggZE7MF5sJTq4d+01hAgIDz3KyvGa6Jf73g==", "dev": true, "license": "MIT", "dependencies": { @@ -7753,7 +7700,7 @@ "yargs-parser": "21.1.1" }, "peerDependencies": { - "nx": ">= 19 <= 21" + "nx": "21.1.2" } }, "node_modules/@nx/devkit/node_modules/brace-expansion": { @@ -7783,14 +7730,14 @@ } }, "node_modules/@nx/eslint": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-20.8.1.tgz", - "integrity": "sha512-eIfNZ4bGdCKAeq7c8dhJ31wW3D422UJaAGl3hT3mJoxW2qbaKDZhgUr5EJqiMAO78vycpnYaLrN1KPEKeFrQZg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-21.1.2.tgz", + "integrity": "sha512-Mp8u0RlkhxYtZ47d2ou6t8XIpRy7N/n23OzikqMro4Wt/DK1irGyShSoNIqdGdwalAE5MG1OFXspttXB+y/wOQ==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "semver": "^7.5.3", "tslib": "^2.3.0", "typescript": "~5.7.2" @@ -7806,14 +7753,14 @@ } }, "node_modules/@nx/eslint-plugin": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-20.8.1.tgz", - "integrity": "sha512-AF3oxqflCUL73OjfZUdFOuDnYuAqNiozXJrZCVRxyi/9a+dO/kvukU3x5ObwvnZFamWQIwfsfVzgk/nI0WDwjQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-21.1.2.tgz", + "integrity": "sha512-kwhwe6e8dZ0pf5CYPq4OBck15NEJrfuivCEGRTIDZWu3WDYJIw7OvhfyCdGuoZLeHGoCVRjIU6xV5hOzkD9RSw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "@typescript-eslint/type-utils": "^8.0.0", "@typescript-eslint/utils": "^8.0.0", "chalk": "^4.1.0", @@ -7847,16 +7794,16 @@ } }, "node_modules/@nx/jest": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-20.8.1.tgz", - "integrity": "sha512-Cx2cOOWprB2HiggCRg72vl3/evg2fcoANShhnrb+VCTJLHcq87hkwdrAcHwlbENpXwTd4bjlqYJdP1HobdH3FA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-21.1.2.tgz", + "integrity": "sha512-y4VZita9LFb6XajulRIwjMcqHU6/f73C4SNSH6IM5BYmkN68ovICmzTGvoaL7wGTaYrA4Moh/WoKwEwQWKxRPQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "identity-obj-proxy": "3.0.0", "jest-config": "^29.4.1", @@ -7897,9 +7844,9 @@ } }, "node_modules/@nx/js": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-20.8.1.tgz", - "integrity": "sha512-D3T84PuZggEdraS41S2Frzef2FhebWAHzXcs0IE1ZLInUtwek5P5aTN2d3i/JwYB3mcOyvx8XN3HVADap4KRpg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-21.1.2.tgz", + "integrity": "sha512-ZF6Zf4Ys+RBvH0GoQHio94C/0N07Px/trAvseMuQ8PKc0tSkXycu/EBc1uAZQvgJThR5o3diAKtIQug77pPYMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7910,8 +7857,8 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nx/devkit": "20.8.1", - "@nx/workspace": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/workspace": "21.1.2", "@zkochan/js-yaml": "0.0.7", "babel-plugin-const-enum": "^1.0.1", "babel-plugin-macros": "^3.1.0", @@ -8084,19 +8031,19 @@ } }, "node_modules/@nx/module-federation": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-20.8.1.tgz", - "integrity": "sha512-El+qAxP/jqVxgkir43ZN6pwki+FrhtSEcfdk1G8f+cU1DCmZgbKlDYjDjZ/e7SdXkjtJran5fPg7sfLEUyoFew==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-21.1.2.tgz", + "integrity": "sha512-19aodN8uh3fEI2ifXYDXTV4hpQMk5Ko3UAFW+x0dQwlzSUIObt2mBMHL0PIkFXlT1fyz/rH+tkx67/DAAUxVZw==", "dev": true, "license": "MIT", "dependencies": { "@module-federation/enhanced": "^0.9.0", "@module-federation/node": "^2.6.26", "@module-federation/sdk": "^0.9.0", - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", - "@nx/web": "20.8.1", - "@rspack/core": "^1.1.5", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", + "@nx/web": "21.1.2", + "@rspack/core": "^1.3.8", "express": "^4.21.2", "http-proxy-middleware": "^3.0.3", "picocolors": "^1.1.0", @@ -8104,38 +8051,6 @@ "webpack": "^5.88.0" } }, - "node_modules/@nx/module-federation/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/@nx/module-federation/node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", @@ -8210,25 +8125,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@nx/module-federation/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nx/module-federation/node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -8246,57 +8142,18 @@ "dev": true, "license": "MIT" }, - "node_modules/@nx/module-federation/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nx/module-federation/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/module-federation/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/@nx/nest": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-20.8.1.tgz", - "integrity": "sha512-B7DBXrIXw/NBqhLltZpZ6An3P/W3x61aw/fZgvugkwLwZx3rlX+XnWCmyNx37U2jna0tYaUkf6tnzebiQOtbMQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-21.1.2.tgz", + "integrity": "sha512-TEiePYfxGB8dWEU8MOHZCUDpyNcxKTCh4Aj9f2zxfvYBqKMmsqpZRvWKXo6OL6IPdCqyqXtPNqoZyv9XbFakKQ==", "dev": true, "license": "MIT", "dependencies": { "@nestjs/schematics": "^9.1.0", - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/js": "20.8.1", - "@nx/node": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/js": "21.1.2", + "@nx/node": "21.1.2", "tslib": "^2.3.0" } }, @@ -8490,23 +8347,25 @@ } }, "node_modules/@nx/node": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-20.8.1.tgz", - "integrity": "sha512-ffZ8ePEWj2g2OTZWalX1xZBgvTHhoirs5NEkcYxgUya3/DohG4Css3FV9gzVFfKkQdP++bUMkG8GJ2LrtqzUxA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-21.1.2.tgz", + "integrity": "sha512-BCKooOKT04MJDzLy6U4w3mFWhHCsuoMXqUjcd5g/3zf4bFXOK3ooklvVkxjHUQxRXVG/uPJ+ZcgTC1SE0vpS6g==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/jest": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/jest": "21.1.2", + "@nx/js": "21.1.2", + "kill-port": "^1.6.1", + "tcp-port-used": "^1.0.2", "tslib": "^2.3.0" } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.1.tgz", - "integrity": "sha512-Gat4Io66cV70Oa1CjrMJPsEx5ICpAGayv9hejOtBUEDb6XjR12L2e4wV+4EHliF0UbEcuZAr8/lTROEPk0RGWQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.1.2.tgz", + "integrity": "sha512-9dO32jd+h7SrvQafJph6b7Bsmp2IotTE0w7dAGb4MGBQni3JWCXaxlMMpWUZXWW1pM5uIkFJO5AASW4UOI7w2w==", "cpu": [ "arm64" ], @@ -8515,15 +8374,12 @@ "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-darwin-x64": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.1.tgz", - "integrity": "sha512-TB9mZk7neGFKgBr2wSBgY6c4kFF9vvChNSp3TrEeXR3FppFcYG5eK4AaKfzWCpYb0wMtseAm7NMX1Lu74utClQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.1.2.tgz", + "integrity": "sha512-5sf+4PRVg9pDVgD53NE1hoPz4lC8Ni34UovQsOrZgDvwU5mqPbIhTzVYRDH86i/086AcCvjT5tEt7rEcuRwlKw==", "cpu": [ "x64" ], @@ -8532,15 +8388,12 @@ "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-freebsd-x64": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.1.tgz", - "integrity": "sha512-7UQu0/Afna5Af2GagEQ6rbKfUh75NfUn+g66wsoQoUGBvDW0U7B8P3Ph5Bk4Urub0BSfMVcNg2X7CgfypLFN/g==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.1.2.tgz", + "integrity": "sha512-E5HR44fimXlQuAgn/tP9esmvxbzt/92AIl0PBT6L3Juh/xYiXKWhda63H4+UNT8AcLRxVXwfZrGPuGCDs+7y/Q==", "cpu": [ "x64" ], @@ -8549,15 +8402,12 @@ "optional": true, "os": [ "freebsd" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.1.tgz", - "integrity": "sha512-Tjh8JkTP+x1jSrzx+ofx1pKpkhIbXd7bi0bPdpYt6NI1lZz2HB/dv8vtdzP80jXEDztHf0AeGnEJVgJKsgI6yg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.1.2.tgz", + "integrity": "sha512-V4n6DE+r12gwJHFjZs+e2GmWYZdhpgA2DYWbsYWRYb1XQCNUg4vPzt+YFzWZ+K2o91k93EBnlLfrag7CqxUslw==", "cpu": [ "arm" ], @@ -8566,15 +8416,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.1.tgz", - "integrity": "sha512-2+qPIwav2vrytH6pe7fukBe8+yN5JGbEDCnDO8wKQsHeeZMLAQJiZ7EJH/+vynRkI7oWf87mihIKNQME19+w6A==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.1.2.tgz", + "integrity": "sha512-NFhsp27O+mS3r7PWLmJgyZy42WQ72c2pTQSpYfhaBbZPTI5DqBHdANa0sEPmV+ON24qkl5CZKvsmhzjsNmyW6A==", "cpu": [ "arm64" ], @@ -8583,15 +8430,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.1.tgz", - "integrity": "sha512-DsKc+DiMsuHqpBWchUUUg6zv4OaexRqpFXys6auZlrpFpn80kSqLQ3S4zZ5AUu+26wxZqEVJs+uxHGwFbhEssQ==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.1.2.tgz", + "integrity": "sha512-BgS9npARwcnw+hoaRsbas6vdBAJRBAj5qSeL57LO8Dva+e/6PYqoNyVJ0BgJ98xPXDpzM/NnpeRsndQGpLyhDw==", "cpu": [ "arm64" ], @@ -8600,15 +8444,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.1.tgz", - "integrity": "sha512-Kzru44beVKAmSG84ShuMIIfyu2Uu5r8gsHdtiQPBIOGkZa0Z/e6YtUxcN3w1UZ7yvvzoQ4pQLvqU6UZRSWZtEg==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.1.2.tgz", + "integrity": "sha512-tjBINbymQgxnIlNK/m6B0P5eiGRSHSYPNkFdh3+sra80AP/ymHGLRxxZy702Ga2xg8RVr9zEvuXYHI+QBa1YmA==", "cpu": [ "x64" ], @@ -8617,15 +8458,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.1.tgz", - "integrity": "sha512-cSVVb7DVMhrxCaj/n55okBZS6lZoP5a5vynOBGIV4z3/OJLev+xI9A+3imn/aXnBl8iS69HogYyrW0YTXv4Xaw==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.1.2.tgz", + "integrity": "sha512-+0V0YAOWMh1wvpQZuayQ7y+sj2MhE3l7z0JMD9SX/4xv9zLOWGv+EiUmN/fGoU/mwsSkH2wTCo6G6quKF1E8jQ==", "cpu": [ "x64" ], @@ -8634,15 +8472,12 @@ "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.1.tgz", - "integrity": "sha512-gte5HcvI24CN6b9I6IYTXh/A0CtRfnlAFaJomPpfT8Wcq637aOZzS0arAEZVoU8QZty1350hj6sfu+wSIjoP7A==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.1.2.tgz", + "integrity": "sha512-E+ECMQIMJ6R47BMW5YpDyOhTqczvFaL8k24umRkcvlRh3SraczyxBVPkYHDukDp7tCeIszc5EvdWc83C3W8U4w==", "cpu": [ "arm64" ], @@ -8651,15 +8486,12 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.1.tgz", - "integrity": "sha512-6c2fVEPdPwJdnRbckBatRDF/g6JAp6p3Mfl90DpuaEF2DZC5pmCXKOsXE0aSIZ+gODom2JIchM++2KmDZPJUoA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.1.2.tgz", + "integrity": "sha512-J9rNTBOS7Ld6CybU/cou1Fg52AHSYsiwpZISM2RNM0XIoVSDk3Jsvh4OJgS2rvV0Sp/cgDg3ieOMAreekH+TKw==", "cpu": [ "x64" ], @@ -8668,25 +8500,22 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@nx/rspack": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-20.8.1.tgz", - "integrity": "sha512-R7+tkwLD+4KYn22r+c4grKfnB4ghxyH2lXUYgmxu7lg/pJsxiy0/Xn7rTHnzI4izTeap2LK9m1F5ZLC3oeJQ6Q==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-21.1.2.tgz", + "integrity": "sha512-CJBD4e/TXrZyKesAZ7Su8wHuRnBo07ZRpYXgUTEBILeOFiSvnU2630cq47CuyjFFPpWTJ78VOOPnA27G46sHcg==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", - "@nx/module-federation": "20.8.1", - "@nx/web": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", + "@nx/module-federation": "21.1.2", + "@nx/web": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", - "@rspack/core": "^1.1.5", - "@rspack/dev-server": "^1.0.9", + "@rspack/core": "^1.3.8", + "@rspack/dev-server": "^1.1.1", "@rspack/plugin-react-refresh": "^1.0.0", "autoprefixer": "^10.4.9", "browserslist": "^4.21.4", @@ -8697,6 +8526,7 @@ "less-loader": "11.1.0", "license-webpack-plugin": "^4.0.2", "loader-utils": "^2.0.3", + "parse5": "4.0.0", "picocolors": "^1.1.0", "postcss": "^8.4.38", "postcss-import": "~14.1.0", @@ -8716,13 +8546,6 @@ "@module-federation/node": "^2.6.26" } }, - "node_modules/@nx/rspack/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, "node_modules/@nx/rspack/node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -8733,31 +8556,6 @@ "node": "*" } }, - "node_modules/@nx/rspack/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/@nx/rspack/node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", @@ -8868,25 +8666,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@nx/rspack/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nx/rspack/node_modules/less-loader": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", @@ -8940,70 +8719,38 @@ "dev": true, "license": "MIT" }, - "node_modules/@nx/rspack/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "node_modules/@nx/rspack/node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true, "license": "MIT" }, - "node_modules/@nx/rspack/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@nx/rspack/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/@nx/storybook": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-20.8.1.tgz", - "integrity": "sha512-SlneVKhePyoG30s3LHFIWU1ZjoeekCQFZ9IktseElHwOxb83wcXXV/61tKCphur3htZEZ7EL226RzMXQYPIknA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-21.1.2.tgz", + "integrity": "sha512-X/5zT+5uovvZneGR1FS8gh5+4ySlazWb2ra9Ifjn5nFBLFpJ84vnPrWyh/ANMgI4MAAV6seMQwmlwuS2xjcoWw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/cypress": "20.8.1", - "@nx/devkit": "20.8.1", - "@nx/eslint": "20.8.1", - "@nx/js": "20.8.1", + "@nx/cypress": "21.1.2", + "@nx/devkit": "21.1.2", + "@nx/eslint": "21.1.2", + "@nx/js": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "semver": "^7.5.3", "tslib": "^2.3.0" } }, "node_modules/@nx/web": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-20.8.1.tgz", - "integrity": "sha512-sZjL5vLkL3IDBGJwPlZG9PP7hDe/PjnQkVji0VmaFRRhiEQqxyfbNy6k9f5BWvc3tj3IITDofLcVvmTFMSHisw==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-21.1.2.tgz", + "integrity": "sha512-ONw3bEO6rc9DqM9Jnt6Rc5xkSBMzruWA2KvHVlU4qaoUs1VKbnmJ28dM72lFMn8wbOOeq+RG7GC2nBpifBPLHw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "detect-port": "^1.5.1", "http-server": "^14.1.0", "picocolors": "^1.1.0", @@ -9011,15 +8758,15 @@ } }, "node_modules/@nx/webpack": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-20.8.1.tgz", - "integrity": "sha512-Xz1badU23VvRl6ij20D5eTndBsPGxOUC67h7gQfmLqnsUxf9R6NgOnMxt2Y42QWRx5jXxuQf1AbJ/0N+z2fi8A==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-21.1.2.tgz", + "integrity": "sha512-MtTXjxT8HB47uaMi4Hw6VGnyycQ5gm7Trazk4Fq7mr4ReIrP0vp1BGnNgho2d1dFONY0eA6MeBf9j/5jOI+MBA==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", - "@nx/devkit": "20.8.1", - "@nx/js": "20.8.1", + "@nx/devkit": "21.1.2", + "@nx/js": "21.1.2", "@phenomnomnominal/tsquery": "~5.0.1", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", @@ -9070,13 +8817,6 @@ "@types/send": "*" } }, - "node_modules/@nx/webpack/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, "node_modules/@nx/webpack/node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -9087,31 +8827,6 @@ "node": "*" } }, - "node_modules/@nx/webpack/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/@nx/webpack/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -9285,25 +9000,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/@nx/webpack/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nx/webpack/node_modules/globby": { "version": "12.2.0", "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", @@ -9493,13 +9189,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@nx/webpack/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@nx/webpack/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -9547,22 +9236,6 @@ "webpack": "^5.0.0" } }, - "node_modules/@nx/webpack/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@nx/webpack/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -9576,22 +9249,6 @@ "node": ">=8.10.0" } }, - "node_modules/@nx/webpack/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/@nx/webpack/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -9675,17 +9332,17 @@ } }, "node_modules/@nx/workspace": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-20.8.1.tgz", - "integrity": "sha512-Y6HlERFJbLHn1J9JHMsPDSRK5iBSH4hbw9TkqwkINeHBDX8bIilnO3tK6VVMIPTzTHJldxI+zQ1IrzVisZpJsA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-21.1.2.tgz", + "integrity": "sha512-I4e/X/GN0Vx3FDZv/7bFYmXfOPmcMI3cDO/rg+TqudsuxVM7tJ7+8jtwdpU4I2IEpI6oU9FZ7Fu9R2uNqL5rrQ==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "20.8.1", + "@nx/devkit": "21.1.2", "@zkochan/js-yaml": "0.0.7", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "20.8.1", + "nx": "21.1.2", "picomatch": "4.0.2", "tslib": "^2.3.0", "yargs-parser": "21.1.1" @@ -10447,9 +10104,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", - "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", + "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", "cpu": [ "riscv64" ], @@ -10539,27 +10196,27 @@ ] }, "node_modules/@rspack/binding": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.2.8.tgz", - "integrity": "sha512-T3FMB3N9P1AbSAryfkSRJkPtmeSYs/Gj9zUZoPz1ckPEIcWZmpUOQbJylldjbw5waxtCL1haHNbi0pcSvxiaJw==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.3.13.tgz", + "integrity": "sha512-BdM6tfLCP7/0H5uGc+okG6AYsU9JEnR5bRHq4YuGaS4tb+N5ct0czm0LprGMZ7zRAnIql/zoLn/bHlheNxZw3g==", "devOptional": true, "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.2.8", - "@rspack/binding-darwin-x64": "1.2.8", - "@rspack/binding-linux-arm64-gnu": "1.2.8", - "@rspack/binding-linux-arm64-musl": "1.2.8", - "@rspack/binding-linux-x64-gnu": "1.2.8", - "@rspack/binding-linux-x64-musl": "1.2.8", - "@rspack/binding-win32-arm64-msvc": "1.2.8", - "@rspack/binding-win32-ia32-msvc": "1.2.8", - "@rspack/binding-win32-x64-msvc": "1.2.8" + "@rspack/binding-darwin-arm64": "1.3.13", + "@rspack/binding-darwin-x64": "1.3.13", + "@rspack/binding-linux-arm64-gnu": "1.3.13", + "@rspack/binding-linux-arm64-musl": "1.3.13", + "@rspack/binding-linux-x64-gnu": "1.3.13", + "@rspack/binding-linux-x64-musl": "1.3.13", + "@rspack/binding-win32-arm64-msvc": "1.3.13", + "@rspack/binding-win32-ia32-msvc": "1.3.13", + "@rspack/binding-win32-x64-msvc": "1.3.13" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.2.8.tgz", - "integrity": "sha512-bDlrlroY3iMlzna/3i1gD6eRmhJW2zRyC3Ov6aR1micshVQ9RteigYZWkjZuQfyC5Z8dCcLUQJVojz+pqp0JXg==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.3.13.tgz", + "integrity": "sha512-1c+KC+TFaKRWu+SO4cJZ5oHKOFuDhTIitbSIG9boJpDRoZmJxHDmFyTTxVI2r2QUjxJaDdUlSFepybhhJ3UiPg==", "cpu": [ "arm64" ], @@ -10571,9 +10228,9 @@ ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.2.8.tgz", - "integrity": "sha512-0/qOVbMuzZ+WbtDa4TbH46R4vph/W6MHcXbrXDO+vpdTMFDVJ64DnZXT7aqvGcY+7vTCIGm0GT+6ooR4KaIX8A==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.3.13.tgz", + "integrity": "sha512-YBF+XjoGSjhJ5o/xOaCBd39BntMudMeup11j2Dz+rrTH+wG6TvH017HYIgDMT3UBVv66eNsQpzA0ZW5raJ0lbA==", "cpu": [ "x64" ], @@ -10585,9 +10242,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.8.tgz", - "integrity": "sha512-En/SMl45s19iUVb1/ZDFQvFDxIjnlfk7yqV3drMWWAL5HSgksNejaTIFTO52aoohIBbmwuk5wSGcbU0G0IFiPg==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.3.13.tgz", + "integrity": "sha512-II71Ez7Z0/5ZpcK+kCgvXFKK0AysS9La8LNQbqf2wmzxDJi5H8eVUiwkM5BabICxzOWYtTGJLZ89QbCYaFbqCg==", "cpu": [ "arm64" ], @@ -10599,9 +10256,9 @@ ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.8.tgz", - "integrity": "sha512-N1oZsXfJ9VLLcK7p1PS65cxLYQCZ7iqHW2OP6Ew2+hlz/d1hzngxgzrtZMCXFOHXDvTzVu5ff6jGS2v7+zv2tA==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.3.13.tgz", + "integrity": "sha512-JFFhqglKVjlWcmmVwdS80Kw6v35yY9xlQJup09mL8gMtiiFiT36wTyTujz15Iv+2+S/Dv0Z+UeUJ99KRbQxgcQ==", "cpu": [ "arm64" ], @@ -10613,9 +10270,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.8.tgz", - "integrity": "sha512-BdPaepoLKuaVwip4QK/nGqNi1xpbCWSxiycPbKRrGqKgt/QGihxxFgiqr4EpWQVIJNIMy4nCsg4arO0+H1KWGQ==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.3.13.tgz", + "integrity": "sha512-ogm4rt+PMQHkMg/0mA9VTjfGE3c+YaHZQT8KrFgTsoj2YCW9WO2J/RjdMc6STG4Y10BWO9Ar2azLxxHrKb+8UQ==", "cpu": [ "x64" ], @@ -10627,9 +10284,9 @@ ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.8.tgz", - "integrity": "sha512-GFv0Bod268OcXIcjeLoPlK0oz8rClEIxIRFkz+ejhbvfCwRJ+Fd+EKaaKQTBfZQujPqc0h2GctIF25nN5pFTmA==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.3.13.tgz", + "integrity": "sha512-8icDyXhg1iMKhQ3X2FTgAGQTQqnli9FyqHCuRIBauxy1V4W478Mp9Y+V+ErVUY1YxbZEUrkt3a59hssjGeDEeg==", "cpu": [ "x64" ], @@ -10641,9 +10298,9 @@ ] }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.8.tgz", - "integrity": "sha512-aEU+uJdbvJJGrzzAsjbjrPeNbG/bcG8JoXK2kSsUB+/sWHTIkHX0AQ3oX3aV/lcLKgZWrUxLAfLoCXEnIHMEyQ==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.3.13.tgz", + "integrity": "sha512-y5XxwxDW4DrPKy+8P6t7I7IbA7B/iXjLoaS0jP/EwjSHWf/EnZzq9MgWqdop1km8Mwx6s1zcj+0qs73jL2N98w==", "cpu": [ "arm64" ], @@ -10655,9 +10312,9 @@ ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.2.8.tgz", - "integrity": "sha512-GHYzNOSoiLyG9elLTmMqADJMQzjll+co4irp5AgZ+KHG9EVq0qEHxDqDIJxZnUA15U8JDvCgo6YAo3T0BFEL0Q==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.3.13.tgz", + "integrity": "sha512-n24sznsZe3lC8ok6MgsT1nG4lVx3SQ/lZ0g23i2BGMRN8/p+kaC2eoPaHe/4m9Liz/W4Z5LhZCCvg4DQMEzeLA==", "cpu": [ "ia32" ], @@ -10669,9 +10326,9 @@ ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.8.tgz", - "integrity": "sha512-EigKLhKLH1kfv1e/ZgXuSKlIjkbyneJtiLbNDz7EeEVFGV1XMM6bsCea1sb2WOxsPYiOX4Q5JmR1j1KGrZS/LA==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.3.13.tgz", + "integrity": "sha512-CLyTNo0OrOD7xFKusFciKKG+8CXPowjPz+tcdkkrKYqGzAPzOcszblikITJhMbc7DLMzdTRSZUTkKLRydYH9sw==", "cpu": [ "x64" ], @@ -10683,16 +10340,15 @@ ] }, "node_modules/@rspack/core": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.2.8.tgz", - "integrity": "sha512-ppj3uQQtkhgrYDLrUqb33YbpNEZCpAudpfVuOHGsvUrAnu1PijbfJJymoA5ZvUhM+HNMvPI5D1ie97TXyb0UVg==", + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.3.13.tgz", + "integrity": "sha512-j9jsNzKeEN14yraqX4jAFrM/nMfX5YEPgEMPlp4g5NAu3siaBa8gDF5brbdNq6TDXnTHK1MwwjaMdKA+3YeBKQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@module-federation/runtime-tools": "0.8.4", - "@rspack/binding": "1.2.8", - "@rspack/lite-tapable": "1.0.1", - "caniuse-lite": "^1.0.30001702" + "@module-federation/runtime-tools": "0.14.3", + "@rspack/binding": "1.3.13", + "@rspack/lite-tapable": "1.0.1" }, "engines": { "node": ">=16.0.0" @@ -10707,68 +10363,74 @@ } }, "node_modules/@rspack/core/node_modules/@module-federation/error-codes": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.4.tgz", - "integrity": "sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.14.3.tgz", + "integrity": "sha512-sBJ3XKU9g5Up31jFeXPFsD8AgORV7TLO/cCSMuRewSfgYbG/3vSKLJmfHrO6+PvjZSb9VyV2UaF02ojktW65vw==", "devOptional": true, "license": "MIT" }, "node_modules/@rspack/core/node_modules/@module-federation/runtime": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.4.tgz", - "integrity": "sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.14.3.tgz", + "integrity": "sha512-7ZHpa3teUDVhraYdxQGkfGHzPbjna4LtwbpudgzAxSLLFxLDNanaxCuSeIgSM9c+8sVUNC9kvzUgJEZB0krPJw==", "devOptional": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "0.8.4", - "@module-federation/sdk": "0.8.4" + "@module-federation/error-codes": "0.14.3", + "@module-federation/runtime-core": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, - "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.4.tgz", - "integrity": "sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==", + "node_modules/@rspack/core/node_modules/@module-federation/runtime-core": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.14.3.tgz", + "integrity": "sha512-xMFQXflLVW/AJTWb4soAFP+LB4XuhE7ryiLIX8oTyUoBBgV6U2OPghnFljPjeXbud72O08NYlQ1qsHw1kN/V8Q==", "devOptional": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.8.4", - "@module-federation/webpack-bundler-runtime": "0.8.4" + "@module-federation/error-codes": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, - "node_modules/@rspack/core/node_modules/@module-federation/sdk": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.4.tgz", - "integrity": "sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==", + "node_modules/@rspack/core/node_modules/@module-federation/runtime-tools": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.14.3.tgz", + "integrity": "sha512-QBETX7iMYXdSa3JtqFlYU+YkpymxETZqyIIRiqg0gW+XGpH3jgU68yjrme2NBJp7URQi/CFZG8KWtfClk0Pjgw==", "devOptional": true, "license": "MIT", "dependencies": { - "isomorphic-rslog": "0.0.6" + "@module-federation/runtime": "0.14.3", + "@module-federation/webpack-bundler-runtime": "0.14.3" } }, + "node_modules/@rspack/core/node_modules/@module-federation/sdk": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.14.3.tgz", + "integrity": "sha512-THJZMfbXpqjQOLblCQ8jjcBFFXsGRJwUWE9l/Q4SmuCSKMgAwie7yLT0qSGrHmyBYrsUjAuy+xNB4nfKP0pnGw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.4.tgz", - "integrity": "sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.14.3.tgz", + "integrity": "sha512-hIyJFu34P7bY2NeMIUHAS/mYUHEY71VTAsN0A0AqEJFSVPszheopu9VdXq0VDLrP9KQfuXT8SDxeYeJXyj0mgA==", "devOptional": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.8.4", - "@module-federation/sdk": "0.8.4" + "@module-federation/runtime": "0.14.3", + "@module-federation/sdk": "0.14.3" } }, "node_modules/@rspack/dev-server": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.1.tgz", - "integrity": "sha512-9r7vOml2SrFA8cvbcJdSan9wHEo1TPXezF22+s5jvdyAAywg8w7HqDol6TPVv64NUonP1DOdyLxZ+6UW6WZiwg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.2.tgz", + "integrity": "sha512-YNzXxWn6DV3X9yeJZ9bqX77wuhm2ko3sGavilBGi1MWuNihhWfhh9dlbipudPyoiwLl0lbioxA/hevosr+ajLg==", "dev": true, "license": "MIT", "dependencies": { "chokidar": "^3.6.0", - "express": "^4.21.2", "http-proxy-middleware": "^2.0.7", - "mime-types": "^2.1.35", "p-retry": "^6.2.0", - "webpack-dev-middleware": "^7.4.2", "webpack-dev-server": "5.2.0", "ws": "^8.18.0" }, @@ -10779,38 +10441,6 @@ "@rspack/core": "*" } }, - "node_modules/@rspack/dev-server/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rspack/dev-server/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/@rspack/dev-server/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -10836,99 +10466,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/@rspack/dev-server/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@rspack/dev-server/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rspack/dev-server/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/@rspack/dev-server/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "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" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@rspack/dev-server/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@rspack/dev-server/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -10967,30 +10504,6 @@ } } }, - "node_modules/@rspack/dev-server/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@rspack/dev-server/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/@rspack/dev-server/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@rspack/dev-server/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -11004,22 +10517,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@rspack/dev-server/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/@rspack/dev-server/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -11033,22 +10530,6 @@ "node": ">=8.10.0" } }, - "node_modules/@rspack/dev-server/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/@rspack/lite-tapable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", @@ -11060,9 +10541,9 @@ } }, "node_modules/@rspack/plugin-react-refresh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.4.1.tgz", - "integrity": "sha512-bRALP4qEauvrB7RcMQ95rUHu1dw19V6c6uYukUTpA2OZDyMHTQ9cpEe28kaDwH/xsAuDNuYqnUZOW3NdLO/q3A==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.4.3.tgz", + "integrity": "sha512-wZx4vWgy5oMEvgyNGd/oUKcdnKaccYWHCRkOqTdAPJC3WcytxhTX+Kady8ERurSBiLyQpoMiU3Iyd+F1Y2Arbw==", "dev": true, "license": "MIT", "dependencies": { @@ -14490,6 +13971,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, "node_modules/array-includes": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", @@ -15278,6 +14765,60 @@ "dev": true, "license": "MIT" }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bonjour-service": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", @@ -15715,13 +15256,13 @@ } }, "node_modules/cache-manager": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-6.4.0.tgz", - "integrity": "sha512-eUmPyVqQYzWCt7hx1QrYzQ7oC3MGKM1etxxe8zuq1o7IB4NzdBeWcUGDSWYahaI8fkd538SEZRGadyZWQfvOzQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-6.4.3.tgz", + "integrity": "sha512-VV5eq/QQ5rIVix7/aICO4JyvSeEv9eIQuKL5iFwgM2BrcYoE0A/D1mNsAHJAsB0WEbNdBlKkn6Tjz6fKzh/cKQ==", "license": "MIT", "peer": true, "dependencies": { - "keyv": "^5.2.3" + "keyv": "^5.3.3" } }, "node_modules/cachedir": { @@ -20413,6 +19954,39 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/find-cache-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", @@ -21120,6 +20694,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-them-args": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/get-them-args/-/get-them-args-1.3.2.tgz", + "integrity": "sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==", + "dev": true, + "license": "MIT" + }, "node_modules/getos": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", @@ -22496,6 +22077,16 @@ "node": ">= 12" } }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -23070,6 +22661,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true, + "license": "MIT" + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -23147,6 +22745,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -23179,16 +22792,6 @@ "node": ">=0.10.0" } }, - "node_modules/isomorphic-rslog": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.6.tgz", - "integrity": "sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=14.17.6" - } - }, "node_modules/isomorphic-ws": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", @@ -24937,6 +24540,20 @@ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", "optional": true }, + "node_modules/kill-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/kill-port/-/kill-port-1.6.1.tgz", + "integrity": "sha512-un0Y55cOM7JKGaLnGja28T38tDDop0AQ8N0KlAdyh+B1nmMoX8AnNmqPNZbS3mUMgiST51DCVqmbFT1gNJpVNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-them-args": "1.3.2", + "shell-exec": "1.0.2" + }, + "bin": { + "kill-port": "cli.js" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -26967,9 +26584,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -27626,9 +27243,9 @@ "license": "MIT" }, "node_modules/nx": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.1.tgz", - "integrity": "sha512-73Uw8YXpsjeLqHSl7NMCmGdCs+8ynPzoNJFWAqVanPETEY9zPd5wevVQmeyzYtNNQU35uj6Os4iUzYunmwnFaA==", + "version": "21.1.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.1.2.tgz", + "integrity": "sha512-oczAEOOkQHElxCXs2g2jXDRabDRsmub/h5SAgqAUDSJ2CRnYGVVlgZX7l+o+A9kSqfONyLy5FlJ1pSWlvPuG4w==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -27662,6 +27279,7 @@ "string-width": "^4.2.3", "tar-stream": "~2.2.0", "tmp": "~0.2.1", + "tree-kill": "^1.2.2", "tsconfig-paths": "^4.1.2", "tslib": "^2.3.0", "yaml": "^2.6.0", @@ -27673,16 +27291,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.1", - "@nx/nx-darwin-x64": "20.8.1", - "@nx/nx-freebsd-x64": "20.8.1", - "@nx/nx-linux-arm-gnueabihf": "20.8.1", - "@nx/nx-linux-arm64-gnu": "20.8.1", - "@nx/nx-linux-arm64-musl": "20.8.1", - "@nx/nx-linux-x64-gnu": "20.8.1", - "@nx/nx-linux-x64-musl": "20.8.1", - "@nx/nx-win32-arm64-msvc": "20.8.1", - "@nx/nx-win32-x64-msvc": "20.8.1" + "@nx/nx-darwin-arm64": "21.1.2", + "@nx/nx-darwin-x64": "21.1.2", + "@nx/nx-freebsd-x64": "21.1.2", + "@nx/nx-linux-arm-gnueabihf": "21.1.2", + "@nx/nx-linux-arm64-gnu": "21.1.2", + "@nx/nx-linux-arm64-musl": "21.1.2", + "@nx/nx-linux-x64-gnu": "21.1.2", + "@nx/nx-linux-x64-musl": "21.1.2", + "@nx/nx-win32-arm64-msvc": "21.1.2", + "@nx/nx-win32-x64-msvc": "21.1.2" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -28654,6 +28272,12 @@ "devOptional": true, "license": "ISC" }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -28923,9 +28547,9 @@ } }, "node_modules/portfinder": { - "version": "1.0.36", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.36.tgz", - "integrity": "sha512-gMKUzCoP+feA7t45moaSx7UniU7PgGN3hA8acAB+3Qn7/js0/lJ07fYZlxt9riE9S3myyxDCyAFzSrLlta0c9g==", + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.37.tgz", + "integrity": "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==", "dev": true, "license": "MIT", "dependencies": { @@ -31730,6 +31354,21 @@ "node": ">= 0.6" } }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -31820,6 +31459,13 @@ "node": ">=8" } }, + "node_modules/shell-exec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shell-exec/-/shell-exec-1.0.2.tgz", + "integrity": "sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==", + "dev": true, + "license": "MIT" + }, "node_modules/shell-quote": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", @@ -33127,6 +32773,42 @@ "node": ">=10" } }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tcp-port-used/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, "node_modules/telejson": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", @@ -33507,15 +33189,16 @@ } }, "node_modules/ts-checker-rspack-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.1.1.tgz", - "integrity": "sha512-BlpPqnfAmV0TcDg58H+1qV8Zb57ilv0x+ajjnxrVQ6BWgC8HzAdc+TycqDOJ4sZZYIV+hywQGozZFGklzbCR6A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.1.3.tgz", + "integrity": "sha512-VpB+L+F330T484qGp5KqyoU00PRlUlz4kO1ifBpQ5CkKXEFXye8nmeXlZ5rvZAXjFAMRFiG+sI9OewO6Bd9UvA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "@rspack/lite-tapable": "^1.0.0", "chokidar": "^3.5.3", + "is-glob": "^4.0.3", "memfs": "^4.14.0", "minimatch": "^9.0.5", "picocolors": "^1.1.1" @@ -33582,9 +33265,9 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/memfs": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", - "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", + "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -34647,9 +34330,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.1.tgz", - "integrity": "sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "license": "MIT", "peer": true, "dependencies": { @@ -34722,9 +34405,9 @@ } }, "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", - "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", + "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", "cpu": [ "arm" ], @@ -34736,9 +34419,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", - "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", + "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", "cpu": [ "arm64" ], @@ -34750,9 +34433,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", - "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", + "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", "cpu": [ "arm64" ], @@ -34764,9 +34447,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", - "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", + "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", "cpu": [ "x64" ], @@ -34778,9 +34461,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", - "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", + "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", "cpu": [ "arm64" ], @@ -34792,9 +34475,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", - "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", + "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", "cpu": [ "x64" ], @@ -34806,9 +34489,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", - "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", + "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", "cpu": [ "arm" ], @@ -34820,9 +34503,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", - "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", + "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", "cpu": [ "arm" ], @@ -34834,9 +34517,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", - "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", + "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", "cpu": [ "arm64" ], @@ -34848,9 +34531,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", - "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", + "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", "cpu": [ "arm64" ], @@ -34862,9 +34545,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", - "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", + "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", "cpu": [ "loong64" ], @@ -34876,9 +34559,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", - "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", + "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", "cpu": [ "ppc64" ], @@ -34890,9 +34573,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", - "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", + "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", "cpu": [ "riscv64" ], @@ -34904,9 +34587,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", - "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", + "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", "cpu": [ "s390x" ], @@ -34918,9 +34601,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", - "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", + "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", "cpu": [ "x64" ], @@ -34932,9 +34615,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", - "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", + "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", "cpu": [ "x64" ], @@ -34946,9 +34629,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", - "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", + "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", "cpu": [ "arm64" ], @@ -34960,9 +34643,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", - "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", + "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", "cpu": [ "ia32" ], @@ -34974,9 +34657,9 @@ "peer": true }, "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", - "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", + "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", "cpu": [ "x64" ], @@ -34995,9 +34678,9 @@ "peer": true }, "node_modules/vite/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", "funding": [ { "type": "opencollective", @@ -35015,7 +34698,7 @@ "license": "MIT", "peer": true, "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -35024,9 +34707,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", - "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", + "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", "license": "MIT", "peer": true, "dependencies": { @@ -35040,26 +34723,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.2", - "@rollup/rollup-android-arm64": "4.40.2", - "@rollup/rollup-darwin-arm64": "4.40.2", - "@rollup/rollup-darwin-x64": "4.40.2", - "@rollup/rollup-freebsd-arm64": "4.40.2", - "@rollup/rollup-freebsd-x64": "4.40.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", - "@rollup/rollup-linux-arm-musleabihf": "4.40.2", - "@rollup/rollup-linux-arm64-gnu": "4.40.2", - "@rollup/rollup-linux-arm64-musl": "4.40.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-musl": "4.40.2", - "@rollup/rollup-linux-s390x-gnu": "4.40.2", - "@rollup/rollup-linux-x64-gnu": "4.40.2", - "@rollup/rollup-linux-x64-musl": "4.40.2", - "@rollup/rollup-win32-arm64-msvc": "4.40.2", - "@rollup/rollup-win32-ia32-msvc": "4.40.2", - "@rollup/rollup-win32-x64-msvc": "4.40.2", + "@rollup/rollup-android-arm-eabi": "4.41.1", + "@rollup/rollup-android-arm64": "4.41.1", + "@rollup/rollup-darwin-arm64": "4.41.1", + "@rollup/rollup-darwin-x64": "4.41.1", + "@rollup/rollup-freebsd-arm64": "4.41.1", + "@rollup/rollup-freebsd-x64": "4.41.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", + "@rollup/rollup-linux-arm-musleabihf": "4.41.1", + "@rollup/rollup-linux-arm64-gnu": "4.41.1", + "@rollup/rollup-linux-arm64-musl": "4.41.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-musl": "4.41.1", + "@rollup/rollup-linux-s390x-gnu": "4.41.1", + "@rollup/rollup-linux-x64-gnu": "4.41.1", + "@rollup/rollup-linux-x64-musl": "4.41.1", + "@rollup/rollup-win32-arm64-msvc": "4.41.1", + "@rollup/rollup-win32-ia32-msvc": "4.41.1", + "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" } }, @@ -35429,36 +35112,6 @@ } } }, - "node_modules/webpack-dev-server/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/webpack-dev-server/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/webpack-dev-server/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -35553,24 +35206,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/webpack-dev-server/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/webpack-dev-server/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -35631,12 +35266,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/webpack-dev-server/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, "node_modules/webpack-dev-server/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -35649,21 +35278,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/webpack-dev-server/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -35676,21 +35290,6 @@ "node": ">=8.10.0" } }, - "node_modules/webpack-dev-server/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/webpack-hot-middleware": { "version": "2.26.1", "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", diff --git a/package.json b/package.json index a2f647c73..738bf317a 100644 --- a/package.json +++ b/package.json @@ -154,17 +154,17 @@ "@eslint/js": "9.24.0", "@nestjs/schematics": "11.0.5", "@nestjs/testing": "11.1.0", - "@nx/angular": "20.8.1", - "@nx/cypress": "20.8.1", - "@nx/eslint-plugin": "20.8.1", - "@nx/jest": "20.8.1", - "@nx/js": "20.8.1", - "@nx/module-federation": "20.8.1", - "@nx/nest": "20.8.1", - "@nx/node": "20.8.1", - "@nx/storybook": "20.8.1", - "@nx/web": "20.8.1", - "@nx/workspace": "20.8.1", + "@nx/angular": "21.1.2", + "@nx/cypress": "21.1.2", + "@nx/eslint-plugin": "21.1.2", + "@nx/jest": "21.1.2", + "@nx/js": "21.1.2", + "@nx/module-federation": "21.1.2", + "@nx/nest": "21.1.2", + "@nx/node": "21.1.2", + "@nx/storybook": "21.1.2", + "@nx/web": "21.1.2", + "@nx/workspace": "21.1.2", "@schematics/angular": "19.2.1", "@storybook/addon-essentials": "8.6.12", "@storybook/addon-interactions": "8.6.12", @@ -191,7 +191,7 @@ "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", "jest-preset-angular": "14.4.2", - "nx": "20.8.1", + "nx": "21.1.2", "prettier": "3.5.3", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "6.8.2", From fde8ff4bb6dba99b7b045bbb34bf90a685912e62 Mon Sep 17 00:00:00 2001 From: Tobias Kugel <78074722+tobikugel@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:31:45 -0300 Subject: [PATCH 43/81] Feature/localize X-ray rule FeeRatioInitialInvestment (#4779) * Localize X-ray rule FeeRatioInitialInvestment * Update changelog --------- Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 4 +++ apps/api/src/app/auth/jwt.strategy.ts | 14 +++++++- .../api/src/app/endpoints/ai/ai.controller.ts | 10 ++---- .../src/app/portfolio/portfolio.service.ts | 1 + .../app/subscription/subscription.service.ts | 2 +- apps/api/src/app/user/user.service.ts | 1 + apps/api/src/models/rule.ts | 15 ++++---- .../current-investment.ts | 7 ++-- .../account-cluster-risk/single-account.ts | 7 ++-- .../rules/asset-class-cluster-risk/equity.ts | 7 ++-- .../asset-class-cluster-risk/fixed-income.ts | 7 ++-- .../base-currency-current-investment.ts | 7 ++-- .../current-investment.ts | 7 ++-- .../developed-markets.ts | 7 ++-- .../emerging-markets.ts | 7 ++-- .../emergency-fund/emergency-fund-setup.ts | 7 ++-- .../fees/fee-ratio-initial-investment.ts | 36 ++++++++++++++----- .../asia-pacific.ts | 7 ++-- .../emerging-markets.ts | 7 ++-- .../regional-market-cluster-risk/europe.ts | 7 ++-- .../regional-market-cluster-risk/japan.ts | 7 ++-- .../north-america.ts | 7 ++-- apps/api/src/services/i18n/i18n.service.ts | 12 +++++-- .../access-table/access-table.component.ts | 3 +- .../admin-settings.component.ts | 10 ++---- apps/client/src/app/pages/i18n/i18n-page.html | 9 +++++ 26 files changed, 152 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63c2b12d1..68117a0ea 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 + +- Set up the language localization for the static portfolio analysis rule: _Fees_ (Fee Ratio) + ### Changed - Upgraded `Nx` from version `20.8.1` to `21.1.2` diff --git a/apps/api/src/app/auth/jwt.strategy.ts b/apps/api/src/app/auth/jwt.strategy.ts index 7a3fb224b..3d466082a 100644 --- a/apps/api/src/app/auth/jwt.strategy.ts +++ b/apps/api/src/app/auth/jwt.strategy.ts @@ -1,7 +1,11 @@ import { UserService } from '@ghostfolio/api/app/user/user.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; -import { HEADER_KEY_TIMEZONE } from '@ghostfolio/common/config'; +import { + DEFAULT_CURRENCY, + DEFAULT_LANGUAGE_CODE, + HEADER_KEY_TIMEZONE +} from '@ghostfolio/common/config'; import { hasRole } from '@ghostfolio/common/permissions'; import { HttpException, Injectable } from '@nestjs/common'; @@ -52,6 +56,14 @@ export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { }); } + if (!user.Settings.settings.baseCurrency) { + user.Settings.settings.baseCurrency = DEFAULT_CURRENCY; + } + + if (!user.Settings.settings.language) { + user.Settings.settings.language = DEFAULT_LANGUAGE_CODE; + } + return user; } else { throw new HttpException( diff --git a/apps/api/src/app/endpoints/ai/ai.controller.ts b/apps/api/src/app/endpoints/ai/ai.controller.ts index 980d5607c..8050c675b 100644 --- a/apps/api/src/app/endpoints/ai/ai.controller.ts +++ b/apps/api/src/app/endpoints/ai/ai.controller.ts @@ -1,10 +1,6 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; -import { - DEFAULT_CURRENCY, - DEFAULT_LANGUAGE_CODE -} from '@ghostfolio/common/config'; import { AiPromptResponse } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; import type { AiPromptMode, RequestWithUser } from '@ghostfolio/common/types'; @@ -53,10 +49,8 @@ export class AiController { filters, mode, impersonationId: undefined, - languageCode: - this.request.user.Settings.settings.language ?? DEFAULT_LANGUAGE_CODE, - userCurrency: - this.request.user.Settings.settings.baseCurrency ?? DEFAULT_CURRENCY, + languageCode: this.request.user.Settings.settings.language, + userCurrency: this.request.user.Settings.settings.baseCurrency, 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 18f923112..313721a17 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1332,6 +1332,7 @@ export class PortfolioService { [ new FeeRatioInitialInvestment( this.exchangeRateDataService, + userSettings.language, summary.committedFunds, summary.fees ) diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 2e5724c96..d233e475c 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -61,7 +61,7 @@ export class SubscriptionService { const checkoutSessionCreateParams: Stripe.Checkout.SessionCreateParams = { cancel_url: `${this.configurationService.get('ROOT_URL')}/${ - user.Settings?.settings?.language ?? DEFAULT_LANGUAGE_CODE + user.Settings.settings.language }/account`, client_reference_id: user.id, line_items: [ diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 2a48b2583..774f9746b 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -302,6 +302,7 @@ export class UserService { undefined ).getSettings(user.Settings.settings), FeeRatioInitialInvestment: new FeeRatioInitialInvestment( + undefined, undefined, undefined, undefined diff --git a/apps/api/src/models/rule.ts b/apps/api/src/models/rule.ts index 187527fbb..0870be03e 100644 --- a/apps/api/src/models/rule.ts +++ b/apps/api/src/models/rule.ts @@ -1,5 +1,6 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; import { groupBy } from '@ghostfolio/common/helper'; import { PortfolioPosition, @@ -14,28 +15,28 @@ import { RuleInterface } from './interfaces/rule.interface'; export abstract class Rule implements RuleInterface { private key: string; - private name: string; + private languageCode: string; public constructor( protected exchangeRateDataService: ExchangeRateDataService, { key, - name + languageCode = DEFAULT_LANGUAGE_CODE }: { key: string; - name: string; + languageCode?: string; // TODO: Make mandatory } ) { this.key = key; - this.name = name; + this.languageCode = languageCode; } public getKey() { return this.key; } - public getName() { - return this.name; + public getLanguageCode() { + return this.languageCode; } public groupCurrentHoldingsByAttribute( @@ -73,5 +74,7 @@ export abstract class Rule implements RuleInterface { PortfolioReportRule['configuration'] >; + public abstract getName(): string; + public abstract getSettings(aUserSettings: UserSettings): T; } diff --git a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts index 564af935d..76b7e2f94 100644 --- a/apps/api/src/models/rules/account-cluster-risk/current-investment.ts +++ b/apps/api/src/models/rules/account-cluster-risk/current-investment.ts @@ -15,8 +15,7 @@ export class AccountClusterRiskCurrentInvestment extends Rule { accounts: PortfolioDetails['accounts'] ) { super(exchangeRateDataService, { - key: AccountClusterRiskCurrentInvestment.name, - name: 'Investment' + key: AccountClusterRiskCurrentInvestment.name }); this.accounts = accounts; @@ -88,6 +87,10 @@ export class AccountClusterRiskCurrentInvestment extends Rule { }; } + public getName() { + return 'Investment'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/account-cluster-risk/single-account.ts b/apps/api/src/models/rules/account-cluster-risk/single-account.ts index ef549e579..50f49efab 100644 --- a/apps/api/src/models/rules/account-cluster-risk/single-account.ts +++ b/apps/api/src/models/rules/account-cluster-risk/single-account.ts @@ -11,8 +11,7 @@ export class AccountClusterRiskSingleAccount extends Rule { accounts: PortfolioDetails['accounts'] ) { super(exchangeRateDataService, { - key: AccountClusterRiskSingleAccount.name, - name: 'Single Account' + key: AccountClusterRiskSingleAccount.name }); this.accounts = accounts; @@ -38,6 +37,10 @@ export class AccountClusterRiskSingleAccount extends Rule { return undefined; } + public getName() { + return 'Single Account'; + } + public getSettings({ xRayRules }: UserSettings): RuleSettings { return { isActive: xRayRules?.[this.getKey()].isActive ?? true diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts index b67e01e61..b386f3e18 100644 --- a/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts +++ b/apps/api/src/models/rules/asset-class-cluster-risk/equity.ts @@ -11,8 +11,7 @@ export class AssetClassClusterRiskEquity extends Rule { holdings: PortfolioPosition[] ) { super(exchangeRateDataService, { - key: AssetClassClusterRiskEquity.name, - name: 'Equity' + key: AssetClassClusterRiskEquity.name }); this.holdings = holdings; @@ -78,6 +77,10 @@ export class AssetClassClusterRiskEquity extends Rule { }; } + public getName() { + return 'Equity'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts index eb744a143..918856c45 100644 --- a/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts +++ b/apps/api/src/models/rules/asset-class-cluster-risk/fixed-income.ts @@ -11,8 +11,7 @@ export class AssetClassClusterRiskFixedIncome extends Rule { holdings: PortfolioPosition[] ) { super(exchangeRateDataService, { - key: AssetClassClusterRiskFixedIncome.name, - name: 'Fixed Income' + key: AssetClassClusterRiskFixedIncome.name }); this.holdings = holdings; @@ -78,6 +77,10 @@ export class AssetClassClusterRiskFixedIncome extends Rule { }; } + public getName() { + return 'Fixed Income'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts index 90ee29c54..6de686a9e 100644 --- a/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts +++ b/apps/api/src/models/rules/currency-cluster-risk/base-currency-current-investment.ts @@ -11,8 +11,7 @@ export class CurrencyClusterRiskBaseCurrencyCurrentInvestment extends Rule { holdings: PortfolioPosition[] ) { super(exchangeRateDataService, { - key: CurrencyClusterRiskCurrentInvestment.name, - name: 'Investment' + key: CurrencyClusterRiskCurrentInvestment.name }); this.holdings = holdings; @@ -73,6 +72,10 @@ export class CurrencyClusterRiskCurrentInvestment extends Rule { }; } + public getName() { + return 'Investment'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts index 15e113927..8f3ef0d65 100644 --- a/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts +++ b/apps/api/src/models/rules/economic-market-cluster-risk/developed-markets.ts @@ -13,8 +13,7 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule { developedMarketsValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: EconomicMarketClusterRiskDevelopedMarkets.name, - name: 'Developed Markets' + key: EconomicMarketClusterRiskDevelopedMarkets.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -67,6 +66,10 @@ export class EconomicMarketClusterRiskDevelopedMarkets extends Rule { }; } + public getName() { + return 'Developed Markets'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts index 8fccdf1d8..48eff22cf 100644 --- a/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts +++ b/apps/api/src/models/rules/economic-market-cluster-risk/emerging-markets.ts @@ -13,8 +13,7 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule { emergingMarketsValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: EconomicMarketClusterRiskEmergingMarkets.name, - name: 'Emerging Markets' + key: EconomicMarketClusterRiskEmergingMarkets.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -67,6 +66,10 @@ export class EconomicMarketClusterRiskEmergingMarkets extends Rule { }; } + public getName() { + return 'Emerging Markets'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts index d13f2ffc5..8b53e6799 100644 --- a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts +++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts @@ -11,8 +11,7 @@ export class EmergencyFundSetup extends Rule { emergencyFund: number ) { super(exchangeRateDataService, { - key: EmergencyFundSetup.name, - name: 'Emergency Fund: Set up' + key: EmergencyFundSetup.name }); this.emergencyFund = emergencyFund; @@ -36,6 +35,10 @@ export class EmergencyFundSetup extends Rule { return undefined; } + public getName() { + return 'Emergency Fund: Set up'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts index fa9d7e7bc..4298eed44 100644 --- a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts +++ b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts @@ -1,20 +1,23 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; import { UserSettings } from '@ghostfolio/common/interfaces'; export class FeeRatioInitialInvestment extends Rule { private fees: number; + private i18nService = new I18nService(); private totalInvestment: number; public constructor( protected exchangeRateDataService: ExchangeRateDataService, + languageCode: string, totalInvestment: number, fees: number ) { super(exchangeRateDataService, { - key: FeeRatioInitialInvestment.name, - name: 'Fee Ratio' + languageCode, + key: FeeRatioInitialInvestment.name }); this.fees = fees; @@ -28,17 +31,27 @@ export class FeeRatioInitialInvestment extends Rule { if (feeRatio > ruleSettings.thresholdMax) { return { - evaluation: `The fees do exceed ${ - ruleSettings.thresholdMax * 100 - }% of your initial investment (${(feeRatio * 100).toPrecision(3)}%)`, + evaluation: this.i18nService.getTranslation({ + id: 'rule.feeRatioInitialInvestment.false', + languageCode: this.getLanguageCode(), + placeholders: { + feeRatio: (ruleSettings.thresholdMax * 100).toFixed(2), + thresholdMax: (feeRatio * 100).toPrecision(3) + } + }), value: false }; } return { - evaluation: `The fees do not exceed ${ - ruleSettings.thresholdMax * 100 - }% of your initial investment (${(feeRatio * 100).toPrecision(3)}%)`, + evaluation: this.i18nService.getTranslation({ + id: 'rule.feeRatioInitialInvestment.true', + languageCode: this.getLanguageCode(), + placeholders: { + feeRatio: (feeRatio * 100).toPrecision(3), + thresholdMax: (ruleSettings.thresholdMax * 100).toFixed(2) + } + }), value: true }; } @@ -55,6 +68,13 @@ export class FeeRatioInitialInvestment extends Rule { }; } + public getName() { + return this.i18nService.getTranslation({ + id: 'rule.feeRatioInitialInvestment', + languageCode: this.getLanguageCode() + }); + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts b/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts index d49849d54..823da9e27 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/asia-pacific.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskAsiaPacific extends Rule { asiaPacificValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskAsiaPacific.name, - name: 'Asia-Pacific' + key: RegionalMarketClusterRiskAsiaPacific.name }); this.asiaPacificValueInBaseCurrency = asiaPacificValueInBaseCurrency; @@ -66,6 +65,10 @@ export class RegionalMarketClusterRiskAsiaPacific extends Rule { }; } + public getName() { + return 'Asia-Pacific'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts b/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts index 2d9a3b394..b1ab74e1f 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/emerging-markets.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskEmergingMarkets extends Rule { emergingMarketsValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskEmergingMarkets.name, - name: 'Emerging Markets' + key: RegionalMarketClusterRiskEmergingMarkets.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -68,6 +67,10 @@ export class RegionalMarketClusterRiskEmergingMarkets extends Rule { }; } + public getName() { + return 'Emerging Markets'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts index d33190ceb..3b069cf57 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/europe.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskEurope extends Rule { europeValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskEurope.name, - name: 'Europe' + key: RegionalMarketClusterRiskEurope.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -66,6 +65,10 @@ export class RegionalMarketClusterRiskEurope extends Rule { }; } + public getName() { + return 'Europe'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts b/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts index 4694b0006..511393cfb 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/japan.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskJapan extends Rule { japanValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskJapan.name, - name: 'Japan' + key: RegionalMarketClusterRiskJapan.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -66,6 +65,10 @@ export class RegionalMarketClusterRiskJapan extends Rule { }; } + public getName() { + return 'Japan'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts index 4563b7c54..5bea57db1 100644 --- a/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts +++ b/apps/api/src/models/rules/regional-market-cluster-risk/north-america.ts @@ -14,8 +14,7 @@ export class RegionalMarketClusterRiskNorthAmerica extends Rule { northAmericaValueInBaseCurrency: number ) { super(exchangeRateDataService, { - key: RegionalMarketClusterRiskNorthAmerica.name, - name: 'North America' + key: RegionalMarketClusterRiskNorthAmerica.name }); this.currentValueInBaseCurrency = currentValueInBaseCurrency; @@ -66,6 +65,10 @@ export class RegionalMarketClusterRiskNorthAmerica extends Rule { }; } + public getName() { + return 'North America'; + } + public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { return { baseCurrency, diff --git a/apps/api/src/services/i18n/i18n.service.ts b/apps/api/src/services/i18n/i18n.service.ts index 13193fc6a..e928775d1 100644 --- a/apps/api/src/services/i18n/i18n.service.ts +++ b/apps/api/src/services/i18n/i18n.service.ts @@ -15,10 +15,12 @@ export class I18nService { public getTranslation({ id, - languageCode + languageCode, + placeholders }: { id: string; languageCode: string; + placeholders?: Record; }): string { const $ = this.translations[languageCode]; @@ -26,7 +28,7 @@ export class I18nService { Logger.warn(`Translation not found for locale '${languageCode}'`); } - const translatedText = $( + let translatedText = $( `trans-unit[id="${id}"] > ${ languageCode === DEFAULT_LANGUAGE_CODE ? 'source' : 'target' }` @@ -38,6 +40,12 @@ export class I18nService { ); } + if (placeholders) { + for (const [key, value] of Object.entries(placeholders)) { + translatedText = translatedText.replace(`{${key}}`, String(value)); + } + } + return translatedText.trim(); } diff --git a/apps/client/src/app/components/access-table/access-table.component.ts b/apps/client/src/app/components/access-table/access-table.component.ts index e70b6684a..bcd5839e0 100644 --- a/apps/client/src/app/components/access-table/access-table.component.ts +++ b/apps/client/src/app/components/access-table/access-table.component.ts @@ -1,6 +1,5 @@ import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; -import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; import { Access, User } from '@ghostfolio/common/interfaces'; import { paths } from '@ghostfolio/common/paths'; @@ -54,7 +53,7 @@ export class AccessTableComponent implements OnChanges { } public getPublicUrl(aId: string): string { - const languageCode = this.user?.settings?.language ?? DEFAULT_LANGUAGE_CODE; + const languageCode = this.user.settings.language; return `${this.baseUrl}/${languageCode}/${paths.public}/${aId}`; } diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index 3ff8370cd..68db9eaac 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -3,10 +3,7 @@ import { NotificationService } from '@ghostfolio/client/core/notification/notifi import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { - DEFAULT_LANGUAGE_CODE, - PROPERTY_API_KEY_GHOSTFOLIO -} from '@ghostfolio/common/config'; +import { PROPERTY_API_KEY_GHOSTFOLIO } from '@ghostfolio/common/config'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { DataProviderGhostfolioStatusResponse, @@ -70,11 +67,10 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { this.user = state.user; this.defaultDateFormat = getDateFormatString( - this.user?.settings?.locale + this.user.settings.locale ); - const languageCode = - this.user?.settings?.language ?? DEFAULT_LANGUAGE_CODE; + const languageCode = this.user.settings.language; this.pricingUrl = `https://ghostfol.io/${languageCode}/${paths.pricing}`; diff --git a/apps/client/src/app/pages/i18n/i18n-page.html b/apps/client/src/app/pages/i18n/i18n-page.html index b23129c45..e1c244265 100644 --- a/apps/client/src/app/pages/i18n/i18n-page.html +++ b/apps/client/src/app/pages/i18n/i18n-page.html @@ -11,6 +11,15 @@ performance, portfolio, software, stock, trading, wealth, web3
  • My Account
  • +
  • Fee Ratio
  • +
  • + The fees do exceed {thresholdMax}% of your initial investment + ({feeRatio}%) +
  • +
  • + The fees do not exceed {thresholdMax}% of your initial + investment ({feeRatio}%) +
  • Open Source Wealth Management Software
  • From 7d2bb2116f057cf41b704857c95f9de128d21ef1 Mon Sep 17 00:00:00 2001 From: "Andy (Truongan) Vo" <140454605+prosperxo@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:11:52 -0700 Subject: [PATCH 44/81] Bugfix/enable import button in import activities dialog (#4791) * Enable import button in import activities dialog * Update changelog --- CHANGELOG.md | 4 ++++ .../import-activities-dialog.component.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68117a0ea..b75b5f393 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Upgraded `Nx` from version `20.8.1` to `21.1.2` +### Fixed + +- Fixed an issue where the import button was not correctly enabled in the import activities dialog + ## 2.166.0 - 2025-06-05 ### Added 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 20f135801..3abf3a042 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 @@ -330,6 +330,7 @@ export class ImportActivitiesDialog implements OnDestroy { } finally { this.importStep = ImportStep.SELECT_ACTIVITIES; this.snackBar.dismiss(); + this.updateSelection(this.activities); stepper.next(); From 1f01668a52d41f9dceeefaf4386a04393a33e800 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 6 Jun 2025 07:38:54 +0200 Subject: [PATCH 45/81] Feature/upgrade ng-extract-i18n-merge to version 2.15.1 (#4838) * Upgrade ng-extract-i18n-merge to version 2.15.1 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 18 +++++++++--------- package.json | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b75b5f393..d53d2290c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Upgraded `ng-extract-i18n-merge` from version `2.15.0` to `2.15.1` - Upgraded `Nx` from version `20.8.1` to `21.1.2` ### Fixed diff --git a/package-lock.json b/package-lock.json index 18360e2f2..1dd611787 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,7 +72,7 @@ "lodash": "4.17.21", "marked": "15.0.4", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "2.15.0", + "ng-extract-i18n-merge": "2.15.1", "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", @@ -26654,22 +26654,22 @@ "license": "MIT" }, "node_modules/ng-extract-i18n-merge": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.15.0.tgz", - "integrity": "sha512-43ew7btSrRJ34BHfRkjvvW8wXxfyFiM5rbFU22f/ZuEK1wpClV8lNaF09CYixY1+ycMpKLLyW+olj1Nj3kvs4g==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/ng-extract-i18n-merge/-/ng-extract-i18n-merge-2.15.1.tgz", + "integrity": "sha512-vNr+sVySO13imQ1Y7Jwe3JtGKP4Hck4Gzb7i4HxOq9fDLDORDIoazLTiwmZVoW4ZAyqK7kkDavjS0XD+VSMZUA==", "license": "MIT", "dependencies": { - "@angular-devkit/architect": "^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0 || ^0.1800.0 || ^0.1900.0 || ^0.2000.0 || 0.2000.0-rc.2", - "@angular-devkit/core": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || 20.0.0-rc.2", - "@angular-devkit/schematics": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || 20.0.0-rc.2", - "@schematics/angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || 20.0.0-rc.2", + "@angular-devkit/architect": "^0.1301.0 || ^0.1401.0 || ^0.1501.0 || ^0.1601.0 || ^0.1700.0 || ^0.1800.0 || ^0.1900.0 || ^0.2000.0", + "@angular-devkit/core": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@angular-devkit/schematics": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", + "@schematics/angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0", "xmldoc": "^1.1.3" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "@angular-devkit/build-angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || 20.0.0-rc.2" + "@angular-devkit/build-angular": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0" } }, "node_modules/ng-extract-i18n-merge/node_modules/@angular-devkit/architect": { diff --git a/package.json b/package.json index 738bf317a..1e717258e 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "lodash": "4.17.21", "marked": "15.0.4", "ms": "3.0.0-canary.1", - "ng-extract-i18n-merge": "2.15.0", + "ng-extract-i18n-merge": "2.15.1", "ngx-device-detector": "9.0.0", "ngx-markdown": "19.0.0", "ngx-skeleton-loader": "11.0.0", From e2ec635bbff27bdba8edfe0c703844c4b26f78ba Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 6 Jun 2025 07:41:35 +0200 Subject: [PATCH 46/81] Feature/localize X-ray rule EmergencyFundSetup (#4835) * Set up language localization for static portfolio analysis rule: Emergency Fund (Set up) * Update changelog --- CHANGELOG.md | 1 + .../src/app/portfolio/portfolio.service.ts | 1 + apps/api/src/app/user/user.service.ts | 1 + .../emergency-fund/emergency-fund-setup.ts | 19 ++++++++++++++++--- apps/client/src/app/pages/i18n/i18n-page.html | 7 +++++++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d53d2290c..ecbfdad28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Set up the language localization for the static portfolio analysis rule: _Emergency Fund_ (Setup) - Set up the language localization for the static portfolio analysis rule: _Fees_ (Fee Ratio) ### Changed diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 313721a17..9f1901c7f 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1319,6 +1319,7 @@ export class PortfolioService { [ new EmergencyFundSetup( this.exchangeRateDataService, + userSettings.language, this.getTotalEmergencyFund({ userSettings, emergencyFundHoldingsValueInBaseCurrency: diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 774f9746b..21790182f 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -298,6 +298,7 @@ export class UserService { undefined ).getSettings(user.Settings.settings), EmergencyFundSetup: new EmergencyFundSetup( + undefined, undefined, undefined ).getSettings(user.Settings.settings), diff --git a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts index 8b53e6799..a91e68425 100644 --- a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts +++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts @@ -1,16 +1,20 @@ import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { Rule } from '@ghostfolio/api/models/rule'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; import { UserSettings } from '@ghostfolio/common/interfaces'; export class EmergencyFundSetup extends Rule { private emergencyFund: number; + private i18nService = new I18nService(); public constructor( protected exchangeRateDataService: ExchangeRateDataService, + languageCode: string, emergencyFund: number ) { super(exchangeRateDataService, { + languageCode, key: EmergencyFundSetup.name }); @@ -20,13 +24,19 @@ export class EmergencyFundSetup extends Rule { public evaluate() { if (!this.emergencyFund) { return { - evaluation: 'No emergency fund has been set up', + evaluation: this.i18nService.getTranslation({ + id: 'rule.emergencyFundSetup.false', + languageCode: this.getLanguageCode() + }), value: false }; } return { - evaluation: 'An emergency fund has been set up', + evaluation: this.i18nService.getTranslation({ + id: 'rule.emergencyFundSetup.true', + languageCode: this.getLanguageCode() + }), value: true }; } @@ -36,7 +46,10 @@ export class EmergencyFundSetup extends Rule { } public getName() { - return 'Emergency Fund: Set up'; + return this.i18nService.getTranslation({ + id: 'rule.emergencyFundSetup', + languageCode: this.getLanguageCode() + }); } public getSettings({ baseCurrency, xRayRules }: UserSettings): Settings { diff --git a/apps/client/src/app/pages/i18n/i18n-page.html b/apps/client/src/app/pages/i18n/i18n-page.html index e1c244265..f54a45b3f 100644 --- a/apps/client/src/app/pages/i18n/i18n-page.html +++ b/apps/client/src/app/pages/i18n/i18n-page.html @@ -11,6 +11,13 @@ performance, portfolio, software, stock, trading, wealth, web3
  • My Account
  • +
  • Emergency Fund: Set up
  • +
  • + No emergency fund has been set up +
  • +
  • + An emergency fund has been set up +
  • Fee Ratio
  • The fees do exceed {thresholdMax}% of your initial investment From f87dc437fd5aea74fc8ff72bb1096a1b0a9300ca Mon Sep 17 00:00:00 2001 From: Terry Casper Date: Fri, 6 Jun 2025 11:28:19 -0700 Subject: [PATCH 47/81] Feature/improve language localization for ES 20250605 (#4833) * Improve language localization for ES * Updated Changlog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.es.xlf | 46 ++++++++++++------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecbfdad28..55cb91e29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Improved the language localization for Spanish (`es`) - Upgraded `ng-extract-i18n-merge` from version `2.15.0` to `2.15.1` - Upgraded `Nx` from version `20.8.1` to `21.1.2` diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 21457ce5a..23a4e66fa 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -5458,7 +5458,7 @@ Add tag - Add tag + Añadir etiqueta apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html 10 @@ -5466,7 +5466,7 @@ Currency Cluster Risks - Currency Cluster Risks + Riesgos de clúster de divisas apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 93 @@ -5474,7 +5474,7 @@ Account Cluster Risks - Account Cluster Risks + Riesgos de clúster de cuentas apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 141 @@ -5482,7 +5482,7 @@ Transfer Cash Balance - Transfer Cash Balance + Transferir saldo de efectivo apps/client/src/app/components/accounts-table/accounts-table.component.html 10 @@ -5494,7 +5494,7 @@ Benchmark - Benchmark + Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 346 @@ -5502,7 +5502,7 @@ Version - Version + Versión apps/client/src/app/components/admin-overview/admin-overview.html 7 @@ -5510,7 +5510,7 @@ Settings - Settings + Configuración apps/client/src/app/components/user-account-settings/user-account-settings.html 2 @@ -5518,7 +5518,7 @@ From - From + Desde apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 11 @@ -5526,7 +5526,7 @@ To - To + A apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 32 @@ -5534,7 +5534,7 @@ Transfer - Transfer + Transferir apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html 72 @@ -5542,7 +5542,7 @@ Membership - Membership + Membresía apps/client/src/app/pages/user-account/user-account-page-routing.module.ts 24 @@ -5554,7 +5554,7 @@ Access - Access + Acceso apps/client/src/app/pages/user-account/user-account-page-routing.module.ts 29 @@ -5566,7 +5566,7 @@ Find holding... - Find holding... + Buscar holding... libs/ui/src/lib/assistant/assistant.component.ts 143 @@ -5574,7 +5574,7 @@ No entries... - No entries... + No hay entradas... libs/ui/src/lib/assistant/assistant.html 62 @@ -5586,7 +5586,7 @@ Asset Profile - Asset Profile + Perfil de activo apps/client/src/app/components/admin-jobs/admin-jobs.html 35 @@ -5594,7 +5594,7 @@ Do you really want to delete this asset profile? - Do you really want to delete this asset profile? + ¿Realmente deseas eliminar este perfil de activo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts 37 @@ -5602,7 +5602,7 @@ Search - Search + Buscar apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 16 @@ -5610,7 +5610,7 @@ Add Manually - Add Manually + Añadir manualmente apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html 19 @@ -5618,7 +5618,7 @@ Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms. - Ghostfolio es un dashboard de finanzas personales para hacer un seguimiento de tus activos como acciones, ETFs o criptodivisas a través de múltiples plataformas. + Ghostfolio es un dashboard de finanzas personales para hacer un seguimiento de tus activos como acciones, ETFs o criptodivisas a través de múltiples plataformas. apps/client/src/app/pages/i18n/i18n-page.html 4 @@ -5626,7 +5626,7 @@ Last All Time High - Last All Time High + Último máximo histórico libs/ui/src/lib/benchmark/benchmark.component.html 74 @@ -5634,7 +5634,7 @@ User - User + Usuario apps/client/src/app/components/admin-users/admin-users.html 29 @@ -5650,7 +5650,7 @@ Open Source Wealth Management Software - Open Source Wealth Management Software + Software de gestión de patrimonio de código abierto apps/client/src/app/pages/i18n/i18n-page.html 14 @@ -5666,7 +5666,7 @@ Oops, cash balance transfer has failed. - Oops, cash balance transfer has failed. + Oops, el saldo de efectivo no se ha transferido. apps/client/src/app/pages/accounts/accounts-page.component.ts 318 From b5abdaae073dac5d976a2f642a4a43dd789e1cb0 Mon Sep 17 00:00:00 2001 From: csehatt741 <77381875+csehatt741@users.noreply.github.com> Date: Fri, 6 Jun 2025 20:50:12 +0200 Subject: [PATCH 48/81] Feature/extend GfSymbolAutocompleteComponent by default options (#4563) * Extend GfSymbolAutocompleteComponent by default options * Update changelog --- CHANGELOG.md | 1 + libs/ui/src/lib/mocks/httpClient.mock.ts | 18 +++ .../symbol-autocomplete.component.html | 2 +- .../symbol-autocomplete.component.stories.ts | 115 ++++++++++++++++++ .../symbol-autocomplete.component.ts | 38 ++++-- 5 files changed, 165 insertions(+), 9 deletions(-) create mode 100644 libs/ui/src/lib/mocks/httpClient.mock.ts create mode 100644 libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.stories.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 55cb91e29..1d71729b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Extended the symbol search component by default options - Improved the language localization for Spanish (`es`) - Upgraded `ng-extract-i18n-merge` from version `2.15.0` to `2.15.1` - Upgraded `Nx` from version `20.8.1` to `21.1.2` diff --git a/libs/ui/src/lib/mocks/httpClient.mock.ts b/libs/ui/src/lib/mocks/httpClient.mock.ts new file mode 100644 index 000000000..6ef79af61 --- /dev/null +++ b/libs/ui/src/lib/mocks/httpClient.mock.ts @@ -0,0 +1,18 @@ +import { Observable } from 'rxjs'; + +export class HttpClientMock { + public constructor(private mockResponses: Map) {} + + public get(url: string, options?: any): Observable { + if (this.mockResponses.has(url) && options) { + return new Observable((subscriber) => { + subscriber.next(this.mockResponses.get(url)); + subscriber.complete(); + }); + } + + return new Observable((subscriber) => { + subscriber.error(new Error(`No mock data for URL: ${url}`)); + }); + } +} diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html index c6327c318..456cd9940 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html @@ -12,7 +12,7 @@ (optionSelected)="onUpdateSymbol($event)" > @if (!isLoading) { - @for (lookupItem of filteredLookupItems; track lookupItem) { + @for (lookupItem of lookupItems; track lookupItem) { ; + +type Story = StoryObj; + +export const Default: Story = { + args: {} +}; + +export const WithDefaultItems: Story = { + args: { + defaultLookupItems: DEFAULT_OPTIONS + } +}; diff --git a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts index 3c56c4748..4d73e3c53 100644 --- a/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts +++ b/libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts @@ -76,16 +76,17 @@ export class GfSymbolAutocompleteComponent extends AbstractMatFormField implements OnInit, OnDestroy { - @Input() private includeIndices = false; + @Input() public defaultLookupItems: LookupItem[] = []; @Input() public isLoading = false; - @ViewChild(MatInput) private input: MatInput; - @ViewChild('symbolAutocomplete') public symbolAutocomplete: MatAutocomplete; + @Input() private includeIndices = false; + + @ViewChild(MatInput) private input: MatInput; + public control = new FormControl(); - public filteredLookupItems: (LookupItem & { assetSubClassString: string })[] = - []; + public lookupItems: (LookupItem & { assetSubClassString: string })[] = []; private unsubscribeSubject = new Subject(); @@ -106,6 +107,10 @@ export class GfSymbolAutocompleteComponent this.control.disable(); } + if (this.defaultLookupItems?.length) { + this.showDefaultOptions(); + } + this.control.valueChanges .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => { @@ -117,7 +122,13 @@ export class GfSymbolAutocompleteComponent this.control.valueChanges .pipe( filter((query) => { - return isString(query) && query.length > 1; + if (query.length === 0) { + this.showDefaultOptions(); + + return false; + } + + return isString(query); }), tap(() => { this.isLoading = true; @@ -135,7 +146,7 @@ export class GfSymbolAutocompleteComponent }) ) .subscribe((filteredLookupItems) => { - this.filteredLookupItems = filteredLookupItems.map((lookupItem) => { + this.lookupItems = filteredLookupItems.map((lookupItem) => { return { ...lookupItem, assetSubClassString: translate(lookupItem.assetSubClass) @@ -161,7 +172,7 @@ export class GfSymbolAutocompleteComponent } public isValueInOptions(value: string) { - return this.filteredLookupItems.some((item) => { + return this.lookupItems.some((item) => { return item.symbol === value; }); } @@ -193,6 +204,17 @@ export class GfSymbolAutocompleteComponent this.unsubscribeSubject.complete(); } + private showDefaultOptions() { + this.lookupItems = this.defaultLookupItems.map((lookupItem) => { + return { + ...lookupItem, + assetSubClassString: translate(lookupItem.assetSubClass) + }; + }); + + this.changeDetectorRef.markForCheck(); + } + private validateRequired() { const requiredCheck = super.required ? !super.value?.dataSource || !super.value?.symbol From c318e0019efe937bae6629249c0de575b46dcdba Mon Sep 17 00:00:00 2001 From: Alesky Zakarin <59431392+aleskrin@users.noreply.github.com> Date: Sat, 7 Jun 2025 00:51:33 +0600 Subject: [PATCH 49/81] Feature/improve language localization for TR 20250606 (#4844) * Improve language localization for TR * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.tr.xlf | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d71729b4..e443f44e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extended the symbol search component by default options - Improved the language localization for Spanish (`es`) +- Improved the language localization for Turkish (`tr`) - Upgraded `ng-extract-i18n-merge` from version `2.15.0` to `2.15.1` - Upgraded `Nx` from version `20.8.1` to `21.1.2` diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index e044b4211..c0fd7ea12 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -112,7 +112,7 @@ Resources - Piyasalar + Kaynaklar apps/client/src/app/app.component.html 64 @@ -7606,7 +7606,7 @@ Demo user account has been synced. - Demo user account has been synced. + Demo kullanıcı hesabı senkronize edildi. apps/client/src/app/components/admin-overview/admin-overview.component.ts 223 @@ -7614,7 +7614,7 @@ Sync Demo User Account - Sync Demo User Account + Demo Kullanıcı Hesabını Senkronize Et apps/client/src/app/components/admin-overview/admin-overview.html 181 From 1dd3857618777ec4104e23dc3e71acbf780e6a20 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 7 Jun 2025 08:12:23 +0200 Subject: [PATCH 50/81] Refactor getCashPositions() in portfolio service (#4800) * Refactor getCashPositions() --- apps/api/src/app/portfolio/portfolio.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 9f1901c7f..eb6abc224 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -542,7 +542,7 @@ export class PortfolioService { } if (filters?.length === 0 || isFilteredByAccount || isFilteredByCash) { - const cashPositions = await this.getCashPositions({ + const cashPositions = this.getCashPositions({ cashDetails, userCurrency, value: filteredValueInBaseCurrency @@ -567,7 +567,7 @@ export class PortfolioService { filters[0].id === TAG_ID_EMERGENCY_FUND && filters[0].type === 'TAG' ) { - const emergencyFundCashPositions = await this.getCashPositions({ + const emergencyFundCashPositions = this.getCashPositions({ cashDetails, userCurrency, value: filteredValueInBaseCurrency @@ -1535,7 +1535,7 @@ export class PortfolioService { return { markets, marketsAdvanced }; } - private async getCashPositions({ + private getCashPositions({ cashDetails, userCurrency, value From e8f185e484c0e74608800f054b5b2c30bd33ecfb Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 7 Jun 2025 13:31:55 +0700 Subject: [PATCH 51/81] Bugfix/fix issue in annualized performance calculation (#4840) * Fix issue in annualized performance calculation * Update changelog --- CHANGELOG.md | 1 + libs/common/src/lib/calculation-helper.ts | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e443f44e8..706edd865 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed an issue where the import button was not correctly enabled in the import activities dialog +- Fixed an issue in the annualized performance calculation ## 2.166.0 - 2025-06-05 diff --git a/libs/common/src/lib/calculation-helper.ts b/libs/common/src/lib/calculation-helper.ts index 4292f2383..d67384a30 100644 --- a/libs/common/src/lib/calculation-helper.ts +++ b/libs/common/src/lib/calculation-helper.ts @@ -23,10 +23,14 @@ export function getAnnualizedPerformancePercent({ }): Big { if (isNumber(daysInMarket) && daysInMarket > 0) { const exponent = new Big(365).div(daysInMarket).toNumber(); + const growthFactor = Math.pow( + netPerformancePercentage.plus(1).toNumber(), + exponent + ); - return new Big( - Math.pow(netPerformancePercentage.plus(1).toNumber(), exponent) - ).minus(1); + if (!isNaN(growthFactor)) { + return new Big(growthFactor).minus(1); + } } return new Big(0); From 840805f9dfc37814693594b42c2bcecc17f693e0 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 7 Jun 2025 14:04:19 +0700 Subject: [PATCH 52/81] Feature/enable column sorting in benchmark component (#4842) * Enable column sorting in benchmark component * Update changelog --- CHANGELOG.md | 2 ++ .../lib/benchmark/benchmark.component.html | 20 ++++++++++++++++--- .../lib/benchmark/benchmark.component.scss | 10 ++++++++++ .../src/lib/benchmark/benchmark.component.ts | 16 ++++++++++++--- 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 706edd865..b2e20e8da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added support for column sorting to the markets overview +- Added support for column sorting to the watchlist - Set up the language localization for the static portfolio analysis rule: _Emergency Fund_ (Setup) - Set up the language localization for the static portfolio analysis rule: _Fees_ (Fee Ratio) diff --git a/libs/ui/src/lib/benchmark/benchmark.component.html b/libs/ui/src/lib/benchmark/benchmark.component.html index 631e5b7e1..b11a76507 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.html +++ b/libs/ui/src/lib/benchmark/benchmark.component.html @@ -1,7 +1,16 @@
    - +
    - + @@ -91,7 +100,12 @@ -
    Name + Name + {{ element?.name }} + Change from All Time High diff --git a/libs/ui/src/lib/benchmark/benchmark.component.scss b/libs/ui/src/lib/benchmark/benchmark.component.scss index 5d4e87f30..990b8b294 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.scss +++ b/libs/ui/src/lib/benchmark/benchmark.component.scss @@ -1,3 +1,13 @@ :host { display: block; + + .gf-table { + th { + ::ng-deep { + .mat-sort-header-container { + justify-content: inherit; + } + } + } + } } diff --git a/libs/ui/src/lib/benchmark/benchmark.component.ts b/libs/ui/src/lib/benchmark/benchmark.component.ts index e773caecf..7269bb70c 100644 --- a/libs/ui/src/lib/benchmark/benchmark.component.ts +++ b/libs/ui/src/lib/benchmark/benchmark.component.ts @@ -19,14 +19,16 @@ import { Input, OnChanges, OnDestroy, - Output + Output, + ViewChild } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { MatMenuModule } from '@angular/material/menu'; -import { MatTableModule } from '@angular/material/table'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { ActivatedRoute, Router, RouterModule } from '@angular/router'; -import { isNumber } from 'lodash'; +import { get, isNumber } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject, takeUntil } from 'rxjs'; @@ -41,6 +43,7 @@ import { BenchmarkDetailDialogParams } from './benchmark-detail-dialog/interface GfValueComponent, MatButtonModule, MatMenuModule, + MatSortModule, MatTableModule, NgxSkeletonLoaderModule, RouterModule @@ -59,6 +62,9 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { @Output() itemDeleted = new EventEmitter(); + @ViewChild(MatSort) sort: MatSort; + + public dataSource = new MatTableDataSource([]); public displayedColumns = [ 'name', 'date', @@ -97,6 +103,10 @@ export class GfBenchmarkComponent implements OnChanges, OnDestroy { public ngOnChanges() { if (this.benchmarks) { + this.dataSource.data = this.benchmarks; + this.dataSource.sort = this.sort; + this.dataSource.sortingDataAccessor = get; + this.isLoading = false; } From 31f5c0de885229b6040e773beda517f4c547baef Mon Sep 17 00:00:00 2001 From: Alison Hawk <185055428+alisonhawk@users.noreply.github.com> Date: Sat, 7 Jun 2025 14:37:01 +0600 Subject: [PATCH 53/81] Bugfix/fix import of empty account balances (#4677) * Fix import of empty account balances * Update changelog --------- Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 1 + .../create-account-with-balances.dto.ts | 2 +- apps/api/src/app/import/import.controller.ts | 2 +- apps/api/src/app/import/import.service.ts | 28 +++++++++++++------ test/import/ok.json | 10 +++++++ 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2e20e8da..55befe0e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed an issue where the import button was not correctly enabled in the import activities dialog +- Fixed an issue with empty account balances in the import activities dialog - Fixed an issue in the annualized performance calculation ## 2.166.0 - 2025-06-05 diff --git a/apps/api/src/app/import/create-account-with-balances.dto.ts b/apps/api/src/app/import/create-account-with-balances.dto.ts index fd4b8df48..6cf4057f8 100644 --- a/apps/api/src/app/import/create-account-with-balances.dto.ts +++ b/apps/api/src/app/import/create-account-with-balances.dto.ts @@ -6,5 +6,5 @@ import { IsArray, IsOptional } from 'class-validator'; export class CreateAccountWithBalancesDto extends CreateAccountDto { @IsArray() @IsOptional() - balances?: AccountBalance; + balances?: AccountBalance[]; } diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index 15631a3e8..07e017bce 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -71,7 +71,7 @@ export class ImportController { const activities = await this.importService.import({ isDryRun, maxActivitiesToImport, - accountsDto: importData.accounts ?? [], + accountsWithBalancesDto: importData.accounts ?? [], activitiesDto: importData.activities, user: this.request.user }); diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 28c49ca70..6fd48e3ee 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -28,9 +28,11 @@ import { Injectable } from '@nestjs/common'; import { DataSource, Prisma, SymbolProfile } from '@prisma/client'; import { Big } from 'big.js'; import { endOfToday, isAfter, isSameSecond, parseISO } from 'date-fns'; -import { uniqBy } from 'lodash'; +import { omit, uniqBy } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; +import { ImportDataDto } from './import-data.dto'; + @Injectable() export class ImportService { public constructor( @@ -138,14 +140,14 @@ export class ImportService { } public async import({ - accountsDto, + accountsWithBalancesDto, activitiesDto, isDryRun = false, maxActivitiesToImport, user }: { - accountsDto: Partial[]; - activitiesDto: Partial[]; + accountsWithBalancesDto: ImportDataDto['accounts']; + activitiesDto: ImportDataDto['activities']; isDryRun?: boolean; maxActivitiesToImport: number; user: UserWithSettings; @@ -153,12 +155,12 @@ export class ImportService { const accountIdMapping: { [oldAccountId: string]: string } = {}; const userCurrency = user.Settings.settings.baseCurrency; - if (!isDryRun && accountsDto?.length) { + if (!isDryRun && accountsWithBalancesDto?.length) { const [existingAccounts, existingPlatforms] = await Promise.all([ this.accountService.accounts({ where: { id: { - in: accountsDto.map(({ id }) => { + in: accountsWithBalancesDto.map(({ id }) => { return id; }) } @@ -167,14 +169,19 @@ export class ImportService { this.platformService.getPlatforms() ]); - for (const account of accountsDto) { + for (const accountWithBalances of accountsWithBalancesDto) { // Check if there is any existing account with the same ID const accountWithSameId = existingAccounts.find((existingAccount) => { - return existingAccount.id === account.id; + return existingAccount.id === accountWithBalances.id; }); // If there is no account or if the account belongs to a different user then create a new account if (!accountWithSameId || accountWithSameId.userId !== user.id) { + const account: CreateAccountDto = omit( + accountWithBalances, + 'balances' + ); + let oldAccountId: string; const platformId = account.platformId; @@ -187,6 +194,9 @@ export class ImportService { let accountObject: Prisma.AccountCreateInput = { ...account, + balances: { + create: accountWithBalances.balances ?? [] + }, User: { connect: { id: user.id } } }; @@ -251,7 +261,7 @@ export class ImportService { ); if (isDryRun) { - accountsDto.forEach(({ id, name }) => { + accountsWithBalancesDto.forEach(({ id, name }) => { accounts.push({ id, name }); }); } diff --git a/test/import/ok.json b/test/import/ok.json index 4bce98ba2..d3e05e610 100644 --- a/test/import/ok.json +++ b/test/import/ok.json @@ -6,6 +6,16 @@ "accounts": [ { "balance": 2000, + "balances": [ + { + "date": "2024-12-31T00:00:00.000Z", + "value": 2000 + }, + { + "date": "2023-12-31T00:00:00.000Z", + "value": 1000 + } + ], "currency": "USD", "id": "b2d3fe1d-d6a8-41a3-be39-07ef5e9480f0", "isExcluded": false, From e38ce2852cdff08afc678967eb7d4f9f2e4f45a3 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 7 Jun 2025 10:37:21 +0200 Subject: [PATCH 54/81] Feature/rename Tag to tags in User database schema (#4846) * Rename Tag to tags * Update changelog --- CHANGELOG.md | 1 + prisma/schema.prisma | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55befe0e2..46bc7fc39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Extended the symbol search component by default options +- Renamed `Tag` to `tags` in the `User` database schema - Improved the language localization for Spanish (`es`) - Improved the language localization for Turkish (`tr`) - Upgraded `ng-extract-i18n-merge` from version `2.15.0` to `2.15.1` diff --git a/prisma/schema.prisma b/prisma/schema.prisma index dd3be8cef..b063b1d89 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -252,6 +252,7 @@ model User { provider Provider @default(ANONYMOUS) role Role @default(USER) subscriptions Subscription[] + tags Tag[] thirdPartyId String? updatedAt DateTime @updatedAt watchlist SymbolProfile[] @relation("UserWatchlist") @@ -263,7 +264,6 @@ model User { AuthDevice AuthDevice[] Settings Settings? SymbolProfile SymbolProfile[] - Tag Tag[] @@index([accessToken]) @@index([createdAt]) From 1d29005736151c97af32d55c0e9a979c1389a630 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 7 Jun 2025 10:50:25 +0200 Subject: [PATCH 55/81] Feature/update locales (#4834) * Update locales * Update translations * Update changelog --------- Co-authored-by: github-actions[bot] Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 1 + apps/client/src/locales/messages.ca.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.de.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.es.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.fr.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.it.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.nl.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.pl.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.pt.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.tr.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.uk.xlf | 84 ++++++++++++++++++++----- apps/client/src/locales/messages.xlf | 77 ++++++++++++++++++----- apps/client/src/locales/messages.zh.xlf | 84 ++++++++++++++++++++----- 13 files changed, 810 insertions(+), 192 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46bc7fc39..248b83d64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extended the symbol search component by default options - Renamed `Tag` to `tags` in the `User` database schema +- Improved the language localization for German (`de`) - Improved the language localization for Spanish (`es`) - Improved the language localization for Turkish (`tr`) - Upgraded `ng-extract-i18n-merge` from version `2.15.0` to `2.15.1` diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index d667f6ceb..b90757a68 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -523,7 +523,7 @@ Realment vol revocar aquest accés? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -693,10 +693,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -863,7 +859,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -3788,7 +3784,7 @@ Programari de gestió patrimonial de codi obert apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -4584,7 +4580,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5725,7 +5721,7 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5733,7 +5729,7 @@ 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -5741,7 +5737,7 @@ Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5749,7 +5745,7 @@ Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -5757,7 +5753,7 @@ from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -7015,7 +7011,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7163,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7576,7 +7572,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7620,6 +7616,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 5ee8eb1d7..ba6802bfe 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -78,7 +78,7 @@ Möchtest du diese Zugangsberechtigung wirklich widerrufen? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -168,10 +168,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -306,7 +302,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -2550,7 +2546,7 @@ Änderung vom Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2558,7 +2554,7 @@ vom AZH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -4694,7 +4690,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5652,7 +5648,7 @@ Letztes Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5676,7 +5672,7 @@ Open Source Software für die Vermögensverwaltung apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5740,7 +5736,7 @@ 50 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5748,7 +5744,7 @@ 200 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -7039,7 +7035,7 @@ Möchtest du den API-Schlüssel wirklich löschen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7191,7 +7187,7 @@ Link wurde in die Zwischenablage kopiert apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7576,7 +7572,7 @@ Möchtest du diesen Eintrag wirklich löschen? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7620,6 +7616,62 @@ 181 + + Emergency Fund: Set up + Notfallfonds: Einrichtung + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + Es wurde kein Notfallfonds eingerichtet + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + Ein Notfallfonds wurde eingerichtet + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Gebührenverhältnis + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + Die Gebühren übersteigen {thresholdMax}% deiner ursprünglichen Investition ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + Die Gebühren übersteigen {thresholdMax}% deiner ursprünglichen Investition ({feeRatio}%) nicht + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 23a4e66fa..08fd82259 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -79,7 +79,7 @@ ¿Quieres revocar el acceso concedido? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -169,10 +169,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -307,7 +303,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -2535,7 +2531,7 @@ Variación respecto al máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2543,7 +2539,7 @@ desde el máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -4671,7 +4667,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5629,7 +5625,7 @@ Último máximo histórico libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5653,7 +5649,7 @@ Software de gestión de patrimonio de código abierto apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5717,7 +5713,7 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5725,7 +5721,7 @@ 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -7016,7 +7012,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7168,7 +7164,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7577,7 +7573,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7621,6 +7617,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 01593fe6d..e8eef67fd 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -70,7 +70,7 @@ Voulez-vous vraiment révoquer cet accès ? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -176,10 +176,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -362,7 +358,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -3054,7 +3050,7 @@ Différence avec le Record Historique libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -3062,7 +3058,7 @@ par rapport au record historique libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -4670,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5628,7 +5624,7 @@ Dernier All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5652,7 +5648,7 @@ Logiciel libre de Gestion de Patrimoine apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5716,7 +5712,7 @@ Tendance 50 jours libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5720,7 @@ Tendance 200 jours libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -7015,7 +7011,7 @@ Voulez-vous vraiment supprimer la clé API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7163,7 @@ Le lien a été copié dans le presse-papiers apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7576,7 +7572,7 @@ Voulez-vous vraiment supprimer cet élément? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7620,6 +7616,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index cef21a5b1..f542d5dca 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -79,7 +79,7 @@ Vuoi davvero revocare l’accesso concesso? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -169,10 +169,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -307,7 +303,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -2535,7 +2531,7 @@ Variazione rispetto al massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2543,7 +2539,7 @@ dal massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -4671,7 +4667,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5629,7 +5625,7 @@ Ultimo massimo storico libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5653,7 +5649,7 @@ Software Open Source per la gestione della tua ricchezza apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5717,7 +5713,7 @@ Trend a 50 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5725,7 +5721,7 @@ Trend a 200 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -7016,7 +7012,7 @@ Vuoi davvero eliminare l’API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7168,7 +7164,7 @@ Il link è stato copiato negli appunti apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7577,7 +7573,7 @@ Vuoi davvero eliminare questo elemento? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7621,6 +7617,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 7b27a8cfe..fd1bfa6ac 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -78,7 +78,7 @@ Wil je deze verleende toegang echt intrekken? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -168,10 +168,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -306,7 +302,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -2534,7 +2530,7 @@ Verandering van Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2542,7 +2538,7 @@ van ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -4670,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5628,7 +5624,7 @@ Laatste Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5652,7 +5648,7 @@ Open Source Vermogensbeheer Software apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5716,7 +5712,7 @@ 50-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5720,7 @@ 200-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -7015,7 +7011,7 @@ Wilt u de API-sleutel echt verwijderen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7163,7 @@ Link is gekopieerd naar klemboord apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7576,7 +7572,7 @@ Wilt u dit item echt verwijderen? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7620,6 +7616,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 140e35872..c9030efba 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -479,7 +479,7 @@ Czy na pewno chcesz cofnąć przyznany dostęp? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -621,10 +621,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -791,7 +787,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -3407,7 +3403,7 @@ Oprogramowanie Open Source do Zarządzania Majątkiem apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -4195,7 +4191,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5164,7 +5160,7 @@ Ostatni Najwyższy Punkt w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5172,7 +5168,7 @@ Zmiana od Najwyższego Punktu w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -5180,7 +5176,7 @@ od ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -5716,7 +5712,7 @@ 50-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5720,7 @@ 200-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -7015,7 +7011,7 @@ Czy na pewno chcesz usunąć klucz API?? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7163,7 @@ Link został skopiowany do schowka apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7576,7 +7572,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7620,6 +7616,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 1b079bcd0..4284198ae 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -70,7 +70,7 @@ Pretende realmente revogar este acesso concedido? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -176,10 +176,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -362,7 +358,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -2926,7 +2922,7 @@ Diferença desde o Máximo Histórico libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -2934,7 +2930,7 @@ a partir do ATH (All Time High) libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -4670,7 +4666,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5628,7 +5624,7 @@ Última alta de todos os tempos libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5652,7 +5648,7 @@ Open Source Wealth Management Software apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5716,7 +5712,7 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5720,7 @@ 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -7015,7 +7011,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7163,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7576,7 +7572,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7620,6 +7616,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index c0fd7ea12..9d96ee0cf 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -451,7 +451,7 @@ Bu erişim iznini geri almayı gerçekten istiyor musunuz? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -581,10 +581,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -751,7 +747,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -3687,7 +3683,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4860,7 +4856,7 @@ Tüm Zamanların En Yüksek Seviyesinden (ATH) Değişim libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -4868,7 +4864,7 @@ Tüm Zamanların En Yüksek Seviyesinden libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -5628,7 +5624,7 @@ Son, ATH libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5652,7 +5648,7 @@ Açık Kaynak Varlık Yönetim Yazılımı apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -5716,7 +5712,7 @@ 50 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5724,7 +5720,7 @@ 200 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -7015,7 +7011,7 @@ API anahtarını silmek istediğinize emin misiniz? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7167,7 +7163,7 @@ Bağlantı panoya kopyalandı apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7576,7 +7572,7 @@ Bu öğeyi silmek istediğinize emin misiniz? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7620,6 +7616,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 88be53938..3c4bc4a8b 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -531,7 +531,7 @@ Посилання скопійовано в буфер обміну apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -539,7 +539,7 @@ Ви дійсно хочете відкликати цей наданий доступ? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -709,10 +709,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -879,7 +875,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -1867,7 +1863,7 @@ Ви дійсно хочете видалити ключ API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -4004,7 +4000,7 @@ Програмне забезпечення управління багатством з відкритим кодом apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -4836,7 +4832,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6347,7 +6343,7 @@ Тренд на 50 днів libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -6355,7 +6351,7 @@ Тренд на 200 днів libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -6363,7 +6359,7 @@ Останній рекордний максимум libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -6371,7 +6367,7 @@ Зміна від Історичного Максимуму libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -6379,7 +6375,7 @@ від ІМ libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -7576,7 +7572,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7620,6 +7616,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index e0772a40f..2980807da 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -450,7 +450,7 @@ Do you really want to revoke this granted access? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -593,10 +593,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -758,7 +754,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -3149,7 +3145,7 @@ Open Source Wealth Management Software apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -3849,7 +3845,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4747,35 +4743,35 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -6334,7 +6330,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -6474,7 +6470,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -6813,7 +6809,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -6852,6 +6848,55 @@ 223 + + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + + + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 391ec6d26..21301ba16 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -480,7 +480,7 @@ 您真的要撤销此授予的访问权限吗? apps/client/src/app/components/access-table/access-table.component.ts - 80 + 79 @@ -630,10 +630,6 @@ libs/ui/src/lib/activities-table/activities-table.component.html 138 - - libs/ui/src/lib/benchmark/benchmark.component.html - 4 - libs/ui/src/lib/holdings-table/holdings-table.component.html 28 @@ -800,7 +796,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 155 + 169 @@ -3416,7 +3412,7 @@ 开源财富管理软件 apps/client/src/app/pages/i18n/i18n-page.html - 14 + 30 @@ -4204,7 +4200,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 188 + 202 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5205,7 +5201,7 @@ 50 天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 16 + 25 @@ -5213,7 +5209,7 @@ 200天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 45 + 54 @@ -5221,7 +5217,7 @@ 上次历史最高纪录 libs/ui/src/lib/benchmark/benchmark.component.html - 74 + 83 @@ -5229,7 +5225,7 @@ 较历史最高纪录涨跌 libs/ui/src/lib/benchmark/benchmark.component.html - 96 + 110 @@ -5237,7 +5233,7 @@ 来自 ATH libs/ui/src/lib/benchmark/benchmark.component.html - 98 + 112 @@ -7016,7 +7012,7 @@ 您确定要删除此 API 密钥吗? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 102 + 98 @@ -7168,7 +7164,7 @@ 链接已复制到剪贴板 apps/client/src/app/components/access-table/access-table.component.ts - 66 + 65 @@ -7577,7 +7573,7 @@ 您确定要删除此项目吗? libs/ui/src/lib/benchmark/benchmark.component.ts - 122 + 132 @@ -7621,6 +7617,62 @@ 181 + + Emergency Fund: Set up + Emergency Fund: Set up + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + No emergency fund has been set up + No emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + An emergency fund has been set up + An emergency fund has been set up + + apps/client/src/app/pages/i18n/i18n-page.html + 18 + + + + Fee Ratio + Fee Ratio + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 22 + + + + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + + apps/client/src/app/pages/i18n/i18n-page.html + 26 + + + + Name + Name + + libs/ui/src/lib/benchmark/benchmark.component.html + 11 + + From 19b8300a4d40b2e6b107f2bdfe3cd1b7a988324f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 7 Jun 2025 10:52:36 +0200 Subject: [PATCH 56/81] Release 2.167.0 (#4847) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 248b83d64..19763952b 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.167.0 - 2025-06-07 ### Added diff --git a/package-lock.json b/package-lock.json index 1dd611787..4a1245a45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.166.0", + "version": "2.167.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.166.0", + "version": "2.167.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 1e717258e..125fe768d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.166.0", + "version": "2.167.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From b3ec3530746fa89c5266f5ff84c9238936455957 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 7 Jun 2025 13:43:06 +0200 Subject: [PATCH 57/81] Feature/change interpolation syntax in i18n service (#4849) * Change interpolation syntax from {var} to ${var} --- apps/api/src/services/i18n/i18n.service.ts | 2 +- apps/client/src/app/pages/i18n/i18n-page.html | 8 ++++---- apps/client/src/locales/messages.ca.xlf | 8 ++++---- apps/client/src/locales/messages.de.xlf | 8 ++++---- apps/client/src/locales/messages.es.xlf | 8 ++++---- apps/client/src/locales/messages.fr.xlf | 8 ++++---- apps/client/src/locales/messages.it.xlf | 8 ++++---- apps/client/src/locales/messages.nl.xlf | 8 ++++---- apps/client/src/locales/messages.pl.xlf | 8 ++++---- apps/client/src/locales/messages.pt.xlf | 8 ++++---- apps/client/src/locales/messages.tr.xlf | 8 ++++---- apps/client/src/locales/messages.uk.xlf | 8 ++++---- apps/client/src/locales/messages.xlf | 4 ++-- apps/client/src/locales/messages.zh.xlf | 8 ++++---- 14 files changed, 51 insertions(+), 51 deletions(-) diff --git a/apps/api/src/services/i18n/i18n.service.ts b/apps/api/src/services/i18n/i18n.service.ts index e928775d1..533abf2e2 100644 --- a/apps/api/src/services/i18n/i18n.service.ts +++ b/apps/api/src/services/i18n/i18n.service.ts @@ -42,7 +42,7 @@ export class I18nService { if (placeholders) { for (const [key, value] of Object.entries(placeholders)) { - translatedText = translatedText.replace(`{${key}}`, String(value)); + translatedText = translatedText.replace(`\${${key}}`, String(value)); } } diff --git a/apps/client/src/app/pages/i18n/i18n-page.html b/apps/client/src/app/pages/i18n/i18n-page.html index f54a45b3f..565d5b68f 100644 --- a/apps/client/src/app/pages/i18n/i18n-page.html +++ b/apps/client/src/app/pages/i18n/i18n-page.html @@ -20,12 +20,12 @@
  • Fee Ratio
  • - The fees do exceed {thresholdMax}% of your initial investment - ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment + (${feeRatio}%)
  • - The fees do not exceed {thresholdMax}% of your initial - investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial + investment (${feeRatio}%)
  • Open Source Wealth Management Software
  • diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index b90757a68..bfab9a8a2 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -7649,16 +7649,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index ba6802bfe..bd05b886c 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -7649,16 +7649,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - Die Gebühren übersteigen {thresholdMax}% deiner ursprünglichen Investition ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + Die Gebühren übersteigen ${thresholdMax}% deiner ursprünglichen Investition (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - Die Gebühren übersteigen {thresholdMax}% deiner ursprünglichen Investition ({feeRatio}%) nicht + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + Die Gebühren übersteigen ${thresholdMax}% deiner ursprünglichen Investition (${feeRatio}%) nicht apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 08fd82259..76f53b029 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -7650,16 +7650,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index e8eef67fd..fac798e8c 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -7649,16 +7649,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index f542d5dca..5ef471fdf 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -7650,16 +7650,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index fd1bfa6ac..3439f03c0 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -7649,16 +7649,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index c9030efba..38f2a5725 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -7649,16 +7649,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 4284198ae..2635a020a 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -7649,16 +7649,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 9d96ee0cf..6eab8df6c 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -7649,16 +7649,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 3c4bc4a8b..24ef55c37 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -7649,16 +7649,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 2980807da..9a3af47b8 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -6884,14 +6884,14 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 21301ba16..4f9202df8 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -7650,16 +7650,16 @@ - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) - The fees do not exceed {thresholdMax}% of your initial investment ({feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 From 042112faa67380c81f74840f095f8f891c29e9d0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 7 Jun 2025 13:43:33 +0200 Subject: [PATCH 58/81] Feature/improve language localization for de 20250607 (#4848) * Update translation * Update changelog --- CHANGELOG.md | 6 ++++++ apps/client/src/locales/messages.de.xlf | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19763952b..be60a7bfe 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 German (`de`) + ## 2.167.0 - 2025-06-07 ### Added diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index bd05b886c..b7b7d6663 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -7128,7 +7128,7 @@ rules align with your portfolio. - Regeln werden von Ihrem Portfolio erfüllt. + Regeln werden von deinem Portfolio erfüllt. apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html 58 From 66e430ab9a7a6f4df5197ad079daf0e9e39614c8 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 7 Jun 2025 16:25:20 +0200 Subject: [PATCH 59/81] Feature/add background gradient to sidebar navigation (#4850) * Add background gradient to sidebar navigation * Update changelog --- CHANGELOG.md | 4 ++++ .../src/app/components/header/header.component.scss | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be60a7bfe..00c480234 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 a background gradient to the sidebar navigation + ### Changed - Improved the language localization for German (`de`) diff --git a/apps/client/src/app/components/header/header.component.scss b/apps/client/src/app/components/header/header.component.scss index d73bf1a8a..97f8cd354 100644 --- a/apps/client/src/app/components/header/header.component.scss +++ b/apps/client/src/app/components/header/header.component.scss @@ -7,7 +7,11 @@ .logo-container { &.filled { - background-color: rgba(var(--palette-foreground-base), 0.02); + background: linear-gradient( + to bottom, + transparent, + rgba(var(--palette-foreground-base), 0.02) + ); } @media (min-width: 576px) { @@ -56,7 +60,11 @@ .logo-container { &.filled { - background-color: rgba(var(--palette-foreground-base-dark), 0.02); + background: linear-gradient( + to bottom, + transparent, + rgba(var(--palette-foreground-base-dark), 0.02) + ); } } } From 21baabc7f2db6e5a3d66806b779dc1c237cc4530 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 7 Jun 2025 16:38:18 +0200 Subject: [PATCH 60/81] Feature/upgrade nestjs to version 11.1.3 (#4852) * Upgrade nestjs to version 11.1.3 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 90 +++++++++++++++++++++++++++++------------------ package.json | 8 ++--- 3 files changed, 60 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00c480234..c09a4d16d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Improved the language localization for German (`de`) +- Upgraded `nestjs` from version `11.1.0` to `11.1.3` ## 2.167.0 - 2025-06-07 diff --git a/package-lock.json b/package-lock.json index 4a1245a45..36c79af6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,13 +33,13 @@ "@keyv/redis": "4.3.4", "@nestjs/bull": "11.0.2", "@nestjs/cache-manager": "3.0.1", - "@nestjs/common": "11.1.0", + "@nestjs/common": "11.1.3", "@nestjs/config": "4.0.2", - "@nestjs/core": "11.1.0", + "@nestjs/core": "11.1.3", "@nestjs/event-emitter": "3.0.1", "@nestjs/jwt": "11.0.0", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.0", + "@nestjs/platform-express": "11.1.3", "@nestjs/schedule": "6.0.0", "@nestjs/serve-static": "5.0.3", "@prisma/client": "6.8.2", @@ -107,7 +107,7 @@ "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.24.0", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.0", + "@nestjs/testing": "11.1.3", "@nx/angular": "21.1.2", "@nx/cypress": "21.1.2", "@nx/eslint-plugin": "21.1.2", @@ -6950,12 +6950,12 @@ } }, "node_modules/@nestjs/common": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.0.tgz", - "integrity": "sha512-8MrajltjtIN6eW9cTpv+1IZogqz2Zsrc8YDt0LwQPUq8cSq0j50DETdQpPsNMeib+p9avkV41+NrzGk1z2o5Wg==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.3.tgz", + "integrity": "sha512-ogEK+GriWodIwCw6buQ1rpcH4Kx+G7YQ9EwuPySI3rS05pSdtQ++UhucjusSI9apNidv+QURBztJkRecwwJQXg==", "license": "MIT", "dependencies": { - "file-type": "20.4.1", + "file-type": "21.0.0", "iterare": "1.2.1", "load-esm": "1.0.2", "tslib": "2.8.1", @@ -6966,8 +6966,8 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -6996,9 +6996,9 @@ } }, "node_modules/@nestjs/core": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.0.tgz", - "integrity": "sha512-IeXbTRPrr6xAVbETlDE+miSkNmYf/cPhCa9GU9gFtPO6pVNuAeG/dNrjLVc23mJtUlT/ibdsoW35TlSyHLkzEA==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.3.tgz", + "integrity": "sha512-5lTni0TCh8x7bXETRD57pQFnKnEg1T6M+VLE7wAmyQRIecKQU+2inRGZD+A4v2DC1I04eA0WffP0GKLxjOKlzw==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -7082,14 +7082,14 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.0.tgz", - "integrity": "sha512-lxv73GT9VdQaxndciqKcyzLsT2j3gMRX+tO6J06oa7RIfp4Dp4oMTIu57lM1gkIJ+gLGq29bob+mfPv/K8RIuw==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.3.tgz", + "integrity": "sha512-hEDNMlaPiBO72fxxX/CuRQL3MEhKRc/sIYGVoXjrnw6hTxZdezvvM6A95UaLsYknfmcZZa/CdG1SMBZOu9agHQ==", "license": "MIT", "dependencies": { "cors": "2.8.5", "express": "5.1.0", - "multer": "1.4.5-lts.2", + "multer": "2.0.1", "path-to-regexp": "8.2.0", "tslib": "2.8.1" }, @@ -7225,9 +7225,9 @@ } }, "node_modules/@nestjs/testing": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.0.tgz", - "integrity": "sha512-gQ+NGshkHbNrDNXMVaPiwduqZ8YHpXrnsQqhSsnyNYOcDNPdBbB+0FDq7XiiklluXqjdLAN8i+bS7MbGlZIhKw==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.1.3.tgz", + "integrity": "sha512-CeXG6/eEqgFIkPkmU00y18Dd3DLOIDFhPItzJK1SWckKo6IhcnfoRJzGx75bmuvUMjb51j6An96S/+MJ2ty9jA==", "dev": true, "license": "MIT", "dependencies": { @@ -16242,6 +16242,7 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, "engines": [ "node >= 0.8" ], @@ -16257,12 +16258,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, "license": "MIT" }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -16278,12 +16281,14 @@ "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, "license": "MIT" }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -19850,18 +19855,18 @@ } }, "node_modules/file-type": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", - "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.0.0.tgz", + "integrity": "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==", "license": "MIT", "dependencies": { - "@tokenizer/inflate": "^0.2.6", - "strtok3": "^10.2.0", + "@tokenizer/inflate": "^0.2.7", + "strtok3": "^10.2.2", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sindresorhus/file-type?sponsor=1" @@ -26544,21 +26549,36 @@ } }, "node_modules/multer": { - "version": "1.4.5-lts.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", - "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz", + "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" + "type-is": "^1.6.18", + "xtend": "^4.0.2" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10.16.0" + } + }, + "node_modules/multer/node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, "node_modules/multicast-dns": { diff --git a/package.json b/package.json index 125fe768d..36d370b23 100644 --- a/package.json +++ b/package.json @@ -79,13 +79,13 @@ "@keyv/redis": "4.3.4", "@nestjs/bull": "11.0.2", "@nestjs/cache-manager": "3.0.1", - "@nestjs/common": "11.1.0", + "@nestjs/common": "11.1.3", "@nestjs/config": "4.0.2", - "@nestjs/core": "11.1.0", + "@nestjs/core": "11.1.3", "@nestjs/event-emitter": "3.0.1", "@nestjs/jwt": "11.0.0", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.0", + "@nestjs/platform-express": "11.1.3", "@nestjs/schedule": "6.0.0", "@nestjs/serve-static": "5.0.3", "@prisma/client": "6.8.2", @@ -153,7 +153,7 @@ "@eslint/eslintrc": "3.3.1", "@eslint/js": "9.24.0", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.0", + "@nestjs/testing": "11.1.3", "@nx/angular": "21.1.2", "@nx/cypress": "21.1.2", "@nx/eslint-plugin": "21.1.2", From 3bcb19af143618cc2ba6b51e1cdece308222c700 Mon Sep 17 00:00:00 2001 From: Tobias Kugel <78074722+tobikugel@users.noreply.github.com> Date: Sat, 7 Jun 2025 11:52:48 -0300 Subject: [PATCH 61/81] Feature/migrate i18n service to injectable service (#4829) * Migrate i18n service to injectable service * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/endpoints/ai/ai.module.ts | 2 ++ .../src/app/endpoints/benchmarks/benchmarks.module.ts | 2 ++ apps/api/src/app/endpoints/public/public.module.ts | 2 ++ apps/api/src/app/portfolio/portfolio.module.ts | 2 ++ apps/api/src/app/portfolio/portfolio.service.ts | 4 ++++ apps/api/src/app/user/user.module.ts | 2 ++ apps/api/src/app/user/user.service.ts | 5 +++-- .../models/rules/emergency-fund/emergency-fund-setup.ts | 2 +- .../models/rules/fees/fee-ratio-initial-investment.ts | 2 +- apps/api/src/services/i18n/i18n.module.ts | 9 +++++++++ apps/api/src/services/i18n/i18n.service.ts | 3 ++- 12 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 apps/api/src/services/i18n/i18n.module.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c09a4d16d..51597cd60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Migrated the `i18n` service to use `@Injectable()` - Improved the language localization for German (`de`) - Upgraded `nestjs` from version `11.1.0` to `11.1.3` diff --git a/apps/api/src/app/endpoints/ai/ai.module.ts b/apps/api/src/app/endpoints/ai/ai.module.ts index b6f9941ad..42480efd7 100644 --- a/apps/api/src/app/endpoints/ai/ai.module.ts +++ b/apps/api/src/app/endpoints/ai/ai.module.ts @@ -12,6 +12,7 @@ import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.mo import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; @@ -32,6 +33,7 @@ import { AiService } from './ai.service'; ConfigurationModule, DataProviderModule, ExchangeRateDataModule, + I18nModule, ImpersonationModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts b/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts index a0f443621..8bdf79035 100644 --- a/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts +++ b/apps/api/src/app/endpoints/benchmarks/benchmarks.module.ts @@ -15,6 +15,7 @@ import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.s import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; @@ -35,6 +36,7 @@ import { BenchmarksService } from './benchmarks.service'; ConfigurationModule, DataProviderModule, ExchangeRateDataModule, + I18nModule, ImpersonationModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/endpoints/public/public.module.ts b/apps/api/src/app/endpoints/public/public.module.ts index cf4fd3d18..19e281dde 100644 --- a/apps/api/src/app/endpoints/public/public.module.ts +++ b/apps/api/src/app/endpoints/public/public.module.ts @@ -12,6 +12,7 @@ import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; @@ -29,6 +30,7 @@ import { PublicController } from './public.controller'; BenchmarkModule, DataProviderModule, ExchangeRateDataModule, + I18nModule, ImpersonationModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/portfolio/portfolio.module.ts b/apps/api/src/app/portfolio/portfolio.module.ts index 0f64b2f6a..6dd5811a3 100644 --- a/apps/api/src/app/portfolio/portfolio.module.ts +++ b/apps/api/src/app/portfolio/portfolio.module.ts @@ -13,6 +13,7 @@ import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.mo import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; @@ -39,6 +40,7 @@ import { RulesService } from './rules.service'; DataGatheringModule, DataProviderModule, ExchangeRateDataModule, + I18nModule, ImpersonationModule, MarketDataModule, OrderModule, diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index eb6abc224..a43499e5b 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -23,6 +23,7 @@ import { RegionalMarketClusterRiskNorthAmerica } from '@ghostfolio/api/models/ru import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { I18nService } from '@ghostfolio/api/services/i18n/i18n.service'; import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { @@ -105,6 +106,7 @@ export class PortfolioService { private readonly calculatorFactory: PortfolioCalculatorFactory, private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, + private readonly i18nService: I18nService, private readonly impersonationService: ImpersonationService, private readonly orderService: OrderService, @Inject(REQUEST) private readonly request: RequestWithUser, @@ -1319,6 +1321,7 @@ export class PortfolioService { [ new EmergencyFundSetup( this.exchangeRateDataService, + this.i18nService, userSettings.language, this.getTotalEmergencyFund({ userSettings, @@ -1333,6 +1336,7 @@ export class PortfolioService { [ new FeeRatioInitialInvestment( this.exchangeRateDataService, + this.i18nService, userSettings.language, summary.committedFunds, summary.fees diff --git a/apps/api/src/app/user/user.module.ts b/apps/api/src/app/user/user.module.ts index 063cfef82..8a21b0a55 100644 --- a/apps/api/src/app/user/user.module.ts +++ b/apps/api/src/app/user/user.module.ts @@ -1,6 +1,7 @@ import { OrderModule } from '@ghostfolio/api/app/order/order.module'; import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; @@ -16,6 +17,7 @@ import { UserService } from './user.service'; exports: [UserService], imports: [ ConfigurationModule, + I18nModule, JwtModule.register({ secret: process.env.JWT_SECRET_KEY, signOptions: { expiresIn: '30 days' } diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 21790182f..4b04647b5 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -52,11 +52,10 @@ import { sortBy, without } from 'lodash'; @Injectable() export class UserService { - private i18nService = new I18nService(); - public constructor( private readonly configurationService: ConfigurationService, private readonly eventEmitter: EventEmitter2, + private readonly i18nService: I18nService, private readonly orderService: OrderService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, @@ -298,6 +297,7 @@ export class UserService { undefined ).getSettings(user.Settings.settings), EmergencyFundSetup: new EmergencyFundSetup( + undefined, undefined, undefined, undefined @@ -306,6 +306,7 @@ export class UserService { undefined, undefined, undefined, + undefined, undefined ).getSettings(user.Settings.settings), RegionalMarketClusterRiskAsiaPacific: diff --git a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts index a91e68425..67c0f297e 100644 --- a/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts +++ b/apps/api/src/models/rules/emergency-fund/emergency-fund-setup.ts @@ -6,10 +6,10 @@ import { UserSettings } from '@ghostfolio/common/interfaces'; export class EmergencyFundSetup extends Rule { private emergencyFund: number; - private i18nService = new I18nService(); public constructor( protected exchangeRateDataService: ExchangeRateDataService, + private i18nService: I18nService, languageCode: string, emergencyFund: number ) { diff --git a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts index 4298eed44..89fe32dbf 100644 --- a/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts +++ b/apps/api/src/models/rules/fees/fee-ratio-initial-investment.ts @@ -6,11 +6,11 @@ import { UserSettings } from '@ghostfolio/common/interfaces'; export class FeeRatioInitialInvestment extends Rule { private fees: number; - private i18nService = new I18nService(); private totalInvestment: number; public constructor( protected exchangeRateDataService: ExchangeRateDataService, + private i18nService: I18nService, languageCode: string, totalInvestment: number, fees: number diff --git a/apps/api/src/services/i18n/i18n.module.ts b/apps/api/src/services/i18n/i18n.module.ts new file mode 100644 index 000000000..68211de40 --- /dev/null +++ b/apps/api/src/services/i18n/i18n.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; + +import { I18nService } from './i18n.service'; + +@Module({ + exports: [I18nService], + providers: [I18nService] +}) +export class I18nModule {} diff --git a/apps/api/src/services/i18n/i18n.service.ts b/apps/api/src/services/i18n/i18n.service.ts index 533abf2e2..a0389ab36 100644 --- a/apps/api/src/services/i18n/i18n.service.ts +++ b/apps/api/src/services/i18n/i18n.service.ts @@ -1,10 +1,11 @@ import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config'; -import { Logger } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import * as cheerio from 'cheerio'; import { readFileSync, readdirSync } from 'fs'; import { join } from 'path'; +@Injectable() export class I18nService { private localesPath = join(__dirname, 'assets', 'locales'); private translations: { [locale: string]: cheerio.CheerioAPI } = {}; From 9b233da4bf2e625fe58f3b94d88204a787c60852 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 7 Jun 2025 16:55:52 +0200 Subject: [PATCH 62/81] Release 2.168.0 (#4854) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51597cd60..3150e6847 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.168.0 - 2025-06-07 ### Added diff --git a/package-lock.json b/package-lock.json index 36c79af6d..58aa36721 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.167.0", + "version": "2.168.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.167.0", + "version": "2.168.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 36d370b23..c3ed868f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.167.0", + "version": "2.168.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From edba53be297553c67648dcae01abf4e3b220b296 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 7 Jun 2025 21:54:09 +0200 Subject: [PATCH 63/81] Bugfix/fix missing assetlinks.json for TWA (#4855) * Fix command for copying assetlinks.json * Update changelog --- CHANGELOG.md | 6 ++++++ apps/client/project.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3150e6847..c7e8d3d62 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 + +### Fixed + +- Fixed missing `/.well-known/assetlinks.json` for TWA + ## 2.168.0 - 2025-06-07 ### Added diff --git a/apps/client/project.json b/apps/client/project.json index 0bc04556a..4bb7fe296 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -185,7 +185,7 @@ "command": "shx cp -r apps/client/src/assets/* dist/apps/client/assets" }, { - "command": "shx cp -r apps/client/src/assets/.well-known/* dist/apps/client/.well-known" + "command": "shx cp -r apps/client/src/assets/.well-known/assetlinks.json dist/apps/client/.well-known" }, { "command": "shx cp apps/client/src/assets/favicon.ico dist/apps/client" From 71d56ad7894d5330d750f483c93e4b8e23026d99 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 8 Jun 2025 08:39:13 +0200 Subject: [PATCH 64/81] Feature/move asset profile icon component to @ghostfolio/ui (#4858) * Move asset profile icon component to @ghostfolio/ui * Update changelog --- CHANGELOG.md | 4 ++++ .../app/components/accounts-table/accounts-table.module.ts | 2 +- .../asset-profile-dialog/asset-profile-dialog.module.ts | 2 +- .../app/components/admin-platform/admin-platform.module.ts | 2 +- .../create-or-update-platform-dialog.module.ts | 2 +- .../app/components/admin-settings/admin-settings.module.ts | 2 +- .../create-or-update-account-dialog.module.ts | 2 +- .../transfer-balance/transfer-balance-dialog.module.ts | 2 +- .../create-or-update-activity-dialog.module.ts | 2 +- .../ui/src/lib/activities-table/activities-table.component.ts | 2 +- .../lib}/asset-profile-icon/asset-profile-icon.component.html | 0 .../lib}/asset-profile-icon/asset-profile-icon.component.scss | 0 .../lib}/asset-profile-icon/asset-profile-icon.component.ts | 0 libs/ui/src/lib/asset-profile-icon/index.ts | 1 + libs/ui/src/lib/assistant/assistant.component.ts | 2 +- libs/ui/src/lib/holdings-table/holdings-table.component.ts | 2 +- 16 files changed, 16 insertions(+), 11 deletions(-) rename {apps/client/src/app/components => libs/ui/src/lib}/asset-profile-icon/asset-profile-icon.component.html (100%) rename {apps/client/src/app/components => libs/ui/src/lib}/asset-profile-icon/asset-profile-icon.component.scss (100%) rename {apps/client/src/app/components => libs/ui/src/lib}/asset-profile-icon/asset-profile-icon.component.ts (100%) create mode 100644 libs/ui/src/lib/asset-profile-icon/index.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c7e8d3d62..8cad879d3 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 +### Changed + +- Moved the asset profile icon component to `@ghostfolio/ui` + ### Fixed - Fixed missing `/.well-known/assetlinks.json` for TWA diff --git a/apps/client/src/app/components/accounts-table/accounts-table.module.ts b/apps/client/src/app/components/accounts-table/accounts-table.module.ts index 879ca13ea..da233984b 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.module.ts +++ b/apps/client/src/app/components/accounts-table/accounts-table.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts index bef8c198e..03bd7fcbc 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.module.ts @@ -1,5 +1,5 @@ import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector'; import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; diff --git a/apps/client/src/app/components/admin-platform/admin-platform.module.ts b/apps/client/src/app/components/admin-platform/admin-platform.module.ts index e98d53988..a7d93f425 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.module.ts +++ b/apps/client/src/app/components/admin-platform/admin-platform.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts index ac97e57cf..d8b2bd128 100644 --- a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; diff --git a/apps/client/src/app/components/admin-settings/admin-settings.module.ts b/apps/client/src/app/components/admin-settings/admin-settings.module.ts index 706f20a87..eee33461b 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.module.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.module.ts @@ -1,6 +1,6 @@ import { GfAdminPlatformModule } from '@ghostfolio/client/components/admin-platform/admin-platform.module'; import { GfAdminTagModule } from '@ghostfolio/client/components/admin-tag/admin-tag.module'; -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts index 249715d61..ea2537854 100644 --- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts +++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts index b83ccbb9d..ac9ecf20e 100644 --- a/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts +++ b/apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts index 8fb2c1bed..0bdbfdf5c 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { GfTagsSelectorComponent } from '@ghostfolio/ui/tags-selector'; import { GfValueComponent } from '@ghostfolio/ui/value'; 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 8e5a44a50..0ed67ac3e 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.ts +++ b/libs/ui/src/lib/activities-table/activities-table.component.ts @@ -1,5 +1,4 @@ import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; @@ -8,6 +7,7 @@ import { getDateFormatString, getLocale } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { GfActivityTypeComponent } from '@ghostfolio/ui/activity-type'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { GfNoTransactionsInfoComponent } from '@ghostfolio/ui/no-transactions-info'; import { GfValueComponent } from '@ghostfolio/ui/value'; diff --git a/apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.html b/libs/ui/src/lib/asset-profile-icon/asset-profile-icon.component.html similarity index 100% rename from apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.html rename to libs/ui/src/lib/asset-profile-icon/asset-profile-icon.component.html diff --git a/apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.scss b/libs/ui/src/lib/asset-profile-icon/asset-profile-icon.component.scss similarity index 100% rename from apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.scss rename to libs/ui/src/lib/asset-profile-icon/asset-profile-icon.component.scss diff --git a/apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.ts b/libs/ui/src/lib/asset-profile-icon/asset-profile-icon.component.ts similarity index 100% rename from apps/client/src/app/components/asset-profile-icon/asset-profile-icon.component.ts rename to libs/ui/src/lib/asset-profile-icon/asset-profile-icon.component.ts diff --git a/libs/ui/src/lib/asset-profile-icon/index.ts b/libs/ui/src/lib/asset-profile-icon/index.ts new file mode 100644 index 000000000..9f0cfb3e8 --- /dev/null +++ b/libs/ui/src/lib/asset-profile-icon/index.ts @@ -0,0 +1 @@ +export * from './asset-profile-icon.component'; diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index d8c3dcc2e..76529dc87 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -1,10 +1,10 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { AdminService } from '@ghostfolio/client/services/admin.service'; import { DataService } from '@ghostfolio/client/services/data.service'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { Filter, PortfolioPosition, User } from '@ghostfolio/common/interfaces'; import { DateRange } from '@ghostfolio/common/types'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { translate } from '@ghostfolio/ui/i18n'; import { FocusKeyManager } from '@angular/cdk/a11y'; 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 802cdc69a..747ff8581 100644 --- a/libs/ui/src/lib/holdings-table/holdings-table.component.ts +++ b/libs/ui/src/lib/holdings-table/holdings-table.component.ts @@ -1,10 +1,10 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/client/components/asset-profile-icon/asset-profile-icon.component'; import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module'; import { getLocale } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, PortfolioPosition } from '@ghostfolio/common/interfaces'; +import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; From 25a755d1bff9247d2b9c8a248a114a335e4e83a3 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 8 Jun 2025 08:50:06 +0200 Subject: [PATCH 65/81] Feature/rename Account to accounts in User database schema (#4859) * Rename Account to accounts * Update changelog --- CHANGELOG.md | 1 + apps/api/src/app/admin/admin.service.ts | 4 ++-- apps/api/src/app/user/user.service.ts | 14 +++++++------- .../src/lib/types/user-with-settings.type.ts | 2 +- prisma/schema.prisma | 2 +- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cad879d3..fad387eee 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 - Moved the asset profile icon component to `@ghostfolio/ui` +- Renamed `Account` to `accounts` in the `User` database schema ### Fixed diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 258d8556f..9a5b8a849 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -824,7 +824,7 @@ export class AdminService { where, select: { _count: { - select: { Account: true, activities: true } + select: { accounts: true, activities: true } }, Analytics: { select: { @@ -871,7 +871,7 @@ export class AdminService { id, role, subscription, - accountCount: _count.Account || 0, + accountCount: _count.accounts || 0, activityCount: _count.activities || 0, country: Analytics?.country, dailyApiRequests: Analytics?.dataProviderGhostfolioDailyRequests || 0, diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 4b04647b5..b9a0e3d20 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -95,7 +95,7 @@ export class UserService { } public async getUser( - { Account, id, permissions, Settings, subscription }: UserWithSettings, + { accounts, id, permissions, Settings, subscription }: UserWithSettings, aLocale = locale ): Promise { const userData = await Promise.all([ @@ -141,6 +141,7 @@ export class UserService { } return { + accounts, activitiesCount, id, permissions, @@ -154,7 +155,6 @@ export class UserService { permissions: accessItem.permissions }; }), - accounts: Account, dateOfFirstActivity: firstActivity?.date ?? new Date(), settings: { ...(Settings.settings as UserSettings), @@ -181,7 +181,7 @@ export class UserService { const { Access, accessToken, - Account, + accounts, Analytics, authChallenge, createdAt, @@ -195,7 +195,7 @@ export class UserService { } = await this.prismaService.user.findUnique({ include: { Access: true, - Account: { + accounts: { include: { Platform: true } }, Analytics: true, @@ -208,7 +208,7 @@ export class UserService { const user: UserWithSettings = { Access, accessToken, - Account, + accounts, authChallenge, createdAt, id, @@ -444,7 +444,7 @@ export class UserService { currentPermissions.push(permissions.impersonateAllUsers); } - user.Account = sortBy(user.Account, ({ name }) => { + user.accounts = sortBy(user.accounts, ({ name }) => { return name.toLowerCase(); }); user.permissions = currentPermissions.sort(); @@ -481,7 +481,7 @@ export class UserService { const user = await this.prismaService.user.create({ data: { ...data, - Account: { + accounts: { create: { currency: DEFAULT_CURRENCY, name: this.i18nService.getTranslation({ diff --git a/libs/common/src/lib/types/user-with-settings.type.ts b/libs/common/src/lib/types/user-with-settings.type.ts index 5fb25a664..9bff8c625 100644 --- a/libs/common/src/lib/types/user-with-settings.type.ts +++ b/libs/common/src/lib/types/user-with-settings.type.ts @@ -6,7 +6,7 @@ import { Access, Account, Settings, User } from '@prisma/client'; // TODO: Compare with User interface export type UserWithSettings = User & { Access: Access[]; - Account: Account[]; + accounts: Account[]; activityCount: number; dataProviderGhostfolioDailyRequests: number; permissions?: string[]; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index b063b1d89..ede19470d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -245,6 +245,7 @@ model Tag { model User { accessToken String? + accounts Account[] activities Order[] authChallenge String? createdAt DateTime @default(now()) @@ -258,7 +259,6 @@ model User { watchlist SymbolProfile[] @relation("UserWatchlist") Access Access[] @relation("accessGet") AccessGive Access[] @relation("accessGive") - Account Account[] Analytics Analytics? ApiKey ApiKey[] AuthDevice AuthDevice[] From fa99876dcae84a53c6b99902b116e61e47559ae9 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 8 Jun 2025 09:37:23 +0200 Subject: [PATCH 66/81] Feature/rename asset profile icon component to entity logo component (#4861) * Rename asset profile icon component to entity logo component * Update changelog --- CHANGELOG.md | 2 +- .../accounts-table/accounts-table.component.html | 8 ++++---- .../components/accounts-table/accounts-table.module.ts | 4 ++-- .../asset-profile-dialog/asset-profile-dialog.html | 2 +- .../asset-profile-dialog/asset-profile-dialog.module.ts | 4 ++-- .../admin-platform/admin-platform.component.html | 2 +- .../components/admin-platform/admin-platform.module.ts | 4 ++-- .../create-or-update-platform-dialog.html | 6 +----- .../create-or-update-platform-dialog.module.ts | 4 ++-- .../admin-settings/admin-settings.component.html | 2 +- .../components/admin-settings/admin-settings.module.ts | 4 ++-- .../create-or-update-account-dialog.html | 2 +- .../create-or-update-account-dialog.module.ts | 4 ++-- .../transfer-balance/transfer-balance-dialog.html | 4 ++-- .../transfer-balance/transfer-balance-dialog.module.ts | 4 ++-- .../create-or-update-activity-dialog.html | 2 +- .../create-or-update-activity-dialog.module.ts | 4 ++-- .../lib/activities-table/activities-table.component.html | 4 ++-- .../lib/activities-table/activities-table.component.ts | 4 ++-- libs/ui/src/lib/asset-profile-icon/index.ts | 1 - libs/ui/src/lib/assistant/assistant.component.ts | 4 ++-- libs/ui/src/lib/assistant/assistant.html | 2 +- .../entity-logo.component.html} | 0 .../entity-logo.component.scss} | 0 .../entity-logo.component.ts} | 8 ++++---- libs/ui/src/lib/entity-logo/index.ts | 1 + .../src/lib/holdings-table/holdings-table.component.html | 2 +- .../ui/src/lib/holdings-table/holdings-table.component.ts | 4 ++-- 28 files changed, 44 insertions(+), 48 deletions(-) delete mode 100644 libs/ui/src/lib/asset-profile-icon/index.ts rename libs/ui/src/lib/{asset-profile-icon/asset-profile-icon.component.html => entity-logo/entity-logo.component.html} (100%) rename libs/ui/src/lib/{asset-profile-icon/asset-profile-icon.component.scss => entity-logo/entity-logo.component.scss} (100%) rename libs/ui/src/lib/{asset-profile-icon/asset-profile-icon.component.ts => entity-logo/entity-logo.component.ts} (76%) create mode 100644 libs/ui/src/lib/entity-logo/index.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index fad387eee..c2a3dca8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Moved the asset profile icon component to `@ghostfolio/ui` +- Renamed the asset profile icon component to entity logo component and moved to `@ghostfolio/ui` - Renamed `Account` to `accounts` in the `User` database schema ### Fixed diff --git a/apps/client/src/app/components/accounts-table/accounts-table.component.html b/apps/client/src/app/components/accounts-table/accounts-table.component.html index ecb51fc29..41ae74bec 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.component.html +++ b/apps/client/src/app/components/accounts-table/accounts-table.component.html @@ -44,10 +44,10 @@
    @if (element.Platform?.url) { - } {{ element.name }} @@ -92,10 +92,10 @@ >
    @if (element.Platform?.url) { - } {{ element.Platform?.name }} diff --git a/apps/client/src/app/components/accounts-table/accounts-table.module.ts b/apps/client/src/app/components/accounts-table/accounts-table.module.ts index da233984b..d7c6bf9fe 100644 --- a/apps/client/src/app/components/accounts-table/accounts-table.module.ts +++ b/apps/client/src/app/components/accounts-table/accounts-table.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; +import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; @@ -17,7 +17,7 @@ import { AccountsTableComponent } from './accounts-table.component'; exports: [AccountsTableComponent], imports: [ CommonModule, - GfAssetProfileIconComponent, + GfEntityLogoComponent, GfValueComponent, MatButtonModule, MatMenuModule, diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index f10b6dc02..4c7d39fc0 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -507,7 +507,7 @@ Url @if (assetProfileForm.get('url').value) { -
    @if (element.url) { - @if (data.platform.url) { - + } diff --git a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts index d8b2bd128..a6239566c 100644 --- a/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts +++ b/apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.module.ts @@ -1,4 +1,4 @@ -import { GfAssetProfileIconComponent } from '@ghostfolio/ui/asset-profile-icon'; +import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; @@ -14,8 +14,8 @@ import { CreateOrUpdatePlatformDialog } from './create-or-update-platform-dialog declarations: [CreateOrUpdatePlatformDialog], imports: [ CommonModule, - GfAssetProfileIconComponent, FormsModule, + GfEntityLogoComponent, MatButtonModule, MatDialogModule, MatFormFieldModule, diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.html b/apps/client/src/app/components/admin-settings/admin-settings.component.html index 2d577d582..41069fb10 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.html +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -9,7 +9,7 @@ -
    @if (element.Account?.Platform?.url) { -
    -
    - Date: Sun, 8 Jun 2025 09:48:00 +0200 Subject: [PATCH 67/81] Feature/update locales (#4864) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 4 ++-- apps/client/src/locales/messages.de.xlf | 4 ++-- apps/client/src/locales/messages.es.xlf | 4 ++-- apps/client/src/locales/messages.fr.xlf | 4 ++-- apps/client/src/locales/messages.it.xlf | 4 ++-- apps/client/src/locales/messages.nl.xlf | 4 ++-- apps/client/src/locales/messages.pl.xlf | 4 ++-- apps/client/src/locales/messages.pt.xlf | 4 ++-- apps/client/src/locales/messages.tr.xlf | 4 ++-- apps/client/src/locales/messages.uk.xlf | 4 ++-- apps/client/src/locales/messages.xlf | 4 ++-- apps/client/src/locales/messages.zh.xlf | 4 ++-- 12 files changed, 24 insertions(+), 24 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index bfab9a8a2..a64b3f3e3 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -1095,7 +1095,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1143,7 +1143,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index b7b7d6663..4a7762a2e 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -506,7 +506,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -554,7 +554,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 76f53b029..9a12c1fad 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -507,7 +507,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -555,7 +555,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index fac798e8c..31b2e06e2 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -562,7 +562,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -610,7 +610,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 5ef471fdf..e16a9928b 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -507,7 +507,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -555,7 +555,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 3439f03c0..7799e5d4e 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -506,7 +506,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -554,7 +554,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 38f2a5725..3d3a8ac8c 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -987,7 +987,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1035,7 +1035,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 2635a020a..a8021410a 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -562,7 +562,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -610,7 +610,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 6eab8df6c..474f859d3 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -951,7 +951,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -999,7 +999,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 24ef55c37..c6f951b7e 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -1439,7 +1439,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1487,7 +1487,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 9a3af47b8..c3c1931c7 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -937,7 +937,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -984,7 +984,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 4f9202df8..603467ed9 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -996,7 +996,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 42 + 38 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html @@ -1044,7 +1044,7 @@ apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html - 49 + 45 apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html From ffce1c720869e929de84ca96f6e646f6e07e8108 Mon Sep 17 00:00:00 2001 From: Mark Philips Date: Sun, 8 Jun 2025 16:31:35 +0600 Subject: [PATCH 68/81] Feature/improve language localization for PL 20250607 (#4857) * Improve language localization for PL * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.pl.xlf | 42 ++++++++++++------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2a3dca8a..68c861b2e 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 - Renamed the asset profile icon component to entity logo component and moved to `@ghostfolio/ui` - Renamed `Account` to `accounts` in the `User` database schema +- Improved the language localization for Polish (`pl`) ### Fixed diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 3d3a8ac8c..8eaedb396 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -7473,7 +7473,7 @@ with API access for - with API access for + z dostępem API dla apps/client/src/app/pages/pricing/pricing-page.html 266 @@ -7489,7 +7489,7 @@ Gather All Historical Market Data - Gather All Historical Market Data + Zbierz wszystkie historyczne dane rynkowe apps/client/src/app/components/admin-market-data/admin-market-data.html 231 @@ -7497,7 +7497,7 @@ Gather Historical Market Data - Gather Historical Market Data + Zbierz historyczne dane rynkowe apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 29 @@ -7505,7 +7505,7 @@ Data Gathering is off - Data Gathering is off + Zbieranie danych jest wyłączone apps/client/src/app/components/admin-market-data/admin-market-data.html 38 @@ -7513,7 +7513,7 @@ Performance Calculation - Performance Calculation + Obliczanie wydajności apps/client/src/app/components/user-account-settings/user-account-settings.html 31 @@ -7521,7 +7521,7 @@ someone - someone + ktoś apps/client/src/app/pages/public/public-page.component.ts 33 @@ -7529,7 +7529,7 @@ Add asset to watchlist - Add asset to watchlist + Dodaj zasób do listy obserwowanych apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html 7 @@ -7537,7 +7537,7 @@ Watchlist - Watchlist + Lista obserwowanych apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -7549,7 +7549,7 @@ Watchlist - Watchlist + Lista obserwowanych apps/client/src/app/pages/home/home-page-routing.module.ts 40 @@ -7561,7 +7561,7 @@ Get Early Access - Get Early Access + Uzyskaj wcześniejszy dostęp apps/client/src/app/components/admin-settings/ghostfolio-premium-api-dialog/ghostfolio-premium-api-dialog.html 29 @@ -7569,7 +7569,7 @@ Do you really want to delete this item? - Do you really want to delete this item? + Czy na pewno chcesz usunąć ten element? libs/ui/src/lib/benchmark/benchmark.component.ts 132 @@ -7577,7 +7577,7 @@ Log out - Log out + Wyloguj się apps/client/src/app/components/header/header.component.html 317 @@ -7585,7 +7585,7 @@ Calculations are based on delayed market data and may not be displayed in real-time. - Calculations are based on delayed market data and may not be displayed in real-time. + Obliczenia opierają się na opóźnionych danych rynkowych i mogą nie być wyświetlane w czasie rzeczywistym. apps/client/src/app/components/home-market/home-market.html 43 @@ -7593,7 +7593,7 @@ changelog - changelog + dziennik zmian kebab-case libs/common/src/lib/paths.ts @@ -7602,7 +7602,7 @@ Demo user account has been synced. - Demo user account has been synced. + Konto użytkownika demonstracyjnego zostało zsynchronizowane. apps/client/src/app/components/admin-overview/admin-overview.component.ts 223 @@ -7610,7 +7610,7 @@ Sync Demo User Account - Sync Demo User Account + Synchronizuj konto użytkownika demonstracyjnego apps/client/src/app/components/admin-overview/admin-overview.html 181 @@ -7618,7 +7618,7 @@ Emergency Fund: Set up - Emergency Fund: Set up + Fundusz awaryjny: Utworzenie apps/client/src/app/pages/i18n/i18n-page.html 14 @@ -7626,7 +7626,7 @@ No emergency fund has been set up - No emergency fund has been set up + Nie utworzono funduszu awaryjnego apps/client/src/app/pages/i18n/i18n-page.html 15 @@ -7634,7 +7634,7 @@ An emergency fund has been set up - An emergency fund has been set up + Utworzono fundusz awaryjny apps/client/src/app/pages/i18n/i18n-page.html 18 @@ -7642,7 +7642,7 @@ Fee Ratio - Fee Ratio + Stosunek opłat apps/client/src/app/pages/i18n/i18n-page.html 21 @@ -7666,7 +7666,7 @@ Name - Name + Nazwa libs/ui/src/lib/benchmark/benchmark.component.html 11 From a40c726843d26d209527777d9d45c9b209c1a3b5 Mon Sep 17 00:00:00 2001 From: Elisa Falk Date: Sun, 8 Jun 2025 17:50:17 +0600 Subject: [PATCH 69/81] Feature/improve language localization for CA 20250607 (#4856) * Improve language localization for CA * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.ca.xlf | 42 ++++++++++++------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68c861b2e..3e8b6856a 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 - Renamed the asset profile icon component to entity logo component and moved to `@ghostfolio/ui` - Renamed `Account` to `accounts` in the `User` database schema +- Improved the language localization for Catalan (`ca`) - Improved the language localization for Polish (`pl`) ### Fixed diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index a64b3f3e3..81b012d40 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -4385,7 +4385,7 @@ Load Dividends - Load Dividends + Càrrega de dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 68 @@ -4393,7 +4393,7 @@ Choose or drop a file here - Choose or drop a file here + Trieu o deixeu anar un fitxer aquí apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 84 @@ -4401,7 +4401,7 @@ The following file formats are supported: - The following file formats are supported: + S’admeten els formats de fitxer següents: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 90 @@ -4409,7 +4409,7 @@ Select Dividends - Select Dividends + Seleccioneu Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 113 @@ -4417,7 +4417,7 @@ Select Activities - Select Activities + Seleccioneu Activitats apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 115 @@ -4425,7 +4425,7 @@ Back - Back + Enrere apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html 144 @@ -4437,7 +4437,7 @@ Allocations - Allocations + Allocations apps/client/src/app/pages/portfolio/allocations/allocations-page-routing.module.ts 13 @@ -4449,7 +4449,7 @@ Allocations - Allocations + Assignacions apps/client/src/app/pages/portfolio/allocations/allocations-page.html 4 @@ -4457,7 +4457,7 @@ Proportion of Net Worth - Proportion of Net Worth + Proporció del patrimoni net apps/client/src/app/pages/portfolio/allocations/allocations-page.html 12 @@ -4465,7 +4465,7 @@ By Platform - By Platform + Per plataforma apps/client/src/app/pages/portfolio/allocations/allocations-page.html 44 @@ -4473,7 +4473,7 @@ By Currency - By Currency + Per Moneda apps/client/src/app/pages/portfolio/allocations/allocations-page.html 63 @@ -4481,7 +4481,7 @@ By Asset Class - By Asset Class + Per classe d’actiu apps/client/src/app/pages/portfolio/allocations/allocations-page.html 85 @@ -4489,7 +4489,7 @@ By Holding - By Holding + Per Holding apps/client/src/app/pages/portfolio/allocations/allocations-page.html 107 @@ -4497,7 +4497,7 @@ By Sector - By Sector + Per sectors apps/client/src/app/pages/portfolio/allocations/allocations-page.html 130 @@ -4505,7 +4505,7 @@ By Continent - By Continent + Per continent apps/client/src/app/pages/portfolio/allocations/allocations-page.html 153 @@ -4513,7 +4513,7 @@ By Market - By Market + Per Mercat apps/client/src/app/pages/portfolio/allocations/allocations-page.html 175 @@ -4533,7 +4533,7 @@ Developed Markets - Developed Markets + Mercats desenvolupats apps/client/src/app/pages/portfolio/allocations/allocations-page.html 222 @@ -4545,7 +4545,7 @@ Emerging Markets - Emerging Markets + Mercats emergents apps/client/src/app/pages/portfolio/allocations/allocations-page.html 231 @@ -4557,7 +4557,7 @@ Other Markets - Other Markets + Altres Mercats apps/client/src/app/pages/portfolio/allocations/allocations-page.html 240 @@ -4569,7 +4569,7 @@ No data available - No data available + No hi ha dades disponibles apps/client/src/app/pages/portfolio/allocations/allocations-page.html 250 @@ -4589,7 +4589,7 @@ By Country - By Country + Per País apps/client/src/app/pages/portfolio/allocations/allocations-page.html 264 From 766d792b10d366afa0cea6a583deece0354988ae Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 8 Jun 2025 13:50:52 +0200 Subject: [PATCH 70/81] Feature/restructure paths to routes (#4863) * Restructure paths to routes --- apps/client/src/app/app-routing.module.ts | 50 +++++++------- apps/client/src/app/app.component.ts | 32 ++++----- .../access-table/access-table.component.ts | 4 +- .../account-detail-dialog.component.ts | 20 ++++-- .../admin-settings.component.ts | 4 +- .../benchmark-comparator.component.ts | 6 +- .../components/header/header.component.html | 26 +++---- .../app/components/header/header.component.ts | 38 +++++----- .../holding-detail-dialog.component.ts | 20 ++++-- .../home-holdings/home-holdings.component.ts | 8 +-- .../home-overview/home-overview.component.ts | 12 ++-- ...scription-interstitial-dialog.component.ts | 4 +- .../user-account-membership.component.ts | 4 +- apps/client/src/app/core/auth.guard.ts | 48 +++++++------ .../src/app/core/http-response.interceptor.ts | 6 +- .../pages/about/about-page-routing.module.ts | 12 ++-- .../app/pages/about/about-page.component.ts | 14 ++-- .../overview/about-overview-page.component.ts | 10 +-- .../accounts/accounts-page-routing.module.ts | 3 +- .../pages/admin/admin-page-routing.module.ts | 10 +-- .../app/pages/admin/admin-page.component.ts | 12 ++-- .../hallo-ghostfolio-page.component.ts | 8 +-- .../hello-ghostfolio-page.component.ts | 8 +-- ...st-months-in-open-source-page.component.ts | 6 +- ...-meets-internet-identity-page.component.ts | 4 +- ...get-my-finances-in-order-page.component.ts | 6 +- .../500-stars-on-github-page.component.ts | 8 +-- .../hacktoberfest-2022-page.component.ts | 4 +- .../black-friday-2022-page.component.ts | 8 +-- ...g-your-personal-finances-page.component.ts | 4 +- ...auf-sackgeld-vorgestellt-page.component.ts | 4 +- .../ghostfolio-meets-umbrel-page.component.ts | 4 +- .../1000-stars-on-github-page.component.ts | 8 +-- ...otential-with-ghostfolio-page.component.ts | 8 +-- ...ploring-the-path-to-fire-page.component.ts | 6 +- ...tfolio-joins-oss-friends-page.component.ts | 6 +- .../ghostfolio-2-page.component.ts | 12 ++-- .../hacktoberfest-2023-page.component.ts | 8 +-- .../black-week-2023-page.component.ts | 8 +-- ...oberfest-2023-debriefing-page.component.ts | 8 +-- .../hacktoberfest-2024-page.component.ts | 8 +-- .../black-weeks-2024-page.component.ts | 8 +-- .../app/pages/faq/faq-page-routing.module.ts | 6 +- .../src/app/pages/faq/faq-page.component.ts | 8 +-- .../overview/faq-overview-page.component.ts | 6 +- .../app/pages/faq/saas/saas-page.component.ts | 15 ++-- .../self-hosting-page.component.ts | 4 +- .../pages/features/features-page.component.ts | 6 +- .../pages/home/home-page-routing.module.ts | 18 +++-- .../src/app/pages/home/home-page.component.ts | 16 ++--- .../pages/landing/landing-page.component.ts | 10 +-- .../pages/open/open-page-routing.module.ts | 3 +- .../activities-page-routing.module.ts | 3 +- .../portfolio-page-routing.module.ts | 15 ++-- .../portfolio/portfolio-page.component.ts | 14 ++-- .../pages/pricing/pricing-page.component.ts | 6 +- .../register/register-page-routing.module.ts | 3 +- .../show-access-token-dialog.component.ts | 6 +- .../glossary/resources-glossary.component.ts | 6 +- .../overview/resources-overview.component.ts | 10 +-- ...sonal-finance-tools-page-routing.module.ts | 4 +- .../personal-finance-tools-page.component.ts | 8 +-- .../product-page.component.ts | 10 +-- .../resources-page-routing.module.ts | 10 +-- .../resources/resources-page.component.ts | 8 +-- .../user-account-page-routing.module.ts | 6 +- .../user-account-page.component.ts | 8 +-- .../app/pages/zen/zen-page-routing.module.ts | 15 ++-- .../src/app/pages/zen/zen-page.component.ts | 10 +-- libs/common/src/lib/{paths.ts => routes.ts} | 69 ++++++++++++++++--- .../membership-card.component.ts | 4 +- .../no-transactions-info.component.ts | 8 +-- .../premium-indicator.component.ts | 4 +- 73 files changed, 447 insertions(+), 359 deletions(-) rename libs/common/src/lib/{paths.ts => routes.ts} (52%) diff --git a/apps/client/src/app/app-routing.module.ts b/apps/client/src/app/app-routing.module.ts index b3be70bb2..46473d35d 100644 --- a/apps/client/src/app/app-routing.module.ts +++ b/apps/client/src/app/app-routing.module.ts @@ -1,6 +1,10 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; import { PageTitleStrategy } from '@ghostfolio/client/services/page-title.strategy'; -import { paths } from '@ghostfolio/common/paths'; +import { + publicRoutes, + routes as ghostfolioRoutes, + internalRoutes +} from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes, TitleStrategy } from '@angular/router'; @@ -9,26 +13,26 @@ import { ModulePreloadService } from './core/module-preload.service'; const routes: Routes = [ { - path: paths.about, + path: ghostfolioRoutes.about, loadChildren: () => import('./pages/about/about-page.module').then((m) => m.AboutPageModule) }, { - path: paths.account, + path: ghostfolioRoutes.account, loadChildren: () => import('./pages/user-account/user-account-page.module').then( (m) => m.UserAccountPageModule ) }, { - path: paths.accounts, + path: internalRoutes.accounts.path, loadChildren: () => import('./pages/accounts/accounts-page.module').then( (m) => m.AccountsPageModule ) }, { - path: paths.adminControl, + path: ghostfolioRoutes.adminControl, loadChildren: () => import('./pages/admin/admin-page.module').then((m) => m.AdminPageModule) }, @@ -38,16 +42,16 @@ const routes: Routes = [ import('./pages/api/api-page.component').then( (c) => c.GfApiPageComponent ), - path: paths.api, + path: ghostfolioRoutes.api, title: 'Ghostfolio API' }, { - path: paths.auth, + path: ghostfolioRoutes.auth, loadChildren: () => import('./pages/auth/auth-page.module').then((m) => m.AuthPageModule) }, { - path: paths.blog, + path: ghostfolioRoutes.blog, loadChildren: () => import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule) }, @@ -57,10 +61,10 @@ const routes: Routes = [ import('./pages/demo/demo-page.component').then( (c) => c.GfDemoPageComponent ), - path: paths.demo + path: ghostfolioRoutes.demo }, { - path: paths.faq, + path: ghostfolioRoutes.faq, loadChildren: () => import('./pages/faq/faq-page.module').then((m) => m.FaqPageModule) }, @@ -70,11 +74,11 @@ const routes: Routes = [ import('./pages/features/features-page.component').then( (c) => c.GfFeaturesPageComponent ), - path: paths.features, + path: ghostfolioRoutes.features, title: $localize`Features` }, { - path: paths.home, + path: internalRoutes.home.path, loadChildren: () => import('./pages/home/home-page.module').then((m) => m.HomePageModule) }, @@ -84,58 +88,58 @@ const routes: Routes = [ import('./pages/i18n/i18n-page.component').then( (c) => c.GfI18nPageComponent ), - path: paths.i18n, + path: ghostfolioRoutes.i18n, title: $localize`Internationalization` }, { - path: paths.markets, + path: ghostfolioRoutes.markets, loadChildren: () => import('./pages/markets/markets-page.module').then( (m) => m.MarketsPageModule ) }, { - path: paths.openStartup, + path: publicRoutes.openStartup.path, loadChildren: () => import('./pages/open/open-page.module').then((m) => m.OpenPageModule) }, { - path: paths.portfolio, + path: internalRoutes.portfolio.path, loadChildren: () => import('./pages/portfolio/portfolio-page.module').then( (m) => m.PortfolioPageModule ) }, { - path: paths.pricing, + path: ghostfolioRoutes.pricing, loadChildren: () => import('./pages/pricing/pricing-page.module').then( (m) => m.PricingPageModule ) }, { - path: paths.public, + path: ghostfolioRoutes.public, loadChildren: () => import('./pages/public/public-page.module').then( (m) => m.PublicPageModule ) }, { - path: paths.register, + path: publicRoutes.register.path, loadChildren: () => import('./pages/register/register-page.module').then( (m) => m.RegisterPageModule ) }, { - path: paths.resources, + path: ghostfolioRoutes.resources, loadChildren: () => import('./pages/resources/resources-page.module').then( (m) => m.ResourcesPageModule ) }, { - path: paths.start, + path: ghostfolioRoutes.start, loadChildren: () => import('./pages/landing/landing-page.module').then( (m) => m.LandingPageModule @@ -146,11 +150,11 @@ const routes: Routes = [ import('./pages/webauthn/webauthn-page.component').then( (c) => c.GfWebauthnPageComponent ), - path: paths.webauthn, + path: ghostfolioRoutes.webauthn, title: $localize`Sign in` }, { - path: paths.zen, + path: internalRoutes.zen.path, loadChildren: () => import('./pages/zen/zen-page.module').then((m) => m.ZenPageModule) }, diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 5d198580e..f0be8c76e 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -2,8 +2,8 @@ import { GfHoldingDetailDialogComponent } from '@ghostfolio/client/components/ho import { HoldingDetailDialogParams } from '@ghostfolio/client/components/holding-detail-dialog/interfaces/interfaces'; import { getCssVariable } from '@ghostfolio/common/helper'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { ColorScheme } from '@ghostfolio/common/types'; import { DOCUMENT } from '@angular/common'; @@ -63,25 +63,25 @@ export class AppComponent implements OnDestroy, OnInit { public hasTabs = false; public info: InfoItem; public pageTitle: string; - public routerLinkAbout = ['/' + paths.about]; - public routerLinkAboutChangelog = ['/' + paths.about, paths.changelog]; - public routerLinkAboutLicense = ['/' + paths.about, paths.license]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkAboutChangelog = ['/' + routes.about, routes.changelog]; + public routerLinkAboutLicense = ['/' + routes.about, routes.license]; public routerLinkAboutPrivacyPolicy = [ - '/' + paths.about, - paths.privacyPolicy + '/' + routes.about, + routes.privacyPolicy ]; public routerLinkAboutTermsOfService = [ - '/' + paths.about, - paths.termsOfService + '/' + routes.about, + routes.termsOfService ]; - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFaq = ['/' + paths.faq]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkMarkets = ['/' + paths.markets]; - public routerLinkOpenStartup = ['/' + paths.openStartup]; - public routerLinkPricing = ['/' + paths.pricing]; - public routerLinkRegister = ['/' + paths.register]; - public routerLinkResources = ['/' + paths.resources]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFaq = ['/' + routes.faq]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkMarkets = ['/' + routes.markets]; + public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; + public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkRegister = ['/' + publicRoutes.register.path]; + public routerLinkResources = ['/' + routes.resources]; public showFooter = false; public user: User; diff --git a/apps/client/src/app/components/access-table/access-table.component.ts b/apps/client/src/app/components/access-table/access-table.component.ts index bcd5839e0..5487f570d 100644 --- a/apps/client/src/app/components/access-table/access-table.component.ts +++ b/apps/client/src/app/components/access-table/access-table.component.ts @@ -1,7 +1,7 @@ import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { Access, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Clipboard } from '@angular/cdk/clipboard'; import { @@ -55,7 +55,7 @@ export class AccessTableComponent implements OnChanges { public getPublicUrl(aId: string): string { const languageCode = this.user.settings.language; - return `${this.baseUrl}/${languageCode}/${paths.public}/${aId}`; + return `${this.baseUrl}/${languageCode}/${routes.public}/${aId}`; } public onCopyUrlToClipboard(aId: string): void { diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index ba3b9e871..aea1c544c 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -9,8 +9,8 @@ import { PortfolioPosition, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { OrderWithAccount } from '@ghostfolio/common/types'; import { @@ -93,9 +93,12 @@ export class AccountDetailDialog implements OnDestroy, OnInit { } public onCloneActivity(aActivity: Activity) { - this.router.navigate(['/' + paths.portfolio, paths.activities], { - queryParams: { activityId: aActivity.id, createDialog: true } - }); + this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.routerLink, + { + queryParams: { activityId: aActivity.id, createDialog: true } + } + ); this.dialogRef.close(); } @@ -152,9 +155,12 @@ export class AccountDetailDialog implements OnDestroy, OnInit { } public onUpdateActivity(aActivity: Activity) { - this.router.navigate(['/' + paths.portfolio, paths.activities], { - queryParams: { activityId: aActivity.id, editDialog: true } - }); + this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.routerLink, + { + queryParams: { activityId: aActivity.id, editDialog: true } + } + ); this.dialogRef.close(); } diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index 68db9eaac..e6fdb53cc 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -10,7 +10,7 @@ import { DataProviderInfo, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectionStrategy, @@ -72,7 +72,7 @@ export class AdminSettingsComponent implements OnDestroy, OnInit { const languageCode = this.user.settings.language; - this.pricingUrl = `https://ghostfol.io/${languageCode}/${paths.pricing}`; + this.pricingUrl = `https://ghostfol.io/${languageCode}/${routes.pricing}`; this.changeDetectorRef.markForCheck(); } diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index c98f01fb7..74a2f85d6 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -12,8 +12,8 @@ import { parseDate } from '@ghostfolio/common/helper'; import { LineChartItem, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { ColorScheme } from '@ghostfolio/common/types'; import { @@ -65,8 +65,8 @@ export class BenchmarkComparatorComponent implements OnChanges, OnDestroy { public chart: Chart<'line'>; public hasPermissionToAccessAdminControl: boolean; public routerLinkAdminControlMarketData = [ - '/' + paths.adminControl, - paths.marketData + '/' + routes.adminControl, + routes.marketData ]; public constructor() { diff --git a/apps/client/src/app/components/header/header.component.html b/apps/client/src/app/components/header/header.component.html index 74737ca05..c20711242 100644 --- a/apps/client/src/app/components/header/header.component.html +++ b/apps/client/src/app/components/header/header.component.html @@ -20,9 +20,9 @@ mat-flat-button [ngClass]="{ 'font-weight-bold': - currentRoute === paths.home || currentRoute === paths.zen, + currentRoute === routes.home || currentRoute === routes.zen, 'text-decoration-underline': - currentRoute === paths.home || currentRoute === paths.zen + currentRoute === routes.home || currentRoute === routes.zen }" [routerLink]="['/']" >OverviewPortfolioAccountsAdmin ControlOverviewPortfolioAccounts My Ghostfolio @@ -271,7 +271,7 @@ i18n mat-menu-item [ngClass]="{ - 'font-weight-bold': currentRoute === paths.adminControl + 'font-weight-bold': currentRoute === routes.adminControl }" [routerLink]="routerLinkAdminControl" >Admin Control(); 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 cdaea83dc..6e8fc2af5 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 @@ -13,8 +13,8 @@ import { LineChartItem, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDataProviderCreditsComponent } from '@ghostfolio/ui/data-provider-credits'; import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical-market-data-editor'; @@ -470,9 +470,12 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } public onCloneActivity(aActivity: Activity) { - this.router.navigate(['/' + paths.portfolio, paths.activities], { - queryParams: { activityId: aActivity.id, createDialog: true } - }); + this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.routerLink, + { + queryParams: { activityId: aActivity.id, createDialog: true } + } + ); this.dialogRef.close(); } @@ -512,9 +515,12 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } public onUpdateActivity(aActivity: Activity) { - this.router.navigate(['/' + paths.portfolio, paths.activities], { - queryParams: { activityId: aActivity.id, editDialog: true } - }); + this.router.navigate( + internalRoutes.portfolio.subRoutes.activities.routerLink, + { + queryParams: { activityId: aActivity.id, editDialog: true } + } + ); this.dialogRef.close(); } 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 9f772a3e4..03de79f44 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 @@ -7,8 +7,8 @@ import { ToggleOption, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { HoldingType, HoldingsViewMode } from '@ghostfolio/common/types'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; @@ -37,10 +37,8 @@ export class HomeHoldingsComponent implements OnDestroy, OnInit { { label: $localize`Active`, value: 'ACTIVE' }, { label: $localize`Closed`, value: 'CLOSED' } ]; - public routerLinkPortfolioActivities = [ - '/' + paths.portfolio, - paths.activities - ]; + public routerLinkPortfolioActivities = + internalRoutes.portfolio.subRoutes.activities.routerLink; public user: User; public viewModeFormControl = new FormControl( HomeHoldingsComponent.DEFAULT_HOLDINGS_VIEW_MODE 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 783b7d1b9..776967c3d 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 @@ -10,8 +10,8 @@ import { PortfolioPerformance, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -37,12 +37,10 @@ export class HomeOverviewComponent implements OnDestroy, OnInit { public isLoadingPerformance = true; public performance: PortfolioPerformance; public precision = 2; - public routerLinkAccounts = ['/' + paths.accounts]; - public routerLinkPortfolio = ['/' + paths.portfolio]; - public routerLinkPortfolioActivities = [ - '/' + paths.portfolio, - paths.activities - ]; + public routerLinkAccounts = internalRoutes.accounts.routerLink; + public routerLinkPortfolio = internalRoutes.portfolio.routerLink; + public routerLinkPortfolioActivities = + internalRoutes.portfolio.subRoutes.activities.routerLink; public showDetails = false; public unit: string; public user: User; diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts index 233493d13..df257a001 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectionStrategy, @@ -28,7 +28,7 @@ export class SubscriptionInterstitialDialog implements OnInit { public remainingSkipButtonDelay = SubscriptionInterstitialDialog.SKIP_BUTTON_DELAY_IN_SECONDS; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkPricing = ['/' + routes.pricing]; public variantIndex: number; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts index 82810392c..27655915b 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -4,8 +4,8 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { getDateFormatString } from '@ghostfolio/common/helper'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectionStrategy, @@ -37,7 +37,7 @@ export class UserAccountMembershipComponent implements OnDestroy { public hasPermissionToUpdateUserSettings: boolean; public price: number; public priceId: string; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkPricing = ['/' + routes.pricing]; public trySubscriptionMail = 'mailto:hi@ghostfol.io?Subject=Ghostfolio Premium Trial&body=Hello%0D%0DI am interested in Ghostfolio Premium. Can you please send me a coupon code to try it for some time?%0D%0DKind regards'; public user: User; diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index 87ef23d60..21a92b166 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -1,7 +1,11 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { paths } from '@ghostfolio/common/paths'; +import { + internalRoutes, + publicRoutes, + routes +} from '@ghostfolio/common/routes'; import { Injectable } from '@angular/core'; import { @@ -15,17 +19,17 @@ import { catchError } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class AuthGuard { private static PUBLIC_PAGE_ROUTES = [ - `/${paths.about}`, - `/${paths.blog}`, - `/${paths.demo}`, - `/${paths.faq}`, - `/${paths.features}`, - `/${paths.markets}`, - `/${paths.openStartup}`, - `/${paths.pricing}`, - `/${paths.public}`, - `/${paths.register}`, - `/${paths.resources}` + `/${routes.about}`, + `/${routes.blog}`, + `/${routes.demo}`, + `/${routes.faq}`, + `/${routes.features}`, + `/${routes.markets}`, + `/${publicRoutes.openStartup.path}`, + `/${routes.pricing}`, + `/${routes.public}`, + `/${publicRoutes.register.path}`, + `/${routes.resources}` ]; public constructor( @@ -48,10 +52,10 @@ export class AuthGuard { .pipe( catchError(() => { if (utmSource === 'ios') { - this.router.navigate(['/' + paths.demo]); + this.router.navigate(['/' + routes.demo]); resolve(false); } else if (utmSource === 'trusted-web-activity') { - this.router.navigate(['/' + paths.register]); + this.router.navigate(['/' + publicRoutes.register.path]); resolve(false); } else if ( AuthGuard.PUBLIC_PAGE_ROUTES.some((publicPageRoute) => { @@ -62,7 +66,7 @@ export class AuthGuard { resolve(true); return EMPTY; } else if (state.url !== '/start') { - this.router.navigate(['/' + paths.start]); + this.router.navigate(['/' + routes.start]); resolve(false); return EMPTY; } @@ -88,26 +92,26 @@ export class AuthGuard { resolve(true); return; } else if ( - state.url.startsWith(`/${paths.home}`) && + state.url.startsWith(`/${internalRoutes.home.path}`) && user.settings.viewMode === 'ZEN' ) { - this.router.navigate(['/' + paths.zen]); + this.router.navigate(internalRoutes.zen.routerLink); resolve(false); return; - } else if (state.url.startsWith(`/${paths.start}`)) { + } else if (state.url.startsWith(`/${routes.start}`)) { if (user.settings.viewMode === 'ZEN') { - this.router.navigate(['/' + paths.zen]); + this.router.navigate(internalRoutes.zen.routerLink); } else { - this.router.navigate(['/' + paths.home]); + this.router.navigate(internalRoutes.home.routerLink); } resolve(false); return; } else if ( - state.url.startsWith(`/${paths.zen}`) && + state.url.startsWith(`/${internalRoutes.zen.path}`) && user.settings.viewMode === 'DEFAULT' ) { - this.router.navigate(['/' + paths.home]); + this.router.navigate(internalRoutes.home.routerLink); resolve(false); return; } diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts index 32c5350bb..31e1c1947 100644 --- a/apps/client/src/app/core/http-response.interceptor.ts +++ b/apps/client/src/app/core/http-response.interceptor.ts @@ -2,7 +2,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { HTTP_INTERCEPTORS, @@ -75,7 +75,7 @@ export class HttpResponseInterceptor implements HttpInterceptor { }); this.snackBarRef.onAction().subscribe(() => { - this.router.navigate(['/' + paths.pricing]); + this.router.navigate(['/' + routes.pricing]); }); } } else if (error.status === StatusCodes.INTERNAL_SERVER_ERROR) { @@ -111,7 +111,7 @@ export class HttpResponseInterceptor implements HttpInterceptor { } else if (error.status === StatusCodes.UNAUTHORIZED) { if (!error.url.includes('/data-providers/ghostfolio/status')) { if (this.webAuthnService.isEnabled()) { - this.router.navigate(['/' + paths.webauthn]); + this.router.navigate(['/' + routes.webauthn]); } else { this.tokenStorageService.signOut(); } diff --git a/apps/client/src/app/pages/about/about-page-routing.module.ts b/apps/client/src/app/pages/about/about-page-routing.module.ts index d8d70a2da..d17612584 100644 --- a/apps/client/src/app/pages/about/about-page-routing.module.ts +++ b/apps/client/src/app/pages/about/about-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -18,35 +18,35 @@ const routes: Routes = [ ) }, { - path: paths.changelog, + path: ghostfolioRoutes.changelog, loadChildren: () => import('./changelog/changelog-page.module').then( (m) => m.ChangelogPageModule ) }, { - path: paths.license, + path: ghostfolioRoutes.license, loadChildren: () => import('./license/license-page.module').then( (m) => m.LicensePageModule ) }, { - path: paths.ossFriends, + path: ghostfolioRoutes.ossFriends, loadChildren: () => import('./oss-friends/oss-friends-page.module').then( (m) => m.OpenSourceSoftwareFriendsPageModule ) }, { - path: paths.privacyPolicy, + path: ghostfolioRoutes.privacyPolicy, loadChildren: () => import('./privacy-policy/privacy-policy-page.module').then( (m) => m.PrivacyPolicyPageModule ) }, { - path: paths.termsOfService, + path: ghostfolioRoutes.termsOfService, loadChildren: () => import('./terms-of-service/terms-of-service-page.module').then( (m) => m.TermsOfServicePageModule diff --git a/apps/client/src/app/pages/about/about-page.component.ts b/apps/client/src/app/pages/about/about-page.component.ts index deeffa166..de307cbf9 100644 --- a/apps/client/src/app/pages/about/about-page.component.ts +++ b/apps/client/src/app/pages/about/about-page.component.ts @@ -1,8 +1,8 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -44,17 +44,17 @@ export class AboutPageComponent implements OnDestroy, OnInit { { iconName: 'information-circle-outline', label: $localize`About`, - path: ['/' + paths.about] + path: ['/' + routes.about] }, { iconName: 'sparkles-outline', label: $localize`Changelog`, - path: ['/' + paths.about, paths.changelog] + path: ['/' + routes.about, routes.changelog] }, { iconName: 'ribbon-outline', label: $localize`License`, - path: ['/' + paths.about, paths.license], + path: ['/' + routes.about, routes.license], showCondition: !this.hasPermissionForSubscription } ]; @@ -63,14 +63,14 @@ export class AboutPageComponent implements OnDestroy, OnInit { this.tabs.push({ iconName: 'shield-checkmark-outline', label: $localize`Privacy Policy`, - path: ['/' + paths.about, paths.privacyPolicy], + path: ['/' + routes.about, routes.privacyPolicy], showCondition: this.hasPermissionForSubscription }); this.tabs.push({ iconName: 'document-text-outline', label: $localize`Terms of Service`, - path: ['/' + paths.about, paths.termsOfService], + path: ['/' + routes.about, routes.termsOfService], showCondition: this.hasPermissionForSubscription }); @@ -82,7 +82,7 @@ export class AboutPageComponent implements OnDestroy, OnInit { this.tabs.push({ iconName: 'happy-outline', label: 'OSS Friends', - path: ['/' + paths.about, paths.ossFriends] + path: ['/' + routes.about, routes.ossFriends] }); }); } diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts index ec135e4d3..a2d911a8e 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts +++ b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -1,8 +1,8 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; @@ -18,10 +18,10 @@ export class AboutOverviewPageComponent implements OnDestroy, OnInit { public hasPermissionForStatistics: boolean; public hasPermissionForSubscription: boolean; public isLoggedIn: boolean; - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFaq = ['/' + paths.faq]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkOpenStartup = ['/' + paths.openStartup]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFaq = ['/' + routes.faq]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts b/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts index 59c708006..d34ab48fb 100644 --- a/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts +++ b/apps/client/src/app/pages/accounts/accounts-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: AccountsPageComponent, path: '', - title: $localize`Accounts` + title: internalRoutes.accounts.title } ]; diff --git a/apps/client/src/app/pages/admin/admin-page-routing.module.ts b/apps/client/src/app/pages/admin/admin-page-routing.module.ts index d22c754bb..f19f27051 100644 --- a/apps/client/src/app/pages/admin/admin-page-routing.module.ts +++ b/apps/client/src/app/pages/admin/admin-page-routing.module.ts @@ -4,7 +4,7 @@ import { AdminOverviewComponent } from '@ghostfolio/client/components/admin-over import { AdminSettingsComponent } from '@ghostfolio/client/components/admin-settings/admin-settings.component'; import { AdminUsersComponent } from '@ghostfolio/client/components/admin-users/admin-users.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -21,22 +21,22 @@ const routes: Routes = [ title: $localize`Admin Control` }, { - path: paths.jobs, + path: ghostfolioRoutes.jobs, component: AdminJobsComponent, title: $localize`Job Queue` }, { - path: paths.marketData, + path: ghostfolioRoutes.marketData, component: AdminMarketDataComponent, title: $localize`Market Data` }, { - path: paths.settings, + path: ghostfolioRoutes.settings, component: AdminSettingsComponent, title: $localize`Settings` }, { - path: paths.users, + path: ghostfolioRoutes.users, component: AdminUsersComponent, title: $localize`Users` } diff --git a/apps/client/src/app/pages/admin/admin-page.component.ts b/apps/client/src/app/pages/admin/admin-page.component.ts index e787cb0fc..eea04f930 100644 --- a/apps/client/src/app/pages/admin/admin-page.component.ts +++ b/apps/client/src/app/pages/admin/admin-page.component.ts @@ -1,5 +1,5 @@ import { TabConfiguration } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -27,27 +27,27 @@ export class AdminPageComponent implements OnDestroy, OnInit { { iconName: 'reader-outline', label: $localize`Overview`, - path: ['/' + paths.adminControl] + path: ['/' + routes.adminControl] }, { iconName: 'settings-outline', label: $localize`Settings`, - path: ['/' + paths.adminControl, paths.settings] + path: ['/' + routes.adminControl, routes.settings] }, { iconName: 'server-outline', label: $localize`Market Data`, - path: ['/' + paths.adminControl, paths.marketData] + path: ['/' + routes.adminControl, routes.marketData] }, { iconName: 'flash-outline', label: $localize`Job Queue`, - path: ['/' + paths.adminControl, paths.jobs] + path: ['/' + routes.adminControl, routes.jobs] }, { iconName: 'people-outline', label: $localize`Users`, - path: ['/' + paths.adminControl, paths.users] + path: ['/' + routes.adminControl, routes.users] } ]; } diff --git a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts index 222a79648..430166065 100644 --- a/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts +++ b/apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './hallo-ghostfolio-page.html' }) export class HalloGhostfolioPageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkPricing = ['/' + paths.pricing]; - public routerLinkResources = ['/' + paths.resources]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkResources = ['/' + routes.resources]; } diff --git a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts index 7538356a5..0c8584cd0 100644 --- a/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts +++ b/apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './hello-ghostfolio-page.html' }) export class HelloGhostfolioPageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkPricing = ['/' + paths.pricing]; - public routerLinkResources = ['/' + paths.resources]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkPricing = ['/' + routes.pricing]; + public routerLinkResources = ['/' + routes.resources]; } diff --git a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts index 348318421..0b5e6f659 100644 --- a/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router'; templateUrl: './first-months-in-open-source-page.html' }) export class FirstMonthsInOpenSourcePageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkPricing = ['/' + routes.pricing]; } diff --git a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts index 8c0160c25..a644c7996 100644 --- a/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router'; templateUrl: './ghostfolio-meets-internet-identity-page.html' }) export class GhostfolioMeetsInternetIdentityPageComponent { - public routerLinkBlog = ['/' + paths.blog]; + public routerLinkBlog = ['/' + routes.blog]; } diff --git a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts index 4d747e89a..c7ab04820 100644 --- a/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router'; templateUrl: './how-do-i-get-my-finances-in-order-page.html' }) export class HowDoIGetMyFinancesInOrderPageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkResources = ['/' + paths.resources]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkResources = ['/' + routes.resources]; } diff --git a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts index b0cd76494..635a8bde3 100644 --- a/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './500-stars-on-github-page.html' }) export class FiveHundredStarsOnGitHubPageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkMarkets = ['/' + paths.markets]; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkMarkets = ['/' + routes.markets]; + public routerLinkPricing = ['/' + routes.pricing]; } diff --git a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts index 491d82f20..8b15e9f2f 100644 --- a/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router'; templateUrl: './hacktoberfest-2022-page.html' }) export class Hacktoberfest2022PageComponent { - public routerLinkBlog = ['/' + paths.blog]; + public routerLinkBlog = ['/' + routes.blog]; } diff --git a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts index 311d25096..07ffd76d9 100644 --- a/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { Component } from '@angular/core'; @@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './black-friday-2022-page.html' }) export class BlackFriday2022PageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkPricing = ['/' + routes.pricing]; } diff --git a/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts index cffd0be81..f9ebee82b 100644 --- a/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts +++ b/apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router'; templateUrl: './the-importance-of-tracking-your-personal-finances-page.html' }) export class TheImportanceOfTrackingYourPersonalFinancesPageComponent { - public routerLinkBlog = ['/' + paths.blog]; + public routerLinkBlog = ['/' + routes.blog]; } diff --git a/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts index cb86af86f..363bfc8eb 100644 --- a/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router'; templateUrl: './ghostfolio-auf-sackgeld-vorgestellt-page.html' }) export class GhostfolioAufSackgeldVorgestelltPageComponent { - public routerLinkBlog = ['/' + paths.blog]; + public routerLinkBlog = ['/' + routes.blog]; } diff --git a/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts index 25fb5d05a..9d6af906c 100644 --- a/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,5 +11,5 @@ import { RouterModule } from '@angular/router'; templateUrl: './ghostfolio-meets-umbrel-page.html' }) export class GhostfolioMeetsUmbrelPageComponent { - public routerLinkBlog = ['/' + paths.blog]; + public routerLinkBlog = ['/' + routes.blog]; } diff --git a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts index 1203eb16b..4e1360622 100644 --- a/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './1000-stars-on-github-page.html' }) export class ThousandStarsOnGitHubPageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkPricing = ['/' + routes.pricing]; } diff --git a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts index a33691e92..e97dce009 100644 --- a/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './unlock-your-financial-potential-with-ghostfolio-page.html' }) export class UnlockYourFinancialPotentialWithGhostfolioPageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkResources = ['/' + paths.resources]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkResources = ['/' + routes.resources]; } diff --git a/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts b/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts index 891d835e8..abe3d9383 100644 --- a/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router'; templateUrl: './exploring-the-path-to-fire-page.html' }) export class ExploringThePathToFirePageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFeatures = ['/' + paths.features]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFeatures = ['/' + routes.features]; } diff --git a/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts b/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts index 8ba2dac49..0811f2df7 100644 --- a/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,6 +11,6 @@ import { RouterModule } from '@angular/router'; templateUrl: './ghostfolio-joins-oss-friends-page.html' }) export class GhostfolioJoinsOssFriendsPageComponent { - public routerLinkAboutOssFriends = ['/' + paths.about, paths.ossFriends]; - public routerLinkBlog = ['/' + paths.blog]; + public routerLinkAboutOssFriends = ['/' + routes.about, routes.ossFriends]; + public routerLinkBlog = ['/' + routes.blog]; } diff --git a/apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts b/apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts index 42e8f8200..4d5581251 100644 --- a/apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,9 +11,9 @@ import { RouterModule } from '@angular/router'; templateUrl: './ghostfolio-2-page.html' }) export class Ghostfolio2PageComponent { - public routerLinkAbout = ['/' + paths.about]; - public routerLinkAboutChangelog = ['/' + paths.about, paths.changelog]; - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkMarkets = ['/' + paths.markets]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkAboutChangelog = ['/' + routes.about, routes.changelog]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkMarkets = ['/' + routes.markets]; } diff --git a/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts b/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts index 3aed72cbe..0525adc93 100644 --- a/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './hacktoberfest-2023-page.html' }) export class Hacktoberfest2023PageComponent { - public routerLinkAbout = ['/' + paths.about]; - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkOpenStartup = ['/' + paths.openStartup]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; } diff --git a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts index 39b713386..a3b02004e 100644 --- a/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { Component } from '@angular/core'; @@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './black-week-2023-page.html' }) export class BlackWeek2023PageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkPricing = ['/' + routes.pricing]; } diff --git a/apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts b/apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts index e4a628fb6..689581bf1 100644 --- a/apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './hacktoberfest-2023-debriefing-page.html' }) export class Hacktoberfest2023DebriefingPageComponent { - public routerLinkAbout = ['/' + paths.about]; - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFeatures = ['/' + paths.features]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFeatures = ['/' + routes.features]; } diff --git a/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts b/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts index 8db7f0d63..5a559dd95 100644 --- a/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts +++ b/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -11,7 +11,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './hacktoberfest-2024-page.html' }) export class Hacktoberfest2024PageComponent { - public routerLinkAbout = ['/' + paths.about]; - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkOpenStartup = ['/' + paths.openStartup]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; } diff --git a/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts b/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts index cacf1077c..b29a82b57 100644 --- a/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts +++ b/apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { Component } from '@angular/core'; @@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router'; templateUrl: './black-weeks-2024-page.html' }) export class BlackWeeks2024PageComponent { - public routerLinkBlog = ['/' + paths.blog]; - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkBlog = ['/' + routes.blog]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkPricing = ['/' + routes.pricing]; } diff --git a/apps/client/src/app/pages/faq/faq-page-routing.module.ts b/apps/client/src/app/pages/faq/faq-page-routing.module.ts index 3ebf1912a..47870958d 100644 --- a/apps/client/src/app/pages/faq/faq-page-routing.module.ts +++ b/apps/client/src/app/pages/faq/faq-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -18,12 +18,12 @@ const routes: Routes = [ ) }, { - path: paths.saas, + path: ghostfolioRoutes.saas, loadChildren: () => import('./saas/saas-page.module').then((m) => m.SaasPageModule) }, { - path: paths.selfHosting, + path: ghostfolioRoutes.selfHosting, loadChildren: () => import('./self-hosting/self-hosting-page.module').then( (m) => m.SelfHostingPageModule diff --git a/apps/client/src/app/pages/faq/faq-page.component.ts b/apps/client/src/app/pages/faq/faq-page.component.ts index 270719cf3..8bfbdcbcc 100644 --- a/apps/client/src/app/pages/faq/faq-page.component.ts +++ b/apps/client/src/app/pages/faq/faq-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { TabConfiguration } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -36,18 +36,18 @@ export class FaqPageComponent implements OnDestroy, OnInit { { iconName: 'reader-outline', label: $localize`General`, - path: ['/' + paths.faq] + path: ['/' + routes.faq] }, { iconName: 'cloudy-outline', label: $localize`Cloud` + ' (SaaS)', - path: ['/' + paths.faq, paths.saas], + path: ['/' + routes.faq, routes.saas], showCondition: this.hasPermissionForSubscription }, { iconName: 'server-outline', label: $localize`Self-Hosting`, - path: ['/' + paths.faq, paths.selfHosting] + path: ['/' + routes.faq, routes.selfHosting] } ]; } diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts index 4e5ed76b9..a59bb7160 100644 --- a/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; @@ -13,8 +13,8 @@ import { Subject, takeUntil } from 'rxjs'; standalone: false }) export class FaqOverviewPageComponent implements OnDestroy { - public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; - public routerLinkFeatures = ['/' + paths.features]; + public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`; + public routerLinkFeatures = ['/' + routes.features]; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/faq/saas/saas-page.component.ts b/apps/client/src/app/pages/faq/saas/saas-page.component.ts index b6e6b7002..27c794069 100644 --- a/apps/client/src/app/pages/faq/saas/saas-page.component.ts +++ b/apps/client/src/app/pages/faq/saas/saas-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; @@ -13,11 +13,14 @@ import { Subject, takeUntil } from 'rxjs'; standalone: false }) export class SaasPageComponent implements OnDestroy { - public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; - public routerLinkAccount = ['/' + paths.account]; - public routerLinkAccountMembership = ['/' + paths.account, paths.membership]; - public routerLinkMarkets = ['/' + paths.markets]; - public routerLinkRegister = ['/' + paths.register]; + public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`; + public routerLinkAccount = ['/' + routes.account]; + public routerLinkAccountMembership = [ + '/' + routes.account, + routes.membership + ]; + public routerLinkMarkets = ['/' + routes.markets]; + public routerLinkRegister = ['/' + publicRoutes.register.path]; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts index 1b7836755..864db7af3 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; @@ -11,7 +11,7 @@ import { Subject } from 'rxjs'; standalone: false }) export class SelfHostingPageComponent implements OnDestroy { - public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${paths.pricing}`; + public pricingUrl = `https://ghostfol.io/${document.documentElement.lang}/${routes.pricing}`; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/features/features-page.component.ts b/apps/client/src/app/pages/features/features-page.component.ts index 1057516bd..bb502fdaf 100644 --- a/apps/client/src/app/pages/features/features-page.component.ts +++ b/apps/client/src/app/pages/features/features-page.component.ts @@ -1,8 +1,8 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; @@ -26,8 +26,8 @@ import { Subject, takeUntil } from 'rxjs'; export class GfFeaturesPageComponent implements OnDestroy { public hasPermissionForSubscription: boolean; public info: InfoItem; - public routerLinkRegister = ['/' + paths.register]; - public routerLinkResources = ['/' + paths.resources]; + public routerLinkRegister = ['/' + publicRoutes.register.path]; + public routerLinkResources = ['/' + routes.resources]; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/home/home-page-routing.module.ts b/apps/client/src/app/pages/home/home-page-routing.module.ts index a28ea864f..7f00ceabe 100644 --- a/apps/client/src/app/pages/home/home-page-routing.module.ts +++ b/apps/client/src/app/pages/home/home-page-routing.module.ts @@ -4,7 +4,10 @@ import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overvi import { HomeSummaryComponent } from '@ghostfolio/client/components/home-summary/home-summary.component'; import { HomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { + routes as ghostfolioRoutes, + internalRoutes +} from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -20,28 +23,29 @@ const routes: Routes = [ component: HomeOverviewComponent }, { - path: paths.holdings, + path: internalRoutes.home.subRoutes.holdings.path, component: HomeHoldingsComponent, - title: $localize`Holdings` + title: internalRoutes.home.subRoutes.holdings.title }, { - path: paths.summary, + path: ghostfolioRoutes.summary, component: HomeSummaryComponent, title: $localize`Summary` }, { - path: paths.market, + path: ghostfolioRoutes.market, component: HomeMarketComponent, title: $localize`Markets` }, { - path: paths.watchlist, + path: ghostfolioRoutes.watchlist, component: HomeWatchlistComponent, title: $localize`Watchlist` } ], component: HomePageComponent, - path: '' + path: '', + title: internalRoutes.home.title } ]; diff --git a/apps/client/src/app/pages/home/home-page.component.ts b/apps/client/src/app/pages/home/home-page.component.ts index ecb8ff0be..870930b4e 100644 --- a/apps/client/src/app/pages/home/home-page.component.ts +++ b/apps/client/src/app/pages/home/home-page.component.ts @@ -1,7 +1,7 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes, routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -36,28 +36,28 @@ export class HomePageComponent implements OnDestroy, OnInit { this.tabs = [ { iconName: 'analytics-outline', - label: $localize`Overview`, - path: ['/' + paths.home] + label: internalRoutes.home.title, + path: internalRoutes.home.routerLink }, { iconName: 'wallet-outline', - label: $localize`Holdings`, - path: ['/' + paths.home, paths.holdings] + label: internalRoutes.home.subRoutes.holdings.title, + path: internalRoutes.home.subRoutes.holdings.routerLink }, { iconName: 'reader-outline', label: $localize`Summary`, - path: ['/' + paths.home, paths.summary] + path: ['/' + internalRoutes.home.path, routes.summary] }, { iconName: 'bookmark-outline', label: $localize`Watchlist`, - path: ['/' + paths.home, paths.watchlist] + path: ['/' + internalRoutes.home.path, routes.watchlist] }, { iconName: 'newspaper-outline', label: $localize`Markets`, - path: ['/' + paths.home, paths.market] + path: ['/' + internalRoutes.home.path, routes.market] } ]; diff --git a/apps/client/src/app/pages/landing/landing-page.component.ts b/apps/client/src/app/pages/landing/landing-page.component.ts index 9777a6c01..84a2e4768 100644 --- a/apps/client/src/app/pages/landing/landing-page.component.ts +++ b/apps/client/src/app/pages/landing/landing-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { Statistics } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { format } from 'date-fns'; @@ -25,10 +25,10 @@ export class LandingPageComponent implements OnDestroy, OnInit { public hasPermissionForStatistics: boolean; public hasPermissionForSubscription: boolean; public hasPermissionToCreateUser: boolean; - public routerLinkAbout = ['/' + paths.about]; - public routerLinkDemo = ['/' + paths.demo]; - public routerLinkOpenStartup = ['/' + paths.openStartup]; - public routerLinkRegister = ['/' + paths.register]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkDemo = ['/' + routes.demo]; + public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; + public routerLinkRegister = ['/' + publicRoutes.register.path]; public statistics: Statistics; public testimonials = [ { diff --git a/apps/client/src/app/pages/open/open-page-routing.module.ts b/apps/client/src/app/pages/open/open-page-routing.module.ts index b9db4ab10..cd113d361 100644 --- a/apps/client/src/app/pages/open/open-page-routing.module.ts +++ b/apps/client/src/app/pages/open/open-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { publicRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: OpenPageComponent, path: '', - title: 'Open Startup' + title: publicRoutes.openStartup.title } ]; diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts b/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts index 00962d563..38a594c99 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: ActivitiesPageComponent, path: '', - title: $localize`Activities` + title: internalRoutes.portfolio.subRoutes.activities.title } ]; diff --git a/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts b/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts index 84499573a..87c1a2785 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts +++ b/apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts @@ -1,5 +1,8 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { + routes as ghostfolioRoutes, + internalRoutes +} from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -18,33 +21,33 @@ const routes: Routes = [ ) }, { - path: paths.activities, + path: internalRoutes.portfolio.subRoutes.activities.path, loadChildren: () => import('./activities/activities-page.module').then( (m) => m.ActivitiesPageModule ) }, { - path: paths.allocations, + path: ghostfolioRoutes.allocations, loadChildren: () => import('./allocations/allocations-page.module').then( (m) => m.AllocationsPageModule ) }, { - path: paths.fire, + path: ghostfolioRoutes.fire, loadChildren: () => import('./fire/fire-page.module').then((m) => m.FirePageModule) }, { - path: paths.xRay, + path: ghostfolioRoutes.xRay, loadChildren: () => import('./x-ray/x-ray-page.module').then((m) => m.XRayPageModule) } ], component: PortfolioPageComponent, path: '', - title: $localize`Portfolio` + title: internalRoutes.portfolio.title } ]; diff --git a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts index 926ec7a8b..8e0748f64 100644 --- a/apps/client/src/app/pages/portfolio/portfolio-page.component.ts +++ b/apps/client/src/app/pages/portfolio/portfolio-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes, routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -34,27 +34,27 @@ export class PortfolioPageComponent implements OnDestroy, OnInit { { iconName: 'analytics-outline', label: $localize`Analysis`, - path: ['/' + paths.portfolio] + path: internalRoutes.portfolio.routerLink }, { iconName: 'swap-vertical-outline', - label: $localize`Activities`, - path: ['/' + paths.portfolio, paths.activities] + label: internalRoutes.portfolio.subRoutes.activities.title, + path: internalRoutes.portfolio.subRoutes.activities.routerLink }, { iconName: 'pie-chart-outline', label: $localize`Allocations`, - path: ['/' + paths.portfolio, paths.allocations] + path: ['/' + internalRoutes.portfolio.path, routes.allocations] }, { iconName: 'calculator-outline', label: 'FIRE ', - path: ['/' + paths.portfolio, paths.fire] + path: ['/' + internalRoutes.portfolio.path, routes.fire] }, { iconName: 'scan-outline', label: 'X-ray', - path: ['/' + paths.portfolio, paths.xRay] + path: ['/' + internalRoutes.portfolio.path, routes.xRay] } ]; this.user = state.user; diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 68573dde5..e3cc8ccb2 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -2,8 +2,8 @@ import { NotificationService } from '@ghostfolio/client/core/notification/notifi import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { publicRoutes, routes } from '@ghostfolio/common/routes'; import { translate } from '@ghostfolio/ui/i18n'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; @@ -41,8 +41,8 @@ export class PricingPageComponent implements OnDestroy, OnInit { public professionalDataProviderTooltipPremium = translate( 'PROFESSIONAL_DATA_PROVIDER_TOOLTIP_PREMIUM' ); - public routerLinkFeatures = ['/' + paths.features]; - public routerLinkRegister = ['/' + paths.register]; + public routerLinkFeatures = ['/' + routes.features]; + public routerLinkRegister = ['/' + publicRoutes.register.path]; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/register/register-page-routing.module.ts b/apps/client/src/app/pages/register/register-page-routing.module.ts index 80ab69b62..81af9f09f 100644 --- a/apps/client/src/app/pages/register/register-page-routing.module.ts +++ b/apps/client/src/app/pages/register/register-page-routing.module.ts @@ -1,4 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; +import { publicRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -10,7 +11,7 @@ const routes: Routes = [ canActivate: [AuthGuard], component: RegisterPageComponent, path: '', - title: $localize`Registration` + title: publicRoutes.register.title } ]; diff --git a/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts b/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts index 5b7de607d..fb35a357d 100644 --- a/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts +++ b/apps/client/src/app/pages/register/show-access-token-dialog/show-access-token-dialog.component.ts @@ -1,5 +1,5 @@ import { DataService } from '@ghostfolio/client/services/data.service'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectionStrategy, @@ -31,8 +31,8 @@ export class ShowAccessTokenDialog { public isDisclaimerChecked = false; public role: string; public routerLinkAboutTermsOfService = [ - '/' + paths.about, - paths.termsOfService + '/' + routes.about, + routes.termsOfService ]; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts index 2734707d1..f05b353d2 100644 --- a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts +++ b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnInit } from '@angular/core'; @@ -15,8 +15,8 @@ export class ResourcesGlossaryPageComponent implements OnInit { public hasPermissionForSubscription: boolean; public info: InfoItem; public routerLinkResourcesPersonalFinanceTools = [ - '/' + paths.resources, - paths.personalFinanceTools + '/' + routes.resources, + routes.personalFinanceTools ]; public constructor(private dataService: DataService) { diff --git a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts index cca9aa9bf..6cf136ed9 100644 --- a/apps/client/src/app/pages/resources/overview/resources-overview.component.ts +++ b/apps/client/src/app/pages/resources/overview/resources-overview.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component } from '@angular/core'; @@ -14,25 +14,25 @@ export class ResourcesOverviewComponent { title: 'Frequently Asked Questions (FAQ)', description: 'Find quick answers to commonly asked questions about Ghostfolio in our Frequently Asked Questions (FAQ) section.', - link: ['/' + paths.faq] + link: ['/' + routes.faq] }, { title: 'Guides', description: 'Explore our guides to help you get started with investing and managing your finances.', - link: ['/' + paths.resources, paths.guides] + link: ['/' + routes.resources, routes.guides] }, { title: 'Markets', description: 'Access various market resources and tools to stay informed about financial markets.', - link: ['/' + paths.resources, paths.markets] + link: ['/' + routes.resources, routes.markets] }, { title: 'Glossary', description: 'Learn key financial terms and concepts in our comprehensive glossary.', - link: ['/' + paths.resources, paths.glossary] + link: ['/' + routes.resources, routes.glossary] } ]; } diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts index 2b5146d89..921b7340d 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page-routing.module.ts @@ -1,6 +1,6 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -24,7 +24,7 @@ const routes: Routes = [ return GfProductPageComponent; } ), - path: `${paths.openSourceAlternativeTo}-${alias ?? key}`, + path: `${ghostfolioRoutes.openSourceAlternativeTo}-${alias ?? key}`, title: $localize`Open Source Alternative to ${name}` }; }) diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts index f2b6a6541..e6394098c 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.component.ts @@ -1,5 +1,5 @@ -import { paths } from '@ghostfolio/common/paths'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; @@ -12,12 +12,12 @@ import { Subject } from 'rxjs'; standalone: false }) export class PersonalFinanceToolsPageComponent implements OnDestroy { - public pathAlternativeTo = paths.openSourceAlternativeTo + '-'; - public pathResources = '/' + paths.resources; + public pathAlternativeTo = routes.openSourceAlternativeTo + '-'; + public pathResources = '/' + routes.resources; public personalFinanceTools = personalFinanceTools.sort((a, b) => { return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }); }); - public routerLinkAbout = ['/' + paths.about]; + public routerLinkAbout = ['/' + routes.about]; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts index 6c3e8b551..9024acc7e 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1,7 +1,7 @@ import { DataService } from '@ghostfolio/client/services/data.service'; import { Product } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; +import { routes } from '@ghostfolio/common/routes'; import { translate } from '@ghostfolio/ui/i18n'; import { Component, OnInit } from '@angular/core'; @@ -20,11 +20,11 @@ export class GfProductPageComponent implements OnInit { public price: number; public product1: Product; public product2: Product; - public routerLinkAbout = ['/' + paths.about]; - public routerLinkFeatures = ['/' + paths.features]; + public routerLinkAbout = ['/' + routes.about]; + public routerLinkFeatures = ['/' + routes.features]; public routerLinkResourcesPersonalFinanceTools = [ - '/' + paths.resources, - paths.personalFinanceTools + '/' + routes.resources, + routes.personalFinanceTools ]; public tags: string[]; diff --git a/apps/client/src/app/pages/resources/resources-page-routing.module.ts b/apps/client/src/app/pages/resources/resources-page-routing.module.ts index b7c1734be..fe226a896 100644 --- a/apps/client/src/app/pages/resources/resources-page-routing.module.ts +++ b/apps/client/src/app/pages/resources/resources-page-routing.module.ts @@ -1,5 +1,5 @@ import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -19,27 +19,27 @@ const routes: Routes = [ ) }, { - path: paths.glossary, + path: ghostfolioRoutes.glossary, loadChildren: () => import('./glossary/resources-glossary.module').then( (m) => m.ResourcesGlossaryPageModule ) }, { - path: paths.guides, + path: ghostfolioRoutes.guides, loadChildren: () => import('./guides/resources-guides.module').then( (m) => m.ResourcesGuidesModule ) }, { - path: paths.markets, + path: ghostfolioRoutes.markets, loadChildren: () => import('./markets/resources-markets.module').then( (m) => m.ResourcesMarketsModule ) }, - ...[paths.personalFinanceTools].map((path) => ({ + ...[ghostfolioRoutes.personalFinanceTools].map((path) => ({ path, loadChildren: () => import( diff --git a/apps/client/src/app/pages/resources/resources-page.component.ts b/apps/client/src/app/pages/resources/resources-page.component.ts index ba38fac18..907779ed8 100644 --- a/apps/client/src/app/pages/resources/resources-page.component.ts +++ b/apps/client/src/app/pages/resources/resources-page.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { Component, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -20,17 +20,17 @@ export class ResourcesPageComponent implements OnInit { iconName: 'reader-outline' }, { - path: paths.guides, + path: routes.guides, label: $localize`Guides`, iconName: 'book-outline' }, { - path: paths.markets, + path: routes.markets, label: $localize`Markets`, iconName: 'newspaper-outline' }, { - path: paths.glossary, + path: routes.glossary, label: $localize`Glossary`, iconName: 'library-outline' } diff --git a/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts b/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts index 003d0df75..9701c20a2 100644 --- a/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts +++ b/apps/client/src/app/pages/user-account/user-account-page-routing.module.ts @@ -2,7 +2,7 @@ import { UserAccountAccessComponent } from '@ghostfolio/client/components/user-a import { UserAccountMembershipComponent } from '@ghostfolio/client/components/user-account-membership/user-account-membership.component'; import { UserAccountSettingsComponent } from '@ghostfolio/client/components/user-account-settings/user-account-settings.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { routes as ghostfolioRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -19,12 +19,12 @@ const routes: Routes = [ title: $localize`Settings` }, { - path: paths.membership, + path: ghostfolioRoutes.membership, component: UserAccountMembershipComponent, title: $localize`Membership` }, { - path: paths.access, + path: ghostfolioRoutes.access, component: UserAccountAccessComponent, title: $localize`Access` } diff --git a/apps/client/src/app/pages/user-account/user-account-page.component.ts b/apps/client/src/app/pages/user-account/user-account-page.component.ts index c18598910..da53c1fd6 100644 --- a/apps/client/src/app/pages/user-account/user-account-page.component.ts +++ b/apps/client/src/app/pages/user-account/user-account-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -35,18 +35,18 @@ export class UserAccountPageComponent implements OnDestroy, OnInit { { iconName: 'settings-outline', label: $localize`Settings`, - path: ['/' + paths.account] + path: ['/' + routes.account] }, { iconName: 'diamond-outline', label: $localize`Membership`, - path: ['/' + paths.account, paths.membership], + path: ['/' + routes.account, routes.membership], showCondition: !!this.user?.subscription }, { iconName: 'key-outline', label: $localize`Access`, - path: ['/' + paths.account, paths.access] + path: ['/' + routes.account, routes.access] } ]; diff --git a/apps/client/src/app/pages/zen/zen-page-routing.module.ts b/apps/client/src/app/pages/zen/zen-page-routing.module.ts index 819f39f7e..8ca947957 100644 --- a/apps/client/src/app/pages/zen/zen-page-routing.module.ts +++ b/apps/client/src/app/pages/zen/zen-page-routing.module.ts @@ -1,7 +1,7 @@ import { HomeHoldingsComponent } from '@ghostfolio/client/components/home-holdings/home-holdings.component'; import { HomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component'; import { AuthGuard } from '@ghostfolio/client/core/auth.guard'; -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -12,12 +12,19 @@ const routes: Routes = [ { canActivate: [AuthGuard], children: [ - { path: '', component: HomeOverviewComponent }, - { path: paths.holdings, component: HomeHoldingsComponent } + { + path: '', + component: HomeOverviewComponent + }, + { + path: internalRoutes.zen.subRoutes.holdings.path, + component: HomeHoldingsComponent, + title: internalRoutes.home.subRoutes.holdings.title + } ], component: ZenPageComponent, path: '', - title: $localize`Overview` + title: internalRoutes.zen.title } ]; diff --git a/apps/client/src/app/pages/zen/zen-page.component.ts b/apps/client/src/app/pages/zen/zen-page.component.ts index cad969bd5..ae15c1532 100644 --- a/apps/client/src/app/pages/zen/zen-page.component.ts +++ b/apps/client/src/app/pages/zen/zen-page.component.ts @@ -1,6 +1,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { DeviceDetectorService } from 'ngx-device-detector'; @@ -33,13 +33,13 @@ export class ZenPageComponent implements OnDestroy, OnInit { this.tabs = [ { iconName: 'analytics-outline', - label: $localize`Overview`, - path: ['/' + paths.zen] + label: internalRoutes.zen.title, + path: internalRoutes.zen.routerLink }, { iconName: 'wallet-outline', - label: $localize`Holdings`, - path: ['/' + paths.zen, paths.holdings] + label: internalRoutes.zen.subRoutes.holdings.title, + path: internalRoutes.zen.subRoutes.holdings.routerLink } ]; this.user = state.user; diff --git a/libs/common/src/lib/paths.ts b/libs/common/src/lib/routes.ts similarity index 52% rename from libs/common/src/lib/paths.ts rename to libs/common/src/lib/routes.ts index c63457afc..bf4b40fee 100644 --- a/libs/common/src/lib/paths.ts +++ b/libs/common/src/lib/routes.ts @@ -1,26 +1,20 @@ import '@angular/localize/init'; -export const paths = { +export const routes = { access: 'access', account: 'account', - accounts: 'accounts', - activities: 'activities', adminControl: 'admin', allocations: 'allocations', api: 'api', auth: 'auth', - blog: 'blog', demo: 'demo', fire: 'fire', - holdings: 'holdings', - home: 'home', i18n: 'i18n', jobs: 'jobs', market: 'market', marketData: 'market-data', membership: 'membership', personalFinanceTools: 'personal-finance-tools', - portfolio: 'portfolio', public: 'p', saas: 'saas', settings: 'settings', @@ -30,10 +24,10 @@ export const paths = { watchlist: 'watchlist', webauthn: 'webauthn', xRay: 'x-ray', - zen: 'zen', // Publicly accessible pages about: $localize`:kebab-case:about`, + blog: 'blog', changelog: $localize`:kebab-case:changelog`, faq: $localize`:kebab-case:faq`, features: $localize`:kebab-case:features`, @@ -42,12 +36,67 @@ export const paths = { license: $localize`:kebab-case:license`, markets: $localize`:kebab-case:markets`, openSourceAlternativeTo: $localize`:kebab-case:open-source-alternative-to`, - openStartup: 'open', ossFriends: 'oss-friends', pricing: $localize`:kebab-case:pricing`, privacyPolicy: $localize`:kebab-case:privacy-policy`, - register: $localize`:kebab-case:register`, resources: $localize`:kebab-case:resources`, selfHosting: $localize`:kebab-case:self-hosting`, termsOfService: $localize`:kebab-case:terms-of-service` }; + +export const internalRoutes = { + accounts: { + path: 'accounts', + routerLink: ['/accounts'], + title: $localize`Accounts` + }, + home: { + excludeFromAssistant: true, + path: 'home', + routerLink: ['/home'], + subRoutes: { + holdings: { + path: 'holdings', + routerLink: ['/home', 'holdings'], + title: $localize`Holdings` + } + }, + title: $localize`Overview` + }, + portfolio: { + path: 'portfolio', + routerLink: ['/portfolio'], + subRoutes: { + activities: { + path: 'activities', + routerLink: ['/portfolio', 'activities'], + title: $localize`Activities` + } + }, + title: $localize`Portfolio` + }, + zen: { + excludeFromAssistant: true, + path: 'zen', + routerLink: ['/zen'], + subRoutes: { + holdings: { + path: 'holdings', + routerLink: ['/zen', 'holdings'], + title: $localize`Holdings` + } + }, + title: $localize`Overview` + } +}; + +export const publicRoutes = { + openStartup: { + path: 'open', + title: 'Open Startup' + }, + register: { + path: $localize`:kebab-case:register`, + title: $localize`Registration` + } +}; diff --git a/libs/ui/src/lib/membership-card/membership-card.component.ts b/libs/ui/src/lib/membership-card/membership-card.component.ts index fd2986e18..1264a7a94 100644 --- a/libs/ui/src/lib/membership-card/membership-card.component.ts +++ b/libs/ui/src/lib/membership-card/membership-card.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { CommonModule } from '@angular/common'; import { @@ -29,7 +29,7 @@ export class GfMembershipCardComponent { @Output() generateApiKeyClicked = new EventEmitter(); - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkPricing = ['/' + routes.pricing]; public onGenerateApiKey(event: MouseEvent) { event.preventDefault(); diff --git a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts index 286aeb322..f948edcca 100644 --- a/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts +++ b/libs/ui/src/lib/no-transactions-info/no-transactions-info.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { internalRoutes } from '@ghostfolio/common/routes'; import { CUSTOM_ELEMENTS_SCHEMA, @@ -23,8 +23,6 @@ import { GfLogoComponent } from '../logo'; export class GfNoTransactionsInfoComponent { @HostBinding('class.has-border') @Input() hasBorder = true; - public routerLinkPortfolioActivities = [ - '/' + paths.portfolio, - paths.activities - ]; + public routerLinkPortfolioActivities = + internalRoutes.portfolio.subRoutes.activities.routerLink; } diff --git a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts index 90198fed6..56ce7cf58 100644 --- a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts +++ b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts @@ -1,4 +1,4 @@ -import { paths } from '@ghostfolio/common/paths'; +import { routes } from '@ghostfolio/common/routes'; import { CommonModule } from '@angular/common'; import { @@ -20,5 +20,5 @@ import { RouterModule } from '@angular/router'; export class GfPremiumIndicatorComponent { @Input() enableLink = true; - public routerLinkPricing = ['/' + paths.pricing]; + public routerLinkPricing = ['/' + routes.pricing]; } From fec223070ff54b28acd7b1dd242ee9da506116d0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Jun 2025 13:55:08 +0200 Subject: [PATCH 71/81] Feature/update locales (#4866) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.de.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.es.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.fr.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.it.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.nl.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.pl.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.pt.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.tr.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.uk.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.xlf | 124 +++++++++++------------- apps/client/src/locales/messages.zh.xlf | 124 +++++++++++------------- 12 files changed, 672 insertions(+), 816 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 81b012d40..d8785bf0c 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -6,7 +6,7 @@ Característiques apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -14,7 +14,7 @@ Internacionalització apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -22,11 +22,11 @@ Iniciar sessió apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -370,8 +370,8 @@ sobre kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -379,8 +379,8 @@ llicències kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -388,8 +388,8 @@ política de privacitat kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -397,8 +397,8 @@ faq kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -406,8 +406,8 @@ característiques kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -415,8 +415,8 @@ mercats kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -424,8 +424,8 @@ preu kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -433,8 +433,8 @@ registrar-se kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -442,8 +442,8 @@ recursos kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -1941,14 +1941,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -2103,7 +2103,7 @@ Oooh! El testimoni de seguretat és incorrecte. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -3326,8 +3326,8 @@ Accounts Comptes - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -3457,21 +3457,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -3547,8 +3543,8 @@ autoallotjament kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -3707,16 +3703,12 @@ Holdings Explotacions - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -3724,7 +3716,7 @@ Resum apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3736,7 +3728,7 @@ Mercats apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -4199,12 +4191,8 @@ Activities Activitats - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -5071,8 +5059,8 @@ Registration Registration - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -5112,8 +5100,8 @@ open-source-alternative-to kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6945,8 +6933,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6954,8 +6942,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7415,8 +7403,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7552,7 +7540,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7596,8 +7584,8 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 4a7762a2e..12b6e7e51 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -1018,11 +1018,11 @@ Einloggen apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -1030,7 +1030,7 @@ Ups! Falsches Sicherheits-Token. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1821,8 +1821,8 @@ Accounts Konten - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -1962,7 +1962,7 @@ Features apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -1972,21 +1972,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -1994,7 +1990,7 @@ Märkte apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2173,16 +2169,12 @@ Holdings Positionen - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2341,12 +2333,8 @@ Activities Aktivitäten - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2380,14 +2368,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Currencies @@ -2417,8 +2405,8 @@ Registration Registrierung - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -3354,7 +3342,7 @@ Zusammenfassung apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -5170,8 +5158,8 @@ haeufig-gestellte-fragen kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5179,8 +5167,8 @@ features kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5188,8 +5176,8 @@ ueber-uns kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5197,8 +5185,8 @@ datenschutzbestimmungen kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5206,8 +5194,8 @@ lizenz kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5215,8 +5203,8 @@ maerkte kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5224,8 +5212,8 @@ preise kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5233,8 +5221,8 @@ registrierung kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -5242,8 +5230,8 @@ ressourcen kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5315,8 +5303,8 @@ open-source-alternative-zu kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6092,8 +6080,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6217,7 +6205,7 @@ Internationalisierung apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6969,8 +6957,8 @@ ratgeber kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6978,8 +6966,8 @@ lexikon kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7439,8 +7427,8 @@ allgemeine-geschaeftsbedingungen kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7552,7 +7540,7 @@ Beobachtungsliste apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7596,8 +7584,8 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 9a12c1fad..697222e9a 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -1003,11 +1003,11 @@ Iniciar sesión apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -1015,7 +1015,7 @@ Vaya! Token de seguridad incorrecto. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1806,8 +1806,8 @@ Accounts Cuentas - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -1947,7 +1947,7 @@ Funcionalidades apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -1957,21 +1957,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -1979,7 +1975,7 @@ Mercados apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2158,16 +2154,12 @@ Holdings Participaciones - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2326,12 +2318,8 @@ Activities Operación - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2365,14 +2353,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Currencies @@ -2402,8 +2390,8 @@ Registration Registro - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -3339,7 +3327,7 @@ Resumen apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -5147,8 +5135,8 @@ preguntas-mas-frecuentes kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5156,8 +5144,8 @@ funcionalidades kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5165,8 +5153,8 @@ sobre kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5174,8 +5162,8 @@ politica-de-privacidad kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5183,8 +5171,8 @@ licencia kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5192,8 +5180,8 @@ mercados kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5201,8 +5189,8 @@ precios kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5210,8 +5198,8 @@ registro kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -5219,8 +5207,8 @@ recursos kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5292,8 +5280,8 @@ alternativa-de-software-libre-a kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6069,8 +6057,8 @@ auto alojado kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6194,7 +6182,7 @@ Internacionalización apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6946,8 +6934,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6955,8 +6943,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7416,8 +7404,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7553,7 +7541,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7597,8 +7585,8 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 31b2e06e2..0c1251741 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -1104,14 +1104,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1314,11 +1314,11 @@ Se connecter apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -1326,7 +1326,7 @@ Oups! Jeton de Sécurité Incorrect. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2161,8 +2161,8 @@ Accounts Comptes - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -2358,23 +2358,19 @@ Fonctionnalités apps/client/src/app/app-routing.module.ts - 74 + 78 Holdings Positions - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2382,7 +2378,7 @@ Résumé apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -2394,7 +2390,7 @@ Marchés apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2417,12 +2413,8 @@ Activities Activités - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2877,8 +2869,8 @@ Registration Enregistrement - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -2964,21 +2956,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -5146,8 +5134,8 @@ foire-aux-questions kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5155,8 +5143,8 @@ fonctionnalites kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5164,8 +5152,8 @@ a-propos kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5173,8 +5161,8 @@ politique-de-confidentialite kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5182,8 +5170,8 @@ licence kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5191,8 +5179,8 @@ marches kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5200,8 +5188,8 @@ prix kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5209,8 +5197,8 @@ enregistrement kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -5218,8 +5206,8 @@ ressources kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5291,8 +5279,8 @@ alternative-open-source-a kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6068,8 +6056,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6193,7 +6181,7 @@ Internationalisation apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6945,8 +6933,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6954,8 +6942,8 @@ glossaire kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7415,8 +7403,8 @@ conditions-d-utilisation kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7552,7 +7540,7 @@ Liste de suivi apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7596,8 +7584,8 @@ journal-des-modifications kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index e16a9928b..de5f4b82a 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -1003,11 +1003,11 @@ Accedi apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -1015,7 +1015,7 @@ Ops! Token di sicurezza errato. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1806,8 +1806,8 @@ Accounts Account - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -1947,7 +1947,7 @@ Funzionalità apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -1957,21 +1957,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -1979,7 +1975,7 @@ Mercati apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2158,16 +2154,12 @@ Holdings Partecipazioni - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2326,12 +2318,8 @@ Activities Attività - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2365,14 +2353,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Currencies @@ -2402,8 +2390,8 @@ Registration Iscrizione - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -3339,7 +3327,7 @@ Summario apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -5147,8 +5135,8 @@ domande-piu-frequenti kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5156,8 +5144,8 @@ funzionalita kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5165,8 +5153,8 @@ informazioni-su kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5174,8 +5162,8 @@ informativa-sulla-privacy kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5183,8 +5171,8 @@ licenza kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5192,8 +5180,8 @@ mercati kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5201,8 +5189,8 @@ prezzi kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5210,8 +5198,8 @@ iscrizione kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -5219,8 +5207,8 @@ risorse kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5292,8 +5280,8 @@ alternativa-open-source-a kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6069,8 +6057,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6194,7 +6182,7 @@ Internazionalizzazione apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6946,8 +6934,8 @@ guide kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6955,8 +6943,8 @@ glossario kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7416,8 +7404,8 @@ termini-e-condizioni kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7553,7 +7541,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7597,8 +7585,8 @@ registro-delle-modifiche kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 7799e5d4e..920754452 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -1002,11 +1002,11 @@ Aanmelden apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -1014,7 +1014,7 @@ Oeps! Onjuiste beveiligingstoken. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1805,8 +1805,8 @@ Accounts Rekeningen - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -1946,7 +1946,7 @@ Functionaliteiten apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -1956,21 +1956,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -1978,7 +1974,7 @@ Markten apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2157,16 +2153,12 @@ Holdings Posities - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2325,12 +2317,8 @@ Activities Activiteiten - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2364,14 +2352,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Currencies @@ -2401,8 +2389,8 @@ Registration Registratie - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -3338,7 +3326,7 @@ Samenvatting apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -5146,8 +5134,8 @@ veelgestelde-vragen kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5155,8 +5143,8 @@ functionaliteiten kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5164,8 +5152,8 @@ over kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5173,8 +5161,8 @@ privacybeleid kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5182,8 +5170,8 @@ licentie kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5191,8 +5179,8 @@ markten kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5200,8 +5188,8 @@ prijzen kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5209,8 +5197,8 @@ registratie kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -5218,8 +5206,8 @@ bronnen kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5291,8 +5279,8 @@ open-source-alternatief-voor kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6068,8 +6056,8 @@ zelf hosten kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6193,7 +6181,7 @@ Internationalizering apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6945,8 +6933,8 @@ gidsen kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6954,8 +6942,8 @@ woordenlijst kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7415,8 +7403,8 @@ servicevoorwaarden kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7552,7 +7540,7 @@ Volglijst apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7596,8 +7584,8 @@ wijzigingslogboek kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 8eaedb396..3a1aaa389 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -6,8 +6,8 @@ o-ghostfolio kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -15,8 +15,8 @@ faq kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -24,8 +24,8 @@ funkcje kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -33,8 +33,8 @@ licencja kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -42,8 +42,8 @@ rynki kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -51,8 +51,8 @@ cennik kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -60,8 +60,8 @@ polityka-prywatnosci kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -69,8 +69,8 @@ zarejestruj kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -78,8 +78,8 @@ zasoby kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -1773,14 +1773,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1899,11 +1899,11 @@ Zaloguj się apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -1911,7 +1911,7 @@ Ups! Nieprawidłowy token bezpieczeństwa. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -3010,8 +3010,8 @@ Accounts Konta - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -3129,21 +3129,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -3203,7 +3199,7 @@ Funkcje apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -3334,16 +3330,12 @@ Holdings Inwestycje - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -3351,7 +3343,7 @@ Podsumowanie apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3363,7 +3355,7 @@ Rynki apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -3802,12 +3794,8 @@ Activities Aktywności - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -4638,8 +4626,8 @@ Registration Rejestracja - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -4679,8 +4667,8 @@ alternatywa-open-source-dla kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6068,8 +6056,8 @@ wlasny-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6193,7 +6181,7 @@ Internacjonalizacja apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6945,8 +6933,8 @@ poradniki kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6954,8 +6942,8 @@ slowniczek kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7415,8 +7403,8 @@ warunki-świadczenia-usług kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7552,7 +7540,7 @@ Lista obserwowanych apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7596,8 +7584,8 @@ dziennik zmian kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index a8021410a..c31e11a33 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -976,14 +976,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1186,11 +1186,11 @@ Iniciar sessão apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -1198,7 +1198,7 @@ Oops! Token de Segurança Incorreto. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2105,8 +2105,8 @@ Accounts Contas - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -2278,7 +2278,7 @@ Funcionalidades apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -2288,21 +2288,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -2310,7 +2306,7 @@ Mercados apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -2333,12 +2329,8 @@ Activities Atividades - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -2685,16 +2677,12 @@ Holdings Posições - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2773,8 +2761,8 @@ Registration Registo - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -3286,7 +3274,7 @@ Sumário apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -5146,8 +5134,8 @@ perguntas-mais-frequentes kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -5155,8 +5143,8 @@ funcionalidades kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -5164,8 +5152,8 @@ sobre kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -5173,8 +5161,8 @@ politica-de-privacidade kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -5182,8 +5170,8 @@ licenca kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -5191,8 +5179,8 @@ mercados kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -5200,8 +5188,8 @@ precos kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -5209,8 +5197,8 @@ registo kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -5218,8 +5206,8 @@ recursos kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -5291,8 +5279,8 @@ alternativa-de-software-livre-ao kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6068,8 +6056,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6193,7 +6181,7 @@ Internationalization apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6945,8 +6933,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6954,8 +6942,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7415,8 +7403,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7552,7 +7540,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7596,8 +7584,8 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 474f859d3..c478b56b7 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -6,8 +6,8 @@ hakkinda kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -15,8 +15,8 @@ sss kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -24,8 +24,8 @@ oezellikler kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -33,8 +33,8 @@ lisans kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -42,8 +42,8 @@ piyasalar kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -51,8 +51,8 @@ fiyatlandirma kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -60,8 +60,8 @@ gizlilik-politikasi kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -69,8 +69,8 @@ kayit-ol kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -78,8 +78,8 @@ kaynaklar kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -1637,14 +1637,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1751,11 +1751,11 @@ Giriş apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -1763,7 +1763,7 @@ Hay Allah! Güvenlik anahtarı yanlış. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2590,8 +2590,8 @@ Accounts Hesaplar - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -2677,21 +2677,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -2751,7 +2747,7 @@ Özellikler apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -2894,16 +2890,12 @@ Holdings Varlıklar - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -2911,7 +2903,7 @@ Özet apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -2923,7 +2915,7 @@ Piyasalar apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -3310,12 +3302,8 @@ Activities İşlemler - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -4114,8 +4102,8 @@ Registration Kayıt - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -4175,8 +4163,8 @@ Açık kaynak alternatif kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6068,8 +6056,8 @@ Kendini-Barındırma kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6193,7 +6181,7 @@ İnternasyonalizasyon apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6945,8 +6933,8 @@ kılavuzlar kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6954,8 +6942,8 @@ sözlük kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7415,8 +7403,8 @@ Hizmet Koşulları kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7552,7 +7540,7 @@ İzleme Listesi apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7596,8 +7584,8 @@ degisiklik-gunlugu kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index c6f951b7e..d11343e3d 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -6,7 +6,7 @@ Функції apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -14,7 +14,7 @@ Інтернаціоналізація apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -22,11 +22,11 @@ Увійти apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -370,8 +370,8 @@ about kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -379,8 +379,8 @@ license kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -388,8 +388,8 @@ privacy-policy kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -397,8 +397,8 @@ faq kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -406,8 +406,8 @@ features kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -415,8 +415,8 @@ markets kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -424,8 +424,8 @@ pricing kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -433,8 +433,8 @@ register kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -442,8 +442,8 @@ resources kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -2057,14 +2057,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -2207,7 +2207,7 @@ Упс! Неправильний Секретний Токен. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -3534,8 +3534,8 @@ Accounts Рахунки - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -3665,21 +3665,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -3763,8 +3759,8 @@ самохостинг kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -3923,16 +3919,12 @@ Holdings Активи - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -3940,7 +3932,7 @@ Зведення apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3952,7 +3944,7 @@ Ринки apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -4415,12 +4407,8 @@ Activities Активності - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -5395,8 +5383,8 @@ Registration Реєстрація - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -5468,8 +5456,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -5477,8 +5465,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -5494,8 +5482,8 @@ відкритий-альтернативний-для kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -7415,8 +7403,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7552,7 +7540,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7596,8 +7584,8 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index c3c1931c7..a67647667 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -6,72 +6,72 @@ about kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 faq kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 features kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 license kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 markets kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 pricing kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 privacy-policy kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 register kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 resources kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -1675,14 +1675,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1789,18 +1789,18 @@ Sign in apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 Oops! Incorrect Security Token. apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2791,8 +2791,8 @@ Accounts - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -2898,21 +2898,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -2966,7 +2962,7 @@ Features apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -3081,23 +3077,19 @@ Holdings - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 Summary apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3108,7 +3100,7 @@ Markets apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -3497,12 +3489,8 @@ Activities - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -4245,8 +4233,8 @@ Registration - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -4281,8 +4269,8 @@ open-source-alternative-to kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -5470,8 +5458,8 @@ self-hosting kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -5620,7 +5608,7 @@ Internationalization apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6268,8 +6256,8 @@ glossary kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -6287,8 +6275,8 @@ guides kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6695,8 +6683,8 @@ terms-of-service kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -6780,7 +6768,7 @@ Watchlist apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -6830,8 +6818,8 @@ changelog kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 603467ed9..6fe2ecc48 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -7,8 +7,8 @@ 关于 kebab-case - libs/common/src/lib/paths.ts - 36 + libs/common/src/lib/routes.ts + 29 @@ -16,8 +16,8 @@ 常见问题 kebab-case - libs/common/src/lib/paths.ts - 38 + libs/common/src/lib/routes.ts + 32 @@ -25,8 +25,8 @@ 功能 kebab-case - libs/common/src/lib/paths.ts - 39 + libs/common/src/lib/routes.ts + 33 @@ -34,8 +34,8 @@ 许可证 kebab-case - libs/common/src/lib/paths.ts - 42 + libs/common/src/lib/routes.ts + 36 @@ -43,8 +43,8 @@ 市场 kebab-case - libs/common/src/lib/paths.ts - 43 + libs/common/src/lib/routes.ts + 37 @@ -52,8 +52,8 @@ 价钱 kebab-case - libs/common/src/lib/paths.ts - 47 + libs/common/src/lib/routes.ts + 40 @@ -61,8 +61,8 @@ 隐私政策 kebab-case - libs/common/src/lib/paths.ts - 48 + libs/common/src/lib/routes.ts + 41 @@ -70,8 +70,8 @@ 注册 kebab-case - libs/common/src/lib/paths.ts - 49 + libs/common/src/lib/routes.ts + 99 @@ -79,8 +79,8 @@ 资源 kebab-case - libs/common/src/lib/paths.ts - 50 + libs/common/src/lib/routes.ts + 42 @@ -1782,14 +1782,14 @@ apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 122 - - apps/client/src/app/pages/portfolio/portfolio-page-routing.module.ts - 47 - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 94 + + libs/common/src/lib/routes.ts + 76 + Benchmark @@ -1908,11 +1908,11 @@ 登入 apps/client/src/app/app-routing.module.ts - 150 + 154 apps/client/src/app/components/header/header.component.ts - 237 + 241 @@ -1920,7 +1920,7 @@ 哎呀!安全令牌不正确。 apps/client/src/app/components/header/header.component.ts - 252 + 256 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -3019,8 +3019,8 @@ Accounts 账户 - apps/client/src/app/pages/accounts/accounts-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 51 @@ -3138,21 +3138,17 @@ apps/client/src/app/pages/admin/admin-page.component.ts 29 - - apps/client/src/app/pages/home/home-page.component.ts - 39 - apps/client/src/app/pages/resources/resources-page.component.ts 19 - apps/client/src/app/pages/zen/zen-page-routing.module.ts - 20 + libs/common/src/lib/routes.ts + 64 - apps/client/src/app/pages/zen/zen-page.component.ts - 36 + libs/common/src/lib/routes.ts + 89 @@ -3212,7 +3208,7 @@ 功能 apps/client/src/app/app-routing.module.ts - 74 + 78 @@ -3343,16 +3339,12 @@ Holdings 持仓 - apps/client/src/app/pages/home/home-page-routing.module.ts - 25 - - - apps/client/src/app/pages/home/home-page.component.ts - 44 + libs/common/src/lib/routes.ts + 61 - apps/client/src/app/pages/zen/zen-page.component.ts - 41 + libs/common/src/lib/routes.ts + 86 @@ -3360,7 +3352,7 @@ 汇总 apps/client/src/app/pages/home/home-page-routing.module.ts - 30 + 33 apps/client/src/app/pages/home/home-page.component.ts @@ -3372,7 +3364,7 @@ 市场 apps/client/src/app/pages/home/home-page-routing.module.ts - 35 + 38 apps/client/src/app/pages/home/home-page.component.ts @@ -3811,12 +3803,8 @@ Activities 活动 - apps/client/src/app/pages/portfolio/activities/activities-page-routing.module.ts - 13 - - - apps/client/src/app/pages/portfolio/portfolio-page.component.ts - 41 + libs/common/src/lib/routes.ts + 73 @@ -4647,8 +4635,8 @@ Registration 注册 - apps/client/src/app/pages/register/register-page-routing.module.ts - 13 + libs/common/src/lib/routes.ts + 100 @@ -4688,8 +4676,8 @@ 开源替代方案 kebab-case - libs/common/src/lib/paths.ts - 44 + libs/common/src/lib/routes.ts + 38 @@ -6025,8 +6013,8 @@ 自托管 kebab-case - libs/common/src/lib/paths.ts - 51 + libs/common/src/lib/routes.ts + 43 @@ -6194,7 +6182,7 @@ 国际化 apps/client/src/app/app-routing.module.ts - 88 + 92 @@ -6946,8 +6934,8 @@ 指南 kebab-case - libs/common/src/lib/paths.ts - 41 + libs/common/src/lib/routes.ts + 35 @@ -6955,8 +6943,8 @@ 词汇表 kebab-case - libs/common/src/lib/paths.ts - 40 + libs/common/src/lib/routes.ts + 34 @@ -7416,8 +7404,8 @@ 服务条款 kebab-case - libs/common/src/lib/paths.ts - 52 + libs/common/src/lib/routes.ts + 44 @@ -7553,7 +7541,7 @@ 关注列表 apps/client/src/app/pages/home/home-page-routing.module.ts - 40 + 43 apps/client/src/app/pages/home/home-page.component.ts @@ -7597,8 +7585,8 @@ 变更日志 kebab-case - libs/common/src/lib/paths.ts - 37 + libs/common/src/lib/routes.ts + 31 From c42ffcb2a1cd0d1ca59853c88eee5fa9ff695637 Mon Sep 17 00:00:00 2001 From: jlebutte Date: Sun, 8 Jun 2025 17:26:22 +0200 Subject: [PATCH 72/81] Feature/improve language localization for FR 20250607 (#4860) * Improve language localization for FR * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.fr.xlf | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e8b6856a..450ae6fa3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Renamed the asset profile icon component to entity logo component and moved to `@ghostfolio/ui` - Renamed `Account` to `accounts` in the `User` database schema - Improved the language localization for Catalan (`ca`) +- Improved the language localization for French (`fr`) - Improved the language localization for Polish (`pl`) ### Fixed diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 0c1251741..a53fe2322 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -7590,7 +7590,7 @@ Demo user account has been synced. - Demo user account has been synced. + Le compte utilisateur de démonstration a été synchronisé. apps/client/src/app/components/admin-overview/admin-overview.component.ts 223 @@ -7598,7 +7598,7 @@ Sync Demo User Account - Sync Demo User Account + Synchroniser le compte utilisateur de démonstration apps/client/src/app/components/admin-overview/admin-overview.html 181 @@ -7606,7 +7606,7 @@ Emergency Fund: Set up - Emergency Fund: Set up + Fonds d’urgence : Mise en place apps/client/src/app/pages/i18n/i18n-page.html 14 @@ -7614,7 +7614,7 @@ No emergency fund has been set up - No emergency fund has been set up + Aucun fonds d’urgence n’a été mis en place apps/client/src/app/pages/i18n/i18n-page.html 15 @@ -7622,7 +7622,7 @@ An emergency fund has been set up - An emergency fund has been set up + Un fonds d’urgence a été mis en place apps/client/src/app/pages/i18n/i18n-page.html 18 @@ -7630,7 +7630,7 @@ Fee Ratio - Fee Ratio + Ratio de frais apps/client/src/app/pages/i18n/i18n-page.html 21 @@ -7638,7 +7638,7 @@ The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) - The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + Les frais dépassent ${thresholdMax}% de votre investissement initial (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 22 @@ -7646,7 +7646,7 @@ The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) - The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + Les frais ne dépassent pas ${thresholdMax}% de votre investissement initial (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 26 @@ -7654,7 +7654,7 @@ Name - Name + Nom libs/ui/src/lib/benchmark/benchmark.component.html 11 From 85aa323e848bc385c6a9344d3f23dab76cb7245f Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 8 Jun 2025 17:27:15 +0200 Subject: [PATCH 73/81] Feature/improve cache verification in health check endpoint (#4868) * Improve implementation of isHealthy() without using getKeys() * Update changelog --- CHANGELOG.md | 1 + .../app/redis-cache/redis-cache.service.ts | 20 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 450ae6fa3..a6f98ee1f 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 - Renamed the asset profile icon component to entity logo component and moved to `@ghostfolio/ui` - Renamed `Account` to `accounts` in the `User` database schema +- Improved the cache verification in the health check endpoint (experimental) - Improved the language localization for Catalan (`ca`) - Improved the language localization for French (`fr`) - Improved the language localization for Polish (`pl`) 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 e6e98d622..ae4493e51 100644 --- a/apps/api/src/app/redis-cache/redis-cache.service.ts +++ b/apps/api/src/app/redis-cache/redis-cache.service.ts @@ -79,12 +79,22 @@ export class RedisCacheService { } public async isHealthy() { + const testKey = '__health_check__'; + const testValue = Date.now().toString(); + try { await Promise.race([ - this.getKeys(), + (async () => { + await this.set(testKey, testValue, ms('1 second')); + const result = await this.get(testKey); + + if (result !== testValue) { + throw new Error('Redis health check failed: value mismatch'); + } + })(), new Promise((_, reject) => setTimeout( - () => reject(new Error('Redis health check timeout')), + () => reject(new Error('Redis health check failed: timeout')), ms('2 seconds') ) ) @@ -92,7 +102,13 @@ export class RedisCacheService { return true; } catch (error) { + Logger.error(error?.message, 'RedisCacheService'); + return false; + } finally { + try { + await this.remove(testKey); + } catch {} } } From 3af558c580ab295512b7dc7403c24dfd19d35011 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 8 Jun 2025 20:58:47 +0200 Subject: [PATCH 74/81] Bugfix/handle exception in getKeys() of Redis cache service (#4871) * Handle exception in getKeys() * Update changelog --- CHANGELOG.md | 1 + .../app/redis-cache/redis-cache.service.ts | 40 +++++++++---------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6f98ee1f..e2d973013 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Handled an exception in the get keys function of the _Redis_ cache service - Fixed missing `/.well-known/assetlinks.json` for TWA ## 2.168.0 - 2025-06-07 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 ae4493e51..621199cc9 100644 --- a/apps/api/src/app/redis-cache/redis-cache.service.ts +++ b/apps/api/src/app/redis-cache/redis-cache.service.ts @@ -5,17 +5,28 @@ import { AssetProfileIdentifier, Filter } from '@ghostfolio/common/interfaces'; import { CACHE_MANAGER, Cache } from '@nestjs/cache-manager'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { createHash } from 'crypto'; +import Keyv from 'keyv'; import ms from 'ms'; @Injectable() export class RedisCacheService { + private client: Keyv; + public constructor( @Inject(CACHE_MANAGER) private readonly cache: Cache, private readonly configurationService: ConfigurationService ) { - const client = cache.stores[0]; + this.client = cache.stores[0]; + + this.client.deserialize = (value) => { + try { + return JSON.parse(value); + } catch {} + + return value; + }; - client.on('error', (error) => { + this.client.on('error', (error) => { Logger.error(error, 'RedisCacheService'); }); } @@ -28,28 +39,13 @@ export class RedisCacheService { const keys: string[] = []; const prefix = aPrefix; - this.cache.stores[0].deserialize = (value) => { - try { - return JSON.parse(value); - } catch (error: any) { - if (error instanceof SyntaxError) { - Logger.debug( - `Failed to parse json, returning the value as String: ${value}`, - 'RedisCacheService' - ); - - return value; - } else { - throw error; + try { + for await (const [key] of this.client.iterator({})) { + if ((prefix && key.startsWith(prefix)) || !prefix) { + keys.push(key); } } - }; - - for await (const [key] of this.cache.stores[0].iterator({})) { - if ((prefix && key.startsWith(prefix)) || !prefix) { - keys.push(key); - } - } + } catch {} return keys; } From c60426850717fdc828f6894bb2bd4925ea265f64 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 8 Jun 2025 21:06:33 +0200 Subject: [PATCH 75/81] Bugfix/fix issue in header after paths to routes restructuring (#4872) * Fix issue in header --- apps/client/src/app/app.component.ts | 4 +-- .../components/header/header.component.html | 25 ++++++++++++------- .../app/components/header/header.component.ts | 5 ++-- apps/client/src/app/core/auth.guard.ts | 2 +- .../overview/about-overview-page.component.ts | 2 +- .../hacktoberfest-2023-page.component.ts | 2 +- .../hacktoberfest-2024-page.component.ts | 2 +- .../app/pages/faq/saas/saas-page.component.ts | 2 +- .../pages/features/features-page.component.ts | 2 +- .../pages/landing/landing-page.component.ts | 4 +-- .../pages/pricing/pricing-page.component.ts | 2 +- libs/common/src/lib/routes.ts | 2 ++ 12 files changed, 32 insertions(+), 22 deletions(-) diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index f0be8c76e..bc3eb69b7 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -78,9 +78,9 @@ export class AppComponent implements OnDestroy, OnInit { public routerLinkFaq = ['/' + routes.faq]; public routerLinkFeatures = ['/' + routes.features]; public routerLinkMarkets = ['/' + routes.markets]; - public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; + public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; public routerLinkPricing = ['/' + routes.pricing]; - public routerLinkRegister = ['/' + publicRoutes.register.path]; + public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkResources = ['/' + routes.resources]; public showFooter = false; public user: User; diff --git a/apps/client/src/app/components/header/header.component.html b/apps/client/src/app/components/header/header.component.html index c20711242..c1475d549 100644 --- a/apps/client/src/app/components/header/header.component.html +++ b/apps/client/src/app/components/header/header.component.html @@ -20,9 +20,11 @@ mat-flat-button [ngClass]="{ 'font-weight-bold': - currentRoute === routes.home || currentRoute === routes.zen, + currentRoute === internalRoutes.home.path || + currentRoute === internalRoutes.zen.path, 'text-decoration-underline': - currentRoute === routes.home || currentRoute === routes.zen + currentRoute === internalRoutes.home.path || + currentRoute === internalRoutes.zen.path }" [routerLink]="['/']" >OverviewPortfolioAccountsOverviewPortfolioAccounts diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index 0bf42c86e..23049ada9 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -83,13 +83,13 @@ export class HeaderComponent implements OnChanges { public hasPermissionToAccessFearAndGreedIndex: boolean; public hasPermissionToCreateUser: boolean; public impersonationId: string; + public internalRoutes = internalRoutes; public isMenuOpen: boolean; public routeAbout = routes.about; public routeFeatures = routes.features; public routeMarkets = routes.markets; public routePricing = routes.pricing; public routeResources = routes.resources; - public routes = routes; public routerLinkAbout = ['/' + routes.about]; public routerLinkAccount = ['/' + routes.account]; public routerLinkAccounts = internalRoutes.accounts.routerLink; @@ -98,8 +98,9 @@ export class HeaderComponent implements OnChanges { public routerLinkMarkets = ['/' + routes.markets]; public routerLinkPortfolio = internalRoutes.portfolio.routerLink; public routerLinkPricing = ['/' + routes.pricing]; - public routerLinkRegister = ['/' + publicRoutes.register.path]; + public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkResources = ['/' + routes.resources]; + public routes = routes; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index 21a92b166..919a88bd5 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -55,7 +55,7 @@ export class AuthGuard { this.router.navigate(['/' + routes.demo]); resolve(false); } else if (utmSource === 'trusted-web-activity') { - this.router.navigate(['/' + publicRoutes.register.path]); + this.router.navigate(publicRoutes.register.routerLink); resolve(false); } else if ( AuthGuard.PUBLIC_PAGE_ROUTES.some((publicPageRoute) => { diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts index a2d911a8e..c4ce08aee 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts +++ b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -21,7 +21,7 @@ export class AboutOverviewPageComponent implements OnDestroy, OnInit { public routerLinkBlog = ['/' + routes.blog]; public routerLinkFaq = ['/' + routes.faq]; public routerLinkFeatures = ['/' + routes.features]; - public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; + public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts b/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts index 0525adc93..162831703 100644 --- a/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts +++ b/apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.component.ts @@ -13,5 +13,5 @@ import { RouterModule } from '@angular/router'; export class Hacktoberfest2023PageComponent { public routerLinkAbout = ['/' + routes.about]; public routerLinkBlog = ['/' + routes.blog]; - public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; + public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; } diff --git a/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts b/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts index 5a559dd95..28b24cb00 100644 --- a/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts +++ b/apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.component.ts @@ -13,5 +13,5 @@ import { RouterModule } from '@angular/router'; export class Hacktoberfest2024PageComponent { public routerLinkAbout = ['/' + routes.about]; public routerLinkBlog = ['/' + routes.blog]; - public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; + public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; } diff --git a/apps/client/src/app/pages/faq/saas/saas-page.component.ts b/apps/client/src/app/pages/faq/saas/saas-page.component.ts index 27c794069..7f7e2c709 100644 --- a/apps/client/src/app/pages/faq/saas/saas-page.component.ts +++ b/apps/client/src/app/pages/faq/saas/saas-page.component.ts @@ -20,7 +20,7 @@ export class SaasPageComponent implements OnDestroy { routes.membership ]; public routerLinkMarkets = ['/' + routes.markets]; - public routerLinkRegister = ['/' + publicRoutes.register.path]; + public routerLinkRegister = publicRoutes.register.routerLink; public user: User; private unsubscribeSubject = new Subject(); diff --git a/apps/client/src/app/pages/features/features-page.component.ts b/apps/client/src/app/pages/features/features-page.component.ts index bb502fdaf..abe5cab0f 100644 --- a/apps/client/src/app/pages/features/features-page.component.ts +++ b/apps/client/src/app/pages/features/features-page.component.ts @@ -26,7 +26,7 @@ import { Subject, takeUntil } from 'rxjs'; export class GfFeaturesPageComponent implements OnDestroy { public hasPermissionForSubscription: boolean; public info: InfoItem; - public routerLinkRegister = ['/' + publicRoutes.register.path]; + public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkResources = ['/' + routes.resources]; public user: User; diff --git a/apps/client/src/app/pages/landing/landing-page.component.ts b/apps/client/src/app/pages/landing/landing-page.component.ts index 84a2e4768..bdfff38fb 100644 --- a/apps/client/src/app/pages/landing/landing-page.component.ts +++ b/apps/client/src/app/pages/landing/landing-page.component.ts @@ -27,8 +27,8 @@ export class LandingPageComponent implements OnDestroy, OnInit { public hasPermissionToCreateUser: boolean; public routerLinkAbout = ['/' + routes.about]; public routerLinkDemo = ['/' + routes.demo]; - public routerLinkOpenStartup = ['/' + publicRoutes.openStartup.path]; - public routerLinkRegister = ['/' + publicRoutes.register.path]; + public routerLinkOpenStartup = publicRoutes.openStartup.routerLink; + public routerLinkRegister = publicRoutes.register.routerLink; public statistics: Statistics; public testimonials = [ { diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index e3cc8ccb2..1e9001632 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -42,7 +42,7 @@ export class PricingPageComponent implements OnDestroy, OnInit { 'PROFESSIONAL_DATA_PROVIDER_TOOLTIP_PREMIUM' ); public routerLinkFeatures = ['/' + routes.features]; - public routerLinkRegister = ['/' + publicRoutes.register.path]; + public routerLinkRegister = publicRoutes.register.routerLink; public user: User; private unsubscribeSubject = new Subject(); diff --git a/libs/common/src/lib/routes.ts b/libs/common/src/lib/routes.ts index bf4b40fee..44a19bc8a 100644 --- a/libs/common/src/lib/routes.ts +++ b/libs/common/src/lib/routes.ts @@ -93,10 +93,12 @@ export const internalRoutes = { export const publicRoutes = { openStartup: { path: 'open', + routerLink: ['/open'], title: 'Open Startup' }, register: { path: $localize`:kebab-case:register`, + routerLink: ['/' + $localize`:kebab-case:register`], title: $localize`Registration` } }; From 0d3a99dd393c682c95c9782602ee5e4acf0a9807 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 8 Jun 2025 21:08:41 +0200 Subject: [PATCH 76/81] Release 2.169.0 (#4873) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2d973013..8bd42dc7e 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.169.0 - 2025-06-08 ### Changed diff --git a/package-lock.json b/package-lock.json index 58aa36721..f32b2412e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.168.0", + "version": "2.169.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.168.0", + "version": "2.169.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index c3ed868f8..86cadad72 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.168.0", + "version": "2.169.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 2e377044ed12d4e2585aac2d5b5a33462ba0f15f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Jun 2025 21:15:20 +0200 Subject: [PATCH 77/81] Feature/update locales (#4874) Co-authored-by: github-actions[bot] --- apps/client/src/locales/messages.ca.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.de.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.es.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.fr.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.it.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.nl.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.pl.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.pt.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.tr.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.uk.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.xlf | 64 +++++++++++++------------ apps/client/src/locales/messages.zh.xlf | 64 +++++++++++++------------ 12 files changed, 408 insertions(+), 360 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index d8785bf0c..63a6e47ef 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -26,7 +26,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -74,7 +74,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -94,11 +94,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -114,11 +114,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -238,7 +238,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -278,15 +278,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -434,7 +434,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -1755,11 +1759,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1971,11 +1975,11 @@ Visió General apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1983,11 +1987,11 @@ Portfolio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1995,11 +1999,11 @@ Panell d’Administració apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -2007,7 +2011,7 @@ Millora la teva Subscripció apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2027,7 +2031,7 @@ Renova la teva Subscripció apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -2043,7 +2047,7 @@ Tu apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -2055,7 +2059,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -2063,7 +2067,7 @@ El meu Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -2071,7 +2075,7 @@ Sobre Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2083,7 +2087,7 @@ Iniciar Sessió apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2095,7 +2099,7 @@ Primers Passos apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -2103,7 +2107,7 @@ Oooh! El testimoni de seguretat és incorrecte. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -5060,7 +5064,7 @@ Registration libs/common/src/lib/routes.ts - 100 + 102 @@ -7568,7 +7572,7 @@ Log out apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 12b6e7e51..bd1e9e165 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -778,7 +778,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -818,11 +818,11 @@ Übersicht apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -830,11 +830,11 @@ Portfolio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -850,11 +850,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -870,11 +870,11 @@ Administration apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -886,11 +886,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -906,15 +906,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -930,11 +930,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -942,7 +942,7 @@ Ich apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -950,7 +950,7 @@ Mein Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -958,7 +958,7 @@ Über Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -974,7 +974,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -990,7 +990,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1022,7 +1022,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -1030,7 +1030,7 @@ Ups! Falsches Sicherheits-Token. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1142,7 +1142,7 @@ Einloggen apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2406,7 +2406,7 @@ Registrierung libs/common/src/lib/routes.ts - 100 + 102 @@ -2574,7 +2574,7 @@ Registrieren apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -3558,7 +3558,7 @@ Abonnement abschliessen apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3850,7 +3850,7 @@ Abonnement erneuern apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5222,7 +5222,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -7568,7 +7572,7 @@ Ausloggen apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 697222e9a..fee61f309 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -763,7 +763,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -803,11 +803,11 @@ Visión general apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -815,11 +815,11 @@ Cartera apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -835,11 +835,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -855,11 +855,11 @@ Control de administrador apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -871,11 +871,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -891,15 +891,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -915,11 +915,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -927,7 +927,7 @@ apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -935,7 +935,7 @@ Mi Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -943,7 +943,7 @@ Sobre Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -959,7 +959,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -975,7 +975,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1007,7 +1007,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -1015,7 +1015,7 @@ Vaya! Token de seguridad incorrecto. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1127,7 +1127,7 @@ Iniciar sesión apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2391,7 +2391,7 @@ Registro libs/common/src/lib/routes.ts - 100 + 102 @@ -2559,7 +2559,7 @@ Comenzar apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -3543,7 +3543,7 @@ Mejorar plan apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3827,7 +3827,7 @@ Renovar Plan apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5199,7 +5199,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -7569,7 +7573,7 @@ Log out apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index a53fe2322..7389e81a1 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -1022,7 +1022,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -1046,11 +1046,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1134,11 +1134,11 @@ Aperçu apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1146,11 +1146,11 @@ Portefeuille apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1158,11 +1158,11 @@ Contrôle Administrateur apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1174,11 +1174,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -1194,15 +1194,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -1218,11 +1218,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -1230,7 +1230,7 @@ Moi apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1238,7 +1238,7 @@ Mon Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1246,7 +1246,7 @@ À propos de Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1262,7 +1262,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -1278,7 +1278,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1294,7 +1294,7 @@ Se connecter apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1306,7 +1306,7 @@ Démarrer apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1318,7 +1318,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -1326,7 +1326,7 @@ Oups! Jeton de Sécurité Incorrect. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2870,7 +2870,7 @@ Enregistrement libs/common/src/lib/routes.ts - 100 + 102 @@ -3542,7 +3542,7 @@ Mettre à niveau l’Abonnement apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3826,7 +3826,7 @@ Renouveler l’Abonnement apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5198,7 +5198,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -7568,7 +7572,7 @@ Se déconnecter apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index de5f4b82a..9d98d4da9 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -763,7 +763,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -803,11 +803,11 @@ Panoramica apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -815,11 +815,11 @@ Portafoglio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -835,11 +835,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -855,11 +855,11 @@ Controllo amministrativo apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -871,11 +871,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -891,15 +891,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -915,11 +915,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -927,7 +927,7 @@ Io apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -935,7 +935,7 @@ Il mio Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -943,7 +943,7 @@ Informazioni su Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -959,7 +959,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -975,7 +975,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1007,7 +1007,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -1015,7 +1015,7 @@ Ops! Token di sicurezza errato. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1127,7 +1127,7 @@ Accedi apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2391,7 +2391,7 @@ Iscrizione libs/common/src/lib/routes.ts - 100 + 102 @@ -2559,7 +2559,7 @@ Inizia apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -3543,7 +3543,7 @@ Aggiorna il piano apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3827,7 +3827,7 @@ Rinnova il piano apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5199,7 +5199,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -7569,7 +7573,7 @@ Esci apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 920754452..8a6dd3cf7 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -762,7 +762,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -802,11 +802,11 @@ Overzicht apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -814,11 +814,11 @@ Portefeuille apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -834,11 +834,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -854,11 +854,11 @@ Beheer apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -870,11 +870,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -890,15 +890,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -914,11 +914,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -926,7 +926,7 @@ Ik apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -934,7 +934,7 @@ Mijn Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -942,7 +942,7 @@ Over Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -958,7 +958,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -974,7 +974,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1006,7 +1006,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -1014,7 +1014,7 @@ Oeps! Onjuiste beveiligingstoken. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1126,7 +1126,7 @@ Aanmelden apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2390,7 +2390,7 @@ Registratie libs/common/src/lib/routes.ts - 100 + 102 @@ -2558,7 +2558,7 @@ Aan de slag apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -3542,7 +3542,7 @@ Abonnement uitbreiden apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3826,7 +3826,7 @@ Abonnement Vernieuwen apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5198,7 +5198,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -7568,7 +7572,7 @@ Uitloggen apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 3a1aaa389..c063e7beb 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -70,7 +70,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -127,7 +131,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -147,11 +151,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -167,11 +171,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -291,7 +295,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -331,15 +335,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -1587,11 +1591,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1803,11 +1807,11 @@ Przegląd apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1815,11 +1819,11 @@ Portfel apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1827,11 +1831,11 @@ Nadzór Administratora apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1839,7 +1843,7 @@ Ja apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1851,7 +1855,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -1859,7 +1863,7 @@ Moje Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1867,7 +1871,7 @@ O Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1879,7 +1883,7 @@ Zaloguj się apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1891,7 +1895,7 @@ Rozpocznij apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1903,7 +1907,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -1911,7 +1915,7 @@ Ups! Nieprawidłowy token bezpieczeństwa. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2539,7 +2543,7 @@ Ulepsz Plan apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -4555,7 +4559,7 @@ Odnów Plan apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4627,7 +4631,7 @@ Rejestracja libs/common/src/lib/routes.ts - 100 + 102 @@ -7568,7 +7572,7 @@ Wyloguj się apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index c31e11a33..167938e6a 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -894,7 +894,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -918,11 +918,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1006,11 +1006,11 @@ Visão geral apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1018,11 +1018,11 @@ Portefólio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1030,11 +1030,11 @@ Controlo Administrativo apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1046,11 +1046,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -1066,15 +1066,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -1090,11 +1090,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -1102,7 +1102,7 @@ Eu apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1110,7 +1110,7 @@ O meu Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1118,7 +1118,7 @@ Sobre o Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1134,7 +1134,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -1150,7 +1150,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -1166,7 +1166,7 @@ Iniciar sessão apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1178,7 +1178,7 @@ Começar apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1190,7 +1190,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -1198,7 +1198,7 @@ Oops! Token de Segurança Incorreto. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2762,7 +2762,7 @@ Registo libs/common/src/lib/routes.ts - 100 + 102 @@ -3542,7 +3542,7 @@ Atualizar Plano apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3826,7 +3826,7 @@ Renovar Plano apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -5198,7 +5198,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -7568,7 +7572,7 @@ Log out apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index c478b56b7..f2db105b6 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -70,7 +70,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -99,7 +103,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -119,11 +123,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -139,11 +143,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -263,7 +267,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -303,15 +307,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -1495,11 +1499,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1559,7 +1563,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -1667,11 +1671,11 @@ Genel Bakış apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1679,11 +1683,11 @@ Portföy apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1691,11 +1695,11 @@ Yönetici Kontrolü apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1703,7 +1707,7 @@ Ben apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1711,7 +1715,7 @@ Ghostfolio’m apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1719,7 +1723,7 @@ Ghostfolio Hakkında apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1731,7 +1735,7 @@ Giriş apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1743,7 +1747,7 @@ Haydi Başlayalım apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1755,7 +1759,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -1763,7 +1767,7 @@ Hay Allah! Güvenlik anahtarı yanlış. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2383,7 +2387,7 @@ Üyeliğinizi Yükseltin apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -4031,7 +4035,7 @@ Aboneliği Yenile apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4103,7 +4107,7 @@ Kayıt libs/common/src/lib/routes.ts - 100 + 102 @@ -7568,7 +7572,7 @@ Oturumu kapat apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index d11343e3d..013649efc 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -26,7 +26,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -74,7 +74,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -94,11 +94,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -114,11 +114,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -238,7 +238,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -278,15 +278,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -434,7 +434,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -1743,11 +1747,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1931,7 +1935,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -2087,11 +2091,11 @@ Огляд apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -2099,11 +2103,11 @@ Портфель apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -2111,11 +2115,11 @@ Управління адміністратором apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -2123,7 +2127,7 @@ Оновити план apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2143,7 +2147,7 @@ Поновити план apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -2159,7 +2163,7 @@ Я apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -2167,7 +2171,7 @@ Мій Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -2175,7 +2179,7 @@ Про Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -2187,7 +2191,7 @@ Увійти apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -2199,7 +2203,7 @@ Почати apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -2207,7 +2211,7 @@ Упс! Неправильний Секретний Токен. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -5384,7 +5388,7 @@ Реєстрація libs/common/src/lib/routes.ts - 100 + 102 @@ -7568,7 +7572,7 @@ Log out apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index a67647667..f9d89c9ca 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -63,7 +63,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -115,7 +119,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -134,11 +138,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -153,11 +157,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -274,7 +278,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -311,15 +315,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -1509,11 +1513,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1702,40 +1706,40 @@ Overview apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 Portfolio apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 Admin Control apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 Me apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1746,21 +1750,21 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 My Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 About Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1771,7 +1775,7 @@ Sign in apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1782,7 +1786,7 @@ Get started apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1793,14 +1797,14 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 Oops! Incorrect Security Token. apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2368,7 +2372,7 @@ Upgrade Plan apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -4170,7 +4174,7 @@ Renew Plan apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4234,7 +4238,7 @@ Registration libs/common/src/lib/routes.ts - 100 + 102 @@ -6804,7 +6808,7 @@ Log out apps/client/src/app/components/header/header.component.html - 317 + 324 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 6fe2ecc48..743926cd4 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -71,7 +71,11 @@ kebab-case libs/common/src/lib/routes.ts - 99 + 100 + + + libs/common/src/lib/routes.ts + 101 @@ -128,7 +132,7 @@ apps/client/src/app/components/header/header.component.html - 396 + 403 apps/client/src/app/components/home-market/home-market.html @@ -148,11 +152,11 @@ apps/client/src/app/components/header/header.component.html - 82 + 86 apps/client/src/app/components/header/header.component.html - 289 + 296 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -168,11 +172,11 @@ apps/client/src/app/components/header/header.component.html - 117 + 121 apps/client/src/app/components/header/header.component.html - 362 + 369 @@ -292,7 +296,7 @@ apps/client/src/app/components/header/header.component.html - 349 + 356 apps/client/src/app/pages/features/features-page.html @@ -332,15 +336,15 @@ apps/client/src/app/components/header/header.component.html - 99 + 103 apps/client/src/app/components/header/header.component.html - 301 + 308 apps/client/src/app/components/header/header.component.html - 377 + 384 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -1596,11 +1600,11 @@ apps/client/src/app/components/header/header.component.html - 54 + 58 apps/client/src/app/components/header/header.component.html - 259 + 266 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1812,11 +1816,11 @@ 概述 apps/client/src/app/components/header/header.component.html - 28 + 30 apps/client/src/app/components/header/header.component.html - 241 + 246 @@ -1824,11 +1828,11 @@ 投资组合 apps/client/src/app/components/header/header.component.html - 41 + 44 apps/client/src/app/components/header/header.component.html - 251 + 256 @@ -1836,11 +1840,11 @@ 管理控制 apps/client/src/app/components/header/header.component.html - 68 + 72 apps/client/src/app/components/header/header.component.html - 277 + 284 @@ -1848,7 +1852,7 @@ apps/client/src/app/components/header/header.component.html - 207 + 211 @@ -1860,7 +1864,7 @@ apps/client/src/app/components/header/header.component.html - 225 + 229 @@ -1868,7 +1872,7 @@ 我的 Ghostfolio apps/client/src/app/components/header/header.component.html - 266 + 273 @@ -1876,7 +1880,7 @@ 关于 Ghostfolio apps/client/src/app/components/header/header.component.html - 314 + 321 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1888,7 +1892,7 @@ 登入 apps/client/src/app/components/header/header.component.html - 410 + 417 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1900,7 +1904,7 @@ 开始使用 apps/client/src/app/components/header/header.component.html - 420 + 427 @@ -1912,7 +1916,7 @@ apps/client/src/app/components/header/header.component.ts - 241 + 242 @@ -1920,7 +1924,7 @@ 哎呀!安全令牌不正确。 apps/client/src/app/components/header/header.component.ts - 256 + 257 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -2548,7 +2552,7 @@ 升级计划 apps/client/src/app/components/header/header.component.html - 187 + 191 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -4564,7 +4568,7 @@ 更新计划 apps/client/src/app/components/header/header.component.html - 185 + 189 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4636,7 +4640,7 @@ 注册 libs/common/src/lib/routes.ts - 100 + 102 @@ -7569,7 +7573,7 @@ 登出 apps/client/src/app/components/header/header.component.html - 317 + 324 From 376b1416bbb582b09f699e2e341f60ee8ca184ab Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 9 Jun 2025 08:03:42 +0200 Subject: [PATCH 78/81] Bugfix/restrict date range change permission in Zen mode (#4877) * Restrict date range change permission in Zen Mode * Update changelog --- CHANGELOG.md | 6 ++++++ apps/client/src/app/app.component.ts | 11 +++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bd42dc7e..e698a08af 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 + +### Fixed + +- Restricted the date range change permission in the _Zen Mode_ + ## 2.169.0 - 2025-06-08 ### Changed diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index bc3eb69b7..105dfdd79 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -160,12 +160,11 @@ export class AppComponent implements OnDestroy, OnInit { this.currentSubRoute = urlSegments[1]?.path; if ( - (this.currentRoute === 'home' && !this.currentSubRoute) || - (this.currentRoute === 'home' && - this.currentSubRoute === 'holdings') || - (this.currentRoute === 'portfolio' && !this.currentSubRoute) || - (this.currentRoute === 'zen' && !this.currentSubRoute) || - (this.currentRoute === 'zen' && this.currentSubRoute === 'holdings') + ((this.currentRoute === 'home' && !this.currentSubRoute) || + (this.currentRoute === 'home' && + this.currentSubRoute === 'holdings') || + (this.currentRoute === 'portfolio' && !this.currentSubRoute)) && + this.user?.settings?.viewMode !== 'ZEN' ) { this.hasPermissionToChangeDateRange = true; } else { From d77295f64cf669594b89d9bc47f65675507a3244 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 9 Jun 2025 08:43:56 +0200 Subject: [PATCH 79/81] Feature/reuse routes in app component (#4878) * Reuse routes --- apps/client/src/app/app.component.ts | 70 ++++++++++++++++------------ 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 105dfdd79..7f308c7a7 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -3,7 +3,11 @@ import { HoldingDetailDialogParams } from '@ghostfolio/client/components/holding import { getCssVariable } from '@ghostfolio/common/helper'; import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; -import { publicRoutes, routes } from '@ghostfolio/common/routes'; +import { + internalRoutes, + publicRoutes, + routes +} from '@ghostfolio/common/routes'; import { ColorScheme } from '@ghostfolio/common/types'; import { DOCUMENT } from '@angular/common'; @@ -160,10 +164,13 @@ export class AppComponent implements OnDestroy, OnInit { this.currentSubRoute = urlSegments[1]?.path; if ( - ((this.currentRoute === 'home' && !this.currentSubRoute) || - (this.currentRoute === 'home' && - this.currentSubRoute === 'holdings') || - (this.currentRoute === 'portfolio' && !this.currentSubRoute)) && + ((this.currentRoute === internalRoutes.home.path && + !this.currentSubRoute) || + (this.currentRoute === internalRoutes.home.path && + this.currentSubRoute === + internalRoutes.home.subRoutes.holdings.path) || + (this.currentRoute === internalRoutes.portfolio.path && + !this.currentSubRoute)) && this.user?.settings?.viewMode !== 'ZEN' ) { this.hasPermissionToChangeDateRange = true; @@ -172,14 +179,19 @@ export class AppComponent implements OnDestroy, OnInit { } if ( - (this.currentRoute === 'home' && - this.currentSubRoute === 'holdings') || - (this.currentRoute === 'portfolio' && !this.currentSubRoute) || - (this.currentRoute === 'portfolio' && - this.currentSubRoute === 'activities') || - (this.currentRoute === 'portfolio' && - this.currentSubRoute === 'allocations') || - (this.currentRoute === 'zen' && this.currentSubRoute === 'holdings') + (this.currentRoute === internalRoutes.home.path && + this.currentSubRoute === + internalRoutes.home.subRoutes.holdings.path) || + (this.currentRoute === internalRoutes.portfolio.path && + !this.currentSubRoute) || + (this.currentRoute === internalRoutes.portfolio.path && + this.currentSubRoute === + internalRoutes.portfolio.subRoutes.activities.path) || + (this.currentRoute === internalRoutes.portfolio.path && + this.currentSubRoute === routes.allocations) || + (this.currentRoute === internalRoutes.zen.path && + this.currentSubRoute === + internalRoutes.home.subRoutes.holdings.path) ) { this.hasPermissionToChangeFilters = true; } else { @@ -187,25 +199,25 @@ export class AppComponent implements OnDestroy, OnInit { } this.hasTabs = - (this.currentRoute === this.routerLinkAbout[0].slice(1) || - this.currentRoute === this.routerLinkFaq[0].slice(1) || - this.currentRoute === this.routerLinkResources[0].slice(1) || - this.currentRoute === 'account' || - this.currentRoute === 'admin' || - this.currentRoute === 'home' || - this.currentRoute === 'portfolio' || - this.currentRoute === 'zen') && + (this.currentRoute === routes.about || + this.currentRoute === routes.faq || + this.currentRoute === routes.resources || + this.currentRoute === routes.account || + this.currentRoute === routes.adminControl || + this.currentRoute === internalRoutes.home.path || + this.currentRoute === internalRoutes.portfolio.path || + this.currentRoute === internalRoutes.zen.path) && this.deviceType !== 'mobile'; this.showFooter = - (this.currentRoute === 'blog' || - this.currentRoute === this.routerLinkFeatures[0].slice(1) || - this.currentRoute === this.routerLinkMarkets[0].slice(1) || - this.currentRoute === 'open' || - this.currentRoute === 'p' || - this.currentRoute === this.routerLinkPricing[0].slice(1) || - this.currentRoute === this.routerLinkRegister[0].slice(1) || - this.currentRoute === 'start') && + (this.currentRoute === routes.blog || + this.currentRoute === routes.features || + this.currentRoute === routes.markets || + this.currentRoute === publicRoutes.openStartup.path || + this.currentRoute === routes.public || + this.currentRoute === routes.pricing || + this.currentRoute === publicRoutes.register.path || + this.currentRoute === routes.start) && this.deviceType !== 'mobile'; if (this.deviceType === 'mobile') { From 6056cf9a6a770b7528a1517315b1c30ba9148b6a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 9 Jun 2025 08:44:30 +0200 Subject: [PATCH 80/81] Feature/upgrade @keyv/redis to version 4.4.0 (#4821) * Upgrade @keyv/redis to version 4.4.0 * Update changelog --- CHANGELOG.md | 4 +++ package-lock.json | 80 ++++++----------------------------------------- package.json | 2 +- 3 files changed, 14 insertions(+), 72 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e698a08af..98345be0f 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 +### Changed + +- Upgraded `@keyv/redis` from version `4.3.4` to `4.4.0` + ### Fixed - Restricted the date range change permission in the _Zen Mode_ diff --git a/package-lock.json b/package-lock.json index f32b2412e..fb75467d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "@dfinity/principal": "0.15.7", "@dinero.js/currencies": "2.0.0-alpha.8", "@internationalized/number": "3.6.0", - "@keyv/redis": "4.3.4", + "@keyv/redis": "4.4.0", "@nestjs/bull": "11.0.2", "@nestjs/cache-manager": "3.0.1", "@nestjs/common": "11.1.3", @@ -4962,13 +4962,13 @@ } }, "node_modules/@keyv/redis": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@keyv/redis/-/redis-4.3.4.tgz", - "integrity": "sha512-PLWmawfq9McxEvtHa2Uj5WjI7g6qWtv2eOvXvXJ9tkwEV5vLkqA+pFeZ/0pz9xvP20NQiAkGm4521YJ0DhuFiw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@keyv/redis/-/redis-4.4.0.tgz", + "integrity": "sha512-n/KEj3S7crVkoykggqsMUtcjNGvjagGPlJYgO/r6m9hhGZfhp1txJElHxcdJ1ANi/LJoBuOSILj15g6HD2ucqQ==", "license": "MIT", "dependencies": { - "cluster-key-slot": "^1.1.2", - "redis": "^4.7.0" + "@redis/client": "^1.6.0", + "cluster-key-slot": "^1.1.2" }, "engines": { "node": ">= 18" @@ -9875,19 +9875,10 @@ "@prisma/debug": "6.8.2" } }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, "node_modules/@redis/client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", - "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.1.tgz", + "integrity": "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2", @@ -9898,42 +9889,6 @@ "node": ">=14" } }, - "node_modules/@redis/graph": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", - "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/json": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", - "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/search": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", - "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/time-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", - "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.34.8", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", @@ -29778,23 +29733,6 @@ "node": ">=8" } }, - "node_modules/redis": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", - "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", - "license": "MIT", - "workspaces": [ - "./packages/*" - ], - "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.6.0", - "@redis/graph": "1.1.1", - "@redis/json": "1.0.7", - "@redis/search": "1.2.0", - "@redis/time-series": "1.1.0" - } - }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", diff --git a/package.json b/package.json index 86cadad72..399aef474 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "@dfinity/principal": "0.15.7", "@dinero.js/currencies": "2.0.0-alpha.8", "@internationalized/number": "3.6.0", - "@keyv/redis": "4.3.4", + "@keyv/redis": "4.4.0", "@nestjs/bull": "11.0.2", "@nestjs/cache-manager": "3.0.1", "@nestjs/common": "11.1.3", From f9aea95a73cc8da22ecac4a35e80da0510202f06 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Mon, 9 Jun 2025 09:52:13 +0200 Subject: [PATCH 81/81] Feature/upgrade zone.js to version 0.15.1 (#4869) * Upgrade zone.js to version 0.15.1 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98345be0f..89f7fa606 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Upgraded `@keyv/redis` from version `4.3.4` to `4.4.0` +- Upgraded `zone.js` from version `0.15.0` to `0.15.1` ### Fixed diff --git a/package-lock.json b/package-lock.json index fb75467d6..6a585a001 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,7 +90,7 @@ "twitter-api-v2": "1.23.0", "uuid": "11.1.0", "yahoo-finance2": "3.3.5", - "zone.js": "0.15.0" + "zone.js": "0.15.1" }, "devDependencies": { "@angular-devkit/build-angular": "19.2.1", @@ -35792,9 +35792,9 @@ } }, "node_modules/zone.js": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", - "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", "license": "MIT" } } diff --git a/package.json b/package.json index 399aef474..4ed3dc73b 100644 --- a/package.json +++ b/package.json @@ -136,7 +136,7 @@ "twitter-api-v2": "1.23.0", "uuid": "11.1.0", "yahoo-finance2": "3.3.5", - "zone.js": "0.15.0" + "zone.js": "0.15.1" }, "devDependencies": { "@angular-devkit/build-angular": "19.2.1",